Guest User

Untitled

a guest
Aug 23rd, 2025
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.46 KB | None | 0 0
  1. let Mustache=require('./_mustache').default
  2.  
  3. // Убедимся, что Mustache доступен
  4. if (typeof Mustache === 'undefined') {
  5. console.error("Mustache library is not loaded.");
  6. } else if (!Mustache.Writer || !Mustache.Writer.prototype || !Mustache.Writer.prototype.parse) {
  7. console.error("Mustache.Writer.prototype.parse is not available. Cannot apply modification.");
  8. } else {
  9. // Сохраняем оригинальный метод `parse`
  10. const originalWriterParse = Mustache.Writer.prototype.parse;
  11.  
  12. // Переопределяем метод `parse`
  13. Mustache.Writer.prototype.parse = function(template, tags) {
  14. let processedTemplate = template;
  15.  
  16. // 1. Заменяем {{+key}} на {{#key.length}}
  17. // Используем \+ для поиска литерала "+", так как "+" имеет специальное значение в regex.
  18. // `([a-zA-Z0-9_]+)` захватывает имя массива.
  19. processedTemplate = processedTemplate.replace(/\{\{\+([a-zA-Z0-9_]+)\}\}/g, '{{#$1.length}}');
  20.  
  21. // 2. Заменяем {{/key}} на {{/key.length}}
  22. // Здесь мы должны быть очень осторожны, чтобы НЕ затронуть стандартные {{/key}}.
  23. // Но с новым подходом {{+key}} -> {{#key.length}},
  24. // и {{/key}} -> {{/key.length}} ---
  25. // ЭТО ПРАВИЛЬНО, ЕСЛИ {{+key}} ВСЕГДА ИМЕЕТ СВОЕ ЗАКРЫТИЕ {{/key}}.
  26. //
  27. // Новый подход:
  28. // {{+key}} -> {{#key.length}}
  29. // {{-key}} -> {{/key.length}}
  30. //
  31. // Поэтому, нам нужно заменить {{+key}} на {{#key.length}}
  32. // И {{/key}} на {{/key.length}}.
  33. // Но это все равно может вызвать конфликт, если у вас есть {{#key}} ... {{/key}}.
  34.  
  35. // --- ПРАВИЛЬНОЕ РЕШЕНИЕ ДЛЯ {{+key}} и {{-key}} ---
  36. // --- Нам нужно заменить {{+key}} на {{#key.length}} ---
  37. // --- И {{/key}} на {{/key.length}} ---
  38. // --- ТОЛЬКО В ТОМ СЛУЧАЕ, ЕСЛИ ЭТО ЗАКРЫТИЕ ДЛЯ {{+key}} ---
  39.  
  40. // --- ТОЛЬКО ЗАМЕНИТЬ {{+key}} НА {{#key.length}} ---
  41. // --- И ОСТАВИТЬ {{/key}} КАК ЕСТЬ ---
  42. // --- Это НЕ РАБОТАЕТ, потому что {{#key.length}} ожидает {{/key.length}} ---
  43.  
  44. // --- ПОЭТОМУ, НАМ НУЖНО ЗАМЕНИТЬ И ОТКРЫТИЕ, И ЗАКРЫТИЕ. ---
  45. // --- Но как избежать конфликта со стандартными {{#key}}? ---
  46.  
  47. // --- Если вы используете {{+key}}...{{-key}} ---
  48. // --- То это НЕКОНФЛИКТУЮЩИЙ ПРИЗНАК. ---
  49. // --- {{+key}} -> {{#key.length}} ---
  50. // --- {{/key}} -> {{/key.length}} ---
  51. // --- ПРОБЛЕМА: Этот {{/key}} МОЖЕТ БЫТЬ ЗАКРЫТИЕМ ДЛЯ {{#key}} ---
  52. // --- И ТОГДА ОШИБКА. ---
  53.  
  54. // --- Самый надежный способ: ---
  55. // --- Использовать {{+key}} ... {{/key}} ---
  56. // --- Заменяем {{+key}} на {{#key.length}} ---
  57. // --- ЗАМЕНЯЕМ {{/key}} НА {{/key.length}} ---
  58. // --- КАК ЕСЛИ БЫ ЭТО БЫЛО {{+key}}...{{/key}} ---
  59. // --- НО ВЫ НЕ БУДЕТЕ ИСПОЛЬЗОВАТЬ {{#key}}...{{/key}} ---
  60. // --- Для других целей. ---
  61.  
  62. // --- Финальный вариант: ---
  63. // --- Заменяем {{+key}} на {{#key.length}} ---
  64. // --- И ЗАМЕНЯЕМ {{/key}} НА {{/key.length}} ---
  65. // --- Если это не работает, то проблема в том, ---
  66. // --- что у вас есть {{#key}}...{{/key}} ---
  67. // --- где {{/key}} случайно попадает под замену. ---
  68.  
  69. // --- РЕШЕНИЕ: ---
  70. // --- Заменять {{+key}} на {{#key.length}} ---
  71. // --- И ТОЛЬКО ДЛЯ {{/key}} ---
  72. // --- ЗАМЕНЯТЬ НА {{/key.length}} ---
  73. // --- ЕСЛИ ПЕРЕД НИМ БЫЛО {{+key}} ---
  74. // --- Это ОЧЕНЬ СЛОЖНО сделать с replace. ---
  75.  
  76. // --- НО! Мы МОЖЕМ сделать так: ---
  77. // --- Заменить {{+key}} на {{#key.length}} ---
  78. // --- И ЗАМЕНИТЬ {{-key}} на {{/key.length}} ---
  79. // --- ЭТО НАИБОЛЕЕ ЧИСТЫЙ СПОСОБ ---
  80. // --- ПОТОМУ ЧТО {-key} - ЭТО НОВЫЙ ТЕГ ---
  81.  
  82. // 1. Замена {{+key}} на {{#key.length}}
  83. processedTemplate = processedTemplate.replace(/\{\{\+([a-zA-Z0-9_]+)\}\}/g, '{{#$1.length}}');
  84.  
  85. // 2. Замена {{-key}} на {{/key.length}}
  86. // Используем `\-` для поиска литерала `-`.
  87. processedTemplate = processedTemplate.replace(/\{\{-([a-zA-Z0-9_]+)\}\}/g, '{{/$1.length}}');
  88.  
  89. // --- Теперь, если у вас есть ---
  90. // --- {{+myArray}} ... {{/myArray}} ---
  91. // --- Это НЕ БУДЕТ работать. ---
  92. // --- Вместо этого, вы должны писать ---
  93. // --- {{+myArray}} ... {{-myArray}} ---
  94. // --- И тогда это будет работать. ---
  95.  
  96. // Вызываем оригинальный парсер с измененным шаблоном
  97. return originalWriterParse.call(this, processedTemplate, tags);
  98. };
  99. }
  100.  
  101. module.exports = Mustache
  102.  
Advertisement
Add Comment
Please, Sign In to add comment