const {existsSync} = require('fs'); const {join} = require('path'); const map = require('unist-util-map'); const CODEPEN_PROTOCOL = 'codepen://'; const DEFAULT_LINK_TEXT = 'Try it on CodePen'; module.exports = ({markdownAST}, {directory}) => { map(markdownAST, (node, index, parent) => { if (!directory.startsWith('/')) { directory = `/${directory}`; } if (!directory.endsWith('/')) { directory = `${directory}/`; } // eg convert // from: [](codepen:introducing-jsx) // to: <a href="/<directory>/introducing-jsx" target="_blank">Try it on CodePen</a> // from: [Try the Hello World example on CodePen](codepen:hello-world) // to: <a href="/<directory>/hello-world" target="_blank">Try the Hello World example on CodePen</a> if (node.type === 'link' && node.url.startsWith(CODEPEN_PROTOCOL)) { const href = node.url.replace(CODEPEN_PROTOCOL, directory); const text = node.children.length === 0 ? DEFAULT_LINK_TEXT : node.children[0].value; // Verify that the specified example file exists. const filePath = join(__dirname, `../../${href}.js`); if (!existsSync(filePath)) { console.error( `Invalid Codepen link specified; no such file "${filePath}"`, ); process.exit(1); } const anchorOpenNode = { type: 'html', value: `<a href="${href}" target="_blank">`, }; const textNode = { type: 'text', value: text, }; const anchorCloseNode = { type: 'html', value: '</a>', }; parent.children.splice( index, 1, anchorOpenNode, textNode, anchorCloseNode, ); } // No change return node; }); };