@lionrapid/core 0.3.1 → 0.5.0

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 (101) hide show
  1. package/dist/browser/attribute-extractor.d.ts +54 -0
  2. package/dist/browser/attribute-extractor.d.ts.map +1 -0
  3. package/dist/browser/attribute-extractor.js +155 -0
  4. package/dist/browser/attribute-extractor.js.map +1 -0
  5. package/dist/browser/auto-init.d.ts +9 -0
  6. package/dist/browser/auto-init.d.ts.map +1 -1
  7. package/dist/browser/auto-init.js +28 -4
  8. package/dist/browser/auto-init.js.map +1 -1
  9. package/dist/browser/auto-translator.d.ts +23 -0
  10. package/dist/browser/auto-translator.d.ts.map +1 -1
  11. package/dist/browser/auto-translator.js +90 -5
  12. package/dist/browser/auto-translator.js.map +1 -1
  13. package/dist/browser/block-extractor.d.ts +8 -0
  14. package/dist/browser/block-extractor.d.ts.map +1 -1
  15. package/dist/browser/block-extractor.js +77 -0
  16. package/dist/browser/block-extractor.js.map +1 -1
  17. package/dist/browser/editor/editor-api.d.ts +22 -1
  18. package/dist/browser/editor/editor-api.d.ts.map +1 -1
  19. package/dist/browser/editor/editor-api.js +54 -19
  20. package/dist/browser/editor/editor-api.js.map +1 -1
  21. package/dist/browser/editor/editor-init.js +72 -3
  22. package/dist/browser/editor/editor-init.js.map +1 -1
  23. package/dist/browser/editor/editor-styles.d.ts +1 -1
  24. package/dist/browser/editor/editor-styles.d.ts.map +1 -1
  25. package/dist/browser/editor/editor-styles.js +38 -1
  26. package/dist/browser/editor/editor-styles.js.map +1 -1
  27. package/dist/browser/editor/inspector.d.ts +8 -0
  28. package/dist/browser/editor/inspector.d.ts.map +1 -1
  29. package/dist/browser/editor/inspector.js +14 -0
  30. package/dist/browser/editor/inspector.js.map +1 -1
  31. package/dist/browser/editor/live-preview.d.ts +1 -1
  32. package/dist/browser/editor/live-preview.d.ts.map +1 -1
  33. package/dist/browser/editor/live-preview.js +27 -16
  34. package/dist/browser/editor/live-preview.js.map +1 -1
  35. package/dist/browser/editor/locale-url.d.ts +18 -0
  36. package/dist/browser/editor/locale-url.d.ts.map +1 -0
  37. package/dist/browser/editor/locale-url.js +37 -0
  38. package/dist/browser/editor/locale-url.js.map +1 -0
  39. package/dist/browser/editor/sidebar.d.ts +6 -0
  40. package/dist/browser/editor/sidebar.d.ts.map +1 -1
  41. package/dist/browser/editor/sidebar.js +133 -4
  42. package/dist/browser/editor/sidebar.js.map +1 -1
  43. package/dist/browser/editor/toolbar.d.ts +8 -1
  44. package/dist/browser/editor/toolbar.d.ts.map +1 -1
  45. package/dist/browser/editor/toolbar.js +49 -4
  46. package/dist/browser/editor/toolbar.js.map +1 -1
  47. package/dist/browser/index.d.ts +2 -0
  48. package/dist/browser/index.d.ts.map +1 -1
  49. package/dist/browser/index.js +1 -0
  50. package/dist/browser/index.js.map +1 -1
  51. package/dist/browser/lionrapid.auto.dev.js +494 -109
  52. package/dist/browser/lionrapid.auto.dev.js.map +4 -4
  53. package/dist/browser/lionrapid.auto.js +494 -109
  54. package/dist/browser/lionrapid.auto.js.map +4 -4
  55. package/dist/browser/lionrapid.auto.min.js +3 -3
  56. package/dist/browser/lionrapid.auto.min.js.map +4 -4
  57. package/dist/browser/lionrapid.editor.js +371 -36
  58. package/dist/browser/lionrapid.editor.js.map +3 -3
  59. package/dist/browser/lionrapid.editor.min.js +41 -4
  60. package/dist/browser/lionrapid.editor.min.js.map +4 -4
  61. package/dist/browser/lionrapid.esm.js +403 -97
  62. package/dist/browser/lionrapid.esm.js.map +3 -3
  63. package/dist/browser/lionrapid.esm.min.js +2 -2
  64. package/dist/browser/lionrapid.esm.min.js.map +4 -4
  65. package/dist/browser/lionrapid.iife.dev.js +403 -97
  66. package/dist/browser/lionrapid.iife.dev.js.map +3 -3
  67. package/dist/browser/lionrapid.iife.js +403 -97
  68. package/dist/browser/lionrapid.iife.js.map +3 -3
  69. package/dist/browser/lionrapid.iife.min.js +2 -2
  70. package/dist/browser/lionrapid.iife.min.js.map +4 -4
  71. package/dist/browser/lionrapid.umd.js +403 -97
  72. package/dist/browser/lionrapid.umd.js.map +3 -3
  73. package/dist/browser/lionrapid.umd.min.js +2 -2
  74. package/dist/browser/lionrapid.umd.min.js.map +4 -4
  75. package/dist/browser/md5.d.ts +3 -2
  76. package/dist/browser/md5.d.ts.map +1 -1
  77. package/dist/browser/md5.js +41 -6
  78. package/dist/browser/md5.js.map +1 -1
  79. package/dist/builder.d.ts +8 -0
  80. package/dist/builder.d.ts.map +1 -1
  81. package/dist/builder.js +10 -0
  82. package/dist/builder.js.map +1 -1
  83. package/dist/content/parser/MarkupParser.d.ts +0 -10
  84. package/dist/content/parser/MarkupParser.d.ts.map +1 -1
  85. package/dist/content/parser/MarkupParser.js +45 -3
  86. package/dist/content/parser/MarkupParser.js.map +1 -1
  87. package/dist/content/types.d.ts +30 -0
  88. package/dist/content/types.d.ts.map +1 -1
  89. package/dist/index.d.ts +5 -0
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +11 -0
  92. package/dist/index.js.map +1 -1
  93. package/dist/repositories/index.d.ts +1 -0
  94. package/dist/repositories/index.d.ts.map +1 -1
  95. package/dist/repositories/index.js +1 -0
  96. package/dist/repositories/index.js.map +1 -1
  97. package/dist/repositories/static-repository.d.ts +40 -0
  98. package/dist/repositories/static-repository.d.ts.map +1 -0
  99. package/dist/repositories/static-repository.js +60 -0
  100. package/dist/repositories/static-repository.js.map +1 -0
  101. package/package.json +1 -1
