@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.
- package/dist/cjs/components/RegexEditor/core/RegexEditor.d.ts +34 -0
- package/dist/cjs/components/RegexEditor/core/RegexEditor.js +223 -0
- package/dist/cjs/components/RegexEditor/core/RegexEditor.less +119 -0
- package/dist/cjs/components/RegexEditor/core/extensions/errorMarker.d.ts +49 -0
- package/dist/cjs/components/RegexEditor/core/extensions/errorMarker.js +158 -0
- package/dist/cjs/components/RegexEditor/core/types.d.ts +79 -0
- package/dist/cjs/components/RegexEditor/core/types.js +5 -0
- package/dist/cjs/components/RegexEditor/hooks/index.d.ts +9 -0
- package/dist/cjs/components/RegexEditor/hooks/index.js +19 -0
- package/dist/cjs/components/RegexEditor/hooks/useRegexTester.d.ts +95 -0
- package/dist/cjs/components/RegexEditor/hooks/useRegexTester.js +234 -0
- package/dist/cjs/components/RegexEditor/hooks/useRegexValidation.d.ts +71 -0
- package/dist/cjs/components/RegexEditor/hooks/useRegexValidation.js +215 -0
- package/dist/cjs/components/RegexEditor/hooks/useTemplateManager.d.ts +64 -0
- package/dist/cjs/components/RegexEditor/hooks/useTemplateManager.js +438 -0
- package/dist/cjs/components/RegexEditor/index.d.ts +16 -0
- package/dist/cjs/components/RegexEditor/index.js +232 -0
- package/dist/cjs/components/RegexEditor/templates/TemplateSelector.d.ts +36 -0
- package/dist/cjs/components/RegexEditor/templates/TemplateSelector.js +322 -0
- package/dist/cjs/components/RegexEditor/templates/builtinTemplates.d.ts +36 -0
- package/dist/cjs/components/RegexEditor/templates/builtinTemplates.js +340 -0
- package/dist/cjs/components/RegexEditor/templates/index.d.ts +10 -0
- package/dist/cjs/components/RegexEditor/templates/index.js +184 -0
- package/dist/cjs/components/RegexEditor/templates/storage.d.ts +74 -0
- package/dist/cjs/components/RegexEditor/templates/storage.js +337 -0
- package/dist/cjs/components/RegexEditor/templates/templateManager.d.ts +67 -0
- package/dist/cjs/components/RegexEditor/templates/templateManager.js +277 -0
- package/dist/cjs/components/RegexEditor/templates/types.d.ts +111 -0
- package/dist/cjs/components/RegexEditor/templates/types.js +94 -0
- package/dist/cjs/components/RegexEditor/testing/types.d.ts +55 -0
- package/dist/cjs/components/RegexEditor/testing/types.js +5 -0
- package/dist/cjs/components/RegexEditor/validation/complexity.d.ts +22 -0
- package/dist/cjs/components/RegexEditor/validation/complexity.js +196 -0
- package/dist/cjs/components/RegexEditor/validation/parser.d.ts +53 -0
- package/dist/cjs/components/RegexEditor/validation/parser.js +129 -0
- package/dist/cjs/components/RegexEditor/validation/types.d.ts +146 -0
- package/dist/cjs/components/RegexEditor/validation/types.js +5 -0
- package/dist/cjs/components/RegexEditor/validation/validator.d.ts +60 -0
- package/dist/cjs/components/RegexEditor/validation/validator.js +218 -0
- package/dist/cjs/components/RegexEditor/visualizer/FlagsSelector.d.ts +20 -0
- package/dist/cjs/components/RegexEditor/visualizer/FlagsSelector.js +98 -0
- package/dist/cjs/components/RegexEditor/visualizer/MatchItem.d.ts +25 -0
- package/dist/cjs/components/RegexEditor/visualizer/MatchItem.js +201 -0
- package/dist/cjs/components/RegexEditor/visualizer/RegexRailroadDiagram.d.ts +32 -0
- package/dist/cjs/components/RegexEditor/visualizer/RegexRailroadDiagram.js +192 -0
- package/dist/cjs/components/RegexEditor/visualizer/RegexTester.d.ts +22 -0
- package/dist/cjs/components/RegexEditor/visualizer/RegexTester.js +255 -0
- package/dist/cjs/components/RegexEditor/visualizer/astToRailroad.d.ts +19 -0
- package/dist/cjs/components/RegexEditor/visualizer/astToRailroad.js +155 -0
- package/dist/cjs/components/RegexEditor/visualizer/index.d.ts +12 -0
- package/dist/cjs/components/RegexEditor/visualizer/index.js +76 -0
- package/dist/cjs/components/RegexEditor/visualizer/types.d.ts +131 -0
- package/dist/cjs/components/RegexEditor/visualizer/types.js +5 -0
- package/dist/cjs/components/RegexEditor/visualizer/utils.d.ts +106 -0
- package/dist/cjs/components/RegexEditor/visualizer/utils.js +268 -0
- package/dist/cjs/index.d.ts +3 -1
- package/dist/cjs/index.js +55 -0
- package/dist/cjs/standardFormDialog/useStandardFormSchema.d.ts +1 -1
- package/dist/cjs/standardFormDialog/withStandardForm.d.ts +2 -2
- package/dist/cjs/types/railroad-diagrams.d.ts +59 -0
- package/dist/cjs/types/regexp-tree.d.ts +175 -0
- package/dist/esm/components/RegexEditor/core/RegexEditor.d.ts +34 -0
- package/dist/esm/components/RegexEditor/core/RegexEditor.js +214 -0
- package/dist/esm/components/RegexEditor/core/RegexEditor.less +119 -0
- package/dist/esm/components/RegexEditor/core/extensions/errorMarker.d.ts +49 -0
- package/dist/esm/components/RegexEditor/core/extensions/errorMarker.js +154 -0
- package/dist/esm/components/RegexEditor/core/types.d.ts +79 -0
- package/dist/esm/components/RegexEditor/core/types.js +1 -0
- package/dist/esm/components/RegexEditor/hooks/index.d.ts +9 -0
- package/dist/esm/components/RegexEditor/hooks/index.js +8 -0
- package/dist/esm/components/RegexEditor/hooks/useRegexTester.d.ts +95 -0
- package/dist/esm/components/RegexEditor/hooks/useRegexTester.js +230 -0
- package/dist/esm/components/RegexEditor/hooks/useRegexValidation.d.ts +71 -0
- package/dist/esm/components/RegexEditor/hooks/useRegexValidation.js +211 -0
- package/dist/esm/components/RegexEditor/hooks/useTemplateManager.d.ts +64 -0
- package/dist/esm/components/RegexEditor/hooks/useTemplateManager.js +430 -0
- package/dist/esm/components/RegexEditor/index.d.ts +16 -0
- package/dist/esm/components/RegexEditor/index.js +27 -0
- package/dist/esm/components/RegexEditor/templates/TemplateSelector.d.ts +36 -0
- package/dist/esm/components/RegexEditor/templates/TemplateSelector.js +316 -0
- package/dist/esm/components/RegexEditor/templates/builtinTemplates.d.ts +36 -0
- package/dist/esm/components/RegexEditor/templates/builtinTemplates.js +335 -0
- package/dist/esm/components/RegexEditor/templates/index.d.ts +10 -0
- package/dist/esm/components/RegexEditor/templates/index.js +19 -0
- package/dist/esm/components/RegexEditor/templates/storage.d.ts +74 -0
- package/dist/esm/components/RegexEditor/templates/storage.js +335 -0
- package/dist/esm/components/RegexEditor/templates/templateManager.d.ts +67 -0
- package/dist/esm/components/RegexEditor/templates/templateManager.js +274 -0
- package/dist/esm/components/RegexEditor/templates/types.d.ts +111 -0
- package/dist/esm/components/RegexEditor/templates/types.js +90 -0
- package/dist/esm/components/RegexEditor/testing/types.d.ts +55 -0
- package/dist/esm/components/RegexEditor/testing/types.js +1 -0
- package/dist/esm/components/RegexEditor/validation/complexity.d.ts +22 -0
- package/dist/esm/components/RegexEditor/validation/complexity.js +190 -0
- package/dist/esm/components/RegexEditor/validation/parser.d.ts +53 -0
- package/dist/esm/components/RegexEditor/validation/parser.js +123 -0
- package/dist/esm/components/RegexEditor/validation/types.d.ts +145 -0
- package/dist/esm/components/RegexEditor/validation/types.js +1 -0
- package/dist/esm/components/RegexEditor/validation/validator.d.ts +60 -0
- package/dist/esm/components/RegexEditor/validation/validator.js +213 -0
- package/dist/esm/components/RegexEditor/visualizer/FlagsSelector.d.ts +20 -0
- package/dist/esm/components/RegexEditor/visualizer/FlagsSelector.js +93 -0
- package/dist/esm/components/RegexEditor/visualizer/MatchItem.d.ts +25 -0
- package/dist/esm/components/RegexEditor/visualizer/MatchItem.js +194 -0
- package/dist/esm/components/RegexEditor/visualizer/RegexRailroadDiagram.d.ts +32 -0
- package/dist/esm/components/RegexEditor/visualizer/RegexRailroadDiagram.js +186 -0
- package/dist/esm/components/RegexEditor/visualizer/RegexTester.d.ts +22 -0
- package/dist/esm/components/RegexEditor/visualizer/RegexTester.js +248 -0
- package/dist/esm/components/RegexEditor/visualizer/astToRailroad.d.ts +18 -0
- package/dist/esm/components/RegexEditor/visualizer/astToRailroad.js +150 -0
- package/dist/esm/components/RegexEditor/visualizer/index.d.ts +12 -0
- package/dist/esm/components/RegexEditor/visualizer/index.js +17 -0
- package/dist/esm/components/RegexEditor/visualizer/types.d.ts +131 -0
- package/dist/esm/components/RegexEditor/visualizer/types.js +1 -0
- package/dist/esm/components/RegexEditor/visualizer/utils.d.ts +106 -0
- package/dist/esm/components/RegexEditor/visualizer/utils.js +256 -0
- package/dist/esm/index.d.ts +3 -1
- package/dist/esm/index.js +5 -2
- package/dist/esm/types/railroad-diagrams.d.ts +59 -0
- package/dist/esm/types/regexp-tree.d.ts +175 -0
- package/dist/umd/qc-ui.min.css +1 -1
- package/dist/umd/qc-ui.min.js +1 -1
- package/package.json +23 -7
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 模板系统统一导出
|
|
3
|
+
*/
|
|
4
|
+
export type { RegexTemplate } from './types';
|
|
5
|
+
export { TemplateCategory } from './types';
|
|
6
|
+
export { getAllBuiltinTemplates, getTemplatesByCategory as getBuiltinTemplatesByCategory, getTemplateById as getBuiltinTemplateById, searchTemplates as searchBuiltinTemplates, } from './builtinTemplates';
|
|
7
|
+
export { TemplateStorage, loadCustomTemplates, saveCustomTemplate, deleteCustomTemplate, updateTemplateUsage, clearAllTemplates, exportTemplates, importTemplates, getStorageStats, isStorageAvailable, } from './storage';
|
|
8
|
+
export { getAllTemplates, getTemplateById, getTemplatesByCategory, searchTemplates, getMostUsedTemplates, getRecentlyUsedTemplates, createCustomTemplate, updateCustomTemplate, deleteCustomTemplate as deleteCustomTemplateById, duplicateTemplate, useTemplate, getTemplateStats, validateTemplate, } from './templateManager';
|
|
9
|
+
export { TemplateSelector } from './TemplateSelector';
|
|
10
|
+
export type { TemplateSelectorProps } from './TemplateSelector';
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 模板系统统一导出
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
// 类型定义
|
|
6
|
+
|
|
7
|
+
export { TemplateCategory } from "./types";
|
|
8
|
+
|
|
9
|
+
// 内置模板
|
|
10
|
+
export { getAllBuiltinTemplates, getTemplatesByCategory as getBuiltinTemplatesByCategory, getTemplateById as getBuiltinTemplateById, searchTemplates as searchBuiltinTemplates } from "./builtinTemplates";
|
|
11
|
+
|
|
12
|
+
// 存储层
|
|
13
|
+
export { TemplateStorage, loadCustomTemplates, saveCustomTemplate, deleteCustomTemplate, updateTemplateUsage, clearAllTemplates, exportTemplates, importTemplates, getStorageStats, isStorageAvailable } from "./storage";
|
|
14
|
+
|
|
15
|
+
// 管理层
|
|
16
|
+
export { getAllTemplates, getTemplateById, getTemplatesByCategory, searchTemplates, getMostUsedTemplates, getRecentlyUsedTemplates, createCustomTemplate, updateCustomTemplate, deleteCustomTemplate as deleteCustomTemplateById, duplicateTemplate, useTemplate, getTemplateStats, validateTemplate } from "./templateManager";
|
|
17
|
+
|
|
18
|
+
// UI 组件
|
|
19
|
+
export { TemplateSelector } from "./TemplateSelector";
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 自定义模板存储模块
|
|
3
|
+
* 使用 LocalStorage 持久化存储用户自定义的正则表达式模板
|
|
4
|
+
*/
|
|
5
|
+
import type { RegexTemplate } from './types';
|
|
6
|
+
/**
|
|
7
|
+
* 模板存储工具类
|
|
8
|
+
*/
|
|
9
|
+
export declare class TemplateStorage {
|
|
10
|
+
/**
|
|
11
|
+
* 加载所有自定义模板
|
|
12
|
+
*/
|
|
13
|
+
static loadCustomTemplates(): RegexTemplate[];
|
|
14
|
+
/**
|
|
15
|
+
* 保存自定义模板
|
|
16
|
+
*/
|
|
17
|
+
static saveCustomTemplate(template: RegexTemplate): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* 更新模板使用统计
|
|
20
|
+
*/
|
|
21
|
+
static updateTemplateUsage(templateId: string): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* 删除自定义模板
|
|
24
|
+
*/
|
|
25
|
+
static deleteCustomTemplate(templateId: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* 批量删除自定义模板
|
|
28
|
+
*/
|
|
29
|
+
static deleteMultipleTemplates(templateIds: string[]): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* 清空所有自定义模板
|
|
32
|
+
*/
|
|
33
|
+
static clearAllTemplates(): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* 导出所有自定义模板为 JSON
|
|
36
|
+
*/
|
|
37
|
+
static exportTemplates(): string;
|
|
38
|
+
/**
|
|
39
|
+
* 从 JSON 导入自定义模板
|
|
40
|
+
*/
|
|
41
|
+
static importTemplates(jsonString: string, merge?: boolean): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* 获取存储统计信息
|
|
44
|
+
*/
|
|
45
|
+
static getStorageStats(): {
|
|
46
|
+
count: number;
|
|
47
|
+
size: number;
|
|
48
|
+
lastModified: string | null;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* 内部方法: 持久化模板数据到 LocalStorage
|
|
52
|
+
*/
|
|
53
|
+
private static _persistTemplates;
|
|
54
|
+
/**
|
|
55
|
+
* 检查 LocalStorage 是否可用
|
|
56
|
+
*/
|
|
57
|
+
static isStorageAvailable(): boolean;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 便捷函数导出
|
|
61
|
+
*/
|
|
62
|
+
export declare const loadCustomTemplates: () => RegexTemplate[];
|
|
63
|
+
export declare const saveCustomTemplate: (template: RegexTemplate) => boolean;
|
|
64
|
+
export declare const deleteCustomTemplate: (templateId: string) => boolean;
|
|
65
|
+
export declare const updateTemplateUsage: (templateId: string) => boolean;
|
|
66
|
+
export declare const clearAllTemplates: () => boolean;
|
|
67
|
+
export declare const exportTemplates: () => string;
|
|
68
|
+
export declare const importTemplates: (jsonString: string, merge?: boolean) => boolean;
|
|
69
|
+
export declare const getStorageStats: () => {
|
|
70
|
+
count: number;
|
|
71
|
+
size: number;
|
|
72
|
+
lastModified: string | null;
|
|
73
|
+
};
|
|
74
|
+
export declare const isStorageAvailable: () => boolean;
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
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); }
|
|
2
|
+
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
3
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
4
|
+
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); }
|
|
5
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
6
|
+
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
7
|
+
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; }
|
|
8
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
9
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
10
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
11
|
+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
12
|
+
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
|
|
13
|
+
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
14
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
15
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
16
|
+
/**
|
|
17
|
+
* 自定义模板存储模块
|
|
18
|
+
* 使用 LocalStorage 持久化存储用户自定义的正则表达式模板
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { TemplateCategory } from "./types";
|
|
22
|
+
var STORAGE_KEY = 'regex_editor_custom_templates';
|
|
23
|
+
var STORAGE_VERSION = '1.0';
|
|
24
|
+
/**
|
|
25
|
+
* 模板存储工具类
|
|
26
|
+
*/
|
|
27
|
+
export var TemplateStorage = /*#__PURE__*/function () {
|
|
28
|
+
function TemplateStorage() {
|
|
29
|
+
_classCallCheck(this, TemplateStorage);
|
|
30
|
+
}
|
|
31
|
+
_createClass(TemplateStorage, null, [{
|
|
32
|
+
key: "loadCustomTemplates",
|
|
33
|
+
value:
|
|
34
|
+
/**
|
|
35
|
+
* 加载所有自定义模板
|
|
36
|
+
*/
|
|
37
|
+
function loadCustomTemplates() {
|
|
38
|
+
try {
|
|
39
|
+
var data = localStorage.getItem(STORAGE_KEY);
|
|
40
|
+
if (!data) {
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
var parsed = JSON.parse(data);
|
|
44
|
+
|
|
45
|
+
// 版本检查
|
|
46
|
+
if (parsed.version !== STORAGE_VERSION) {
|
|
47
|
+
console.warn('模板存储版本不匹配,将清空旧数据');
|
|
48
|
+
this.clearAllTemplates();
|
|
49
|
+
return [];
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// 恢复 Date 对象
|
|
53
|
+
return parsed.templates.map(function (t) {
|
|
54
|
+
return _objectSpread(_objectSpread({}, t), {}, {
|
|
55
|
+
lastUsed: t.lastUsed ? new Date(t.lastUsed) : undefined,
|
|
56
|
+
isCustom: true // 确保标记为自定义模板
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
} catch (error) {
|
|
60
|
+
console.error('加载自定义模板失败:', error);
|
|
61
|
+
return [];
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* 保存自定义模板
|
|
67
|
+
*/
|
|
68
|
+
}, {
|
|
69
|
+
key: "saveCustomTemplate",
|
|
70
|
+
value: function saveCustomTemplate(template) {
|
|
71
|
+
try {
|
|
72
|
+
var templates = this.loadCustomTemplates();
|
|
73
|
+
|
|
74
|
+
// 检查是否已存在
|
|
75
|
+
var existingIndex = templates.findIndex(function (t) {
|
|
76
|
+
return t.id === template.id;
|
|
77
|
+
});
|
|
78
|
+
if (existingIndex >= 0) {
|
|
79
|
+
// 更新现有模板
|
|
80
|
+
templates[existingIndex] = _objectSpread(_objectSpread({}, template), {}, {
|
|
81
|
+
isCustom: true
|
|
82
|
+
});
|
|
83
|
+
} else {
|
|
84
|
+
// 添加新模板
|
|
85
|
+
templates.push(_objectSpread(_objectSpread({}, template), {}, {
|
|
86
|
+
isCustom: true,
|
|
87
|
+
category: template.category || TemplateCategory.CUSTOM
|
|
88
|
+
}));
|
|
89
|
+
}
|
|
90
|
+
this._persistTemplates(templates);
|
|
91
|
+
return true;
|
|
92
|
+
} catch (error) {
|
|
93
|
+
console.error('保存自定义模板失败:', error);
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* 更新模板使用统计
|
|
100
|
+
*/
|
|
101
|
+
}, {
|
|
102
|
+
key: "updateTemplateUsage",
|
|
103
|
+
value: function updateTemplateUsage(templateId) {
|
|
104
|
+
try {
|
|
105
|
+
var templates = this.loadCustomTemplates();
|
|
106
|
+
var template = templates.find(function (t) {
|
|
107
|
+
return t.id === templateId;
|
|
108
|
+
});
|
|
109
|
+
if (!template) {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
template.useCount = (template.useCount || 0) + 1;
|
|
113
|
+
template.lastUsed = new Date();
|
|
114
|
+
this._persistTemplates(templates);
|
|
115
|
+
return true;
|
|
116
|
+
} catch (error) {
|
|
117
|
+
console.error('更新模板使用统计失败:', error);
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* 删除自定义模板
|
|
124
|
+
*/
|
|
125
|
+
}, {
|
|
126
|
+
key: "deleteCustomTemplate",
|
|
127
|
+
value: function deleteCustomTemplate(templateId) {
|
|
128
|
+
try {
|
|
129
|
+
var templates = this.loadCustomTemplates();
|
|
130
|
+
var filteredTemplates = templates.filter(function (t) {
|
|
131
|
+
return t.id !== templateId;
|
|
132
|
+
});
|
|
133
|
+
if (filteredTemplates.length === templates.length) {
|
|
134
|
+
// 未找到要删除的模板
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
this._persistTemplates(filteredTemplates);
|
|
138
|
+
return true;
|
|
139
|
+
} catch (error) {
|
|
140
|
+
console.error('删除自定义模板失败:', error);
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* 批量删除自定义模板
|
|
147
|
+
*/
|
|
148
|
+
}, {
|
|
149
|
+
key: "deleteMultipleTemplates",
|
|
150
|
+
value: function deleteMultipleTemplates(templateIds) {
|
|
151
|
+
try {
|
|
152
|
+
var templates = this.loadCustomTemplates();
|
|
153
|
+
var idSet = new Set(templateIds);
|
|
154
|
+
var filteredTemplates = templates.filter(function (t) {
|
|
155
|
+
return !idSet.has(t.id);
|
|
156
|
+
});
|
|
157
|
+
this._persistTemplates(filteredTemplates);
|
|
158
|
+
return true;
|
|
159
|
+
} catch (error) {
|
|
160
|
+
console.error('批量删除自定义模板失败:', error);
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* 清空所有自定义模板
|
|
167
|
+
*/
|
|
168
|
+
}, {
|
|
169
|
+
key: "clearAllTemplates",
|
|
170
|
+
value: function clearAllTemplates() {
|
|
171
|
+
try {
|
|
172
|
+
localStorage.removeItem(STORAGE_KEY);
|
|
173
|
+
return true;
|
|
174
|
+
} catch (error) {
|
|
175
|
+
console.error('清空自定义模板失败:', error);
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* 导出所有自定义模板为 JSON
|
|
182
|
+
*/
|
|
183
|
+
}, {
|
|
184
|
+
key: "exportTemplates",
|
|
185
|
+
value: function exportTemplates() {
|
|
186
|
+
var templates = this.loadCustomTemplates();
|
|
187
|
+
var data = {
|
|
188
|
+
version: STORAGE_VERSION,
|
|
189
|
+
templates: templates,
|
|
190
|
+
lastModified: new Date().toISOString()
|
|
191
|
+
};
|
|
192
|
+
return JSON.stringify(data, null, 2);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* 从 JSON 导入自定义模板
|
|
197
|
+
*/
|
|
198
|
+
}, {
|
|
199
|
+
key: "importTemplates",
|
|
200
|
+
value: function importTemplates(jsonString) {
|
|
201
|
+
var merge = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
202
|
+
try {
|
|
203
|
+
var data = JSON.parse(jsonString);
|
|
204
|
+
|
|
205
|
+
// 版本检查
|
|
206
|
+
if (data.version !== STORAGE_VERSION) {
|
|
207
|
+
throw new Error("\u4E0D\u652F\u6301\u7684\u6A21\u677F\u7248\u672C: ".concat(data.version));
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// 验证模板格式
|
|
211
|
+
if (!Array.isArray(data.templates)) {
|
|
212
|
+
throw new Error('无效的模板数据格式');
|
|
213
|
+
}
|
|
214
|
+
var templates = data.templates.map(function (t) {
|
|
215
|
+
return _objectSpread(_objectSpread({}, t), {}, {
|
|
216
|
+
isCustom: true,
|
|
217
|
+
lastUsed: t.lastUsed ? new Date(t.lastUsed) : undefined
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
if (merge) {
|
|
221
|
+
// 合并模式: 与现有模板合并
|
|
222
|
+
var existingTemplates = this.loadCustomTemplates();
|
|
223
|
+
var existingIds = new Set(existingTemplates.map(function (t) {
|
|
224
|
+
return t.id;
|
|
225
|
+
}));
|
|
226
|
+
|
|
227
|
+
// 过滤掉 ID 重复的模板
|
|
228
|
+
var newTemplates = templates.filter(function (t) {
|
|
229
|
+
return !existingIds.has(t.id);
|
|
230
|
+
});
|
|
231
|
+
templates = [].concat(_toConsumableArray(existingTemplates), _toConsumableArray(newTemplates));
|
|
232
|
+
}
|
|
233
|
+
this._persistTemplates(templates);
|
|
234
|
+
return true;
|
|
235
|
+
} catch (error) {
|
|
236
|
+
console.error('导入自定义模板失败:', error);
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* 获取存储统计信息
|
|
243
|
+
*/
|
|
244
|
+
}, {
|
|
245
|
+
key: "getStorageStats",
|
|
246
|
+
value: function getStorageStats() {
|
|
247
|
+
try {
|
|
248
|
+
var data = localStorage.getItem(STORAGE_KEY);
|
|
249
|
+
if (!data) {
|
|
250
|
+
return {
|
|
251
|
+
count: 0,
|
|
252
|
+
size: 0,
|
|
253
|
+
lastModified: null
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
var parsed = JSON.parse(data);
|
|
257
|
+
return {
|
|
258
|
+
count: parsed.templates.length,
|
|
259
|
+
size: new Blob([data]).size,
|
|
260
|
+
lastModified: parsed.lastModified
|
|
261
|
+
};
|
|
262
|
+
} catch (error) {
|
|
263
|
+
console.error('获取存储统计失败:', error);
|
|
264
|
+
return {
|
|
265
|
+
count: 0,
|
|
266
|
+
size: 0,
|
|
267
|
+
lastModified: null
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* 内部方法: 持久化模板数据到 LocalStorage
|
|
274
|
+
*/
|
|
275
|
+
}, {
|
|
276
|
+
key: "_persistTemplates",
|
|
277
|
+
value: function _persistTemplates(templates) {
|
|
278
|
+
var data = {
|
|
279
|
+
version: STORAGE_VERSION,
|
|
280
|
+
templates: templates,
|
|
281
|
+
lastModified: new Date().toISOString()
|
|
282
|
+
};
|
|
283
|
+
localStorage.setItem(STORAGE_KEY, JSON.stringify(data));
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* 检查 LocalStorage 是否可用
|
|
288
|
+
*/
|
|
289
|
+
}, {
|
|
290
|
+
key: "isStorageAvailable",
|
|
291
|
+
value: function isStorageAvailable() {
|
|
292
|
+
try {
|
|
293
|
+
var testKey = '__test_storage__';
|
|
294
|
+
localStorage.setItem(testKey, 'test');
|
|
295
|
+
localStorage.removeItem(testKey);
|
|
296
|
+
return true;
|
|
297
|
+
} catch (error) {
|
|
298
|
+
return false;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}]);
|
|
302
|
+
return TemplateStorage;
|
|
303
|
+
}();
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* 便捷函数导出
|
|
307
|
+
*/
|
|
308
|
+
|
|
309
|
+
export var loadCustomTemplates = function loadCustomTemplates() {
|
|
310
|
+
return TemplateStorage.loadCustomTemplates();
|
|
311
|
+
};
|
|
312
|
+
export var saveCustomTemplate = function saveCustomTemplate(template) {
|
|
313
|
+
return TemplateStorage.saveCustomTemplate(template);
|
|
314
|
+
};
|
|
315
|
+
export var deleteCustomTemplate = function deleteCustomTemplate(templateId) {
|
|
316
|
+
return TemplateStorage.deleteCustomTemplate(templateId);
|
|
317
|
+
};
|
|
318
|
+
export var updateTemplateUsage = function updateTemplateUsage(templateId) {
|
|
319
|
+
return TemplateStorage.updateTemplateUsage(templateId);
|
|
320
|
+
};
|
|
321
|
+
export var clearAllTemplates = function clearAllTemplates() {
|
|
322
|
+
return TemplateStorage.clearAllTemplates();
|
|
323
|
+
};
|
|
324
|
+
export var exportTemplates = function exportTemplates() {
|
|
325
|
+
return TemplateStorage.exportTemplates();
|
|
326
|
+
};
|
|
327
|
+
export var importTemplates = function importTemplates(jsonString, merge) {
|
|
328
|
+
return TemplateStorage.importTemplates(jsonString, merge);
|
|
329
|
+
};
|
|
330
|
+
export var getStorageStats = function getStorageStats() {
|
|
331
|
+
return TemplateStorage.getStorageStats();
|
|
332
|
+
};
|
|
333
|
+
export var isStorageAvailable = function isStorageAvailable() {
|
|
334
|
+
return TemplateStorage.isStorageAvailable();
|
|
335
|
+
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 模板管理器
|
|
3
|
+
* 统一管理内置模板和自定义模板
|
|
4
|
+
*/
|
|
5
|
+
import type { RegexTemplate } from './types';
|
|
6
|
+
import { TemplateCategory } from './types';
|
|
7
|
+
/**
|
|
8
|
+
* 获取所有模板(内置 + 自定义)
|
|
9
|
+
*/
|
|
10
|
+
export declare const getAllTemplates: () => RegexTemplate[];
|
|
11
|
+
/**
|
|
12
|
+
* 根据 ID 获取模板(优先查找自定义模板)
|
|
13
|
+
*/
|
|
14
|
+
export declare const getTemplateById: (id: string) => RegexTemplate | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* 根据分类获取模板
|
|
17
|
+
*/
|
|
18
|
+
export declare const getTemplatesByCategory: (category: TemplateCategory) => RegexTemplate[];
|
|
19
|
+
/**
|
|
20
|
+
* 搜索模板(支持关键词搜索)
|
|
21
|
+
*/
|
|
22
|
+
export declare const searchTemplates: (keyword: string) => RegexTemplate[];
|
|
23
|
+
/**
|
|
24
|
+
* 获取最常用的模板
|
|
25
|
+
*/
|
|
26
|
+
export declare const getMostUsedTemplates: (limit?: number) => RegexTemplate[];
|
|
27
|
+
/**
|
|
28
|
+
* 获取最近使用的模板
|
|
29
|
+
*/
|
|
30
|
+
export declare const getRecentlyUsedTemplates: (limit?: number) => RegexTemplate[];
|
|
31
|
+
/**
|
|
32
|
+
* 创建新的自定义模板
|
|
33
|
+
*/
|
|
34
|
+
export declare const createCustomTemplate: (template: Omit<RegexTemplate, 'id' | 'isCustom' | 'useCount' | 'lastUsed'>) => RegexTemplate;
|
|
35
|
+
/**
|
|
36
|
+
* 更新自定义模板
|
|
37
|
+
*/
|
|
38
|
+
export declare const updateCustomTemplate: (id: string, updates: Partial<Omit<RegexTemplate, 'id' | 'isCustom'>>) => boolean;
|
|
39
|
+
/**
|
|
40
|
+
* 删除自定义模板
|
|
41
|
+
*/
|
|
42
|
+
export declare const deleteCustomTemplate: (id: string) => boolean;
|
|
43
|
+
/**
|
|
44
|
+
* 复制模板(创建副本)
|
|
45
|
+
*/
|
|
46
|
+
export declare const duplicateTemplate: (id: string, newName?: string) => RegexTemplate | null;
|
|
47
|
+
/**
|
|
48
|
+
* 使用模板(更新使用统计)
|
|
49
|
+
*/
|
|
50
|
+
export declare const useTemplate: (id: string) => RegexTemplate | undefined;
|
|
51
|
+
/**
|
|
52
|
+
* 获取模板统计信息
|
|
53
|
+
*/
|
|
54
|
+
export declare const getTemplateStats: () => {
|
|
55
|
+
total: number;
|
|
56
|
+
builtin: number;
|
|
57
|
+
custom: number;
|
|
58
|
+
byCategory: Record<TemplateCategory, number>;
|
|
59
|
+
byComplexity: Record<'simple' | 'medium' | 'complex', number>;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* 验证模板是否有效
|
|
63
|
+
*/
|
|
64
|
+
export declare const validateTemplate: (template: Partial<RegexTemplate>) => {
|
|
65
|
+
valid: boolean;
|
|
66
|
+
errors: string[];
|
|
67
|
+
};
|