generated at
レビューしましたボタンUserScript



動作確認用エリア
確認したら、 ctrl(command) + z でundoして元に戻してくださいshokai
インデントされた #レビュー待ちナレッジ記事 というhashtag
大きな文字の中のレビュー待ちナレッジ記事というリンク記法
> インデントされた引用の中でインデントされた太字の中の #レビュー待ちナレッジ記事 というhashtag記法
これらが全て #レビュー完了ナレッジ記事 に置換される
#レビュー待ちナレッジ記事
これは置換されない。リンクでもhashtagでもないので

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




以下、UserScriptと解説ですshokai

グローバル汚染しなようにスコープを閉じる
script.js
requestAnimationFrame(() => {
以下は全てこのUserScript用のスコープ内で実行される

このUserScriptを使うのはSVだけ
script.js
if (window.KCS?.role !== 'SV') return;
SVではない場合は早期returnし、ここから下のコードを実行しない
KCS roleの設定方法

Page menuにボタンを追加する
script.js
cosense.PageMenu.addMenu({ title: 'レビューしました', icon: 'fas fa-check', onClick: updateReviewTag });

Page menuに追加したレビューしましたボタンを押すと呼び出される関数
script.js
async function updateReviewTag () { if (!updateAllLinksInPage({ from: 'レビュー待ちナレッジ記事', to: 'レビュー完了ナレッジ記事' })) { alert('このページは #レビュー待ちナレッジ記事 ではありません'); return } await cosense.Page.waitForSave(); alert('#レビュー完了ナレッジ記事 に変更しました'); }
変更がサーバーに保存されるまでcosense.Page.waitForSave()で待機してから、「変更しました」とalert表示している

ページ内の全リンク記法を置換する便利な関数
返り値
条件に合う対象を置換したらtrue、1つも置換しなかったらfalse
script.js
function 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.js
function 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; }
やってる事はUpdate all linksとほぼ同じ
ページの見出しを作るUserScriptでも、置換ではないけど似たようなことをやっている
indentとかdecoとか、node typeが増えたら対応しなければならない

グローバル汚染しないように作ったスコープを閉じる