refactor: complete three-layer serial refactoring (knowledge→schema→renderer)

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>
This commit is contained in:
2026-07-23 13:10:01 +08:00
co-authored by Claude Sonnet 5
parent c1a9c2fcda
commit ec7a44d6fb
12 changed files with 538 additions and 21 deletions
+21 -2
View File
@@ -1,3 +1,4 @@
const { normalizeColor } = require('./index');
const { renderText } = require('./text-renderer');
const { renderShape } = require('./shape-renderer');
const { renderTable } = require('./table-renderer');
@@ -7,8 +8,26 @@ 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.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 || [];