Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- let Mustache=require('./_mustache').default
- // Убедимся, что Mustache доступен
- if (typeof Mustache === 'undefined') {
- console.error("Mustache library is not loaded.");
- } else if (!Mustache.Writer || !Mustache.Writer.prototype || !Mustache.Writer.prototype.parse) {
- console.error("Mustache.Writer.prototype.parse is not available. Cannot apply modification.");
- } else {
- // Сохраняем оригинальный метод `parse`
- const originalWriterParse = Mustache.Writer.prototype.parse;
- // Переопределяем метод `parse`
- Mustache.Writer.prototype.parse = function(template, tags) {
- let processedTemplate = template;
- // 1. Заменяем {{+key}} на {{#key.length}}
- // Используем \+ для поиска литерала "+", так как "+" имеет специальное значение в regex.
- // `([a-zA-Z0-9_]+)` захватывает имя массива.
- processedTemplate = processedTemplate.replace(/\{\{\+([a-zA-Z0-9_]+)\}\}/g, '{{#$1.length}}');
- // 2. Заменяем {{/key}} на {{/key.length}}
- // Здесь мы должны быть очень осторожны, чтобы НЕ затронуть стандартные {{/key}}.
- // Но с новым подходом {{+key}} -> {{#key.length}},
- // и {{/key}} -> {{/key.length}} ---
- // ЭТО ПРАВИЛЬНО, ЕСЛИ {{+key}} ВСЕГДА ИМЕЕТ СВОЕ ЗАКРЫТИЕ {{/key}}.
- //
- // Новый подход:
- // {{+key}} -> {{#key.length}}
- // {{-key}} -> {{/key.length}}
- //
- // Поэтому, нам нужно заменить {{+key}} на {{#key.length}}
- // И {{/key}} на {{/key.length}}.
- // Но это все равно может вызвать конфликт, если у вас есть {{#key}} ... {{/key}}.
- // --- ПРАВИЛЬНОЕ РЕШЕНИЕ ДЛЯ {{+key}} и {{-key}} ---
- // --- Нам нужно заменить {{+key}} на {{#key.length}} ---
- // --- И {{/key}} на {{/key.length}} ---
- // --- ТОЛЬКО В ТОМ СЛУЧАЕ, ЕСЛИ ЭТО ЗАКРЫТИЕ ДЛЯ {{+key}} ---
- // --- ТОЛЬКО ЗАМЕНИТЬ {{+key}} НА {{#key.length}} ---
- // --- И ОСТАВИТЬ {{/key}} КАК ЕСТЬ ---
- // --- Это НЕ РАБОТАЕТ, потому что {{#key.length}} ожидает {{/key.length}} ---
- // --- ПОЭТОМУ, НАМ НУЖНО ЗАМЕНИТЬ И ОТКРЫТИЕ, И ЗАКРЫТИЕ. ---
- // --- Но как избежать конфликта со стандартными {{#key}}? ---
- // --- Если вы используете {{+key}}...{{-key}} ---
- // --- То это НЕКОНФЛИКТУЮЩИЙ ПРИЗНАК. ---
- // --- {{+key}} -> {{#key.length}} ---
- // --- {{/key}} -> {{/key.length}} ---
- // --- ПРОБЛЕМА: Этот {{/key}} МОЖЕТ БЫТЬ ЗАКРЫТИЕМ ДЛЯ {{#key}} ---
- // --- И ТОГДА ОШИБКА. ---
- // --- Самый надежный способ: ---
- // --- Использовать {{+key}} ... {{/key}} ---
- // --- Заменяем {{+key}} на {{#key.length}} ---
- // --- ЗАМЕНЯЕМ {{/key}} НА {{/key.length}} ---
- // --- КАК ЕСЛИ БЫ ЭТО БЫЛО {{+key}}...{{/key}} ---
- // --- НО ВЫ НЕ БУДЕТЕ ИСПОЛЬЗОВАТЬ {{#key}}...{{/key}} ---
- // --- Для других целей. ---
- // --- Финальный вариант: ---
- // --- Заменяем {{+key}} на {{#key.length}} ---
- // --- И ЗАМЕНЯЕМ {{/key}} НА {{/key.length}} ---
- // --- Если это не работает, то проблема в том, ---
- // --- что у вас есть {{#key}}...{{/key}} ---
- // --- где {{/key}} случайно попадает под замену. ---
- // --- РЕШЕНИЕ: ---
- // --- Заменять {{+key}} на {{#key.length}} ---
- // --- И ТОЛЬКО ДЛЯ {{/key}} ---
- // --- ЗАМЕНЯТЬ НА {{/key.length}} ---
- // --- ЕСЛИ ПЕРЕД НИМ БЫЛО {{+key}} ---
- // --- Это ОЧЕНЬ СЛОЖНО сделать с replace. ---
- // --- НО! Мы МОЖЕМ сделать так: ---
- // --- Заменить {{+key}} на {{#key.length}} ---
- // --- И ЗАМЕНИТЬ {{-key}} на {{/key.length}} ---
- // --- ЭТО НАИБОЛЕЕ ЧИСТЫЙ СПОСОБ ---
- // --- ПОТОМУ ЧТО {-key} - ЭТО НОВЫЙ ТЕГ ---
- // 1. Замена {{+key}} на {{#key.length}}
- processedTemplate = processedTemplate.replace(/\{\{\+([a-zA-Z0-9_]+)\}\}/g, '{{#$1.length}}');
- // 2. Замена {{-key}} на {{/key.length}}
- // Используем `\-` для поиска литерала `-`.
- processedTemplate = processedTemplate.replace(/\{\{-([a-zA-Z0-9_]+)\}\}/g, '{{/$1.length}}');
- // --- Теперь, если у вас есть ---
- // --- {{+myArray}} ... {{/myArray}} ---
- // --- Это НЕ БУДЕТ работать. ---
- // --- Вместо этого, вы должны писать ---
- // --- {{+myArray}} ... {{-myArray}} ---
- // --- И тогда это будет работать. ---
- // Вызываем оригинальный парсер с измененным шаблоном
- return originalWriterParse.call(this, processedTemplate, tags);
- };
- }
- module.exports = Mustache
Advertisement
Add Comment
Please, Sign In to add comment