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

提供: MeryWiki
ナビゲーションに移動 検索に移動
作成
 
MSY-07 (トーク | 投稿記録)
SyntaxHighlightにcopyの追加
 
(4人の利用者による、間の14版が非表示)
1行目: 1行目:
改行を挿入し、編集モードがMarkdownでありかつ現在行がリストまたは引用ブロックの場合は開始記号を挿入します。
== catfist 版 ==
順序ありリスト(1.等)の場合、数値を+1します。
改行を挿入し、編集モードがMarkdownでありかつ現在行がリストまたは引用ブロックの場合は開始記号を挿入します。順序ありリスト(1.等)の場合、数値を+1します。
 
<syntaxhighlight lang="javascript" copy>
#title="Markdown文書で改行時にリスト、引用ブロック開始記号を自動入力"


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


if (Document.Mode == "Markdown") { // 編集モードがMarkdownの場合
if (Document.Mode == "Markdown") { // 編集モードがMarkdownの場合
20行目: 29行目:
     var s = Document.GetLine(Document.Selection.GetActivePointY(mePosLogical), 0);
     var s = Document.GetLine(Document.Selection.GetActivePointY(mePosLogical), 0);
     // リストまたはブロックコメント開始記号に一致する部分を取得
     // リストまたはブロックコメント開始記号に一致する部分を取得
     var s_syntax = s.replace(/^[ \s]*([-\*\+>] ?|\d\. ?).*$/,"$1");
     if (s.match(/^\s*([-\*\+>] ?|\d+\. ?)[^\s]+$/))
    // 順序ありリストの場合は数値を+1する
    {
    var s_num = s_syntax.replace(/^(\d+).*/,"$1");
        var s_syntax = s.replace(/^\s*([-\*\+>] ?|\d+\. ?).*$/,"$1");
    if (s_num !== "") {
        // 順序ありリストの場合は数値を+1する
        s_num = Number(s_num)
        var s_num = s_syntax.replace(/^(\d+).*/,"$1");
        s_num = s_num + 1
        if (s_num !== "") {
        s_syntax = s_syntax.replace(/^\d+/,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以外の場合は改行のみ
else { // 編集モードがMarkdown以外の場合は改行のみ
     s_syntax = ""
     s_syntax = "";
}
}
// 改行と開始記号を挿入
// 改行と開始記号を挿入
Document.Selection.Text = "\n" + s_syntax;
// Document.Selection.Text = "\n" + s_syntax;
</source>
Document.Selection.NewLine()
Document.Selection.Text = s_syntax;
// alert(s_syntax); //[dev]
</syntaxhighlight>
 
== yuko 版 ==
catfist さんが作成したコードを元に、以下の機能の追加・修正を行いました。
 
=== 追加 ===
* 実行後に Undo を行った場合に、1回の Undo 操作で元の状態に戻るように調整
* 行頭で改行した場合には、通常の改行を挿入する
* タスクリスト (* [ ]) に対応
 
=== 修正 ===
* 文中に半角スペースが入っているリスト行 (「* Hello World」など) で改行をすると、その行が消えてしまう不具合を修正
 
=== 追伸 ===
* さくさくと箇条書きできる感じが気持ち良いので、私は「Document.Mode == "Markdown"」の箇所を「Document.Mode == "Markdown" || Document.Mode == "Text"」に変えて、無題ドキュメント等でも発動するようにして使っています。
 
=== ソースコード ===
<syntaxhighlight lang="javascript" copy>
#title="Markdown文書で改行時にリスト、引用ブロック開始記号を自動入力"
BeginUndoGroup();
 
// 編集モードが'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*([-*+>]( \[ ]| \[x])?|\d+\.)\s+[^\s].*$/)) {
        var s_syntax = s.replace(/^\s*(([-*+>]( \[ ]| \[x])?|\d+\.)\s).*$/,"$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);
        }
        // チェック済みタスクリスト記号 [x] は [ ] に置換
        s_syntax = s_syntax.replace(/\[x]/, "[ ]");
        Document.Selection.Text = "\n" + s_indent + s_syntax;
    }
    // インデントと開始記号のみの場合は削除
    else if (s.match(/^\s*([-*+>]( \[ ]| \[x])?|\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;
</syntaxhighlight>

2025年6月30日 (月) 00:12時点における最新版

catfist 版[編集]

改行を挿入し、編集モードが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]

yuko 版[編集]

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

追加[編集]

  • 実行後に Undo を行った場合に、1回の Undo 操作で元の状態に戻るように調整
  • 行頭で改行した場合には、通常の改行を挿入する
  • タスクリスト (* [ ]) に対応

修正[編集]

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

追伸[編集]

  • さくさくと箇条書きできる感じが気持ち良いので、私は「Document.Mode == "Markdown"」の箇所を「Document.Mode == "Markdown" || Document.Mode == "Text"」に変えて、無題ドキュメント等でも発動するようにして使っています。

ソースコード[編集]

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

// 編集モードが'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*([-*+>]( \[ ]| \[x])?|\d+\.)\s+[^\s].*$/)) {
        var s_syntax = s.replace(/^\s*(([-*+>]( \[ ]| \[x])?|\d+\.)\s).*$/,"$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);
        }
        // チェック済みタスクリスト記号 [x] は [ ] に置換
        s_syntax = s_syntax.replace(/\[x]/, "[ ]");
        Document.Selection.Text = "\n" + s_indent + s_syntax;
    }
    // インデントと開始記号のみの場合は削除
    else if (s.match(/^\s*([-*+>]( \[ ]| \[x])?|\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;
スポンサーリンク