parser


Список разделовВопросы по языку

Я установил парсер довольно давно и уже не помню какая именно версия у меня установлена. Могу я узнать это?
Да, конечно. Обратитесь непосредственно к парсеру и он напишет свою версию. Но предварительно не забудьте выключить IE friendly messages.

Можно ли использовать в тексте спецсимволы “;”, “^”, “$” и др.?
Конечно. Как сказано в документации, все служебные символы необходимо предварять символом «^». Там кстати можно найти полный список служебных символов парсера.
Например, если необходимо вывести список, разделив элементы точкой с запятой:

^table.menu{}[^; ]

Я достал из файла/базы данных текст, содержащий теги, но при выводе в браузер пользователя теги заменяются на < и соответственно не обрабатываются броузером. Но я хочу, чтобы эти данные выводились «как есть». Как мне быть?
Почитать о внешних и внутренних данных в документации и примерах об операторах taint/untaint.

Почему парсер удаляет идущие подряд пробельные символы, оставляя только один.
Это фича называется оптимизация пробельных символов (остается только первый из идущих подряд пробельных символов). В html несколько идущих подряд пробельных символов броузером показываются как один пробел, поэтому нет смысла передавать 200 пробелов, переводов строки или символов табуляции, которые вы использовали для оформления своего парсерного кода, т.к. они все равно не покажутся в броузере посетителя.

Однако если вам нужно иное (например для выдачи содержимого <pre />), то вы можете изменить поведение парсера, прочитав про taint/untaint и использовав соответствующий язык (обычно <pre>^taint[html][тут текст с идущими подряд пробелами, которые нужно сохранить]</pre>).

Мне надоело во всех классах очень часто писать некую конструкцию, как быть?
Создайте себе удобный оператор, см. раздел «Операторы, определяемые пользователем» в документации.

Хочу вывести $name.jpg, а получаю странную ошибку, в чем дело?
Используйте

${name}.jpg
Почему? Потому, что нужно отличить эту ситуацию от…
$table.field
…дать понять, что точка, это не часть языка, и не означает, что необходимо взять поле с именем «jpg» у объекта «name».

При обращении к элементу формы, имя которой находится у меня в переменной проблем не возникает: $form:$var, однако если вместо $var я пытаюсь использовать $hash.key или $table.field то получаю ошибку. Как быть?

$form:[$hash.key]
$form:[$table.field]

Как позволить пользователю загружать файлы на сервер?
Создать форму с <input type="file" name="attach" />, указать у формы action, method="post" и не забыть про enctype="multipart/form-data", и при посте формы в $form:attach у вас будет файл, который вы можете проверить (def $form:attach), узнать его имя ($form:attach.name) или размер ($form:attach.size) и наконец сохранить (^form:attach.save[binary;/path/to/file.^file:justext[$form:attach.name]]).

В случае, если используется русский апач, нужно не забыть положить в каталог рядом с парсером файл .htaccess следующего содержания:

<IfModule mod_charset.c>
	CharsetRecodeMultipartForms Off
	CharsetDisable On
</IfModule>

Хочу вывести рядом содержание двух переменных $a и $b, пишу в коде $a$b но ничего не выводится.
Согласно документации в данном выражении происходит вывод содержимого переменной с именем a$b, для того, чтобы вывети содержимое двух переменных, не разделенных символами-разделителями нужно написать ${a}${b} или проще: ${a}$b

А как в таблицу замен для ^строка.replace[$таблица_замен] добавить символы перевода строки или табуляции? Конструкция $tReplace[^table::create[nameless]{^#0A <p>}] приводит к выдаче сообщения об ошибке.
Дело в том, что ^#0A эквивалентно написанию символа перевод строки. Таким образом мы создаем таблицу, у которой первая строка ничего не содержит. Для того, чтобы парсер не воспринимал ^#0A как разделитель строк таблицы, он должен быть «грязным». Напишите например так:

$tReplace[^table::create{from	to
^taint[^#0A]	<p>}]
и после выполнения метода ^sMyString.replace[$tReplace] все символы перевода строки будут заменены на <p>

Как добавить строку в произвольное место объекта table и как изменить содержимое определенной ячейки таблицы?
Добавлять к объекту table строку можно только в конец (^таблица.append{}). Изменить содержимое ячейки таблицы нельзя. Если вы хотите добавить строку в произвольное место таблицы или изменить значение определенной ячейки таблицы, создайте новый объект-table и перепишите в него данные из существующей таблицы, внеся нужные вам изменения. Для этого может быть удобно использовать метод ^таблица.select(условие).

Хочу, чтобы оператор for имел шаг, отличный от 1
Можно обратиться к документации и прочитать, как написать свой оператор for, который будет делать то, что требуется.
В частности, там есть пример оператора steppedfor, который имеет функционал, аналогичный оператору for, но которому можно передать параметр «шаг»:

@steppedfor[name;from;to;step;code]
$caller.$name($from)
^while($caller.$name<=$to){
    $code
    ^caller.$name.inc($step)
}
Теперь возможен такой вызов…
@somewhere[][i]
^steppedfor[i](1;10;2){$i }
…при этом изменяется локальная переменная метода somewhere.

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

@foreach[h;key;value;code;order_direction][tkey]
$tkey[^h._keys[]]
^tkey.sort{$tkey.key}[^if(def $order_direction){$order_direction}{asc}]
^tkey.menu{
    $caller.$key[$tkey.key]
    $caller.$value[$h.[$tkey.key]]
    $code
}
Пример вызова:
^foreach[$myhash;k;v]{
    key=$k
    value=$v
}[desc]

Почему парсер так строго относится к пробельным символам между скобками, разделяющими параметры методов/операторов? Например я привык писать код в подобном стиле:

^if(условие)
    {если истина}
    {если ложь}
Но парсер не позволяет делать этого, требуя подобное написание:
^if(условие){
    если истина
}{
    если ложь
}

У парсера код погружен в текст и это одна из мелочей обусловленная этим. Пробельные символы также попадают в результирующий html/xml и игнорировать те из них, которые размещенны между скобками было бы неверно. К тому же возникают некоторые сложности с пониманием написанного, например в конструкции:
^if(условие){текст} [вася]
' [вася]' - это буквы такие, или код если условие ложно? Было принято решение быть с подобными конструкциями строже, но однозначнее.

^file:list[/dir;\.gif^$] не находит файлы с расширением .GIF, написанным большими буквами, при этом модификатора "i" как у match у него нет. Как быть?
Да, глобального модификатора для отмены чувствительности к регистру у ^file:list[] нет, однако в связи с использованием достаточно свежей библиотекой PCRE доступен локальный модификатор и можно сделать не чувствительной к регистру всю маску или её часть, например:

$tFileList[^file:list[/dir;\.(?i:jpe?g|gif|png)^$]]

Как выполнить метод имея в переменной его имя?
Так:

$method[$$name]
^method[...параметры...]
или так:
^self.[$name][...параметры...]