react-edge-tts
Version:
Generate text-to-speech narration for React content using Microsoft Edge TTS
51 lines • 2.3 kB
JavaScript
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