feat: add pptxgenjs translation engine (mechanical mapping)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,5 @@
|
|||||||
|
function renderChart(slide, chartData) {
|
||||||
|
slide.addChart(chartData.chartType, chartData.data, chartData.options);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { renderChart };
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
function renderImage(slide, imageData) {
|
||||||
|
slide.addImage(imageData.options);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { renderImage };
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
const pptxgen = require('pptxgenjs');
|
||||||
|
const fs = require('fs');
|
||||||
|
const { renderSlide } = require('./slide-renderer');
|
||||||
|
|
||||||
|
function render(pptxJson) {
|
||||||
|
const pptx = new pptxgen();
|
||||||
|
const data = typeof pptxJson === 'string' ? JSON.parse(pptxJson) : pptxJson;
|
||||||
|
const pres = data.presentation || {};
|
||||||
|
const slides = data.slides || [];
|
||||||
|
|
||||||
|
if (pres.layout) pptx.layout = pres.layout;
|
||||||
|
if (pres.author) pptx.author = pres.author;
|
||||||
|
if (pres.title) pptx.title = pres.title;
|
||||||
|
if (pres.subject) pptx.subject = pres.subject;
|
||||||
|
if (pres.company) pptx.company = pres.company;
|
||||||
|
if (pres.revision) pptx.revision = pres.revision;
|
||||||
|
if (pres.rtlMode !== undefined) pptx.rtlMode = pres.rtlMode;
|
||||||
|
if (pres.theme) pptx.theme = pres.theme;
|
||||||
|
|
||||||
|
slides.forEach(slideData => renderSlide(pptx, slideData));
|
||||||
|
|
||||||
|
return pptx;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function renderFile(inputPath, outputPath) {
|
||||||
|
const json = fs.readFileSync(inputPath, 'utf8');
|
||||||
|
const pptx = render(json);
|
||||||
|
return pptx.writeFile({ fileName: outputPath });
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { render, renderFile };
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
function renderShape(slide, shapeData) {
|
||||||
|
slide.addShape(shapeData.shapeName, shapeData.options);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { renderShape };
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
const { renderText } = require('./text-renderer');
|
||||||
|
const { renderShape } = require('./shape-renderer');
|
||||||
|
const { renderTable } = require('./table-renderer');
|
||||||
|
const { renderImage } = require('./image-renderer');
|
||||||
|
const { renderChart } = require('./chart-renderer');
|
||||||
|
|
||||||
|
function renderSlide(pptx, slideData) {
|
||||||
|
const slide = pptx.addSlide();
|
||||||
|
|
||||||
|
if (slideData.background) slide.background = slideData.background;
|
||||||
|
if (slideData.color) slide.color = slideData.color;
|
||||||
|
if (slideData.hidden) slide.hidden = slideData.hidden;
|
||||||
|
|
||||||
|
const objects = slideData.objects || [];
|
||||||
|
objects.forEach(obj => {
|
||||||
|
switch (obj.type) {
|
||||||
|
case 'text':
|
||||||
|
renderText(slide, obj);
|
||||||
|
break;
|
||||||
|
case 'shape':
|
||||||
|
renderShape(slide, obj);
|
||||||
|
break;
|
||||||
|
case 'table':
|
||||||
|
renderTable(slide, obj);
|
||||||
|
break;
|
||||||
|
case 'image':
|
||||||
|
renderImage(slide, obj);
|
||||||
|
break;
|
||||||
|
case 'chart':
|
||||||
|
renderChart(slide, obj);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { renderSlide };
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
function renderTable(slide, tableData) {
|
||||||
|
slide.addTable(tableData.rows, tableData.options);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { renderTable };
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
function renderText(slide, textData) {
|
||||||
|
slide.addText(textData.text, textData.options);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { renderText };
|
||||||
Reference in New Issue
Block a user