Skip to content
nop edited this page Apr 6, 2011 · 14 revisions

Основной синтаксис

Простой вариант

В самом простом случае весь 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-фрагменты

Строка, начинающаяся с символа < (пробелы вначале не учитываются, конечно), представляет собой 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

if bool-expr {
    // expressions.
}

или

if bool-expr {
    // expressions.
} else {
    // expressions.
}

for

for jpath-expr {
    // expressions.
}

apply

apply jpath-expr

list

Clone this wiki locally