UNPKG

myst-cli

Version:
74 lines (73 loc) 2.55 kB
import { fileWarn, RuleId } from 'myst-common'; import { selectAll } from 'unist-util-select'; import { BASE64_HEADER_SPLIT } from './images.js'; export const metadataSection = 'user_expressions'; export function findExpression(expressions, value) { return expressions?.find((expr) => expr.expression === value); } function processLatex(value) { return value .trim() .replace(/^\$(\\displaystyle)?/, '') .replace(/\$$/, '') .trim(); } function stripTextQuotes(content) { return content.replace(/^(["'])(.*)\1$/, '$2'); } function renderExpression(node, file) { const result = node.result; if (!result) return []; let content; if (result.status === 'ok') { Object.entries(result.data).forEach(([mimeType, value]) => { if (content) { return; } else if (mimeType.startsWith('image/')) { content = [ { type: 'image', url: `data:${mimeType}${BASE64_HEADER_SPLIT}${value}`, }, ]; } else if (mimeType === 'text/latex') { content = [{ type: 'inlineMath', value: processLatex(value) }]; } else if (mimeType === 'text/html') { content = [{ type: 'html', value: value }]; } else if (mimeType === 'text/plain') { // Allow the user / libraries to explicitly indicate that quotes should be preserved const stripQuotes = result.metadata?.['strip-quotes'] ?? true; content = [ { type: 'text', value: stripQuotes ? stripTextQuotes(value) : value, }, ]; } }); if (content) return content; fileWarn(file, 'Unrecognized mime bundle for inline content', { node, ruleId: RuleId.inlineExpressionRenders, }); } return []; } export function transformRenderInlineExpressions(mdast, file) { const inlineNodes = selectAll('inlineExpression', mdast); inlineNodes.forEach((inlineExpression) => { if (!inlineExpression.result) { return; } inlineExpression.children = renderExpression(inlineExpression, file); }); } export const renderInlineExpressionsPlugin = () => (tree, file) => { transformRenderInlineExpressions(tree, file); };