@escapenavigator/utils 1.10.144 → 1.10.146

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.
@@ -22,8 +22,7 @@
22
22
  * - не сохраняем формат (bold/italic): Maily-`variable`-нода рендерит
23
23
  * значение как plain text, теги внутри значения остаются буквальными.
24
24
  * Если когда-то понадобится rich-text-подстановка — отдельная история
25
- * (надо конвертить HTML в TipTap-ноды и инлайнить в doc, см.
26
- * `convertLegacyHtmlToEmailContent`).
25
+ * (надо конвертить HTML в TipTap-ноды и инлайнить в doc).
27
26
  * - не сохраняем переносы строк: Maily-render не превращает `\n` в
28
27
  * `<br>` (он эмитит весь текст одним `Fragment`), так что переносы
29
28
  * визуально не видны. Лучше один параграф, чем «странные» дыры.
@@ -25,8 +25,7 @@ exports.stripHtml = stripHtml;
25
25
  * - не сохраняем формат (bold/italic): Maily-`variable`-нода рендерит
26
26
  * значение как plain text, теги внутри значения остаются буквальными.
27
27
  * Если когда-то понадобится rich-text-подстановка — отдельная история
28
- * (надо конвертить HTML в TipTap-ноды и инлайнить в doc, см.
29
- * `convertLegacyHtmlToEmailContent`).
28
+ * (надо конвертить HTML в TipTap-ноды и инлайнить в doc).
30
29
  * - не сохраняем переносы строк: Maily-render не превращает `\n` в
31
30
  * `<br>` (он эмитит весь текст одним `Fragment`), так что переносы
32
31
  * визуально не видны. Лучше один параграф, чем «странные» дыры.
@@ -23,17 +23,20 @@
23
23
  import Delta from 'quill-delta';
24
24
  export type ClipboardMatcher = [number | string, (node: Node, delta: Delta) => Delta];
25
25
  /**
26
- * Гарантированно убирает неразрывные пробелы из Quill-HTML: и литеральные
27
- * сущности (`&nbsp;`/`&#160;`/`&#xa0;`), и сам символ U+00A0. Применяется
28
- * на `onChange` КАЖДОГО редактора — это финальная страховка поверх
29
- * clipboard-matcher'ов (которые ловят только вставку): что бы ни оказалось
30
- * в редакторе (вставка, набор двойных пробелов, загрузка легаси-контента),
31
- * наружу уходит текст без nbsp.
26
+ * Убирает неразрывные пробелы из Quill-HTML: и литеральные сущности
27
+ * (`&nbsp;`/`&#160;`/`&#xa0;`), и сам символ U+00A0.
32
28
  *
33
- * Зачем: nbsp (1) запрещает перенос строки длинные абзацы вылезают за
34
- * контейнер письма и рвутся посреди слова, (2) ломает разбор Handlebars
35
- * `{{#if X}}` на стороне рендера (`transformText`) и валидатор
36
- * `IsIfIncorrect`, которым нужен обычный пробел после `#if`.
29
+ * ВАЖНО: не вешать на `onChange` контролируемого ReactQuill. Редактор
30
+ * сравнивает `value`-проп со своей внутренней сериализацией (она хранит
31
+ * `&nbsp;`); если на каждый change подсовывать очищенное значение, оно
32
+ * никогда не совпадёт ReactQuill бесконечно вызывает `setEditorContents`
33
+ * → `onChange` → `setState` и страница виснет («Maximum update depth»).
34
+ *
35
+ * Правильные места: (1) нормализация при ЗАГРУЗКЕ/сохранении (см.
36
+ * `normalizeIfTags`, `sanitizeQuillHtml`), (2) clipboard-matcher на вставку
37
+ * (`normalizeWhitespaceInDelta` ниже), (3) рендер письма (`transformText`).
38
+ * nbsp вреден тем, что запрещает перенос строки (абзацы рвутся посреди
39
+ * слова) и ломает разбор `{{#if X}}` (нужен обычный пробел после `#if`).
37
40
  */
38
41
  export declare function stripNonBreakingSpaces(html?: string | null): string;
39
42
  /**
@@ -31,17 +31,20 @@ exports.getStripColorClipboardMatchers = getStripColorClipboardMatchers;
31
31
  exports.getNormalizeWhitespaceClipboardMatchers = getNormalizeWhitespaceClipboardMatchers;
32
32
  const quill_delta_1 = __importDefault(require("quill-delta"));
33
33
  /**
34
- * Гарантированно убирает неразрывные пробелы из Quill-HTML: и литеральные
35
- * сущности (`&nbsp;`/`&#160;`/`&#xa0;`), и сам символ U+00A0. Применяется
36
- * на `onChange` КАЖДОГО редактора — это финальная страховка поверх
37
- * clipboard-matcher'ов (которые ловят только вставку): что бы ни оказалось
38
- * в редакторе (вставка, набор двойных пробелов, загрузка легаси-контента),
39
- * наружу уходит текст без nbsp.
34
+ * Убирает неразрывные пробелы из Quill-HTML: и литеральные сущности
35
+ * (`&nbsp;`/`&#160;`/`&#xa0;`), и сам символ U+00A0.
40
36
  *
41
- * Зачем: nbsp (1) запрещает перенос строки длинные абзацы вылезают за
42
- * контейнер письма и рвутся посреди слова, (2) ломает разбор Handlebars
43
- * `{{#if X}}` на стороне рендера (`transformText`) и валидатор
44
- * `IsIfIncorrect`, которым нужен обычный пробел после `#if`.
37
+ * ВАЖНО: не вешать на `onChange` контролируемого ReactQuill. Редактор
38
+ * сравнивает `value`-проп со своей внутренней сериализацией (она хранит
39
+ * `&nbsp;`); если на каждый change подсовывать очищенное значение, оно
40
+ * никогда не совпадёт ReactQuill бесконечно вызывает `setEditorContents`
41
+ * → `onChange` → `setState` и страница виснет («Maximum update depth»).
42
+ *
43
+ * Правильные места: (1) нормализация при ЗАГРУЗКЕ/сохранении (см.
44
+ * `normalizeIfTags`, `sanitizeQuillHtml`), (2) clipboard-matcher на вставку
45
+ * (`normalizeWhitespaceInDelta` ниже), (3) рендер письма (`transformText`).
46
+ * nbsp вреден тем, что запрещает перенос строки (абзацы рвутся посреди
47
+ * слова) и ломает разбор `{{#if X}}` (нужен обычный пробел после `#if`).
45
48
  */
46
49
  function stripNonBreakingSpaces(html) {
47
50
  if (!html)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@escapenavigator/utils",
3
- "version": "1.10.144",
3
+ "version": "1.10.146",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -14,12 +14,11 @@
14
14
  "test": "jest"
15
15
  },
16
16
  "dependencies": {
17
- "@escapenavigator/types": "^1.10.140",
17
+ "@escapenavigator/types": "^1.10.142",
18
18
  "axios": "^0.21.4",
19
19
  "class-transformer": "^0.5.1",
20
20
  "class-validator": "^0.13.2",
21
21
  "i18next": "^21.6.4",
22
- "node-html-parser": "^7.1.0",
23
22
  "quill-delta": "^5.1.0"
24
23
  },
25
24
  "devDependencies": {
@@ -28,5 +27,5 @@
28
27
  "ts-jest": "^29.1.1",
29
28
  "typescript": "^5.6"
30
29
  },
31
- "gitHead": "3a47865b15ba6211c53a0b9892ae0e618ada4c25"
30
+ "gitHead": "022977230155bf802f8c3f349fb49a42ad7fd5a9"
32
31
  }