CosenseでRINKシステムするUserScript
/shokai/オペレーターが編集したら自動的にレビュー待ちタグを付けるUserScriptより。
変更履歴
2025/7/14 基本的な機能の実装
2025/7/15 infoboxの上に表示されるように変更
code:script.js
requestAnimationFrame(() => {
cosense.on('lines:changed', ({ by }) => {
if (by === 'edit') updateKnowledgeReviewState();
});
async function updateKnowledgeReviewState () {
if (cosense.Layout !== 'page') return;
//ページのタイトルがナンバリングになっているかを確認する
if (!(/^\d{2}\./.test(cosense.Page.title)))return;
console.log("このページのタイトルは、二ケタの半角数字+.ではじまっています");
if (!cosense.Page.metadata?.links?.includes('情報カード')) return;
console.log("情報カードというリンクを持っています");
const matchedLink = cosense.Page.metadata?.links?.find(link =>
typeof link === "string" && /^\d{2}\./.test(link)
);
console.log("このページのリンクに二ケタの半角数字+.ではじまるページがあります");
if (!matchedLink) return;
const tempJSON = await fetchPageJSON(encodeURI(matchedLink))
const refpageList = tempJSON.relatedPages.links1hop
setRINK(refpageList)
return;
}
async function fetchPageJSON(encodedPageTitle) {
const url = https://scrapbox.io/api/pages/${scrapbox.Project.name}/${encodedPageTitle};
const response = await fetch(url);
if (!response.ok) {
throw new Error(${response.status} ${response.statusText});
}
const json = await response.json();
return json;
}
function setRINK(arry){
const titles = arry.map(obj => obj.title).sort();
if (document.getElementById("tempRINKList")?.innerText == titles.join("\n")) {
const tempElem = document.getElementById("tempRINKList");
const sidebar = document.querySelector(".page-sidebar");
if (tempElem && tempElem.parentElement !== sidebar) {
// 親要素が .page-sidebar ではない場合の処理
sidebar.insertBefore(tempElem, sidebar.firstChild);
tempElem.style.position = "static"
}
return
}
const divBody = document.createElement("div")
divBody.id = "tempRINKList"
divBody.innerText = titles.join("\n")
const sidebar = document.querySelector(".page-sidebar")
if (sidebar){
sidebar.prepend(divBody)
divBody.style.position = "static"
}else{
const appContainer = document.querySelector(".app .container .page-column")
appContainer.append(divBody)
}
}
});
code:style.css
#tempRINKList{
position: absolute;top: 72px;left: 20px;background: floralwhite;padding: 1em;
width:280px;border-radius: 5px;
}
https://gyazo.com/4eb5a84d27113c242952f3e5445aa7fd
以前のversionでは左側に表示されていた
https://gyazo.com/6daff966c58ad9300670b64230d96393
CSSの幅が、拡張ディスプレイ用のものを使い回しているのでかなり過剰