const mdastToHTML = require('./mdast-to-html');
/**
* Parses Chinese text in format: hanzi (pinyin)
* @param {string} text - Text in format: hanzi (pinyin)
* @returns {{ hanzi: string, pinyin: string } | null} Parsed hanzi and pinyin, or null if not matching
*/
function parseChinesePattern(text) {
const match = text.match(/^(.+?)\s*\((.+?)\)$/);
if (!match) {
return null;
}
return {
hanzi: match[1].trim(),
pinyin: match[2].trim()
};
}
/**
* Custom handler for Chinese inline code to render as ruby elements
* @param {object} state - The state object from mdast-util-to-hast
* @param {object} node - The inlineCode node
* @returns {object} Hast element node
*/
function chineseInlineCodeHandler(state, node) {
const parsed = parseChinesePattern(node.value);
if (parsed) {
return {
type: 'element',
tagName: 'ruby',
properties: {},
children: [
{ type: 'text', value: parsed.hanzi },
{
type: 'element',
tagName: 'rp',
properties: {},
children: [{ type: 'text', value: '(' }]
},
{
type: 'element',
tagName: 'rt',
properties: {},
children: [{ type: 'text', value: parsed.pinyin }]
},
{
type: 'element',
tagName: 'rp',
properties: {},
children: [{ type: 'text', value: ')' }]
}
]
};
}
return {
type: 'element',
// TODO: change this to span
// https://github.com/freeCodeCamp/language-curricula/issues/22
tagName: 'code',
properties: {},
children: [{ type: 'text', value: node.value }]
};
}
const rubyOptions = {
handlers: {
inlineCode: chineseInlineCodeHandler
}
};
const createMdastToHtml = lang =>
lang == 'zh-CN' ? x => mdastToHTML(x, rubyOptions) : mdastToHTML;
module.exports = { parseChinesePattern, createMdastToHtml };