@nokecy/qc-ui 1.0.66 → 1.0.67

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/dist/cjs/components/RegexEditor/core/RegexEditor.d.ts +34 -0
  2. package/dist/cjs/components/RegexEditor/core/RegexEditor.js +223 -0
  3. package/dist/cjs/components/RegexEditor/core/RegexEditor.less +119 -0
  4. package/dist/cjs/components/RegexEditor/core/extensions/errorMarker.d.ts +49 -0
  5. package/dist/cjs/components/RegexEditor/core/extensions/errorMarker.js +158 -0
  6. package/dist/cjs/components/RegexEditor/core/types.d.ts +79 -0
  7. package/dist/cjs/components/RegexEditor/core/types.js +5 -0
  8. package/dist/cjs/components/RegexEditor/hooks/index.d.ts +9 -0
  9. package/dist/cjs/components/RegexEditor/hooks/index.js +19 -0
  10. package/dist/cjs/components/RegexEditor/hooks/useRegexTester.d.ts +95 -0
  11. package/dist/cjs/components/RegexEditor/hooks/useRegexTester.js +234 -0
  12. package/dist/cjs/components/RegexEditor/hooks/useRegexValidation.d.ts +71 -0
  13. package/dist/cjs/components/RegexEditor/hooks/useRegexValidation.js +215 -0
  14. package/dist/cjs/components/RegexEditor/hooks/useTemplateManager.d.ts +64 -0
  15. package/dist/cjs/components/RegexEditor/hooks/useTemplateManager.js +438 -0
  16. package/dist/cjs/components/RegexEditor/index.d.ts +16 -0
  17. package/dist/cjs/components/RegexEditor/index.js +232 -0
  18. package/dist/cjs/components/RegexEditor/templates/TemplateSelector.d.ts +36 -0
  19. package/dist/cjs/components/RegexEditor/templates/TemplateSelector.js +322 -0
  20. package/dist/cjs/components/RegexEditor/templates/builtinTemplates.d.ts +36 -0
  21. package/dist/cjs/components/RegexEditor/templates/builtinTemplates.js +340 -0
  22. package/dist/cjs/components/RegexEditor/templates/index.d.ts +10 -0
  23. package/dist/cjs/components/RegexEditor/templates/index.js +184 -0
  24. package/dist/cjs/components/RegexEditor/templates/storage.d.ts +74 -0
  25. package/dist/cjs/components/RegexEditor/templates/storage.js +337 -0
  26. package/dist/cjs/components/RegexEditor/templates/templateManager.d.ts +67 -0
  27. package/dist/cjs/components/RegexEditor/templates/templateManager.js +277 -0
  28. package/dist/cjs/components/RegexEditor/templates/types.d.ts +111 -0
  29. package/dist/cjs/components/RegexEditor/templates/types.js +94 -0
  30. package/dist/cjs/components/RegexEditor/testing/types.d.ts +55 -0
  31. package/dist/cjs/components/RegexEditor/testing/types.js +5 -0
  32. package/dist/cjs/components/RegexEditor/validation/complexity.d.ts +22 -0
  33. package/dist/cjs/components/RegexEditor/validation/complexity.js +196 -0
  34. package/dist/cjs/components/RegexEditor/validation/parser.d.ts +53 -0
  35. package/dist/cjs/components/RegexEditor/validation/parser.js +129 -0
  36. package/dist/cjs/components/RegexEditor/validation/types.d.ts +146 -0
  37. package/dist/cjs/components/RegexEditor/validation/types.js +5 -0
  38. package/dist/cjs/components/RegexEditor/validation/validator.d.ts +60 -0
  39. package/dist/cjs/components/RegexEditor/validation/validator.js +218 -0
  40. package/dist/cjs/components/RegexEditor/visualizer/FlagsSelector.d.ts +20 -0
  41. package/dist/cjs/components/RegexEditor/visualizer/FlagsSelector.js +98 -0
  42. package/dist/cjs/components/RegexEditor/visualizer/MatchItem.d.ts +25 -0
  43. package/dist/cjs/components/RegexEditor/visualizer/MatchItem.js +201 -0
  44. package/dist/cjs/components/RegexEditor/visualizer/RegexRailroadDiagram.d.ts +32 -0
  45. package/dist/cjs/components/RegexEditor/visualizer/RegexRailroadDiagram.js +192 -0
  46. package/dist/cjs/components/RegexEditor/visualizer/RegexTester.d.ts +22 -0
  47. package/dist/cjs/components/RegexEditor/visualizer/RegexTester.js +255 -0
  48. package/dist/cjs/components/RegexEditor/visualizer/astToRailroad.d.ts +19 -0
  49. package/dist/cjs/components/RegexEditor/visualizer/astToRailroad.js +155 -0
  50. package/dist/cjs/components/RegexEditor/visualizer/index.d.ts +12 -0
  51. package/dist/cjs/components/RegexEditor/visualizer/index.js +76 -0
  52. package/dist/cjs/components/RegexEditor/visualizer/types.d.ts +131 -0
  53. package/dist/cjs/components/RegexEditor/visualizer/types.js +5 -0
  54. package/dist/cjs/components/RegexEditor/visualizer/utils.d.ts +106 -0
  55. package/dist/cjs/components/RegexEditor/visualizer/utils.js +268 -0
  56. package/dist/cjs/index.d.ts +3 -1
  57. package/dist/cjs/index.js +55 -0
  58. package/dist/cjs/standardFormDialog/useStandardFormSchema.d.ts +1 -1
  59. package/dist/cjs/standardFormDialog/withStandardForm.d.ts +2 -2
  60. package/dist/cjs/types/railroad-diagrams.d.ts +59 -0
  61. package/dist/cjs/types/regexp-tree.d.ts +175 -0
  62. package/dist/esm/components/RegexEditor/core/RegexEditor.d.ts +34 -0
  63. package/dist/esm/components/RegexEditor/core/RegexEditor.js +214 -0
  64. package/dist/esm/components/RegexEditor/core/RegexEditor.less +119 -0
  65. package/dist/esm/components/RegexEditor/core/extensions/errorMarker.d.ts +49 -0
  66. package/dist/esm/components/RegexEditor/core/extensions/errorMarker.js +154 -0
  67. package/dist/esm/components/RegexEditor/core/types.d.ts +79 -0
  68. package/dist/esm/components/RegexEditor/core/types.js +1 -0
  69. package/dist/esm/components/RegexEditor/hooks/index.d.ts +9 -0
  70. package/dist/esm/components/RegexEditor/hooks/index.js +8 -0
  71. package/dist/esm/components/RegexEditor/hooks/useRegexTester.d.ts +95 -0
  72. package/dist/esm/components/RegexEditor/hooks/useRegexTester.js +230 -0
  73. package/dist/esm/components/RegexEditor/hooks/useRegexValidation.d.ts +71 -0
  74. package/dist/esm/components/RegexEditor/hooks/useRegexValidation.js +211 -0
  75. package/dist/esm/components/RegexEditor/hooks/useTemplateManager.d.ts +64 -0
  76. package/dist/esm/components/RegexEditor/hooks/useTemplateManager.js +430 -0
  77. package/dist/esm/components/RegexEditor/index.d.ts +16 -0
  78. package/dist/esm/components/RegexEditor/index.js +27 -0
  79. package/dist/esm/components/RegexEditor/templates/TemplateSelector.d.ts +36 -0
  80. package/dist/esm/components/RegexEditor/templates/TemplateSelector.js +316 -0
  81. package/dist/esm/components/RegexEditor/templates/builtinTemplates.d.ts +36 -0
  82. package/dist/esm/components/RegexEditor/templates/builtinTemplates.js +335 -0
  83. package/dist/esm/components/RegexEditor/templates/index.d.ts +10 -0
  84. package/dist/esm/components/RegexEditor/templates/index.js +19 -0
  85. package/dist/esm/components/RegexEditor/templates/storage.d.ts +74 -0
  86. package/dist/esm/components/RegexEditor/templates/storage.js +335 -0
  87. package/dist/esm/components/RegexEditor/templates/templateManager.d.ts +67 -0
  88. package/dist/esm/components/RegexEditor/templates/templateManager.js +274 -0
  89. package/dist/esm/components/RegexEditor/templates/types.d.ts +111 -0
  90. package/dist/esm/components/RegexEditor/templates/types.js +90 -0
  91. package/dist/esm/components/RegexEditor/testing/types.d.ts +55 -0
  92. package/dist/esm/components/RegexEditor/testing/types.js +1 -0
  93. package/dist/esm/components/RegexEditor/validation/complexity.d.ts +22 -0
  94. package/dist/esm/components/RegexEditor/validation/complexity.js +190 -0
  95. package/dist/esm/components/RegexEditor/validation/parser.d.ts +53 -0
  96. package/dist/esm/components/RegexEditor/validation/parser.js +123 -0
  97. package/dist/esm/components/RegexEditor/validation/types.d.ts +145 -0
  98. package/dist/esm/components/RegexEditor/validation/types.js +1 -0
  99. package/dist/esm/components/RegexEditor/validation/validator.d.ts +60 -0
  100. package/dist/esm/components/RegexEditor/validation/validator.js +213 -0
  101. package/dist/esm/components/RegexEditor/visualizer/FlagsSelector.d.ts +20 -0
  102. package/dist/esm/components/RegexEditor/visualizer/FlagsSelector.js +93 -0
  103. package/dist/esm/components/RegexEditor/visualizer/MatchItem.d.ts +25 -0
  104. package/dist/esm/components/RegexEditor/visualizer/MatchItem.js +194 -0
  105. package/dist/esm/components/RegexEditor/visualizer/RegexRailroadDiagram.d.ts +32 -0
  106. package/dist/esm/components/RegexEditor/visualizer/RegexRailroadDiagram.js +186 -0
  107. package/dist/esm/components/RegexEditor/visualizer/RegexTester.d.ts +22 -0
  108. package/dist/esm/components/RegexEditor/visualizer/RegexTester.js +248 -0
  109. package/dist/esm/components/RegexEditor/visualizer/astToRailroad.d.ts +18 -0
  110. package/dist/esm/components/RegexEditor/visualizer/astToRailroad.js +150 -0
  111. package/dist/esm/components/RegexEditor/visualizer/index.d.ts +12 -0
  112. package/dist/esm/components/RegexEditor/visualizer/index.js +17 -0
  113. package/dist/esm/components/RegexEditor/visualizer/types.d.ts +131 -0
  114. package/dist/esm/components/RegexEditor/visualizer/types.js +1 -0
  115. package/dist/esm/components/RegexEditor/visualizer/utils.d.ts +106 -0
  116. package/dist/esm/components/RegexEditor/visualizer/utils.js +256 -0
  117. package/dist/esm/index.d.ts +3 -1
  118. package/dist/esm/index.js +5 -2
  119. package/dist/esm/types/railroad-diagrams.d.ts +59 -0
  120. package/dist/esm/types/regexp-tree.d.ts +175 -0
  121. package/dist/umd/qc-ui.min.css +1 -1
  122. package/dist/umd/qc-ui.min.js +1 -1
  123. package/package.json +23 -7
