レビューしましたボタンUserScript
動作確認用エリア
確認したら、
ctrl(command) + z
でundoして元に戻してください

#レビュー待ちナレッジ記事
これは置換されない。リンクでもhashtagでもないので
インデントされた
文字装飾記法の中のリンク記法、のような複雑なテキストも、リンクの部分だけ置換する
バッククオートで囲んだインラインコード記法の #レビュー待ちナレッジ記事
は置換しない
以下、UserScriptと解説です

グローバル汚染しなようにスコープを閉じる
以下は全てこのUserScript用のスコープ内で実行される
script.jsif (window.KCS?.role !== 'SV') return;
KCS roleの設定方法
Page menuにボタンを追加する
script.jscosense.PageMenu.addMenu({
title: 'レビューしました',
icon: 'fas fa-check',
onClick: updateReviewTag
});
Page menuに追加したレビューしましたボタンを押すと呼び出される関数
script.jsasync function updateReviewTag () {
if (!updateAllLinksInPage({ from: 'レビュー待ちナレッジ記事', to: 'レビュー完了ナレッジ記事' })) {
alert('このページは #レビュー待ちナレッジ記事 ではありません');
return
}
await cosense.Page.waitForSave();
alert('#レビュー完了ナレッジ記事 に変更しました');
}
ページ内の全リンク記法を置換する便利な関数
返り値
条件に合う対象を置換したらtrue、1つも置換しなかったらfalse
script.jsfunction updateAllLinksInPage({ from, to }) {
let updated = false;
for (const [index, line] of cosense.Page.lines.entries()) {
if (!line.nodes) continue;
const result = updateLink({ node: line.nodes, from, to });
if (result !== line.text) {
cosense.Page.updateLine(result, index);
updated = true;
}
}
return updated;
}
1行を処理する関数
行の文字列からブラケティングをparseし、リンク記法だけ置換して、文字列に戻す
script.jsfunction updateLink({ node, from, to }) {
const args = { from, to };
if (typeof node === 'string') return node;
if (Array.isArray(node)) return node.map(i => updateLink({ node: i, ...args })).join('');
switch (node.type) {
case 'link':
case 'hashTag': {
if (!node.unit.project && node.unit.page === from) {
node.unit.page = to;
}
return node.unit.whole;
}
case 'indent':
case 'quote': {
return node.unit.tag + updateLink({ node: node.children, ...args });
}
case 'deco': {
return '[' + node.unit.deco + ' ' + updateLink({ node: node.children, ...args }) + ']';
}
case 'strong': {
return '[[' + updateLink({ node: node.children, ...args }) + ']]';
}
}
return node.unit.whole;
}
indentとかdecoとか、node typeが増えたら対応しなければならない
グローバル汚染しないように作ったスコープを閉じる