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:
@@ -1,5 +1,46 @@
|
||||
var { normalizePosition, normalizeColor, normalizeColorInOptions, validateEnum } = require('./index');
|
||||
|
||||
function renderChart(slide, chartData) {
|
||||
slide.addChart(chartData.chartType, chartData.data, chartData.options);
|
||||
var opts = {};
|
||||
if (chartData.options) {
|
||||
for (var k in chartData.options) {
|
||||
if (chartData.options.hasOwnProperty(k)) opts[k] = chartData.options[k];
|
||||
}
|
||||
}
|
||||
|
||||
normalizePosition(opts);
|
||||
|
||||
var validChartTypes = ['area', 'bar', 'bar3D', 'bubble', 'doughnut', 'line', 'pie', 'radar', 'scatter'];
|
||||
validateEnum(chartData.chartType, validChartTypes, 'chartType');
|
||||
|
||||
if (chartData.data) {
|
||||
for (var i = 0; i < chartData.data.length; i++) {
|
||||
var series = chartData.data[i];
|
||||
if (series.labels && series.values && series.labels.length !== series.values.length) {
|
||||
console.warn('Chart series "' + (series.name || i) + '" has mismatched labels (' + series.labels.length + ') and values (' + series.values.length + ')');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
validateEnum(opts.barDir, ['bar', 'col'], 'barDir');
|
||||
validateEnum(opts.barGrouping, ['clustered', 'stacked', 'standard'], 'barGrouping');
|
||||
validateEnum(opts.radarStyle, ['standard', 'marker', 'filled'], 'radarStyle');
|
||||
validateEnum(opts.legendPos, ['b', 'l', 'r', 't', 'tr'], 'legendPos');
|
||||
validateEnum(opts.lineCap, ['flat', 'round', 'square'], 'lineCap');
|
||||
validateEnum(opts.lineDataSymbol, ['circle', 'dash', 'diamond', 'dot', 'none', 'square', 'triangle'], 'lineDataSymbol');
|
||||
validateEnum(opts.displayBlanksAs, ['gap', 'span', 'zero'], 'displayBlanksAs');
|
||||
validateEnum(opts.bar3DShape, ['box', 'cylinder', 'cone', 'pyramid'], 'bar3DShape');
|
||||
validateEnum(opts.dataLabelPosition, ['b', 'bestFit', 'ctr', 'l', 'r', 't', 'inEnd', 'outEnd'], 'dataLabelPosition');
|
||||
validateEnum(opts.titleAlign, ['l', 'ctr', 'r'], 'titleAlign');
|
||||
|
||||
if (opts.chartColors) {
|
||||
for (var i = 0; i < opts.chartColors.length; i++) {
|
||||
var nc = normalizeColor(opts.chartColors[i]);
|
||||
if (nc) opts.chartColors[i] = nc;
|
||||
}
|
||||
}
|
||||
|
||||
slide.addChart(chartData.chartType, chartData.data, opts);
|
||||
}
|
||||
|
||||
module.exports = { renderChart };
|
||||
|
||||
Reference in New Issue
Block a user