From 296dabf5561160ee3943f56647dad9a31af9d528 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 2 Mar 2026 06:32:18 +0000 Subject: [PATCH 1/3] Initial plan From c9dd9651345bafb8cc36d508000eecf822f81e20 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 2 Mar 2026 06:38:32 +0000 Subject: [PATCH 2/3] fix(extension): sanitize special characters in BPMNAdapter name attributes Co-authored-by: CraneReturn <127602190+CraneReturn@users.noreply.github.com> --- .../__tests__/adapter_in.test.js | 8 ++++++++ .../extension/src/bpmn-elements-adapter/index.ts | 15 ++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/packages/extension/src/bpmn-elements-adapter/__tests__/adapter_in.test.js b/packages/extension/src/bpmn-elements-adapter/__tests__/adapter_in.test.js index 4c8f57128..b60279c03 100644 --- a/packages/extension/src/bpmn-elements-adapter/__tests__/adapter_in.test.js +++ b/packages/extension/src/bpmn-elements-adapter/__tests__/adapter_in.test.js @@ -525,4 +525,12 @@ describe('Test BPMNAdapter: import xml', () => { }), ).toEqual(graphData) }) + + it('should import shape names with special characters', () => { + const xmlWithSpecialName = xml.replace('name="开始"', 'name="A < B & C"') + const data = adapter.adapterXmlIn(xmlWithSpecialName) + expect(data.nodes.find((node) => node.id === 'Event_0rqndvp')?.text?.value).toBe( + 'A < B & C', + ) + }) }) diff --git a/packages/extension/src/bpmn-elements-adapter/index.ts b/packages/extension/src/bpmn-elements-adapter/index.ts index 9f5f5019e..3506b7116 100644 --- a/packages/extension/src/bpmn-elements-adapter/index.ts +++ b/packages/extension/src/bpmn-elements-adapter/index.ts @@ -1119,8 +1119,21 @@ class BPMNAdapter extends BPMNBaseAdapter { lf.adapterOut = this.adapterXmlOut this.props = props } + private sanitizeNameAttributes(xml: string): string { + return xml.replace(/name="([^"]*)"/g, (_, val) => { + const safe = val + .replace(/&(?!#?\w+;)/g, '&') + .replace(//g, '>') + return `name="${safe}"` + }) + } adapterXmlIn = (bpmnData: any) => { - const json = lfXml2Json(bpmnData) + const xmlData = + typeof bpmnData === 'string' + ? this.sanitizeNameAttributes(bpmnData) + : bpmnData + const json = lfXml2Json(xmlData) return this.adapterIn(json, this.props) } adapterXmlOut = (data: any) => { From 457c6be7fe988bae98f502e834176f34712fb183 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 2 Mar 2026 06:41:10 +0000 Subject: [PATCH 3/3] test(extension): cover mixed escaped/unescaped BPMN shape names on import Co-authored-by: CraneReturn <127602190+CraneReturn@users.noreply.github.com> --- .../bpmn-elements-adapter/__tests__/adapter_in.test.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/extension/src/bpmn-elements-adapter/__tests__/adapter_in.test.js b/packages/extension/src/bpmn-elements-adapter/__tests__/adapter_in.test.js index b60279c03..570de1182 100644 --- a/packages/extension/src/bpmn-elements-adapter/__tests__/adapter_in.test.js +++ b/packages/extension/src/bpmn-elements-adapter/__tests__/adapter_in.test.js @@ -533,4 +533,12 @@ describe('Test BPMNAdapter: import xml', () => { 'A < B & C', ) }) + + it('should import mixed escaped and unescaped characters in shape names', () => { + const xmlWithMixedName = xml.replace('name="开始"', 'name="A & B < C"') + const data = adapter.adapterXmlIn(xmlWithMixedName) + expect(data.nodes.find((node) => node.id === 'Event_0rqndvp')?.text?.value).toBe( + 'A & B < C', + ) + }) })