Step 1 — Knowledge base: perfect all reference/*.md with type, range, default, unit - text.md: add DataOrPathProps, path/data, bullet deprecated params - chart.md: add deprecated section, fix 19 params with missing elements - slide.md: add bkgd→background deprecated mapping - output.md: add masterSlide, presLayout Step 2 — Schema: align schema/presentation.schema.json with KB - Add catAxisItem and valAxisItem definitions with full sub-property constraints - Fix 7 enum constraints (barDir, displayBlanksAs, bar3DShape, etc.) - Add 4 missing fields (verbose, autoPageCharWeight, autoPageLineWeight, notes, masterSlide, presLayout) Step 3 — Translation engine: transform renderers from passthrough to validation - index.js: add normalizePosition, normalizeColor, validateEnum shared utilities - All renderers: position validation, color hex normalization, enum validation - Image: graceful failure handling (catch load errors, warn, continue) - Chart: chartType enum validation, data parity check - Table: colspan/rowspan integer validation, border array check - Full verification: basic.json and full.json generate valid PPTX Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
56 lines
1.5 KiB
JavaScript
56 lines
1.5 KiB
JavaScript
const { normalizeColor } = require('./index');
|
|
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) {
|
|
if (typeof slideData.background === 'object') {
|
|
slide.background = {};
|
|
for (var k in slideData.background) {
|
|
if (slideData.background.hasOwnProperty(k)) {
|
|
slide.background[k] = slideData.background[k];
|
|
}
|
|
}
|
|
if (slide.background.color) {
|
|
var nc = normalizeColor(slide.background.color);
|
|
if (nc) slide.background.color = nc;
|
|
}
|
|
} else {
|
|
slide.background = slideData.background;
|
|
}
|
|
}
|
|
if (slideData.color) {
|
|
var nc = normalizeColor(slideData.color);
|
|
if (nc) slide.color = nc;
|
|
}
|
|
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 };
|