diff --git a/renderer/chart-renderer.js b/renderer/chart-renderer.js new file mode 100644 index 0000000..5393306 --- /dev/null +++ b/renderer/chart-renderer.js @@ -0,0 +1,5 @@ +function renderChart(slide, chartData) { + slide.addChart(chartData.chartType, chartData.data, chartData.options); +} + +module.exports = { renderChart }; diff --git a/renderer/image-renderer.js b/renderer/image-renderer.js new file mode 100644 index 0000000..3c10404 --- /dev/null +++ b/renderer/image-renderer.js @@ -0,0 +1,5 @@ +function renderImage(slide, imageData) { + slide.addImage(imageData.options); +} + +module.exports = { renderImage }; diff --git a/renderer/index.js b/renderer/index.js new file mode 100644 index 0000000..cb6e995 --- /dev/null +++ b/renderer/index.js @@ -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 }; diff --git a/renderer/shape-renderer.js b/renderer/shape-renderer.js new file mode 100644 index 0000000..6ccd686 --- /dev/null +++ b/renderer/shape-renderer.js @@ -0,0 +1,5 @@ +function renderShape(slide, shapeData) { + slide.addShape(shapeData.shapeName, shapeData.options); +} + +module.exports = { renderShape }; diff --git a/renderer/slide-renderer.js b/renderer/slide-renderer.js new file mode 100644 index 0000000..a11dc23 --- /dev/null +++ b/renderer/slide-renderer.js @@ -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 }; diff --git a/renderer/table-renderer.js b/renderer/table-renderer.js new file mode 100644 index 0000000..d139a36 --- /dev/null +++ b/renderer/table-renderer.js @@ -0,0 +1,5 @@ +function renderTable(slide, tableData) { + slide.addTable(tableData.rows, tableData.options); +} + +module.exports = { renderTable }; diff --git a/renderer/text-renderer.js b/renderer/text-renderer.js new file mode 100644 index 0000000..172216b --- /dev/null +++ b/renderer/text-renderer.js @@ -0,0 +1,5 @@ +function renderText(slide, textData) { + slide.addText(textData.text, textData.options); +} + +module.exports = { renderText };