scrapboxlab/強調記法からページの見出しを作るUserScript
[*** ]などの強調記法からページの見出し作成します。
これみたいなリンクに対応していなかったので修正した。 Scrapbox側の見出し自動判別機能を使わないようにした。
[*** ]があれば全て見出し扱いとなる。
見出しがないページに遷移した場合、表示が更新されなかったのを修正した。
code:script.js
function makePageSectionFromStrongNotation(){
scrapbox.PageMenu.addMenu({
title: '見出し',
onClick: () => {
scrapbox.PageMenu('見出し').removeAllItems()
let items = []
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
items.push({ title, image, onClick })
}
addItemToButton(items);
}
})
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
case 'urlLink': // 対応していなかったので追記
return node.unit.title
}
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
}
function addItemToButton(items) {
if (items.length == 0) {
scrapbox.PageMenu('見出し').addItem({ title: "※見出しがありません。" , image: "", onClick: e=>{} })
return
}
for (let item of items) {
scrapbox.PageMenu('見出し').addItem({ title: item.title, image: item.image, onClick: item.onClick })
}
}
}
makePageSectionFromStrongNotation();
色をそれっぽくするやつ(こっちは完全自作)
code:style.css
a#見出し img {
filter: invert(1) brightness(0.4) sepia(.5) hue-rotate(180deg)
}