= 0; i--) {
const pageData = data.pages[i];
const pageNum = pageData.page || (i + 1);
const pageIdx = pageNum - 1;
if (pageIdx >= starts.length) continue;
const pageStart = starts[pageIdx];
const pageEnd = pageIdx + 1 < starts.length ? starts[pageIdx + 1] : html.length;
let pageHtml = html.slice(pageStart, pageEnd);
// Apply object positions
if (pageData.objects) {
for (const obj of pageData.objects) {
pageHtml = applyObject(pageHtml, obj);
}
}
// Apply node positions and update edges
if (pageData.nodes) {
for (const node of pageData.nodes) {
pageHtml = applyNode(pageHtml, node);
}
}
html = html.slice(0, pageStart) + pageHtml + html.slice(pageEnd);
}
return html;
}
function applyObject(pageHtml, obj) {
// Match:
![]()
]*data-node-id="${nodeId}"[^>]*style=")([^"]*)(")`
);
return pageHtml.replace(regex, (match, prefix, oldStyle, suffix) => {
const parts = [];
parts.push(`left: ${obj.left}`);
parts.push(`top: ${obj.top}`);
if (obj.w) parts.push(`width: ${obj.w}`);
if (obj.h) parts.push(`height: ${obj.h}`);
const transforms = [];
if (obj.rotate) transforms.push(`rotate(${obj.rotate}deg)`);
if (obj.flipH) transforms.push('scaleX(-1)');
if (transforms.length) parts.push(`transform: ${transforms.join(' ')}`);
// Preserve margin if present in old style
const marginMatch = oldStyle.match(/margin[^;]+;/);
if (marginMatch) parts.push(marginMatch[0].replace(/;$/, ''));
return prefix + parts.join('; ') + ';' + suffix;
});
}
function applyNode(pageHtml, node) {
// Update node div position
const nodeRegex = new RegExp(
`(
]*data-node-id="${node.nodeId}"[^>]*style=")([^"]*)(")`
);
pageHtml = pageHtml.replace(nodeRegex, (match, prefix, oldStyle, suffix) => {
const newStyle = oldStyle
.replace(/left:\s*[^;]+/, `left: ${node.left}`)
.replace(/top:\s*[^;]+/, `top: ${node.top}`);
return prefix + newStyle + suffix;
});
// Update edges connected to this node
const leftMm = parseFloat(node.left);
const topMm = parseFloat(node.top);
// Edges where this node is first: ]*data-edge="${node.nodeId}-\\d+"[^>]*)(x1=")[^"]*("\\s*y1=")[^"]*(")`,'g'
);
pageHtml = pageHtml.replace(edgeRegex1, (match, prefix, x1p, y1p, suffix) => {
return `${prefix}${x1p}${leftMm}mm${y1p}${topMm}mm${suffix}`;
});
// Edges where this node is second: ]*data-edge="\\d+-${node.nodeId}"[^>]*)(x2=")[^"]*("\\s*y2=")[^"]*(")`,'g'
);
pageHtml = pageHtml.replace(edgeRegex2, (match, prefix, x2p, y2p, suffix) => {
return `${prefix}${x2p}${leftMm}mm${y2p}${topMm}mm${suffix}`;
});
return pageHtml;
}