自動箇条書き

提供: MeryWiki
移動先: 案内検索

概要[編集]

  • 箇条書きの行頭記号や数字を自動的に挿入します。
  • Shift+Enterに登録して便利に使っています。
  • 行末で実行する場合とインデントをずらして実行する場合を考えました。


#title="箇条書き"
// itemizer.js
// 2013/03/15

var firstitem = "・";
var reg = /^([\t  ]*)(?:([((]*)([a-zA-Z]+|[0-9]+|[0-9]+)([))\.. ]+)|([--・・**■□]))/;

var ty = Editor.ActiveDocument.Selection.GetActivePointY( mePosLogical );
var trymax = 5;
var tyend = ( ty - trymax > 0 )? ty - trymax : 1 ;
var line = "";
var result;
var resultary = [];
var thisline = Editor.ActiveDocument.GetLine( ty, 0 );
var indent = thisline.replace( /^([ \t]*).*/, "$1" );
for ( var i = ty; i >= tyend; i-- ){
    line = Editor.ActiveDocument.GetLine( i, 0 );
    var linechk = line.replace( /^([ \t]*).*/, "$1" );
    if ( i < ty && linechk.length < indent.length ){ break }
    result = reg.exec( line );
    if ( result != null ){
        if ( result[ 1 ] == indent ){
            resultary.unshift( result.slice( 0 )  )
        } else if ( result[ 1 ] < indent ){
            break;
        }
    } else if ( resultary.length > 0 ){
        break;
    }
}

Editor.ActiveDocument.Write( bulletSucc( resultary, thisline ) );

function bulletSucc( resultary, thisline ){
    if ( resultary.length == 0 ){ return firstitem }
    var chklast = resultary.pop();
    var chklastlast = resultary.pop();
    var i = ( chklastlast == null || isNaN( chklast[ 3 ] ) || isNaN( chklastlast[ 3 ] ) )? 1 : chklast[ 3 ] - chklastlast[ 3 ] ;
    var s = "", r3 = ( chklast == null )? 0 : chklast[ 3 ] ;
    if ( r3 ){
        if  ( isNaN( r3 ) ){
            if ( r3 == "9" ){
                s = 10;
            } else {
                i = ( r3 == "z" || r3 == "Z" )? -25 : 1 ;
                s = String.fromCharCode( r3.charCodeAt( r3.length - 1 ) + i ) ;
            }
        } else {
            s = Number( r3 ) + i;
            s = ( s > 0 )? s : 0 ;
            if ( r3.charAt( 0 ) == "0" ){
                s = ( "0000" + s ).slice( -r3.length );
            }
        }
    }
    if ( thisline.replace( /^[ \t]+/, "" ).length == 0 ){
        return chklast[ 2 ] + s + chklast[ 4 ] + chklast[ 5 ];
    } else {
        return "\n" + chklast[ 1 ] + chklast[ 2 ] + s + chklast[ 4 ] + chklast[ 5 ];
    }
}

更新履歴[編集]

20130306
  • 全角数字に対応。
  • 箇条書きが一行しかないとエラーになるのを修正。
20130307
  • 数字の加算時にインデントのチェックをするようにした。
  • その他こまかい動作の修正。
20130315
  • 空行があったときの動作を修正。