UNPKG

@curvenote/schema

Version:

Schema and markdown parser for @curvenote/editor

134 lines 5.13 kB
export const DEFAULT_FORMAT = '.1f'; export const createAttr = (name, func = true, defaultValue = '') => { if (defaultValue === false) { return { name, func, default: false, optional: false, }; } return { name, func, default: defaultValue, optional: true, }; }; export function createSpec(def, domAttrs) { const attrs = {}; def.attrs.forEach((attr) => { var _a; if (attr.func !== 'only') { attrs[attr.name] = !attr.optional ? {} : { default: (_a = attr.default) !== null && _a !== void 0 ? _a : '' }; } if (attr.func) { attrs[`${attr.name}Function`] = { default: '' }; } }); const spec = { inline: def.inline, group: def.group, attrs, toDOM(node) { const props = {}; def.attrs.forEach((attr) => { const [value, valueFunction] = [node.attrs[attr.name], node.attrs[`${attr.name}Function`]]; if (value && attr.func !== 'only') props[attr.name] = value; if (attr.func && valueFunction) props[`:${attr.name}`] = valueFunction; }); return [def.tag, domAttrs ? domAttrs(props) : props]; }, parseDOM: [ { tag: def.tag, getAttrs(dom) { const props = {}; def.attrs.forEach((attr) => { var _a, _b; if (attr.func !== 'only') props[attr.name] = (_a = dom.getAttribute(attr.name)) !== null && _a !== void 0 ? _a : attr.default; if (attr.func) props[`${attr.name}Function`] = (_b = dom.getAttribute(`:${attr.name}`)) !== null && _b !== void 0 ? _b : ''; }); return props; }, }, ], attrsFromMyst(token) { const props = {}; def.attrs.forEach((attr) => { const [value, valueFunction] = [token[attr.name], token[`${attr.name}Function`]]; if (value && attr.func !== 'only') props[attr.name] = value; if (attr.func && valueFunction) props[`${attr.name}Function`] = valueFunction; }); return props; }, toMyst(props) { const node = { type: def.mystType, }; def.attrs.forEach((attr) => { const [value, valueFunction] = [props[attr.name], props[`:${attr.name}`]]; if (value && attr.func !== 'only') node[attr.name] = value; if (attr.func && valueFunction) node[`${attr.name}Function`] = valueFunction; }); return node; }, }; return spec; } function encodeFunctionName(state, name, value) { const [first, ...rest] = name; const encoded = `r${first.toUpperCase()}${rest.join('')}`; return `${encoded}=${state.quote(value)}`; } export const nodeToMystRole = (state, node, def) => { state.write(`{${def.name}}\``); const values = def.attrs.map((attr) => { if (attr.func) { const value = node.attrs[attr.name]; const valueFunction = node.attrs[`${attr.name}Function`]; const prop = `${attr.name}=${state.quote(value !== null && value !== void 0 ? value : '')}`; const propFunction = encodeFunctionName(state, attr.name, valueFunction); if (valueFunction || attr.func === 'only') { if (attr.func === 'only' && valueFunction === attr.default) return null; return propFunction; } return value === attr.default ? null : prop; } const value = node.attrs[attr.name]; return value === attr.default ? null : `${attr.name}=${state.quote(value)}`; }); state.write(values.filter((v) => !!v).join(', ')); state.write('`'); }; export const nodeToMystDirective = (state, node, def) => { state.ensureNewLine(); state.write(`\`\`\`{${def.name}}`); state.ensureNewLine(); const values = def.attrs.map((attr) => { if (attr.func) { const value = node.attrs[attr.name]; const valueFunction = node.attrs[`${attr.name}Function`]; const prop = `:${attr.name}: ${state.quote(value !== null && value !== void 0 ? value : '')}`; const propFunction = `:${attr.name}Function: ${state.quote(valueFunction)}`; if (valueFunction || attr.func === 'only') return propFunction; return prop; } const value = node.attrs[attr.name]; return value ? `:${attr.name}: ${state.quote(value)}` : null; }); state.write(values.filter((v) => v !== null).join('\n')); state.write('\n```'); state.closeBlock(node); }; //# sourceMappingURL=utils.js.map