Markdown文書で改行時にリスト、引用ブロック開始記号を自動入力する

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

改行を挿入し、編集モードがMarkdownでありかつ現在行がリストまたは引用ブロックの場合は開始記号を挿入します。 順序ありリスト(1.等)の場合、数値を+1します。

#title="Markdown文書で改行時にリスト、引用ブロック開始記号を自動入力"

// by catfist
//
// 編集モードが'Markdown'の場合のみ実行
// 現在行が以下の構文を含む場合、改行して行頭に開始記号を追加する
// (順序ありリストの場合は数値を1加算する)
//
// 順序なしリスト: '-','*','+'
// 順序ありリスト: '1.','2.'...
// 引用ブロック  : '>'
//
// 開始記号のみの場合は記号を削除して改行する
//
// Enterに割り当てて使うことを想定
//
// [2018-07-27] 1.0
// [2018-07-28] 1.1
// bug fix
// 開始記号しかない行では開始記号削除+通常の改行を行うようにした
// 自動インデント機能を利用するため、改行記号の挿入をNewLineメソッドに変更。ただしアンドゥが2回必要。

if (Document.Mode == "Markdown") { // 編集モードがMarkdownの場合
    // 現在行の内容を取得
    var s = Document.GetLine(Document.Selection.GetActivePointY(mePosLogical), 0);
    // リストまたはブロックコメント開始記号に一致する部分を取得
    if (s.match(/^\s*([-\*\+>] ?|\d+\. ?)[^\s]+$/))
    {
        var s_syntax = s.replace(/^\s*([-\*\+>] ?|\d+\. ?).*$/,"$1");
        // 順序ありリストの場合は数値を+1する
        var s_num = s_syntax.replace(/^(\d+).*/,"$1");
        if (s_num !== "") {
            s_num = Number(s_num);
            s_num = s_num + 1;
            s_syntax = s_syntax.replace(/^\d+/,s_num);
        }
    }
    else if (s.match(/^\s*([-\*\+>]|\d+\.)\s*$/)) { // インデントと開始記号のみは場合は削除
        Document.Selection.DeleteLeft(s.length);
        s_syntax = "";
    }
    else { // 指定の構文がない場合は改行のみ
        s_syntax = "";
    }
}
else { // 編集モードがMarkdown以外の場合は改行のみ
    s_syntax = "";
}
// 改行と開始記号を挿入
// Document.Selection.Text = "\n" + s_syntax;
Document.Selection.NewLine()
Document.Selection.Text = s_syntax;
// alert(s_syntax); //[dev]

(2018/10/15) catfist さんが作成したコードを元に、以下の機能の追加・修正を行いました。

追加:

  • 実行後に Undo を行った場合に、1回の Undo 操作で元の状態に戻るように調整
  • 行頭で改行した場合には、通常の改行を挿入する

修正:

  • 文中に半角スペースが入っているリスト行 (「* Hello World」など) で改行をすると、その行が消えてしまう不具合を修正

追伸:

  • さくさくと箇条書きできる感じが気持ち良いので、私は「Document.Mode == "Markdown"」の箇所を「Document.Mode == "Markdown" || Document.Mode == "Text"」に変えて、無題ドキュメント等でも発動するようにして使っています。
#title="Markdown文書で改行時にリスト、引用ブロック開始記号を自動入力"

// 編集モードが'Markdown'の場合のみ実行
// 現在行が以下の構文を含む場合、改行して行頭に開始記号を追加する
// (順序ありリストの場合は数値を1加算する)
//
// 順序なしリスト: '-','*','+'
// 順序ありリスト: '1.','2.'...
// 引用ブロック  : '>'
//
// 開始記号のみの場合は記号を削除して改行する
//
// Enterに割り当てて使うことを想定

Redraw = false;

if (Document.Mode == "Markdown"
    || Document.Mode == "Text") { // 編集モードがMarkdownの場合
    // 現在位置を取得
    var x = Document.Selection.GetActivePointX(mePosLogical);
    var y = Document.Selection.GetActivePointY(mePosLogical);
    // 現在行の内容を取得
    var s = Document.GetLine(Document.Selection.GetActivePointY(mePosLogical), 0);
    var s_indent = s.match(/^[ \t]*/i, "$1");    
    // リストまたはブロックコメント開始記号に一致する部分を取得
    if (x === 1) {
        Document.Selection.NewLine();
    } else if (s.match(/^\s*([-\*\+>] +|\d+\. +)[^\s]/))
    {
        var s_syntax = s.replace(/^\s*([-\*\+>] ?|\d+\. ?).*$/,"$1");
        // 順序ありリストの場合は数値を+1する
        var s_num = s_syntax.replace(/^(\d+).*/,"$1");
        if (s_num !== "") {
            s_num = Number(s_num);
            s_num = s_num + 1;
            s_syntax = s_syntax.replace(/^\d+/,s_num);
        }
        Document.Selection.Text = "\n" + s_indent + s_syntax;
    }
    else if (s.match(/^\s*([-\*\+>]|\d+\.)\s*$/)) { // インデントと開始記号のみの場合は削除
        Document.Selection.SetAnchorPoint(mePosLogical, 1, y);
        Document.Selection.EndOfLine(true, mePosLogical);
        Document.Selection.NewLine();
    }
    else { // 指定の構文がない場合は改行のみ
        Document.Selection.NewLine();
    }
}
else { // 編集モードがMarkdown以外の場合は改行のみ
    Document.Selection.NewLine();
}

Redraw = true;
スポンサーリンク