UNPKG

@curvenote/schema

Version:

Schema and markdown parser for @curvenote/editor

118 lines 4.11 kB
import { createLatexStatement } from '../serialize/tex/utils'; import { NodeGroups } from './types'; export var CalloutKinds; (function (CalloutKinds) { CalloutKinds["active"] = "active"; CalloutKinds["success"] = "success"; CalloutKinds["info"] = "info"; CalloutKinds["warning"] = "warning"; CalloutKinds["danger"] = "danger"; })(CalloutKinds || (CalloutKinds = {})); export var AdmonitionKinds; (function (AdmonitionKinds) { AdmonitionKinds["attention"] = "attention"; AdmonitionKinds["caution"] = "caution"; AdmonitionKinds["danger"] = "danger"; AdmonitionKinds["error"] = "error"; AdmonitionKinds["hint"] = "hint"; AdmonitionKinds["important"] = "important"; AdmonitionKinds["note"] = "note"; AdmonitionKinds["seealso"] = "seealso"; AdmonitionKinds["tip"] = "tip"; AdmonitionKinds["warning"] = "warning"; })(AdmonitionKinds || (AdmonitionKinds = {})); export function calloutKindToAdmonition(kind) { // https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html#directives // attention, caution, danger, error, hint, important, note, tip, warning switch (kind) { case CalloutKinds.active: return 'note'; case CalloutKinds.success: return 'important'; case CalloutKinds.info: return 'important'; case CalloutKinds.warning: return 'warning'; case CalloutKinds.danger: return 'danger'; default: return 'note'; } } export function admonitionToCalloutKind(kind) { switch (kind) { case 'danger': case 'error': return CalloutKinds.danger; case 'warning': return CalloutKinds.warning; case 'note': return CalloutKinds.active; case 'important': return CalloutKinds.success; default: return CalloutKinds.info; } } const callout = { group: NodeGroups.top, content: NodeGroups.blockOrEquationOrHeading, attrs: { kind: { default: CalloutKinds.info }, }, toDOM(node) { return ['aside', { class: `callout ${node.attrs.kind}` }, 0]; }, parseDOM: [ { tag: 'aside.callout', getAttrs(dom) { if (dom.classList.contains(CalloutKinds.active)) return { kind: CalloutKinds.active }; if (dom.classList.contains(CalloutKinds.success)) return { kind: CalloutKinds.success }; if (dom.classList.contains(CalloutKinds.info)) return { kind: CalloutKinds.info }; if (dom.classList.contains(CalloutKinds.warning)) return { kind: CalloutKinds.warning }; if (dom.classList.contains(CalloutKinds.danger)) return { kind: CalloutKinds.danger }; return { kind: CalloutKinds.info }; }, // aside is also parsed, and this is higher priority priority: 60, }, ], attrsFromMyst: (token) => ({ kind: admonitionToCalloutKind(token.kind), }), toMyst: (props) => { let calloutKind = props.class.split(' ')[1]; if (!Object.values(AdmonitionKinds).includes(calloutKind)) { calloutKind = calloutKindToAdmonition(calloutKind); } return { type: 'admonition', kind: calloutKind, children: (props.children || []), }; }, }; export const toMarkdown = (state, node) => { state.ensureNewLine(); const { kind } = node.attrs; const admonition = calloutKindToAdmonition(kind); // This is a bit of a hack, callouts often have other directives state.write(`\`\`\`\`{${admonition}}`); state.ensureNewLine(); state.renderContent(node); state.write('````'); state.closeBlock(node); }; export const toTex = createLatexStatement(() => ({ command: 'callout', }), (state, node) => { state.renderContent(node); }); export default callout; //# sourceMappingURL=callout.js.map