@curvenote/schema
Version:
Schema and markdown parser for @curvenote/editor
118 lines • 4.11 kB
JavaScript
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