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