強調記法からページの見出しを作るUserScript
強調記号がある部分だけをピックして
見出しにしている。
script.jsscrapbox.PageMenu.addMenu({
title: '見出し',
image: 'https://gyazo.com/da0408108eda84e56a587630be5e4524/raw',
onClick: () => {
scrapbox.PageMenu('見出し').removeAllItems()
for (let line of scrapbox.Page.lines) {
if (!line.section.start) continue
if (!line.text.startsWith("[* ") && !line.text.startsWith("[** ") && !line.text.startsWith("[*** ")) continue
if (!line.nodes) continue
const image = ""
const noIcon = false
// [* hoge]と[** hoge]は先頭をインデントする。
const marginLeft = line.text.startsWith("[* ") ? " ・" : ""
const marginLeft2 = line.text.startsWith("[** ") ? "●" : ""
const title = marginLeft + marginLeft2 + renderPlainText(line.nodes)
const onClick = () => location.hash = line.id
scrapbox.PageMenu('見出し').addItem({ title, image, onClick })
}
}
})
function renderPlainText(node) {
if (node instanceof Array) return node.map(node => renderPlainText(node)).join('')
if (typeof node === 'string') return node
switch (node.type) {
case 'icon':
case 'strong-icon':
return node.unit.page
}
return renderPlainText(node.children)
}
function getIconUrl(node) {
if (/icon/.test(node.type)) {
return `/api/pages/${node.unit.project||scrapbox.Project.name}/${node.unit.page}/icon`
}
if (node instanceof Array) {
return node.map(getIconUrl).find(img => img)
}
return null
}