myst-cli
Version:
Command line tools for MyST
74 lines (73 loc) • 2.55 kB
JavaScript
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);
};