@podlite/schema
Version:
AST tools for Podlite markup language
89 lines • 2.98 kB
JavaScript
import { getTextContentFromNode, makeTransformer } from '..';
import { nanoid } from 'nanoid';
import slugify from 'slugify';
/**
* Clean ids from tree
* @returns
*/
export const cleanIds = (src = { skipChain: 0, podMode: 1 }) => tree => {
const transformerBlocks = makeTransformer({
'*': (node, ctx, visiter) => {
if ('id' in node) {
if ('content' in node) {
node.content = visiter(node.content, ctx);
}
const { id, ...rest } = node;
return { ...rest };
}
return node;
},
});
return transformerBlocks(tree, {});
};
// TODO: refactor linking for blocks
export const slugifyText = (text) => {
return slugify(text.trim(), {});
};
/**
* Add set id to 'id' to each blocks
*/
export const frozenIds = (src = { skipChain: 0, podMode: 1 }) => tree => {
const transformerBlocks = makeTransformer({
'*': (node, ctx, visiter) => {
if ('content' in node) {
node.content = visiter(node.content, ctx);
}
if ('id' in node) {
const { id, ...rest } = node;
return { ...rest, id: 'id' };
}
return node;
},
});
return transformerBlocks(tree, {});
};
export const setAllLinksToAnchor = (src = { skipChain: 0, podMode: 1 }) => tree => {
const transformerBlocks = makeTransformer({
'L<>': (node, ctx, visiter) => {
if ('meta' in node) {
if ('content' in node) {
node.content = visiter(node.content, ctx);
}
const { id, ...rest } = node;
return { ...rest, meta: '#' };
}
return node;
},
});
return transformerBlocks(tree, {});
};
const middleware = () => tree => {
const transformerBlocks = makeTransformer({
'*': (node, ctx, visiter) => {
const addIdField = (node) => {
if (typeof node === 'object' && 'type' in node && node.type == 'block') {
if (node.name == 'caption') {
return node;
}
else if (node.name == 'head') {
return { ...node, id: slugifyText(getTextContentFromNode(node)) };
}
else {
return { ...node, id: nanoid() };
}
}
return node;
};
const processContent = (node) => {
if (typeof node === 'object' && 'content' in node) {
return { ...node, content: visiter(node.content, ctx) };
}
return node;
};
return processContent(addIdField(node));
},
});
return transformerBlocks(tree, {});
};
export default middleware;
//# sourceMappingURL=ids.js.map