ページの見出しを表示するUserScript
変更点
メニューのボタンにアイコンフォントを使用
code:で始まる行は見出しとして表示しない
code:script.js
const indexes = function () {
scrapbox.PageMenu('Headings').removeAllItems()
let lineCount = 0;
let headingCount = 0;
for (let line of scrapbox.Page.lines) {
lineCount = lineCount + 1;
if (line.text == "") continue /* 空行の場合はスキップ */
/* 本文1行目も見出しに含む */
if (lineCount != 2) {
if (!line.section.start) continue /* line.section.startではない場合はスキップ */
if (line.title) continue /* タイトルの場合はスキップ */
}
const image = line.nodes && getIconUrl(line.nodes)
const noIcon = !!image
const title = line.nodes ? renderPlainText(line.nodes, {noIcon}) : line.text
/* if (title.startsWith('code:')) continue */
if (title.startsWith('http')) continue /* リンクと画像はスキップ */
const onClick = () => location.hash = line.id
scrapbox.PageMenu('Headings').addItem({title, image, onClick})
headingCount = headingCount + 1;
}
console.log("headingCount: " + headingCount);
if (headingCount == 0) {
scrapbox.PageMenu('Headings').addItem({
title: "No heading",
onClick: () => void(0),
})
}
}
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
case 'hashTag':
return ''
}
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
}
scrapbox.PageMenu.addMenu({
title: 'Headings',
onClick: indexes
})
アイコンフォントの設定はsettingsのstyle.css
ここではcontentでアイコンだけ指定する
code:style.css
}
content: '\f03a';
}
max-height: calc(80vh - 100px) !important;
}
@import "/api/code/mu373/ページの見出しを表示するUserScript/style.css";
冒頭に置かないとインポートされない模様