@@ -0,0 +1,255 @@
1
+ "use strict";
2
+
3
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.RegexTester = void 0;
8
+ var _react = _interopRequireWildcard(require("react"));
9
+ var _antd = require("antd");
10
+ var _icons = require("@ant-design/icons");
11
+ var _useRegexTester2 = require("../hooks/useRegexTester");
12
+ var _FlagsSelector = require("./FlagsSelector");
13
+ var _MatchItem = require("./MatchItem");
14
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
15
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
16
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
17
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
18
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
19
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
20
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
21
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } /**
22
+ * RegexTester 组件
23
+ *
24
+ * @module RegexEditor/visualizer/RegexTester
25
+ * @description 正则表达式测试面板组件
26
+ */
27
+ var TextArea = _antd.Input.TextArea;
28
+
29
+ /**
30
+ * 正则测试器组件
31
+ *
32
+ * @example
33
+ * ```tsx
34
+ * <RegexTester
35
+ * pattern="\d+"
36
+ * flags={{ global: true }}
37
+ * onMatchResults={(results) => console.log(results)}
38
+ * enableReplace={true}
39
+ * />
40
+ * ```
41
+ */
42
+ var RegexTester = exports.RegexTester = function RegexTester(_ref) {
43
+ var pattern = _ref.pattern,
44
+ initialFlags = _ref.flags,
45
+ externalTestText = _ref.testText,
46
+ onTestTextChange = _ref.onTestTextChange,
47
+ onFlagsChange = _ref.onFlagsChange,
48
+ onMatchResults = _ref.onMatchResults,
49
+ _ref$enableReplace = _ref.enableReplace,
50
+ enableReplace = _ref$enableReplace === void 0 ? false : _ref$enableReplace,
51
+ _ref$maxMatches = _ref.maxMatches,
52
+ maxMatches = _ref$maxMatches === void 0 ? 1000 : _ref$maxMatches,
53
+ _ref$matchTimeout = _ref.matchTimeout,
54
+ matchTimeout = _ref$matchTimeout === void 0 ? 5000 : _ref$matchTimeout,
55
+ _ref$readOnly = _ref.readOnly,
56
+ readOnly = _ref$readOnly === void 0 ? false : _ref$readOnly;
57
+ // 替换文本状态
58
+ var _useState = (0, _react.useState)(''),
59
+ _useState2 = _slicedToArray(_useState, 2),
60
+ replaceText = _useState2[0],
61
+ setReplaceText = _useState2[1];
62
+
63
+ // 使用测试 Hook
64
+ var _useRegexTester = (0, _useRegexTester2.useRegexTester)(pattern, {
65
+ initialTestText: externalTestText || '',
66
+ initialFlags: initialFlags || {
67
+ global: true
68
+ },
69
+ maxMatches: maxMatches,
70
+ matchTimeout: matchTimeout,
71
+ onMatchResults: onMatchResults
72
+ }),
73
+ testText = _useRegexTester.testText,
74
+ setTestText = _useRegexTester.setTestText,
75
+ flags = _useRegexTester.flags,
76
+ setFlags = _useRegexTester.setFlags,
77
+ matches = _useRegexTester.matches,
78
+ isMatching = _useRegexTester.isMatching,
79
+ error = _useRegexTester.error,
80
+ isValid = _useRegexTester.isValid,
81
+ clearTestText = _useRegexTester.clearTestText,
82
+ rematch = _useRegexTester.rematch;
83
+
84
+ // 替换预览
85
+ var _useReplacePreview = (0, _useRegexTester2.useReplacePreview)(pattern, testText, replaceText, flags),
86
+ replaceResult = _useReplacePreview.result,
87
+ replaceError = _useReplacePreview.error;
88
+
89
+ // 处理测试文本变化
90
+ var handleTestTextChange = function handleTestTextChange(e) {
91
+ var newText = e.target.value;
92
+ setTestText(newText);
93
+ onTestTextChange === null || onTestTextChange === void 0 || onTestTextChange(newText);
94
+ };
95
+
96
+ // 处理标志变化
97
+ var handleFlagsChange = function handleFlagsChange(newFlags) {
98
+ setFlags(newFlags);
99
+ onFlagsChange === null || onFlagsChange === void 0 || onFlagsChange(newFlags);
100
+ };
101
+
102
+ // 是否显示匹配数量警告
103
+ var showMaxMatchesWarning = matches.length >= maxMatches;
104
+ return /*#__PURE__*/_react.default.createElement("div", {
105
+ className: "regex-tester"
106
+ }, /*#__PURE__*/_react.default.createElement(_antd.Card, {
107
+ size: "small",
108
+ style: {
109
+ marginBottom: 16
110
+ }
111
+ }, /*#__PURE__*/_react.default.createElement(_antd.Space, {
112
+ split: /*#__PURE__*/_react.default.createElement(_antd.Divider, {
113
+ type: "vertical"
114
+ }),
115
+ wrap: true
116
+ }, /*#__PURE__*/_react.default.createElement(_FlagsSelector.FlagsSelector, {
117
+ value: flags,
118
+ onChange: handleFlagsChange,
119
+ disabled: readOnly
120
+ }), /*#__PURE__*/_react.default.createElement(_antd.Space, null, /*#__PURE__*/_react.default.createElement(_antd.Button, {
121
+ icon: /*#__PURE__*/_react.default.createElement(_icons.ClearOutlined, null),
122
+ size: "small",
123
+ onClick: clearTestText,
124
+ disabled: !testText || readOnly
125
+ }, "\u6E05\u7A7A"), /*#__PURE__*/_react.default.createElement(_antd.Button, {
126
+ icon: /*#__PURE__*/_react.default.createElement(_icons.ReloadOutlined, null),
127
+ size: "small",
128
+ onClick: rematch
129
+ }, "\u91CD\u65B0\u5339\u914D")))), error && /*#__PURE__*/_react.default.createElement(_antd.Alert, {
130
+ message: "\u5339\u914D\u9519\u8BEF",
131
+ description: error,
132
+ type: "error",
133
+ showIcon: true,
134
+ closable: true,
135
+ style: {
136
+ marginBottom: 16
137
+ }
138
+ }), /*#__PURE__*/_react.default.createElement(_antd.Row, {
139
+ gutter: 16
140
+ }, /*#__PURE__*/_react.default.createElement(_antd.Col, {
141
+ span: 12
142
+ }, /*#__PURE__*/_react.default.createElement(_antd.Card, {
143
+ title: "\u6D4B\u8BD5\u6587\u672C",
144
+ size: "small",
145
+ extra: /*#__PURE__*/_react.default.createElement("span", {
146
+ style: {
147
+ fontSize: '12px',
148
+ color: '#999'
149
+ }
150
+ }, testText.length, " \u5B57\u7B26")
151
+ }, /*#__PURE__*/_react.default.createElement(TextArea, {
152
+ value: testText,
153
+ onChange: handleTestTextChange,
154
+ placeholder: "\u8F93\u5165\u6D4B\u8BD5\u6587\u672C...",
155
+ rows: 12,
156
+ disabled: readOnly,
157
+ style: {
158
+ fontFamily: 'Monaco, Menlo, monospace',
159
+ fontSize: '13px'
160
+ }
161
+ }))), /*#__PURE__*/_react.default.createElement(_antd.Col, {
162
+ span: 12
163
+ }, /*#__PURE__*/_react.default.createElement(_antd.Card, {
164
+ title: /*#__PURE__*/_react.default.createElement(_antd.Space, null, /*#__PURE__*/_react.default.createElement("span", null, "\u5339\u914D\u7ED3\u679C"), isMatching && /*#__PURE__*/_react.default.createElement("span", {
165
+ style: {
166
+ fontSize: '12px',
167
+ color: '#999'
168
+ }
169
+ }, "\u5339\u914D\u4E2D..."), !isMatching && isValid && /*#__PURE__*/_react.default.createElement("span", {
170
+ style: {
171
+ fontSize: '12px',
172
+ color: matches.length > 0 ? '#52c41a' : '#999'
173
+ }
174
+ }, matches.length, " \u4E2A\u5339\u914D")),
175
+ size: "small"
176
+ }, showMaxMatchesWarning && /*#__PURE__*/_react.default.createElement(_antd.Alert, {
177
+ message: "\u5DF2\u8FBE\u5230\u6700\u5927\u5339\u914D\u6570\u9650\u5236 (".concat(maxMatches, "),\u53EF\u80FD\u8FD8\u6709\u66F4\u591A\u5339\u914D"),
178
+ type: "warning",
179
+ showIcon: true,
180
+ closable: true,
181
+ style: {
182
+ marginBottom: 12
183
+ }
184
+ }), /*#__PURE__*/_react.default.createElement("div", {
185
+ style: {
186
+ maxHeight: '400px',
187
+ overflow: 'auto'
188
+ }
189
+ }, !isValid && !error && pattern && /*#__PURE__*/_react.default.createElement(_antd.Empty, {
190
+ description: "\u65E0\u6548\u7684\u6B63\u5219\u8868\u8FBE\u5F0F"
191
+ }), isValid && matches.length === 0 && testText && /*#__PURE__*/_react.default.createElement(_antd.Empty, {
192
+ description: "\u65E0\u5339\u914D\u7ED3\u679C"
193
+ }), matches.length === 0 && !testText && /*#__PURE__*/_react.default.createElement(_antd.Empty, {
194
+ description: "\u8BF7\u8F93\u5165\u6D4B\u8BD5\u6587\u672C"
195
+ }), matches.length > 0 && /*#__PURE__*/_react.default.createElement(_antd.List, {
196
+ dataSource: matches,
197
+ renderItem: function renderItem(match, index) {
198
+ return /*#__PURE__*/_react.default.createElement(_MatchItem.MatchItem, {
199
+ key: "match-".concat(index),
200
+ match: match,
201
+ index: index
202
+ });
203
+ }
204
+ }))))), enableReplace && /*#__PURE__*/_react.default.createElement(_antd.Card, {
205
+ title: "\u66FF\u6362\u9884\u89C8",
206
+ size: "small",
207
+ style: {
208
+ marginTop: 16
209
+ }
210
+ }, /*#__PURE__*/_react.default.createElement(_antd.Space, {
211
+ direction: "vertical",
212
+ style: {
213
+ width: '100%'
214
+ },
215
+ size: "middle"
216
+ }, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", {
217
+ style: {
218
+ marginBottom: 8
219
+ }
220
+ }, /*#__PURE__*/_react.default.createElement("span", {
221
+ style: {
222
+ fontSize: '13px',
223
+ color: '#666'
224
+ }
225
+ }, "\u66FF\u6362\u4E3A (\u652F\u6301 $1, $2 \u7B49\u6355\u83B7\u7EC4\u5F15\u7528):")), /*#__PURE__*/_react.default.createElement(_antd.Input, {
226
+ value: replaceText,
227
+ onChange: function onChange(e) {
228
+ return setReplaceText(e.target.value);
229
+ },
230
+ placeholder: "\u4F8B\u5982: $1-$2",
231
+ disabled: readOnly || !isValid
232
+ })), replaceError && /*#__PURE__*/_react.default.createElement(_antd.Alert, {
233
+ message: replaceError,
234
+ type: "error",
235
+ showIcon: true
236
+ }), replaceResult && /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", {
237
+ style: {
238
+ marginBottom: 8
239
+ }
240
+ }, /*#__PURE__*/_react.default.createElement("span", {
241
+ style: {
242
+ fontSize: '13px',
243
+ color: '#666'
244
+ }
245
+ }, "\u66FF\u6362\u7ED3\u679C:")), /*#__PURE__*/_react.default.createElement(TextArea, {
246
+ value: replaceResult,
247
+ readOnly: true,
248
+ rows: 6,
249
+ style: {
250
+ fontFamily: 'Monaco, Menlo, monospace',
251
+ fontSize: '13px',
252
+ backgroundColor: '#f6f6f6'
253
+ }
254
+ })))));
255
+ };
@@ -0,0 +1,19 @@
1
+ /**
2
+ * AST to Railroad Diagram Converter
3
+ *
4
+ * @module RegexEditor/visualizer/astToRailroad
5
+ * @description 将 regexp-tree 的 AST 转换为 railroad-diagrams 格式
6
+ */
7
+ /// <reference types="dist/cjs/types/railroad-diagrams" />
8
+ /// <reference types="src/types/railroad-diagrams" />
9
+ /// <reference types="dist/esm/types/railroad-diagrams" />
10
+ import { Diagram, type DiagramNode } from 'railroad-diagrams';
11
+ import type { ASTNode } from '../validation/types';
12
+ /**
13
+ * 将 regexp-tree AST 节点转换为 railroad-diagram 节点
14
+ */
15
+ export declare function convertASTToRailroad(ast: ASTNode): DiagramNode;
16
+ /**
17
+ * 创建完整的 Railroad Diagram
18
+ */
19
+ export declare function createRailroadDiagram(ast: ASTNode): Diagram;
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.convertASTToRailroad = convertASTToRailroad;
7
+ exports.createRailroadDiagram = createRailroadDiagram;
8
+ var _railroadDiagrams = require("railroad-diagrams");
9
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } /**
10
+ * AST to Railroad Diagram Converter
11
+ *
12
+ * @module RegexEditor/visualizer/astToRailroad
13
+ * @description 将 regexp-tree 的 AST 转换为 railroad-diagrams 格式
14
+ */
15
+ /**
16
+ * 将 regexp-tree AST 节点转换为 railroad-diagram 节点
17
+ */
18
+ function convertASTToRailroad(ast) {
19
+ if (!ast || !ast.type) {
20
+ console.warn('空或无效的 AST 节点:', ast);
21
+ return new _railroadDiagrams.Skip();
22
+ }
23
+
24
+ // 调试日志
25
+ if (ast.type === 'Alternative' || ast.type === 'CharacterClass') {
26
+ console.log("\u5904\u7406 ".concat(ast.type, " \u8282\u70B9:"), {
27
+ type: ast.type,
28
+ expressions: ast.expressions,
29
+ isArray: Array.isArray(ast.expressions)
30
+ });
31
+ }
32
+ switch (ast.type) {
33
+ case 'RegExp':
34
+ // 正则表达式根节点,提取 body
35
+ return ast.body ? convertASTToRailroad(ast.body) : new _railroadDiagrams.Skip();
36
+ case 'Alternative':
37
+ // 选择分支 (a|b|c)
38
+ if (ast.expressions && Array.isArray(ast.expressions) && ast.expressions.length > 0) {
39
+ var choices = ast.expressions.map(convertASTToRailroad);
40
+ return new _railroadDiagrams.Choice(0, choices);
41
+ }
42
+ return new _railroadDiagrams.Skip();
43
+ case 'Disjunction':
44
+ // 析取 (a|b)
45
+ if (ast.left && ast.right) {
46
+ return new _railroadDiagrams.Choice(0, [convertASTToRailroad(ast.left), convertASTToRailroad(ast.right)]);
47
+ }
48
+ return new _railroadDiagrams.Skip();
49
+ case 'Group':
50
+ // 捕获组 (...)
51
+ var groupContent = ast.expression ? convertASTToRailroad(ast.expression) : new _railroadDiagrams.Skip();
52
+ if (ast.capturing) {
53
+ return new _railroadDiagrams.Sequence([new _railroadDiagrams.NonTerminal(ast.name ? "(?<".concat(ast.name, ">") : '('), groupContent, new _railroadDiagrams.NonTerminal(')')]);
54
+ }
55
+ return groupContent;
56
+ case 'Char':
57
+ // 字符字面量
58
+ if (ast.value) {
59
+ var char = 'escaped' in ast && ast.escaped ? "\\".concat(ast.value) : ast.value;
60
+ return new _railroadDiagrams.Terminal(char);
61
+ }
62
+ return new _railroadDiagrams.Skip();
63
+ case 'CharacterClass':
64
+ // 字符类 [abc]
65
+ var classContent = ast.expressions && Array.isArray(ast.expressions) ? ast.expressions.map(convertASTToRailroad) : [];
66
+ var prefix = ast.negative ? '[^' : '[';
67
+ return new _railroadDiagrams.Sequence([new _railroadDiagrams.NonTerminal(prefix), classContent.length > 0 ? new _railroadDiagrams.Choice(0, classContent) : new _railroadDiagrams.Skip(), new _railroadDiagrams.NonTerminal(']')]);
68
+ case 'ClassRange':
69
+ // 字符范围 a-z
70
+ if (ast.from && ast.to) {
71
+ return new _railroadDiagrams.Terminal("".concat(convertCharNode(ast.from), "-").concat(convertCharNode(ast.to)));
72
+ }
73
+ return new _railroadDiagrams.Skip();
74
+ case 'Repetition':
75
+ // 量词 *, +, ?, {n,m}
76
+ var repContent = ast.expression ? convertASTToRailroad(ast.expression) : new _railroadDiagrams.Skip();
77
+ if (ast.quantifier) {
78
+ var _ast$quantifier = ast.quantifier,
79
+ kind = _ast$quantifier.kind,
80
+ greedy = _ast$quantifier.greedy;
81
+ var suffix = greedy ? '' : '?';
82
+ switch (kind) {
83
+ case '*':
84
+ return new _railroadDiagrams.Sequence([new _railroadDiagrams.ZeroOrMore(repContent), greedy === false ? new _railroadDiagrams.NonTerminal('?') : new _railroadDiagrams.Skip()]);
85
+ case '+':
86
+ return new _railroadDiagrams.Sequence([new _railroadDiagrams.OneOrMore(repContent), greedy === false ? new _railroadDiagrams.NonTerminal('?') : new _railroadDiagrams.Skip()]);
87
+ case '?':
88
+ return new _railroadDiagrams.Sequence([new _railroadDiagrams.Optional(repContent), greedy === false ? new _railroadDiagrams.NonTerminal('?') : new _railroadDiagrams.Skip()]);
89
+ default:
90
+ // {n}, {n,}, {n,m}
91
+ if (ast.quantifier.from !== undefined) {
92
+ var rangeText = ast.quantifier.to !== undefined ? "{".concat(ast.quantifier.from, ",").concat(ast.quantifier.to, "}").concat(suffix) : ast.quantifier.to === null ? "{".concat(ast.quantifier.from, ",}").concat(suffix) : "{".concat(ast.quantifier.from, "}").concat(suffix);
93
+ return new _railroadDiagrams.Sequence([repContent, new _railroadDiagrams.NonTerminal(rangeText)]);
94
+ }
95
+ return repContent;
96
+ }
97
+ }
98
+ return repContent;
99
+ case 'Assertion':
100
+ // 断言 ^, $, \b, \B, (?=...), (?!...)
101
+ var assertionText = '';
102
+ if (ast.kind === '^') assertionText = '^';else if (ast.kind === '$') assertionText = '$';else if (ast.kind === '\\b') assertionText = '\\b';else if (ast.kind === '\\B') assertionText = '\\B';else if (ast.kind === 'Lookahead') {
103
+ var _prefix = ast.negative ? '(?!' : '(?=';
104
+ var content = ast.assertion ? convertASTToRailroad(ast.assertion) : new _railroadDiagrams.Skip();
105
+ return new _railroadDiagrams.Sequence([new _railroadDiagrams.NonTerminal(_prefix), content, new _railroadDiagrams.NonTerminal(')')]);
106
+ } else if (ast.kind === 'Lookbehind') {
107
+ var _prefix2 = ast.negative ? '(?<!' : '(?<=';
108
+ var _content = ast.assertion ? convertASTToRailroad(ast.assertion) : new _railroadDiagrams.Skip();
109
+ return new _railroadDiagrams.Sequence([new _railroadDiagrams.NonTerminal(_prefix2), _content, new _railroadDiagrams.NonTerminal(')')]);
110
+ }
111
+ return new _railroadDiagrams.NonTerminal(assertionText);
112
+ case 'Backreference':
113
+ // 反向引用 \1, \k<name>
114
+ if (ast.kind === 'number') {
115
+ return new _railroadDiagrams.NonTerminal("\\".concat(ast.reference));
116
+ } else if (ast.kind === 'name') {
117
+ return new _railroadDiagrams.NonTerminal("\\k<".concat(ast.reference, ">"));
118
+ }
119
+ return new _railroadDiagrams.Skip();
120
+ default:
121
+ // 对于未知节点,尝试处理子节点
122
+ if ('expressions' in ast && ast.expressions && Array.isArray(ast.expressions)) {
123
+ var children = ast.expressions.map(convertASTToRailroad);
124
+ return children.length === 1 ? children[0] : new _railroadDiagrams.Sequence(children);
125
+ }
126
+ if ('expression' in ast && ast.expression && _typeof(ast.expression) === 'object' && 'type' in ast.expression) {
127
+ return convertASTToRailroad(ast.expression);
128
+ }
129
+ return new _railroadDiagrams.Skip();
130
+ }
131
+ }
132
+
133
+ /**
134
+ * 辅助函数:将字符节点转换为字符串
135
+ */
136
+ function convertCharNode(node) {
137
+ if (node.type === 'Char') {
138
+ return node.escaped ? "\\".concat(node.value) : node.value;
139
+ }
140
+ return String(node.value || '');
141
+ }
142
+
143
+ /**
144
+ * 创建完整的 Railroad Diagram
145
+ */
146
+ function createRailroadDiagram(ast) {
147
+ try {
148
+ var diagramNode = convertASTToRailroad(ast);
149
+ return new _railroadDiagrams.Diagram([diagramNode]);
150
+ } catch (error) {
151
+ console.error('Railroad Diagram 转换错误:', error);
152
+ console.error('AST 节点:', JSON.stringify(ast, null, 2));
153
+ throw error;
154
+ }
155
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * RegexEditor Visualizer - 导出索引
3
+ *
4
+ * @module RegexEditor/visualizer
5
+ * @description 可视化组件导出
6
+ */
7
+ export { RegexTester } from './RegexTester';
8
+ export { FlagsSelector } from './FlagsSelector';
9
+ export { MatchItem } from './MatchItem';
10
+ export { RegexRailroadDiagram } from './RegexRailroadDiagram';
11
+ export type { RegexFlags, MatchResult, RegexTesterProps, RegexVisualizerProps, FlagsSelectorProps, MatchItemProps, ReplacePreviewProps, RegexRailroadDiagramProps, } from './types';
12
+ export { flagsToString, stringToFlags, performMatch, performReplace, highlightMatches, formatPosition, isValidRegex, } from './utils';
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "FlagsSelector", {
7
+ enumerable: true,
8
+ get: function get() {
9
+ return _FlagsSelector.FlagsSelector;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "MatchItem", {
13
+ enumerable: true,
14
+ get: function get() {
15
+ return _MatchItem.MatchItem;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "RegexRailroadDiagram", {
19
+ enumerable: true,
20
+ get: function get() {
21
+ return _RegexRailroadDiagram.RegexRailroadDiagram;
22
+ }
23
+ });
24
+ Object.defineProperty(exports, "RegexTester", {
25
+ enumerable: true,
26
+ get: function get() {
27
+ return _RegexTester.RegexTester;
28
+ }
29
+ });
30
+ Object.defineProperty(exports, "flagsToString", {
31
+ enumerable: true,
32
+ get: function get() {
33
+ return _utils.flagsToString;
34
+ }
35
+ });
36
+ Object.defineProperty(exports, "formatPosition", {
37
+ enumerable: true,
38
+ get: function get() {
39
+ return _utils.formatPosition;
40
+ }
41
+ });
42
+ Object.defineProperty(exports, "highlightMatches", {
43
+ enumerable: true,
44
+ get: function get() {
45
+ return _utils.highlightMatches;
46
+ }
47
+ });
48
+ Object.defineProperty(exports, "isValidRegex", {
49
+ enumerable: true,
50
+ get: function get() {
51
+ return _utils.isValidRegex;
52
+ }
53
+ });
54
+ Object.defineProperty(exports, "performMatch", {
55
+ enumerable: true,
56
+ get: function get() {
57
+ return _utils.performMatch;
58
+ }
59
+ });
60
+ Object.defineProperty(exports, "performReplace", {
61
+ enumerable: true,
62
+ get: function get() {
63
+ return _utils.performReplace;
64
+ }
65
+ });
66
+ Object.defineProperty(exports, "stringToFlags", {
67
+ enumerable: true,
68
+ get: function get() {
69
+ return _utils.stringToFlags;
70
+ }
71
+ });
72
+ var _RegexTester = require("./RegexTester");
73
+ var _FlagsSelector = require("./FlagsSelector");
74
+ var _MatchItem = require("./MatchItem");
75
+ var _RegexRailroadDiagram = require("./RegexRailroadDiagram");
76
+ var _utils = require("./utils");
@@ -0,0 +1,131 @@
1
+ /**
2
+ * 正则表达式可视化 - 类型定义
3
+ *
4
+ * @module RegexEditor/visualizer/types
5
+ * @description 定义可视化组件的类型和接口
6
+ */
7
+ /// <reference types="react" />
8
+ /**
9
+ * 正则表达式标志
10
+ */
11
+ export interface RegexFlags {
12
+ /** 全局匹配 */
13
+ global?: boolean;
14
+ /** 忽略大小写 */
15
+ ignoreCase?: boolean;
16
+ /** 多行模式 */
17
+ multiline?: boolean;
18
+ /** dotAll 模式 (. 匹配换行符) */
19
+ dotAll?: boolean;
20
+ /** Unicode 模式 */
21
+ unicode?: boolean;
22
+ /** 粘性匹配 */
23
+ sticky?: boolean;
24
+ }
25
+ /**
26
+ * 匹配结果
27
+ */
28
+ export interface MatchResult {
29
+ /** 匹配的索引位置 */
30
+ index: number;
31
+ /** 匹配结束位置 */
32
+ lastIndex: number;
33
+ /** 完整匹配的文本 */
34
+ fullMatch: string;
35
+ /** 捕获组数组 (索引 0 是完整匹配) */
36
+ groups: string[];
37
+ /** 命名捕获组 */
38
+ namedGroups?: Record<string, string>;
39
+ }
40
+ /**
41
+ * RegexTester 组件属性
42
+ */
43
+ export interface RegexTesterProps {
44
+ /** 正则表达式模式 */
45
+ pattern: string;
46
+ /** 正则表达式标志 */
47
+ flags?: RegexFlags;
48
+ /** 测试文本 */
49
+ testText?: string;
50
+ /** 测试文本变化回调 */
51
+ onTestTextChange?: (text: string) => void;
52
+ /** 标志变化回调 */
53
+ onFlagsChange?: (flags: RegexFlags) => void;
54
+ /** 匹配结果回调 */
55
+ onMatchResults?: (results: MatchResult[]) => void;
56
+ /** 是否启用替换功能 */
57
+ enableReplace?: boolean;
58
+ /** 最大匹配数量限制 */
59
+ maxMatches?: number;
60
+ /** 匹配超时时间 (毫秒) */
61
+ matchTimeout?: number;
62
+ /** 是否只读 */
63
+ readOnly?: boolean;
64
+ }
65
+ /**
66
+ * RegexVisualizer 主容器组件属性
67
+ */
68
+ export interface RegexVisualizerProps {
69
+ /** 正则表达式模式 */
70
+ pattern: string;
71
+ /** 是否显示 AST 可视化 */
72
+ showAST?: boolean;
73
+ /** 是否显示 Railroad 图 */
74
+ showRailroad?: boolean;
75
+ /** 其他 RegexTester 属性 */
76
+ testerProps?: Omit<RegexTesterProps, 'pattern'>;
77
+ }
78
+ /**
79
+ * FlagsSelector 组件属性
80
+ */
81
+ export interface FlagsSelectorProps {
82
+ /** 当前标志值 */
83
+ value?: RegexFlags;
84
+ /** 标志变化回调 */
85
+ onChange?: (flags: RegexFlags) => void;
86
+ /** 是否禁用 */
87
+ disabled?: boolean;
88
+ }
89
+ /**
90
+ * MatchItem 组件属性
91
+ */
92
+ export interface MatchItemProps {
93
+ /** 匹配结果 */
94
+ match: MatchResult;
95
+ /** 匹配项索引 */
96
+ index: number;
97
+ /** 是否高亮显示 */
98
+ highlighted?: boolean;
99
+ /** 点击回调 */
100
+ onClick?: (match: MatchResult, index: number) => void;
101
+ }
102
+ /**
103
+ * ReplacePreview 组件属性
104
+ */
105
+ export interface ReplacePreviewProps {
106
+ /** 原始文本 */
107
+ originalText: string;
108
+ /** 正则表达式模式 */
109
+ pattern: string;
110
+ /** 标志 */
111
+ flags?: RegexFlags;
112
+ /** 替换文本 (支持 $1, $2 等) */
113
+ replaceText: string;
114
+ /** 替换文本变化回调 */
115
+ onReplaceTextChange?: (text: string) => void;
116
+ }
117
+ /**
118
+ * RegexRailroadDiagram 组件属性
119
+ */
120
+ export interface RegexRailroadDiagramProps {
121
+ /** 正则表达式模式 */
122
+ pattern: string;
123
+ /** 是否显示标题 */
124
+ showTitle?: boolean;
125
+ /** 卡片大小 */
126
+ size?: 'small' | 'default';
127
+ /** 自定义样式 */
128
+ style?: React.CSSProperties;
129
+ /** 自定义类名 */
130
+ className?: string;
131
+ }
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });