Условный рендеринг с dmustache

Я использую dmustache ( https://github.com/synopse/dmustache) для рендеринга некоторых шаблонов. Интересно, как можно не визуализировать определенную часть, если строковая переменная является пустой строкой?

Эта упрощенная программа рендеринга FirstName: Joe MiddleName: LastName: Doe но я бы хотел иметь FirstName: Joe LastName: Doe поскольку нет MiddleName (и только в этом случае).

program P;

uses
  System.SysUtils, SynMustache, SynCommons;

const
  TEMPLATE = 'FirstName: {{FIRSTNAME}} {{#MIDDLENAME}}MiddleName: {{MIDDLENAME}}{{/MIDDLENAME}} LastName: {{LASTNAME}}';
var
  Mustache: TSynMustache;
  Content: Variant;
begin
  Mustache := TSynMustache.Parse(TEMPLATE);
  TDocVariant.New(Content);
  Content.FirstName := 'Joe';
  Content.MiddleName := '';
  Content.LastName := 'Doe';
  WriteLn(Mustache.Render(Content));
  ReadLn;
end.

Использование раздела в шаблоне не меняет результат

TEMPLATE = 'FirstName: {{FIRSTNAME}} {{#MIDDLENAME}}MiddleName: {{MIDDLENAME}} {{/MIDDLENAME}}LastName: {{LASTNAME}}';

1 ответ

Я нашел два способа решить эту проблему. Сначала используется условное в шаблоне, как

TEMPLATE = 'FirstName: {{FIRSTNAME}} {{#if MIDDLENAME <> ""}}MiddleName: {{MIDDLENAME}} {{/if}}LastName: {{LASTNAME}}';

Чтобы это работало, нужно также передать стандартных помощников для вызова Render, например

Mustache.Render(Content, nil, TSynMustache.HelpersGetStandardList)

Второй - установить переменную содержимого в NULL вместо пустой строки (или не заполнить ее вообще) и использовать раздел (обратите внимание на {{.}} для самостоятельной ссылки внутри раздела)

const
  TEMPLATE = 'FirstName: {{FIRSTNAME}} {{#MIDDLENAME}}MiddleName: {{.}} {{/MIDDLENAME}}LastName: {{LASTNAME}}';
var
  Mustache: TSynMustache;
  Content: Variant;
begin
  Mustache := TSynMustache.Parse(TEMPLATE);
  TDocVariant.New(Content);
  Content.FirstName := 'Joe';
  Content.MiddleName := NULL; //you can also comment this line
  Content.LastName := 'Doe';
  WriteLn(Mustache.Render(Content));
  ReadLn;
end.
Другие вопросы по тегам