scrapbox-card-bubble-2/parser
scrapbox-card-bubble-2で使うページカードの文章をつくるやつ
基本的にはscrapbox-preview-box/parserと同じ
一部の構文を省略する
code:script.js
export const css =`
p {
margin: 0;
display: block;
}
code {
font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
font-size: 90%;
color: var(--code-color, #342d9c);
background-color: var(--code-bg, rgba(0,0,0,0.04));
padding: 0;
white-space: pre-wrap;
word-wrap: break-word;
}
.icon {
height: 11px;
vertical-align: middle;
}
.page-link {
background-color: transparent;
text-decoration: none;
cursor: pointer;
color: var(--page-link-color, #5e8af7);
}
`;
code:script.js
import {ScrapboxParser} from '../scrapbox-parser.min.js/script.js';
import {
p, span, code, img, fragment
} from '../easyDOMgenerator/script.js';
export function parse(text, project) {
const blocks = ScrapboxParser.parse(text, {hasTitle: false});
return blocks.flatMap(
block => block.type === 'line' ?
p(...convertLine(block, project)) :
[]
);
}
function convertLine({nodes}, project) {
return nodes.map(node => convertNode(node, project));
}
function convertNode(node, project) {
switch (node.type) {
case 'code':
return code(node.text);
case 'formula':
return code(node.formula);
case 'commandLine':
return code(${node.symbol} ${node.text});
case 'helpfeel':
return code(? ${node.text});
case 'quote':
case 'strong':
case 'decoration':
return node.nodes.length > 1 ?
fragment(...node.nodes.map(node_ => span(convertNode(node_)))) :
convertNode(node.nodes0);
case 'icon':
case 'strongIcon':
return img({className: 'icon', src: node.pathType ==='relative' ?
/api/pages/${project}/${node.path}/icon:
/api/pages${node.path}/icon
});
case 'strongImage':
case 'image':
case 'googleMap':
return '';
case 'link':
return node.pathType !== 'absolute' ?
span({className: 'page-link'}, node.href) :
span({className: 'link'}, node.content || node.href);
case 'hashTag':
return span({className: 'page-link'}, #${node.href});
case 'plain':
case 'blank':
return node.text;
}
}
test code
code:js
import('/api/code/programming-notes/scrapbox-card-bubble-2%2Fparser/test1.js')
.then(({execute}) => execute());
code:test1.js
import {parse} from './script.js';
export async function execute() {
const project = scrapbox.Project.name;
const res = await fetch(/api/pages/${project});
const {pages} = await res.json();
const texts = pages.map(({descriptions}) => descriptions.join('\n'));
console.log(texts.map(text => parse(text, project).map(dom => dom.outerHTML).join('\n')));
}
#2021-03-23 08:40:56