UserScript:SystemReport
システムリポート
code: script.js
// バックアップ用のプロジェクト名
let backupProject = "init";
if (scrapbox.Project.name==="suto3scratchpad") {
backupProject = "suto3";
} else {
//backupProject = "suto3suto3";
backupProject = "suto3scratchpad";
}
//console.log(backupProject)
const project = scrapbox.Project.name ;
const menu = 'SystemReport' ;
code: script.js
scrapbox.PageMenu.addMenu({
title: menu,
image: '/api/pages/suto3/UserScript:SystemReport/icon'
})
ページのリンクを拾ってくる
code: script.js
// APIを叩いてページのリンクを拾ってくる
scrapbox.PageMenu(menu).addItem({
title: () => "Linked Page Report",
onClick: () => {
const project = scrapbox.Project.name
const { title, lines } = scrapbox.Page
const report="Report-" + title
const url = https://scrapbox.io/api/pages/${project}/${title}
fetch(url)
.then((response) => response.json())
.then((json) => {
// JSONデータを扱った処理など
//console.log(json)
//console.log(relatedPagesData)
// 1 hop link の取得
.join('\n');
//console.log(l1);
// 2 hop link の取得
.join('\n');
//console.log(l2);
// ページ本文を組み立て
const now = new Date().toLocaleString()
const body =
"Project : + project + "\n"
+ "Page : + project + "/" + title + "\n"
+ "Date : " + now + "\n\n"
+ "1 hop link :\n" + l1
+ "\n\n"
+ "2 hop link :\n" + l2
+ "\nEOF\n"
//console.log(body)
// バックアップ用プロジェクトにレポートを作成
window.open(https://scrapbox.io/${backupProject}/${report}?body=${encodeURIComponent(body)})
}).catch(err => {
console.error('fetch failed', err)
})
}
})
code: script.js
// APIを叩いてページのリンクを拾ってくる
scrapbox.PageMenu(menu).addItem({
title: () => "Linked Page (Graphviz)",
onClick: () => {
const project = scrapbox.Project.name
const { title, lines } = scrapbox.Page
const report="Report-" + title
const url = https://scrapbox.io/api/pages/${project}/${title}
fetch(url)
.then((response) => response.json())
.then((json) => {
// JSONデータを扱った処理など
console.log(json)
//console.log(relatedPagesData)
// 1 hop link の取得
//.map(line => ' "' + title + '" -> "' + line.titleLc + '";')
.map(line => ' "' + title + '" -> "' + line.title + '";')
.join('\n');
//console.log(l1);
// 2 hop link の取得
.map(line => ' "' + line.linksLc0 + '" -> "' +line.titleLc + '";') .join('\n');
//console.log(l2);
// ページ本文を組み立て
const now = new Date().toLocaleString()
const body =
"Project : + project + "\n"
+ "code:d3.js\n"
+ " const digraph = ` digraph g {\n"
+ " rankdir = LR;\n"
+ " ratio=auto;\n"
+ " overlap=false;\n"
+ " ranksep=1.1;\n"
+ l1 + "\n"
+ l2 + "\n"
+ " }`\n"
+ " d3.select(\"#graph\").graphviz()\n"
+ " .fade(false)\n"
+ " .renderDot(digraph);\n\n"
+ https://suto3.github.io/rund3?code=https://scrapbox.io/api/code/${backupProject}/${report}/d3.js
+ "\nEOF\n"
console.log(body)
// バックアップ用プロジェクトにレポートを作成
//window.open(https://scrapbox.io/${backupProject}/${report}?body=${encodeURIComponent(body)})
}).catch(err => {
console.error('fetch failed', err)
})
}
})
最近更新されたページ
code: script.js
// 直近に変更されたページのリストを取得
scrapbox.PageMenu(menu).addItem({
title: 'Top20',
onClick: () => {
const report="Top20-" + scrapbox.Project.name
const top = scrapbox.Project.pages
.filter(page => page.exists)
.slice(0, 20)
.join('\n')
// ページ本文を組み立て
const now = new Date().toLocaleString()
const body =
"Project : + project + "\n"
+ "Date : " + now + "\n\n"
+ top
+ "\nEOF\n"
//console.log(body);
// バックアップ用プロジェクトにレポートを作成
window.open(https://scrapbox.io/${backupProject}/${report}?body=${encodeURIComponent(body)})
}
})
code: script.js
// ページリストの底のほうを取得
scrapbox.PageMenu(menu).addItem({
title: 'Bottom20',
onClick: () => {
const report="Bottom20-" + scrapbox.Project.name
const bottom = scrapbox.Project.pages
.filter(page => page.exists)
.slice(-20)
.join('\n')
// ページ本文を組み立て
const now = new Date().toLocaleString()
const body =
"Project : + project + "\n"
+ "Date : " + now + "\n\n"
+ bottom
+ "\nEOF\n"
//console.log(body);
// バックアップ用プロジェクトにレポートを作成
window.open(https://scrapbox.io/${backupProject}/${report}?body=${encodeURIComponent(body)})
}
})
ページタイトルをパターンマッチングで拾ってくる
code: script.js
// ページリストをパターンマッチングで拾ってくる
// パターンマッチングの対象は、ページタイトルのみ
scrapbox.PageMenu(menu).addItem({
title: 'Pagename',
onClick: () => {
const report="Pattern-" + scrapbox.Project.name
const max = 200 // 最大取得件数
const pat = prompt(
"検索パターンを入力してください\n"
+ "最大 " + max + " 件まで取得します\n"
+ "何も入力しなければキャンセルします"
)
if (pat === undefined || pat === null) return
if (!(0 < pat.length && pat.length < 101)) return
//console.log(pat);
const pagelist = scrapbox.Project.pages
.filter(page => page.exists)
.filter(line => line.title.match(pat))
//console.log(pagelist);
if (pagelist.length > max) {
const ret = confirm(
"件数が " + max + " 件を超えています。\n"
+ "続行しますか? (OKで強制続行)"
)
if(!ret) return
}
// ページ本文を組み立て
const now = new Date().toLocaleString()
const body =
"Project : + project + ": "+ pat +"\n"
+ "Date : " + now + "\n\n"
+ "Pattern : " + pat + "\n\n"
+ "\nEOF\n"
//console.log(body);
// バックアップ用プロジェクトにレポートを作成
window.open(https://scrapbox.io/${backupProject}/${report}?body=${encodeURIComponent(body)})
}
})
ページの情報
code: script.js
scrapbox.PageMenu(menu).addItem({
title: 'Page Info',
onClick: () => {
const url = '/api/pages/'
+ scrapbox.Project.name + '/'
+ scrapbox.Page.title
//console.log(url)
fetch(url)
.then(response => response.json())
.then(json => {
console.log(json)
// 文字数
const chars = scrapbox.Page.lines
.map(line => line.text.length)
.reduce((a,b) => a + b)
const created = new Date(json.created * 1000).toLocaleString()
//console.log(created)
const updated = new Date(json.updated * 1000).toLocaleString()
window.alert(
"ページ情報\n"
+ "プロジェクト名 : " + scrapbox.Project.name + "\n"
+ "ページ名 : " + scrapbox.Page.title + "\n"
+ "ページ行数 : " + json.lines.length + "\n"
+ "ページ文字数 : " + chars + "\n"
+ "作成年月日 : " + created + "\n"
+ "更新年月日 : " + updated + "\n"
+ "作成者 : " + json.user.name + "\n"
+ "Views : " + json.views + "\n"
)
}).catch(err => {
console.error('fetch failed', err)
})
}
})
https://svg-hosting.vercel.app/api/svg?url=https://scrapbox.io/api/code/suto3/analytics/a01.svg
UserScript.icon