「Markdown 向け、タスクリスト (* []) のチェック状態をトグル」の版間の差分
ナビゲーションに移動
検索に移動
ページの作成:「Markdown のリスト記号をトグル (追加/削除) します。 複数行の選択状態で実行すると、複数行に適用できます。 <source lang="javas…」 |
編集の要約なし |
||
| 1行目: | 1行目: | ||
Markdown | Markdown でのタスクリスト記号 (* [ ] / * [x]) のチェック状態をトグルします。 | ||
複数行選択及びマルチカーソル機能に対応しています。 | |||
<source lang="javascript"> | <source lang="javascript"> | ||
#title = | #title = 'Markdown タスクリストのチェックをトグル'; | ||
Redraw = false; | |||
BeginUndoGroup(); | BeginUndoGroup(); | ||
var sel = Document.Selection; | |||
if (sel.Mode === meModeMulti) { | |||
doMultiAction(main); | |||
if ( | |||
} else { | } else { | ||
main(); | |||
} | } | ||
function main() { | |||
var | if (Document.Selection.IsEmpty) { | ||
var actX = sel.GetActivePointX(mePosLogical); | |||
var actY = sel.GetActivePointY(mePosLogical); | |||
toggleCheck(actY); | |||
sel.SetActivePoint(mePosLogical, actX, actY); | |||
} else { | |||
var topX = Document.Selection.GetTopPointX(mePosLogical); | |||
var bottomX = Document.Selection.GetBottomPointX(mePosLogical); | |||
var topY = Document.Selection.GetTopPointY(mePosLogical); | |||
var bottomY = Document.Selection.GetBottomPointY(mePosLogical); | |||
var ignoreY = 0; | |||
var | if (bottomX === 1) { | ||
ignoreY = bottomY; | |||
} | |||
for (var y = topY; y <= bottomY; y++) { | |||
if (y === ignoreY) { | |||
continue; | |||
} | |||
sel.SetActivePoint(mePosLogical, 1, y); | |||
toggleCheck(y); | |||
} | |||
Document.Selection.SetAnchorPoint(mePosLogical, topX, topY); | |||
Document.Selection.SetActivePoint(mePosLogical, bottomX, bottomY, true); | |||
} | } | ||
} | |||
// | function toggleCheck(y) { | ||
// | var lineText = Document.GetLine(y, meGetLineWithNewLines); | ||
if ( | var checked = lineText.match(/^\s*[*-] \[x]/); | ||
var unchecked = lineText.match(/^\s*[*-] \[ ]/); | |||
if (checked || unchecked) { | |||
sel.SelectLine(); | |||
sel.Delete(); | |||
if (checked) { | |||
sel.Text = lineText.replace(/^(\s*[*-] )\[x]/, '$1[ ]'); | |||
} else { | |||
sel.Text = lineText.replace(/^(\s*[*-] )\[ ]/, '$1[x]'); | |||
} | } | ||
} | } | ||
} | } | ||
function doMultiAction(fn) { | |||
var d = document, | |||
} | s = d.selection; | ||
s.Mode = meModeMulti; | |||
// ① まず、GetActivePos と GetAnchorPos で複数選択のリストを作成します | |||
var selections = [{s: s.GetAnchorPos(), e: s.GetActivePos()}]; | |||
if (s.Count > 0) { | |||
selections = []; | |||
for (var i = 0; i < s.Count; i++) | |||
selections.push({s: s.GetActivePos(i), e: s.GetAnchorPos(i)}); | |||
} | |||
var p = 0; | |||
var q = 0; | |||
for (var i = 0; i < selections.length; i++) { | |||
// ② そのリストを上から順に SetActivePos で、「シングルカーソル」で範囲選択します。この段階で複数選択は解除され、通常のマクロ操作が可能となります | |||
s.SetActivePos(selections[i].s + p); | |||
s.SetActivePos(selections[i].e + p, true); | |||
q = d.TextLength; | |||
// ③ <ここで通常のマクロの機能を使って普通に編集などを行います> | |||
fn(); | |||
p += d.TextLength - q; | |||
// ④ 処理を行った後の選択範囲をリストに反映し、これをリストの最後まで繰り返します | |||
selections[i] = {s: s.GetAnchorPos(), e: s.GetActivePos()}; | |||
} | |||
// ⑤ そのリストを上から順に document.selection.AddPos(StartPos, EndPos) で複数選択として復元します | |||
for (var i = 0; i < selections.length; i++) | |||
s.AddPos(selections[i].s, selections[i].e); | |||
} | } | ||
</source> | </source> | ||
2020年9月4日 (金) 10:48時点における版
Markdown でのタスクリスト記号 (* [ ] / * [x]) のチェック状態をトグルします。
複数行選択及びマルチカーソル機能に対応しています。
#title = 'Markdown タスクリストのチェックをトグル';
Redraw = false;
BeginUndoGroup();
var sel = Document.Selection;
if (sel.Mode === meModeMulti) {
doMultiAction(main);
} else {
main();
}
function main() {
if (Document.Selection.IsEmpty) {
var actX = sel.GetActivePointX(mePosLogical);
var actY = sel.GetActivePointY(mePosLogical);
toggleCheck(actY);
sel.SetActivePoint(mePosLogical, actX, actY);
} else {
var topX = Document.Selection.GetTopPointX(mePosLogical);
var bottomX = Document.Selection.GetBottomPointX(mePosLogical);
var topY = Document.Selection.GetTopPointY(mePosLogical);
var bottomY = Document.Selection.GetBottomPointY(mePosLogical);
var ignoreY = 0;
if (bottomX === 1) {
ignoreY = bottomY;
}
for (var y = topY; y <= bottomY; y++) {
if (y === ignoreY) {
continue;
}
sel.SetActivePoint(mePosLogical, 1, y);
toggleCheck(y);
}
Document.Selection.SetAnchorPoint(mePosLogical, topX, topY);
Document.Selection.SetActivePoint(mePosLogical, bottomX, bottomY, true);
}
}
function toggleCheck(y) {
var lineText = Document.GetLine(y, meGetLineWithNewLines);
var checked = lineText.match(/^\s*[*-] \[x]/);
var unchecked = lineText.match(/^\s*[*-] \[ ]/);
if (checked || unchecked) {
sel.SelectLine();
sel.Delete();
if (checked) {
sel.Text = lineText.replace(/^(\s*[*-] )\[x]/, '$1[ ]');
} else {
sel.Text = lineText.replace(/^(\s*[*-] )\[ ]/, '$1[x]');
}
}
}
function doMultiAction(fn) {
var d = document,
s = d.selection;
s.Mode = meModeMulti;
// ① まず、GetActivePos と GetAnchorPos で複数選択のリストを作成します
var selections = [{s: s.GetAnchorPos(), e: s.GetActivePos()}];
if (s.Count > 0) {
selections = [];
for (var i = 0; i < s.Count; i++)
selections.push({s: s.GetActivePos(i), e: s.GetAnchorPos(i)});
}
var p = 0;
var q = 0;
for (var i = 0; i < selections.length; i++) {
// ② そのリストを上から順に SetActivePos で、「シングルカーソル」で範囲選択します。この段階で複数選択は解除され、通常のマクロ操作が可能となります
s.SetActivePos(selections[i].s + p);
s.SetActivePos(selections[i].e + p, true);
q = d.TextLength;
// ③ <ここで通常のマクロの機能を使って普通に編集などを行います>
fn();
p += d.TextLength - q;
// ④ 処理を行った後の選択範囲をリストに反映し、これをリストの最後まで繰り返します
selections[i] = {s: s.GetAnchorPos(), e: s.GetActivePos()};
}
// ⑤ そのリストを上から順に document.selection.AddPos(StartPos, EndPos) で複数選択として復元します
for (var i = 0; i < selections.length; i++)
s.AddPos(selections[i].s, selections[i].e);
}
スポンサーリンク