Scrapboxのメニューにページの見出しを作るUserScript
参考文献
code:script.js
(function () {
scrapbox.PageMenu.addMenu({
title: 'sections',
onClick: () => {
renderSectionItem();
}
});
function renderSectionItem (object) {
scrapbox.PageMenu('sections').removeAllItems()
for (let line of scrapbox.Page.lines) {
if (!line.section.start) continue
const image = line.nodes && getIconUrl(line.nodes)
const noIcon = !!image
const title = line.nodes ? renderPlainText(line.nodes, {noIcon}) : line.text
const onClick = () => location.hash = line.id
scrapbox.PageMenu('sections').addItem({title, image, onClick})
}
};
renderSectionItem();
function renderPlainText (node, options) {
if (node instanceof Array) return node.map(node => renderPlainText(node, options)).join('')
if (typeof node === 'string') return node
switch (node.type) {
case 'icon':
case 'strong-icon':
return options.noIcon ? ' ' : node.unit.page
}
return renderPlainText(node.children, options)
};
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
};
})()