Skip to content

Commit 7359374

Browse files
DymoneLewisboyongjiong
authored andcommitted
fix: 优化代码&增加注释
1 parent 68c52f3 commit 7359374

File tree

3 files changed

+31
-18
lines changed

3 files changed

+31
-18
lines changed

packages/extension/src/bpmn-adapter/index.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,13 @@ const defaultRetainedFields = [
127127
'pointsList',
128128
]
129129

130+
/**
131+
* XML 实体反转义:
132+
* - 将常见的 XML 实体还原为字符:`&lt;`→`<`、`&gt;`→`>`、`&amp;`→`&`、`&quot;`→`"`、`&apos;`→`'`;保障流程图能正常回填
133+
* - 使用 `String(text || '')` 规范化输入,避免 `null/undefined` 导致错误;
134+
* - 注意:此实现为单次替换,若存在嵌套/二次编码(例如 `&amp;lt;`),会先还原为 `&lt;`,
135+
* 如需完全解码,可在外层循环调用或调整替换顺序策略。
136+
*/
130137
const unescapeXml = (text: string) =>
131138
String(text || '')
132139
.replace(/&lt;/g, '<')

packages/extension/src/bpmn-adapter/json2xml.ts

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,29 @@ function handleAttributes(o: any) {
2626
return t
2727
}
2828

29+
/**
30+
* 将普通文本中的一些特殊字符进行转移,保障文本安全地嵌入 XML:
31+
* - 空值(`null/undefined`)返回空字符串,避免输出非法字面量;
32+
* - 按顺序转义 XML 保留字符:`&`, `<`, `>`, `"`, `'`;
33+
* 注意优先转义 `&`,避免后续生成的实体被再次转义。
34+
* @param text 原始文本
35+
* @returns 已完成 XML 转义的字符串
36+
*/
2937
function escapeXml(text: string) {
38+
// 空值直接返回空字符串,防止在 XML 中出现 "null"/"undefined"
3039
if (text == null) return ''
31-
return text
32-
.toString()
33-
.replace(/&/g, '&amp;')
34-
.replace(/</g, '&lt;')
35-
.replace(/>/g, '&gt;')
36-
.replace(/"/g, '&quot;')
37-
.replace(/'/g, '&apos;')
40+
return (
41+
text
42+
.toString()
43+
// & 必须先转义,避免影响后续 < > " ' 的实体
44+
.replace(/&/g, '&amp;')
45+
// 小于号与大于号,用于标签边界
46+
.replace(/</g, '&lt;')
47+
.replace(/>/g, '&gt;')
48+
// 双引号与单引号,用于属性值的包裹
49+
.replace(/"/g, '&quot;')
50+
.replace(/'/g, '&apos;')
51+
)
3852
}
3953

4054
function getAttributes(obj: any) {
@@ -110,4 +124,4 @@ function lfJson2Xml(o: Object) {
110124
return xmlStr
111125
}
112126

113-
export { lfJson2Xml, handleAttributes }
127+
export { lfJson2Xml, handleAttributes, escapeXml }

packages/extension/src/bpmn-adapter/xml2json.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// ========================================================================
44
// XML.ObjTree -- XML source code from/to JavaScript object like E4X
55
// ========================================================================
6+
import { escapeXml } from './json2xml'
67

78
let XML = function () {}
89

@@ -282,16 +283,7 @@ XML.ObjTree.prototype.scalar_to_xml = function (name, text) {
282283

283284
// method: xml_escape( text )
284285

285-
XML.ObjTree.prototype.xml_escape = function (text) {
286-
if (text == null) return ''
287-
return text
288-
.toString()
289-
.replace(/&/g, '&amp;')
290-
.replace(/</g, '&lt;')
291-
.replace(/>/g, '&gt;')
292-
.replace(/"/g, '&quot;')
293-
.replace(/'/g, '&apos;')
294-
}
286+
XML.ObjTree.prototype.xml_escape = escapeXml
295287

296288
/*
297289
// ========================================================================

0 commit comments

Comments
 (0)