-
Notifications
You must be signed in to change notification settings - Fork 28
syntax
В самом простом случае весь stylesheet представляет собой один кусок html'я:
<h1>Hello, World</h1>
Но нужно учитывать пару моментов. Во-первых, текстовые строки могут быть только внутри тегов. Во-вторых, фигурные скобки внутри атрибутов нужно удваивать. Например, так неправильно:
<h1>
Hello, World
<div onclick="return { foo: 42 }"></div>
</h1>
А так правильно:
<h1>
"Hello, World"
<div onclick="return {{ foo: 42 }}"></div>
</h1>
Простой вариант
<h1>Hello, World</h1>
на самом деле является сокращением для
match / {
<h1>Hello, World</h1>
}
Т.е. весь stylesheet в этом случае представляет собой один шаблон, матчащийся на /
.
Принцип действия шаблонов такой же, как и в xslt
.
Синтаксис:
match jpath body
match jpath : mode body
jpath -- это несколько урезанный аналог xpath
.
body
представляет собой либо одно выражение (см. ниже), либо же block
из нескольких выражений,
заключенных в фигурные скобки. Например:
match page {
<h1>
apply . : title
</h1>
}
match page : title "Hello, World"
Бывают блочные:
/* Block comments. */
/*
Block
comments.
*/
И строчные:
// Line comments.
$a = 42 // Line comments.
При этом важно помнить:
- Блочные комментарии могут быть только там, где могут быть необязательные пробелы.
- Строчные комментарии могут быть только там, где может быть перевод строки.
Есть четкое правило: одна строка -- одно выражение/оператор/конструкция/...
При этом внутри выражения может встретиться block
, завернутый в фигурные или круглые скобки,
в котором может быть несколько выражений, разделенных переводом строки.
Но если не учитывать содержимое этих блоков, все остальное будет на одной строке:
match / { ... }
if (42) { ... } else { ... }
$a = ( ... )
Вот так неправильно:
match /
{
...
}
if (42)
"Hello, World"
$a =
(
...
)
Перевод строки может быть только между выражениями.
Строка, начинающаяся с символа <
(пробелы вначале не учитываются, конечно), представляет собой xml-фрагмент.
При этом содержимое строки целиком не обязано быть well-formed.
Но внутри любого блока сумарный xml должен быть well-formed.
При это текстовые ноды допускаются только внутри well-formed фрагментов.
<h1>Hello, World</h1>
var xml = (
<h1>
"Hello, { $username }"
</h1>
)
Вот тут все хорошо:
<b><i>Hello</i>
", World"
</b>
Текстовая нода Hello
находится внутри well-formed фрагмента <i>...</i>
(вся строка целиком не является well-formed).
А здесь ошибка:
<b><i>Hello // Ошибка! "Висящая" текстовая нода.
, World</i></b> // Ошибка! Это вообще не xml-строка.
Внутри каждого блока вида { ... }
или ( ... )
xml должен быть well-formed:
$xml = (
<h1>
"Hello"
// Ошибка! Не well-formed xml внутри блока.
// Здесь должен быть закрывающий тег </h1>.
)
match / {
<h1>
"Hello"
// Ошибка!
}
if (42) <h1> // Ошибка! Выражение <h1> не well-formed.
Внутри всех строковых литералов и текстовых нод фрагменты { ... }
заменяются на значение выражения,
находящегося внутри { ... }
:
<h1>Hello, { $username }</h1>
"Hello, { $username }"
<h1 class="b-header-{ type }">
Чтобы вывести символы {
и }
их нужно удвоить:
<h1>Hello, {{ username }}</h1> // <h1>Hello, { username }</h1>
if bool-expr {
// expressions.
}
или
if bool-expr {
// expressions.
} else {
// expressions.
}
for jpath-expr {
// expressions.
}
apply jpath-expr