mirror of
https://github.com/freeCodeCamp/freeCodeCamp.git
synced 2026-02-13 13:00:27 -05:00
71 lines
2.0 KiB
JavaScript
71 lines
2.0 KiB
JavaScript
const { getSection } = require('./utils/get-section');
|
|
const {
|
|
createMdastToHtml,
|
|
parseHanziPinyinPairs
|
|
} = require('./utils/i18n-stringify');
|
|
|
|
function plugin() {
|
|
return transformer;
|
|
|
|
function transformer(tree, file) {
|
|
const sceneNodes = getSection(tree, '--scene--');
|
|
|
|
if (sceneNodes.length > 0) {
|
|
if (sceneNodes.length !== 1) {
|
|
throw Error('You can only have one item in a scene, a JSON array.');
|
|
}
|
|
|
|
if (sceneNodes[0].type !== 'code' || sceneNodes[0].lang !== 'json') {
|
|
throw Error('A scene must have a ```json code block');
|
|
}
|
|
|
|
// throws if we can't parse it.
|
|
const sceneJson = JSON.parse(sceneNodes[0].value);
|
|
|
|
// Convert hanzi-pinyin pairs to HTML in dialogue text
|
|
if (sceneJson.commands) {
|
|
const toHtml = createMdastToHtml(file.data.lang);
|
|
|
|
sceneJson.commands = sceneJson.commands.map(command => {
|
|
if (
|
|
command.dialogue &&
|
|
command.dialogue.text &&
|
|
parseHanziPinyinPairs(command.dialogue.text).length > 0
|
|
) {
|
|
// Wrap text in inlineCode node so the Chinese handler can process it.
|
|
// The paragraph wrapper is required by mdastToHTML's structure.
|
|
const nodes = [
|
|
{
|
|
type: 'paragraph',
|
|
children: [
|
|
{
|
|
type: 'inlineCode',
|
|
value: command.dialogue.text
|
|
}
|
|
]
|
|
}
|
|
];
|
|
|
|
const html = toHtml(nodes);
|
|
// Remove the <p> wrapper tags, keeping only the inner ruby elements
|
|
const innerHtml = html.replace(/^<p>|<\/p>$/g, '');
|
|
|
|
return {
|
|
...command,
|
|
dialogue: {
|
|
...command.dialogue,
|
|
text: innerHtml
|
|
}
|
|
};
|
|
}
|
|
return command;
|
|
});
|
|
}
|
|
|
|
file.data.scene = sceneJson;
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = plugin;
|