Как убрать начальные пробелы перед переменной Nunjucks, только если строка переменной пуста? - PullRequest
0 голосов
/ 02 октября 2019

Я бы хотел поддержать создание шаблонов Nunjucks, в которых начальный пробел перед переменными удаляется, только если переменная пуста.

Можно начать с простого примера:

    Hello {{ firstname }}, how are you?

Если имя «Дэйв», это будет «Привет, Дейв, как дела?». Но если не установлено, то отображается "Привет, как дела?"с дополнительным пространством.

Как можно построить шаблоны в общем виде (без предварительного знания окружающего текста), чтобы начальные пробелы удалялись только перед переменными, если строка переменной пуста?

Использование {{- firstname }} всегда удаляет начальные пробелы (поэтому не работает, если переменная не пустая, что приводит к "HelloDave" в приведенном выше примере).

Что-то вроде следующего работает дляэтот конкретный случай (или, лучше, подходы, предложенные @AikonMogwai в комментариях), но он слишком сложен и опирается на знание окружающего текста (например, вставляет пробел, если переменная не пустая):

  Hello
   {%- if firstname %}
     {{- " " + firstname -}}
   {% else %}
     {{- "" -}}
   {% endif %},

Вот скрипка, демонстрирующая приведенные выше примеры: https://jsfiddle.net/davebeyer/3L5146jg/ (нажмите «Выполнить», затем «Отрисовка».)

В идеале, я хотел бы создать / использовать пользовательский тег (как {{=) или пользовательский фильтр (например, condlstrip для условной левой полосы), так что шаблоны могут быть построены с использованием чего-то вроде:

  {{= firstname }}

или

  {{ firstname | condlstrip }}

Но этонемне ясно, как создать пользовательский тег {{=, а также не ясно, могут ли фильтры, такие как condlstrip, влиять на рендеринг вне тегов.

Относительно требования "без предварительного знания окружающего текста,«Это конкретно означает, что решение не должно предполагать, что перед переменной всегда будет пробел. Например, он также должен работать в случае, подобном следующему (с использованием моего желаемого тега {{=), и когда пользователь достаточно уверен, что установлены school и studentId, но имя может быть установлено или не установлено):

Hi {{= firstname }}, your user ID is {{= school }}-{{= studentId }} and you can reach your profile at http://{{= school }}.example.com/profiles/{{= studentId }}

для производства:

Привет, Дейв, ваш идентификатор пользователя - CentralValley-1234, и вы можете перейти в свой профиль по адресу http://CentralValley.example.com/profiles/1234

Т.е. было бы здорово, еслинаша система может использовать шаблон {{= variable_name }} для создания разумного поведения по умолчанию для вставленных переменных в шаблонах, созданных пользователями (которые на самом деле используют графический пользовательский интерфейс более высокого уровня).

1 Ответ

0 голосов
/ 08 октября 2019
var nunjucks  = require('nunjucks');
var env = nunjucks.configure();
env.addFilter('ws', val => !val || val == 0 ? val : ' ' + val);

var html = env.renderString(`
    Hi {{- firstname | ws -}}, your user ID ...
`, { firstname: 'Dave' });
console.log(html);
...