@curvenote/schema
Version:
Schema and markdown parser for @curvenote/editor
164 lines • 6.31 kB
JavaScript
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.toMarkdown = exports.toMyst = void 0;
const prosemirror_markdown_1 = require("prosemirror-markdown");
const utils_1 = require("./utils");
const nodes = __importStar(require("../../nodes"));
const clean_1 = require("../clean");
const mdast_1 = require("../mdast");
function mdPostProcess(md) {
// Replace trailing newlines in code fences
const post = md.replace(/\n\n```($|\n)/g, '\n```\n').replace(/```\n$/g, '```');
return post;
}
const mdNodes = {
text(state, node) {
var _a;
state.text((0, clean_1.cleanWhitespaceChars)((_a = node.text) !== null && _a !== void 0 ? _a : ''));
},
paragraph(state, node) {
state.renderInline(node);
state.closeBlock(node);
},
heading: nodes.Heading.toMarkdown,
blockquote(state, node) {
state.wrapBlock('> ', null, node, () => state.renderContent(node));
},
code_block: nodes.Code.toMarkdown,
horizontal_rule(state, node) {
state.write(node.attrs.markup || '---');
state.closeBlock(node);
},
hard_break(state, node, parent, index) {
for (let i = index + 1; i < parent.childCount; i += 1) {
if (parent.child(i).type !== node.type) {
state.write('\\\n');
return;
}
}
},
ordered_list(state, node) {
const start = node.attrs.order || 1;
const maxW = String(start + node.childCount - 1).length;
const space = state.repeat(' ', maxW + 2);
state.renderList(node, space, (i) => {
const nStr = String(start + i);
return `${state.repeat(' ', maxW - nStr.length) + nStr}. `;
});
},
bullet_list(state, node) {
state.renderList(node, ' ', () => `${node.attrs.bullet || '-'} `);
},
list_item(state, node) {
state.renderInline(node);
},
// Presentational
image: nodes.Image.toMarkdown,
figure: nodes.Figure.toMarkdown,
figcaption: nodes.Figcaption.toMarkdown,
footnote: nodes.Footnote.toMarkdown,
iframe: nodes.IFrame.toMarkdown,
time: nodes.Time.toMarkdown,
callout: nodes.Callout.toMarkdown,
aside: nodes.Aside.toMarkdown,
link_block: nodes.LinkBlock.toMarkdown,
// Technical
math: nodes.Math.toMarkdown,
equation: nodes.Equation.toMarkdown,
cite: nodes.Cite.toMarkdown,
cite_group: nodes.CiteGroup.toMarkdown,
mention: nodes.Mention.toMarkdown,
// Tables
table: nodes.Table.toMarkdown,
// Dynamic
variable: nodes.Variable.toMarkdown,
display: nodes.Display.toMarkdown,
dynamic: nodes.Dynamic.toMarkdown,
range: nodes.Range.toMarkdown,
switch: nodes.Switch.toMarkdown,
button: nodes.Button.toMarkdown,
};
const mdMarks = {
em: {
open: '*',
close: '*',
mixable: true,
expelEnclosingWhitespace: true,
},
strong: {
open: '**',
close: '**',
mixable: true,
expelEnclosingWhitespace: true,
},
link: {
open(state, mark, parent, index) {
var _a, _b;
const { options } = state;
const href = (_b = (_a = options.localizeLink) === null || _a === void 0 ? void 0 : _a.call(options, mark.attrs.href)) !== null && _b !== void 0 ? _b : mark.attrs.href;
return (0, utils_1.isPlainURL)(mark, href, parent, index, 1) ? '<' : '[';
},
close(state, mark, parent, index) {
var _a, _b;
const { options } = state;
const href = (_b = (_a = options.localizeLink) === null || _a === void 0 ? void 0 : _a.call(options, mark.attrs.href)) !== null && _b !== void 0 ? _b : mark.attrs.href;
return (0, utils_1.isPlainURL)(mark, href, parent, index, -1)
? '>'
: `](${state.esc(mark.attrs.href)}${mark.attrs.title ? ` ${state.quote(mark.attrs.title)}` : ''})`;
},
},
code: {
open(state, mark, parent, index) {
return (0, utils_1.backticksFor)(parent.child(index), -1);
},
close(state, mark, parent, index) {
return (0, utils_1.backticksFor)(parent.child(index - 1), 1);
},
escape: false,
},
abbr: (0, utils_1.wrapMark)('abbr', (state, mark) => (mark.attrs.title ? ` (${mark.attrs.title})` : '')),
subscript: (0, utils_1.wrapMark)('sub'),
superscript: (0, utils_1.wrapMark)('sup'),
strikethrough: (0, utils_1.wrapMark)('strike'),
underline: (0, utils_1.wrapMark)('u'),
};
function toMyst(doc, opts) {
var _a;
const defualtOpts = { tightLists: true };
const state = new prosemirror_markdown_1.MarkdownSerializerState(mdNodes, mdMarks, Object.assign(Object.assign({}, defualtOpts), opts));
state.mdastSerializer = (d) => (0, mdast_1.toMdastSnippet)(d, opts);
state.renderContent(doc);
const post = mdPostProcess(state.out);
return { content: post, mdastSnippets: (_a = state.mdastSnippets) !== null && _a !== void 0 ? _a : {} };
}
exports.toMyst = toMyst;
// TODO: GFM, CommonMark, etc!
function toMarkdown(doc, opts) {
const myst = toMyst(doc, opts);
return myst.content;
}
exports.toMarkdown = toMarkdown;
//# sourceMappingURL=index.js.map
;