UNPKG

react-edge-tts

Version:

Generate text-to-speech narration for React content using Microsoft Edge TTS

51 lines 2.3 kB
import fs from 'fs'; import * as pathImport from 'path'; import { declare } from '@babel/helper-plugin-utils'; import * as t from '@babel/types'; const outputDir = path.resolve(process.cwd(), 'narration-content'); // Ensure output directory exists if (!fs.existsSync(outputDir)) { fs.mkdirSync(outputDir, { recursive: true }); } const NarrationBabelPlugin = declare((api) => { api.assertVersion(7); return { name: 'extract-narrations', visitor: { JSXElement(path, state) { const openingElement = path.node.openingElement; if (t.isJSXIdentifier(openingElement.name, { name: 'Narrate' }) && openingElement.attributes.some((attr) => t.isJSXAttribute(attr) && t.isJSXIdentifier(attr.name, { name: 'title' }))) { const titleAttr = openingElement.attributes.find((attr) => t.isJSXAttribute(attr) && t.isJSXIdentifier(attr.name, { name: 'title' }) && t.isStringLiteral(attr.value)); if (!titleAttr || !t.isStringLiteral(titleAttr.value)) return; const title = titleAttr.value.value; // Extract children content const childrenContent = path.node.children .map((child) => { if (t.isJSXText(child)) { return child.value.trim(); } if (t.isJSXExpressionContainer(child) && t.isStringLiteral(child.expression)) { return child.expression.value.trim(); } return null; }) .filter(Boolean) .join(' '); const narration = { title, content: childrenContent, }; // Write to JSON file const filePath = pathImport.join(outputDir, `${title}.json`); fs.writeFileSync(filePath, JSON.stringify(narration, null, 2), 'utf-8'); } }, }, }; }); export default NarrationBabelPlugin; //# sourceMappingURL=plugin.js.map