/*--------------------------------------------------------------------- * nzCobolAutoNumbering * * theView @ ARG = 現在の編集ウィンドウのオブジェクト * - @ RET = COBOL編集時はtrueを返す(Enterの動作を置き換へる) * * 【使用方法】 * Startup.ms から読み込んで、 * nzCobolAutoNumbering を onEnter のハンドラ関数として登録します。 * * require("cobolautonum-old"); * Event.onEnter = nzCobolAutoNumbering; * * * ABSTRACT : COBOL編集中、Enter押下時に一連番号を自動的に挿入する * CREATED : 2006-01-17 * MODIFIED : 2009-08-20 * * 2006-01-18: インデント処理をPeggy本来の動作に少し近づけた * 2009-08-20: 途中で行を挿入した時は番号を1ずつ振る(Masa氏の改良を取り込み) *-------------------------------------------------------------------*/ global.nzCobolAutoNumbering = nzCobolAutoNumbering; function nzCobolAutoNumbering(theView) { if (theView.getLanguageID() != "COBOL") return; var intSeqnoInterval; var strPrevSeqno; var intPrevSeqno; var strCurrentSeqno; var intCurrentSeqno; var intInsertSeqno; var strPrefixBreak; var intCurrentCaretColumn; var intFirstCharColumn; var strSuffixIndent; // 追加変数 var strPostSeqno; // 次の行の連番文字列 var intPostSeqno; // 次の行の連番数値 // 初期値 intSeqnoInterval = 10; strPrefixBreak = "\r\n"; strSuffixIndent = ""; // インデント用に空白を準備 intCurrentCaretColumn = theView.CP.column - 6; if ( intCurrentCaretColumn > 0 ) { intFirstCharColumn = theView.getLine().slice(6).search(/[\S]/); if ( intFirstCharColumn != -1 && intCurrentCaretColumn > intFirstCharColumn ) { // カーソル位置が最初に出現する非空白文字よりも後にある場合 strSuffixIndent = new String(" ", intFirstCharColumn); } else { // カーソル位置が最初に出現する非空白文字よりも前にある場合 // または行が空白文字のみの場合 strSuffixIndent = new String(" ", intFirstCharColumn - (intFirstCharColumn - intCurrentCaretColumn) - 1); } } // 前行の一連番号を取得 if ( theView.CP.line > 1 ) { strPrevSeqno = theView.getTextAt(theView.CP.line - 1, 6); if ( strPrevSeqno.search(/\d{6}/) != -1 ) { intPrevSeqno = parseInt(strPrevSeqno, 10); } else { intPrevSeqno = -1; } } else { intPrevSeqno = -1; } // 次の行の一連番号を取得 if ( theView.CP.line > 0 ) { strPostSeqno = theView.getTextAt(theView.CP.line + 1, 6); if ( strPostSeqno.search(/\d{6}/) != -1 ) { intPostSeqno = parseInt(strPostSeqno, 10); } else { intPostSeqno = -1; } } else { intPostSeqno = -1; } // 現在行の一連番号を取得 strCurrentSeqno = theView.getTextAt(theView.CP.line, 6); if ( strCurrentSeqno.search(/\d{6}/) != -1 ) { intCurrentSeqno = parseInt(strCurrentSeqno, 10); } else if ( strCurrentSeqno.search(/^(\r\n)?$/) != -1 ) { // 一連番号領域が空 intCurrentSeqno = -1; } else { // 一連番号領域が不正 intCurrentSeqno = -2; } // 前行及び現在行に応じて挿入する一連番号を決定 if ( intCurrentSeqno >= 0 ) { // 現在行を取得できた場合 // 次の行が取得できない場合=現在最終行の時は、新しい番号を振る if ( intPostSeqno == -1) { intInsertSeqno = (intCurrentSeqno - intCurrentSeqno % intSeqnoInterval) + intSeqnoInterval; } // 次の行が取得できた場合は else { // もし、現在行と次の行の番号の差が2以上の場合は現在行+1を挿入 if ( intPostSeqno > intCurrentSeqno + 1) { intInsertSeqno = intCurrentSeqno + 1; } // もし、現在行と次の行の番号の差が2未満の場合は一連番号が振れないので、現在行と同じものを指定 else { intInsertSeqno = intCurrentSeqno; } strPreFixBreak = ""; } } else if ( intCurrentSeqno == -1 && theView.CP.line == 1 ) { // 現在行が空でかつ一行目の場合 intInsertSeqno = intSeqnoInterval; strPrefixBreak = ""; } else if ( intCurrentSeqno == -1 && intPrevSeqno >= 0 ) { // 現在行は空だが前行を取得できた場合 intInsertSeqno = (intPrevSeqno - intPrevSeqno % intSeqnoInterval) + intSeqnoInterval; strPrefixBreak = ""; } else if ( intCurrentSeqno == -1 && intPrevSeqno >= -1 ) { // 現在行が空でかつ前行も取得できなかつた場合 intInsertSeqno = intStartSeqno; } else if ( intCurrentSeqno == -2 && intPrevSeqno >= 0 ) { // 現在行に不正な内容が入つてゐるが前行を取得できた場合 intInsertSeqno = (intPrevSeqno - intPrevSeqno % intSeqnoInterval) + (intSeqnoInterval * 2); } else { // それら以外の場合 intInsertSeqno = intSeqnoInterval; } // カーソルが一連番号領域内にある場合はインデントしない if ( theView.CP.column <= 6 && intCurrentSeqno != -1 ) { theView.gotoPoint( new Point(theView.CP.line, 6) ); strSuffixIndent = ""; } // 一連番号挿入 theView.insertText(strPrefixBreak + sprintf("%06d", intInsertSeqno) + strSuffixIndent); // 行末がEOFの場合は改行する if ( theView.CP.line == theView.EOF.line ) { theView.openLineBelow(); } return true; }