Почему после Hello в моем шаблоне Closure нет места?

Я пытаюсь научить себя шаблонам закрытия. Я сделал простой файл Simply.soy:

{namespace examples.simple}

/**
 * says hello to the world
 * @param? name Optional parameter specifying who you are greeting.
 */
{template .hiWorld}
  Hello
  {if $name}
   {$name}!
  {else}
   world!
  {/if}
{/template}

Однако после компиляции и вызова document.write(examples.simple.hiWorld(); в отображаемой строке нет пробела между «Hello» и «world»: Helloworld!

Почему нет?


person dangerChihuahua007    schedule 08.06.2012    source источник


Ответы (1)


Шаблоны закрытия управляют соединение строк следующим образом:

В теле шаблона вы можете отступать от строк так, как хотите, потому что компилятор шаблона удаляет все знаки конца строки и пробелы в начале и конце строк, включая пробелы, предшествующие комментарию в конце строки. Компилятор полностью удаляет пустые строки, состоящие только из пробелов. Последовательные строки соединяются в соответствии со следующей эвристикой: если место соединения граничит с шаблоном или HTML-тегом с обеих сторон, строки соединяются без пробела. Если место соединения не граничит с шаблоном или HTML-тегом ни с одной стороны, строки соединяются ровно одним пробелом.

Чтобы добавить пробел в шаблоны закрытия там, где он необходим, используйте команду специального символа {sp}. В случаях, когда вставлен ненужный пробел, вы можете удалить его с помощью команды {nil}. Примеры соединения строк см. в разделе features.soy. .

simple.soy станет:

{namespace examples.simple}

/**
 * says hello to the world
 * @param? name Optional parameter specifying who you are greeting.
 */
{template .hiWorld}
  Hello{sp}
  {if $name}
   {$name}!
  {else}
   world!
  {/if}
{/template}
person Christopher Peisert    schedule 08.06.2012
comment
Спасибо, это многое проясняет! Я все еще не понимаю {nil}. Если перед или после блоков шаблона пробелы не вставлены, зачем нам {nil}? Какие пробелы удалить? - person dangerChihuahua007; 08.06.2012
comment
@DavidFaux: я добавил ссылку на features.soy, которая содержит примеры соединения строк с использованием {sp}, {nil}. - person Christopher Peisert; 09.06.2012
comment
Спасибо! Итак, размещение любого тега шаблона или тега HTML в конце строки или в начале следующей строки предотвращает появление пробела. {nil} оказывается тегом шаблона, который ничего не делает. - person dangerChihuahua007; 09.06.2012
comment
@DavidFaux: правильно, строки будут соединяться без пробела, если 1) предыдущая строка заканчивается либо >, либо тегом шаблона, либо 2) следующая строка начинается либо с <, либо с тега шаблона (Закрытие: Полное руководство, стр. 311). Символьная команда {nil} изменяет поведение соединения строк, при котором строки будут соединяться ровно одним пробелом путем соединения строк без пробела. - person Christopher Peisert; 09.06.2012