@curvenote/schema
Version:
Schema and markdown parser for @curvenote/editor
64 lines • 2.29 kB
JavaScript
import { NodeGroups } from './types';
import { getNumberedAttrs, getNumberedDefaultAttrs, readBooleanAttr, setNumberedAttrs, } from './utils';
const getAttrs = (level) => (dom) => (Object.assign(Object.assign({}, getNumberedAttrs(dom)), { level }));
const heading = {
attrs: Object.assign(Object.assign({}, getNumberedDefaultAttrs()), { level: { default: 1 } }),
content: `${NodeGroups.inline}*`,
group: NodeGroups.heading,
defining: true,
parseDOM: [
{ tag: 'h1', getAttrs: getAttrs(1) },
{ tag: 'h2', getAttrs: getAttrs(2) },
{ tag: 'h3', getAttrs: getAttrs(3) },
{ tag: 'h4', getAttrs: getAttrs(4) },
{ tag: 'h5', getAttrs: getAttrs(5) },
{ tag: 'h6', getAttrs: getAttrs(6) },
],
toDOM(node) {
return [`h${node.attrs.level}`, setNumberedAttrs(node.attrs), 0];
},
attrsFromMyst: (token) => {
var _a;
return ({
id: null,
label: null,
numbered: (_a = token.enumerated) !== null && _a !== void 0 ? _a : false,
level: token.depth,
});
},
toMyst: (props) => ({
type: 'heading',
depth: parseInt(props.tag.slice(1), 10),
enumerated: readBooleanAttr(props.numbered),
children: (props.children || []),
}),
};
export const toMarkdown = (state, node) => {
// TODO: Put the id in:
state.write(`${state.repeat('#', node.attrs.level)} `);
state.renderInline(node);
state.closeBlock(node);
};
export const toTex = (state, node) => {
const { level, id, numbered } = node.attrs;
if (level === 1)
state.write(`\\section${numbered ? '' : '*'}{`);
if (level === 2)
state.write(`\\subsection${numbered ? '' : '*'}{`);
if (level === 3)
state.write(`\\subsubsection${numbered ? '' : '*'}{`);
if (level === 4)
state.write(`\\paragraph${numbered ? '' : '*'}{`);
if (level === 5)
state.write(`\\subparagraph${numbered ? '' : '*'}{`);
if (level === 6)
state.write(`\\subparagraph${numbered ? '' : '*'}{`);
state.renderInline(node);
state.write('}');
if (numbered && id) {
state.write(`\\label{${id}}`);
}
state.closeBlock(node);
};
export default heading;
//# sourceMappingURL=heading.js.map