@@ -2199,10 +2199,44 @@ function readRawStyle(styles) {
2199
2199
  }
2200
2200
 
2201
2201
  // src/content/parser/MarkupParser.ts
2202
+ function decodeEntities(text) {
2203
+ const named = {
2204
+ amp: "&",
2205
+ lt: "<",
2206
+ gt: ">",
2207
+ quot: '"',
2208
+ apos: "'",
2209
+ nbsp: " ",
2210
+ rsquo: "\u2019",
2211
+ lsquo: "\u2018",
2212
+ rdquo: "\u201D",
2213
+ ldquo: "\u201C",
2214
+ hellip: "\u2026",
2215
+ mdash: "\u2014",
2216
+ ndash: "\u2013",
2217
+ copy: "\xA9",
2218
+ reg: "\xAE",
2219
+ trade: "\u2122"
2220
+ };
2221
+ return text.replace(/&(#x[0-9a-f]+|#[0-9]+|[a-z][a-z0-9]*);/gi, (m, body) => {
2222
+ if (body[0] === "#") {
2223
+ const cp = body[1] === "x" || body[1] === "X" ? parseInt(body.slice(2), 16) : parseInt(body.slice(1), 10);
2224
+ if (Number.isFinite(cp) && cp > 0) {
2225
+ try {
2226
+ return String.fromCodePoint(cp);
2227
+ } catch {
2228
+ return m;
2229
+ }
2230
+ }
2231
+ return m;
2232
+ }
2233
+ return named[body.toLowerCase()] ?? m;
2234
+ });
2235
+ }
2202
2236
  var MarkupParser = class {
2203
2237
  parse(input) {
2204
2238
  if (/<\/?[0-9]+>/.test(input)) {
2205
- return { text: input, styles: {} };
2239
+ return { text: decodeEntities(input), styles: {} };
2206
2240
  }
2207
2241
  const styles = {};
2208
2242
  let tagIndex = 0;
@@ -2247,7 +2281,7 @@ var MarkupParser = class {
2247
2281
  const unclosed = tagStack.pop();
2248
2282
  result += `</${unclosed.index}>`;
2249
2283
  }
2250
- return { text: result, styles };
2284
+ return { text: decodeEntities(result), styles };
2251
2285
  }
2252
2286
  matchTag(input, startPos) {
2253
2287
  const tagStart = input.indexOf("<", startPos);
@@ -3128,6 +3162,155 @@ var LionRapidCore = class {
3128
3162
  }
3129
3163
  };
3130
3164
 
3165
+ // src/repositories/memory-repository.ts
3166
+ var MemoryRepository = class {
3167
+ constructor(config) {
3168
+ __publicField(this, "name", "MemoryRepository");
3169
+ __publicField(this, "type", "memory");
3170
+ __publicField(this, "config", {});
3171
+ __publicField(this, "cache", /* @__PURE__ */ new Map());
3172
+ __publicField(this, "accessOrder", /* @__PURE__ */ new Map());
3173
+ __publicField(this, "maxSize", 1e3);
3174
+ this.config = config;
3175
+ this.maxSize = this.config.options?.maxSize || 1e3;
3176
+ }
3177
+ get(key) {
3178
+ const value = this.cache.get(key);
3179
+ if (value !== void 0) {
3180
+ this.accessOrder.set(key, Date.now());
3181
+ return value;
3182
+ }
3183
+ return null;
3184
+ }
3185
+ set(key, value) {
3186
+ if (this.cache.size >= this.maxSize && !this.cache.has(key)) {
3187
+ this.evictOldest();
3188
+ }
3189
+ this.cache.set(key, value);
3190
+ this.accessOrder.set(key, Date.now());
3191
+ }
3192
+ remove(key) {
3193
+ this.cache.delete(key);
3194
+ this.accessOrder.delete(key);
3195
+ }
3196
+ clear() {
3197
+ this.cache.clear();
3198
+ this.accessOrder.clear();
3199
+ }
3200
+ /**
3201
+ * Clear all entries for a specific namespace
3202
+ * Removes both the namespace cache entry and all individual translation keys
3203
+ */
3204
+ clearNamespace(locale, namespace) {
3205
+ const namespaceCacheKey = createNamespaceCacheKey(locale, namespace);
3206
+ const keyPrefix = `${locale}:${namespace}:`;
3207
+ this.cache.delete(namespaceCacheKey);
3208
+ this.accessOrder.delete(namespaceCacheKey);
3209
+ for (const key of this.cache.keys()) {
3210
+ if (key.startsWith(keyPrefix)) {
3211
+ this.cache.delete(key);
3212
+ this.accessOrder.delete(key);
3213
+ }
3214
+ }
3215
+ }
3216
+ getNamespace(locale, namespace) {
3217
+ const namespaceCacheKey = createNamespaceCacheKey(locale, namespace);
3218
+ const namespaceData = this.cache.get(namespaceCacheKey);
3219
+ if (!namespaceData) return null;
3220
+ try {
3221
+ return JSON.parse(namespaceData);
3222
+ } catch (error) {
3223
+ this.cache.delete(namespaceCacheKey);
3224
+ return null;
3225
+ }
3226
+ }
3227
+ setNamespace(locale, namespace, translations) {
3228
+ const namespaceCacheKey = createNamespaceCacheKey(locale, namespace);
3229
+ this.cache.set(namespaceCacheKey, JSON.stringify(translations));
3230
+ }
3231
+ evictOldest() {
3232
+ let oldestKey = "";
3233
+ let oldestTime = Date.now();
3234
+ for (const [key, time] of this.accessOrder.entries()) {
3235
+ if (time < oldestTime) {
3236
+ oldestTime = time;
3237
+ oldestKey = key;
3238
+ }
3239
+ }
3240
+ if (oldestKey) {
3241
+ this.cache.delete(oldestKey);
3242
+ this.accessOrder.delete(oldestKey);
3243
+ }
3244
+ }
3245
+ /**
3246
+ * Get all cache entries for debugging
3247
+ */
3248
+ getEntries() {
3249
+ const entries = {};
3250
+ for (const [key, value] of this.cache.entries()) {
3251
+ entries[key] = value;
3252
+ }
3253
+ return entries;
3254
+ }
3255
+ getConfig() {
3256
+ return this.config;
3257
+ }
3258
+ };
3259
+
3260
+ // src/repositories/static-repository.ts
3261
+ var StaticRepository = class {
3262
+ constructor(bundle, config = {}) {
3263
+ __publicField(this, "name", "StaticRepository");
3264
+ __publicField(this, "type", "memory");
3265
+ __publicField(this, "config");
3266
+ __publicField(this, "mem");
3267
+ this.config = {
3268
+ enabled: config.enabled ?? true,
3269
+ priority: config.priority ?? 0.5,
3270
+ // after the live memory (0), before storage
3271
+ options: {
3272
+ ttl: Number.MAX_SAFE_INTEGER,
3273
+ maxSize: Number.MAX_SAFE_INTEGER,
3274
+ ...config.options
3275
+ }
3276
+ };
3277
+ this.mem = new MemoryRepository({ options: { maxSize: Number.MAX_SAFE_INTEGER } });
3278
+ for (const [locale, namespaces] of Object.entries(bundle)) {
3279
+ for (const [namespace, translations] of Object.entries(namespaces)) {
3280
+ this.mem.setNamespace(locale, namespace, translations);
3281
+ const flat = flattenTranslations(
3282
+ translations,
3283
+ "",
3284
+ locale,
3285
+ namespace
3286
+ );
3287
+ for (const [key, value] of Object.entries(flat)) this.mem.set(key, value);
3288
+ }
3289
+ }
3290
+ }
3291
+ get(key) {
3292
+ return this.mem.get(key);
3293
+ }
3294
+ getNamespace(locale, namespace) {
3295
+ return this.mem.getNamespace(locale, namespace);
3296
+ }
3297
+ getEntries() {
3298
+ return this.mem.getEntries();
3299
+ }
3300
+ getConfig() {
3301
+ return this.config;
3302
+ }
3303
+ // Read-only: the live memory layer owns fresh network data; this stays pristine.
3304
+ set() {
3305
+ }
3306
+ remove() {
3307
+ }
3308
+ clear() {
3309
+ }
3310
+ setNamespace() {
3311
+ }
3312
+ };
3313
+
3131
3314
  // src/sync/missing-translation-queue.ts
3132
3315
  var COOLDOWN_MS = 6e4;
3133
3316
  var MissingTranslationQueue = class {
@@ -3336,6 +3519,15 @@ var LionRapidBuilder = class _LionRapidBuilder {
3336
3519
  }
3337
3520
  return this;
3338
3521
  }
3522
+ /**
3523
+ * Offline resilience: seed a translation bundle (or the CLI's snapshot files)
3524
+ * as a read-only sync layer that resolves synchronously even with the server
3525
+ * down and nothing cached. Sits after the live memory layer (priority 0) at
3526
+ * `priority` (default 0.5), so fresh network data always shadows it.
3527
+ */
3528
+ useStaticBundle(bundle, priority = 0.5) {
3529
+ return this.use(new StaticRepository(bundle, { priority }));
3530
+ }
3339
3531
  async build() {
3340
3532
  const eventEmitter = new EventEmitter();
3341
3533
  const buildBus = eventEmitter.builder();
@@ -3933,101 +4125,6 @@ var _NetworkRepository = class _NetworkRepository {
3933
4125
  __publicField(_NetworkRepository, "VERSION_PREFIX", "lionrapid:v:");
3934
4126
  var NetworkRepository = _NetworkRepository;
3935
4127
 
3936
- // src/repositories/memory-repository.ts
3937
- var MemoryRepository = class {
3938
- constructor(config) {
3939
- __publicField(this, "name", "MemoryRepository");
3940
- __publicField(this, "type", "memory");
3941
- __publicField(this, "config", {});
3942
- __publicField(this, "cache", /* @__PURE__ */ new Map());
3943
- __publicField(this, "accessOrder", /* @__PURE__ */ new Map());
3944
- __publicField(this, "maxSize", 1e3);
3945
- this.config = config;
3946
- this.maxSize = this.config.options?.maxSize || 1e3;
3947
- }
3948
- get(key) {
3949
- const value = this.cache.get(key);
3950
- if (value !== void 0) {
3951
- this.accessOrder.set(key, Date.now());
3952
- return value;
3953
- }
3954
- return null;
3955
- }
3956
- set(key, value) {
3957
- if (this.cache.size >= this.maxSize && !this.cache.has(key)) {
3958
- this.evictOldest();
3959
- }
3960
- this.cache.set(key, value);
3961
- this.accessOrder.set(key, Date.now());
3962
- }
3963
- remove(key) {
3964
- this.cache.delete(key);
3965
- this.accessOrder.delete(key);
3966
- }
3967
- clear() {
3968
- this.cache.clear();
3969
- this.accessOrder.clear();
3970
- }
3971
- /**
3972
- * Clear all entries for a specific namespace
3973
- * Removes both the namespace cache entry and all individual translation keys
3974
- */
3975
- clearNamespace(locale, namespace) {
3976
- const namespaceCacheKey = createNamespaceCacheKey(locale, namespace);
3977
- const keyPrefix = `${locale}:${namespace}:`;
3978
- this.cache.delete(namespaceCacheKey);
3979
- this.accessOrder.delete(namespaceCacheKey);
3980
- for (const key of this.cache.keys()) {
3981
- if (key.startsWith(keyPrefix)) {
3982
- this.cache.delete(key);
3983
- this.accessOrder.delete(key);
3984
- }
3985
- }
3986
- }
3987
- getNamespace(locale, namespace) {
3988
- const namespaceCacheKey = createNamespaceCacheKey(locale, namespace);
3989
- const namespaceData = this.cache.get(namespaceCacheKey);
3990
- if (!namespaceData) return null;
3991
- try {
3992
- return JSON.parse(namespaceData);
3993
- } catch (error) {
3994
- this.cache.delete(namespaceCacheKey);
3995
- return null;
3996
- }
3997
- }
3998
- setNamespace(locale, namespace, translations) {
3999
- const namespaceCacheKey = createNamespaceCacheKey(locale, namespace);
4000
- this.cache.set(namespaceCacheKey, JSON.stringify(translations));
4001
- }
4002
- evictOldest() {
4003
- let oldestKey = "";
4004
- let oldestTime = Date.now();
4005
- for (const [key, time] of this.accessOrder.entries()) {
4006
- if (time < oldestTime) {
4007
- oldestTime = time;
4008
- oldestKey = key;
4009
- }
4010
- }
4011
- if (oldestKey) {
4012
- this.cache.delete(oldestKey);
4013
- this.accessOrder.delete(oldestKey);
4014
- }
4015
- }
4016
- /**
4017
- * Get all cache entries for debugging
4018
- */
4019
- getEntries() {
4020
- const entries = {};
4021
- for (const [key, value] of this.cache.entries()) {
4022
- entries[key] = value;
4023
- }
4024
- return entries;
4025
- }
4026
- getConfig() {
4027
- return this.config;
4028
- }
4029
- };
4030
-
4031
4128
  // src/content/validator/ContentValidator.ts
4032
4129
  var ContentValidator = class {
4033
4130
  /**
@@ -4181,6 +4278,211 @@ var ContentValidator = class {
4181
4278
  }
4182
4279
  };
4183
4280
 
4281
+ // src/browser/md5.ts
4282
+ function safeAdd(x, y) {
4283
+ const lsw = (x & 65535) + (y & 65535);
4284
+ const msw = (x >> 16) + (y >> 16) + (lsw >> 16);
4285
+ return msw << 16 | lsw & 65535;
4286
+ }
4287
+ function bitRotateLeft(num, cnt) {
4288
+ return num << cnt | num >>> 32 - cnt;
4289
+ }
4290
+ function md5cmn(q, a, b, x, s, t) {
4291
+ return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);
4292
+ }
4293
+ function md5ff(a, b, c, d, x, s, t) {
4294
+ return md5cmn(b & c | ~b & d, a, b, x, s, t);
4295
+ }
4296
+ function md5gg(a, b, c, d, x, s, t) {
4297
+ return md5cmn(b & d | c & ~d, a, b, x, s, t);
4298
+ }
4299
+ function md5hh(a, b, c, d, x, s, t) {
4300
+ return md5cmn(b ^ c ^ d, a, b, x, s, t);
4301
+ }
4302
+ function md5ii(a, b, c, d, x, s, t) {
4303
+ return md5cmn(c ^ (b | ~d), a, b, x, s, t);
4304
+ }
4305
+ function binlMD5(x, len) {
4306
+ x[len >> 5] |= 128 << len % 32;
4307
+ x[(len + 64 >>> 9 << 4) + 14] = len;
4308
+ let a = 1732584193;
4309
+ let b = -271733879;
4310
+ let c = -1732584194;
4311
+ let d = 271733878;
4312
+ for (let i = 0; i < x.length; i += 16) {
4313
+ const olda = a;
4314
+ const oldb = b;
4315
+ const oldc = c;
4316
+ const oldd = d;
4317
+ a = md5ff(a, b, c, d, x[i], 7, -680876936);
4318
+ d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);
4319
+ c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);
4320
+ b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);
4321
+ a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);
4322
+ d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);
4323
+ c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);
4324
+ b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);
4325
+ a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);
4326
+ d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);
4327
+ c = md5ff(c, d, a, b, x[i + 10], 17, -42063);
4328
+ b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);
4329
+ a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);
4330
+ d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);
4331
+ c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);
4332
+ b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);
4333
+ a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);
4334
+ d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);
4335
+ c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);
4336
+ b = md5gg(b, c, d, a, x[i], 20, -373897302);
4337
+ a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);
4338
+ d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);
4339
+ c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);
4340
+ b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);
4341
+ a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);
4342
+ d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);
4343
+ c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);
4344
+ b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);
4345
+ a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);
4346
+ d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);
4347
+ c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);
4348
+ b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);
4349
+ a = md5hh(a, b, c, d, x[i + 5], 4, -378558);
4350
+ d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);
4351
+ c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);
4352
+ b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);
4353
+ a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);
4354
+ d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);
4355
+ c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);
4356
+ b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);
4357
+ a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);
4358
+ d = md5hh(d, a, b, c, x[i + 0], 11, -358537222);
4359
+ c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);
4360
+ b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);
4361
+ a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);
4362
+ d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);
4363
+ c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);
4364
+ b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);
4365
+ a = md5ii(a, b, c, d, x[i], 6, -198630844);
4366
+ d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);
4367
+ c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);
4368
+ b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);
4369
+ a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);
4370
+ d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);
4371
+ c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);
4372
+ b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);
4373
+ a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);
4374
+ d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);
4375
+ c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);
4376
+ b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);
4377
+ a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);
4378
+ d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);
4379
+ c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);
4380
+ b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);
4381
+ a = safeAdd(a, olda);
4382
+ b = safeAdd(b, oldb);
4383
+ c = safeAdd(c, oldc);
4384
+ d = safeAdd(d, oldd);
4385
+ }
4386
+ return [a, b, c, d];
4387
+ }
4388
+ function binl2hex(binarray) {
4389
+ const hexTab = "0123456789abcdef";
4390
+ let str = "";
4391
+ for (let i = 0; i < binarray.length * 4; i++) {
4392
+ str += hexTab.charAt(binarray[i >> 2] >> i % 4 * 8 + 4 & 15) + hexTab.charAt(binarray[i >> 2] >> i % 4 * 8 & 15);
4393
+ }
4394
+ return str;
4395
+ }
4396
+ function utf8Bytes(str) {
4397
+ if (typeof TextEncoder !== "undefined") {
4398
+ return new TextEncoder().encode(str);
4399
+ }
4400
+ const out = [];
4401
+ for (let i = 0; i < str.length; i++) {
4402
+ const c = str.charCodeAt(i);
4403
+ if (c < 128) {
4404
+ out.push(c);
4405
+ } else if (c < 2048) {
4406
+ out.push(192 | c >> 6, 128 | c & 63);
4407
+ } else if (c >= 55296 && c < 56320 && i + 1 < str.length) {
4408
+ const c2 = str.charCodeAt(++i);
4409
+ const cp = 65536 + (c - 55296 << 10) + (c2 - 56320);
4410
+ out.push(
4411
+ 240 | cp >> 18,
4412
+ 128 | cp >> 12 & 63,
4413
+ 128 | cp >> 6 & 63,
4414
+ 128 | cp & 63
4415
+ );
4416
+ } else {
4417
+ out.push(
4418
+ 224 | c >> 12,
4419
+ 128 | c >> 6 & 63,
4420
+ 128 | c & 63
4421
+ );
4422
+ }
4423
+ }
4424
+ return new Uint8Array(out);
4425
+ }
4426
+ function bytes2binl(bytes) {
4427
+ const bin = [];
4428
+ for (let i = 0; i < bytes.length; i++) {
4429
+ bin[i >> 2] |= bytes[i] << i % 4 * 8;
4430
+ }
4431
+ return bin;
4432
+ }
4433
+ function md5(str) {
4434
+ const bytes = utf8Bytes(str);
4435
+ return binl2hex(binlMD5(bytes2binl(bytes), bytes.length * 8));
4436
+ }
4437
+ function generateAutoKey(text) {
4438
+ const trimmed = text.trim();
4439
+ return "auto_" + md5(trimmed).substring(0, 12);
4440
+ }
4441
+
4442
+ // src/browser/exclude-filter.ts
4443
+ var DEFAULT_PATTERNS = {
4444
+ emails: true,
4445
+ urls: true,
4446
+ numbers: true,
4447
+ phones: true
4448
+ };
4449
+ var PATTERNS = {
4450
+ email: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/,
4451
+ url: /^(https?:\/\/|www\.)[^\s]+$/i,
4452
+ number: /^[\d\s.,+-]+$/,
4453
+ phone: /^[+\d][\d\s().-]{6,}$/
4454
+ };
4455
+ var ExcludeFilter = class {
4456
+ constructor(patterns = {}, minTextLength = 2) {
4457
+ __publicField(this, "patterns");
4458
+ __publicField(this, "minTextLength");
4459
+ this.patterns = { ...DEFAULT_PATTERNS, ...patterns };
4460
+ this.minTextLength = minTextLength;
4461
+ }
4462
+ /**
4463
+ * Check if text should be excluded from translation
4464
+ */
4465
+ shouldExclude(text) {
4466
+ const trimmed = text.trim();
4467
+ if (trimmed.length < this.minTextLength) {
4468
+ return true;
4469
+ }
4470
+ if (this.patterns.emails && PATTERNS.email.test(trimmed)) {
4471
+ return true;
4472
+ }
4473
+ if (this.patterns.urls && PATTERNS.url.test(trimmed)) {
4474
+ return true;
4475
+ }
4476
+ if (this.patterns.numbers && PATTERNS.number.test(trimmed)) {
4477
+ return true;
4478
+ }
4479
+ if (this.patterns.phones && PATTERNS.phone.test(trimmed)) {
4480
+ return true;
4481
+ }
4482
+ return false;
4483
+ }
4484
+ };
4485
+
4184
4486
  // src/browser/storage/localstorage-repository.ts
4185
4487
  var STORAGE_PREFIX = "lionrapid:";
4186
4488
  var VERSION_KEY = `${STORAGE_PREFIX}version`;
@@ -4581,6 +4883,7 @@ export {
4581
4883
  Colors,
4582
4884
  ContentValidator,
4583
4885
  EventEmitter,
4886
+ ExcludeFilter,
4584
4887
  HTMLSerializer,
4585
4888
  HandlerChain,
4586
4889
  LionRapidBuilder,
@@ -4594,6 +4897,7 @@ export {
4594
4897
  NetworkError,
4595
4898
  NetworkRepository,
4596
4899
  ServerError,
4900
+ StaticRepository,
4597
4901
  TranslationError,
4598
4902
  TranslationLockedError,
4599
4903
  TranslationNotFoundError,
@@ -4601,10 +4905,12 @@ export {
4601
4905
  VOID_TAGS,
4602
4906
  createPackageLogger,
4603
4907
  extractTagName,
4908
+ generateAutoKey,
4604
4909
  isClientError,
4605
4910
  isRetryableError,
4606
4911
  isTranslationError,
4607
4912
  logger,
4913
+ md5,
4608
4914
  measure,
4609
4915
  parseKeyPath,
4610
4916
  prepareTranslationRequest,