オペレーターが編集したら自動的にレビュー待ちタグを付けるUserScript
https://gyazo.com/341f75ce49e6a4a9221b531001421971
このページでは確認しないでください
下に書かれている解説も全て「レビュー待ち」に置換してしまう為
用途
コールセンターの
できたshokai.icon
以下、scriptとその解説です
グローバル汚染しないようスコープを作る
code:script.js
requestAnimationFrame(() => {
個人ページに書いた設定の読み込みを待つため
以下は全てこのUserScript用のスコープ内で実行される
SVはこのscriptを使わない
code:script.js
if (window.KCS?.role === 'SV') return;
code:script.js
cosense.on('lines:changed', ({ by }) => {
if (by === 'edit') updateKnowledgeReviewState();
});
by === 'edit'でlines:changedの発火元を区別している
区別しないと、同じページを編集している他人の編集でもタグが付いてしまう
lines:changedイベントから呼び出される関数。hashtagを書き換える
code: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);
}
https://gyazo.com/dca8a7284268b1e830b3038fb7e230d8
対象は#ナレッジ記事が付いているページだけ
https://gyazo.com/2b1d00e1872ae582a0cee6a1b68d39ba
置換対象が無い場合
ページ内の全てのリンク記法を置換する便利な関数
返り値
条件に合う対象を置換したらtrue、1つも置換しなかったらfalse
code: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し、リンク記法だけ置換して、文字列に戻す
code: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;
}
グローバル汚染しないように作ったスコープを閉じる
code:script.js
});