generated at
オペレーターが編集したら自動的にレビュー待ちタグを付けるUserScript
SV以外が #ナレッジ記事 というタグが付けられたページを編集すると、ページの最上部に #レビュー待ちナレッジ記事 を追加するUserScript

このページでは確認しないでください
下に書かれている解説も全て「レビュー待ち」に置換してしまう為

UserScript Page Edit APIを使っている
用途
コールセンターの

できたshokai
以下、scriptとその解説です


グローバル汚染しないようスコープを作る
script.js
requestAnimationFrame(() => {
requestAnimationFrameを使う理由
個人ページに書いた設定の読み込みを待つため
以下は全てこのUserScript用のスコープ内で実行される

SVはこのscriptを使わない
script.js
if (window.KCS?.role === 'SV') return;
早期returnでさっさと終了する

UserScript Eventslines:changedで行の変更を検知してレビュー状態を更新する
script.js
cosense.on('lines:changed', ({ by }) => { if (by === 'edit') updateKnowledgeReviewState(); });
by === 'edit' lines:changed の発火元を区別している
区別しないと、同じページを編集している他人の編集でもタグが付いてしまう

lines:changed イベントから呼び出される関数。hashtagを書き換える
script.js
async function updateKnowledgeReviewState () { if (cosense.Layout !== 'page') return; if (!cosense.Page.metadata?.links?.includes('ナレッジ記事')) return; if (updateAllLinksInPage({ from: 'レビュー完了ナレッジ記事', to: 'レビュー待ちナレッジ記事' })) return; if (cosense.Page.metadata?.links?.includes('レビュー待ちナレッジ記事')) return; cosense.Page.insertLine('#レビュー待ちナレッジ記事', 1); }
対象は #ナレッジ記事 が付いているページだけ
もちろんレビュー完了ナレッジ記事というリンク記法もレビュー待ちナレッジ記事に置換する
置換対象が無い場合
ページの最上部に #レビュー待ちナレッジ記事 を書き込む

ページ内の全てのリンク記法を置換する便利な関数
返り値
条件に合う対象を置換したら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; }


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