` | PARSER | документация |

parser

faqfaq
авторыавторы
документациядокументация

в действиив действии
куда говоритькуда говорить
жаргонжаргон

скачатьскачать

примерыпримеры
форумфорум

документация

1. Основные конструкции языка

1.1. Веб-страницы, HTML-файлы и шаблоны страниц

Прежде чем приступить к подробному описанию конструкций Парсера, во избежание путаницы уточним значения нескольких важных терминов.

Веб-страницей или просто страницей будем называть результат интерпретации браузером переданного ему HTML-кода. Иными словами, страница — это то, что видит посетитель сайта.

HTML-файлом будем называть текстовый файл, содержащий HTML-код.

Шаблоном страницы или просто шаблоном будем называть HTML-файл, код которого содержит инструкции Парсера.

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

1.2. Операторы

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

^имя_оператора[аргумент1;аргумент2;...аргументN]

В качестве значений аргументов в оператор могут быть подставлены произвольные фрагменты HTML-кода, в том числе занимающие в файле несколько строк. Некоторые операторы не имеют аргументов. Набор доступных операторов определяется используемой версией Парсера.

Для того чтобы отделить аргументы друг от друга, используется символ ; (точка с запятой). Если внутри аргумента встречается точка с запятой или символ ^ (“птичка”), перед ними помещают символ ^.

При обработке файла Парсером оператор заменяется фрагментом, который получается в результате его разбора. Этот фрагмент мы далее будем называть значением оператора и говорить, что оператор возвращает то или иное значение, вычисляемое Парсером.

Пример. Создадим страницу, отображающую собственный URI. Для этого поместим в ее текст используемый без параметров оператор uri, который возвращает URI текущей страницы.

<HTML>
<HEAD><TITLE>
Пример</TITLE></HEAD>
<BODY>
Вот мой URI: ^uri[]</BODY>
</HTML>

Если URI страницы /parser/doc/examples/eg1.html, то обработка приведенного выше кода Парсером даст следующий результат:

<HTML>
<HEAD><TITLE>
Пример</TITLE></HEAD>
<BODY>
Вот мой URI: /parser/doc/examples/eg1.html</BODY>
</HTML>

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

Из приведенного выше правила есть ряд исключений. Так, аргумент оператора rem, который используется для оформления комментариев и всегда возвращает пустую строку, не вычисляется. У оператора вызова макроса macro вычисляется только первый аргумент, остальные же передаются в макрос как есть. Аргументы операторов for и while могут быть вычислены несколько раз. Существуют и другие исключения, они подробно рассмотрены в описаниях операторов.

Пример. Модифицируем предыдущий пример таким образом, чтобы на странице отображалось только имя файла, а не URI. Для этого используем оператор name, который принимает в качестве аргумента путь к файлу, а возвращает только его имя.

<HTML>
<HEAD><TITLE>
Пример</TITLE></HEAD>
<BODY>
Вот мое имя: ^name[^uri[]]</BODY>
</HTML>

Если URI страницы /parser/doc/examples/eg2.html, то обработка приведенного выше кода Парсером даст следующий результат:

<HTML>
<HEAD><TITLE>
Пример</TITLE></HEAD>
<BODY>
Вот мое имя: eg2.html</BODY>
</HTML>

Результатом обработки оператора может быть не только возвращаемое им значение. Некоторые операторы дают побочный эффект, изменяя условия обработки других операторов и макросов. Например, оператор var с двумя аргументами всегда возвращает пустую строку. При этом он помещает в переменную, имя которой задается первым аргументом, значение, задаваемое вторым аргументом. В дальнейшем это значение может быть возвращено оператором var с одним аргументом и использовано, предположим, в качестве аргумента какого-нибудь другого оператора.

Пример. Результатом обработки приведенного ниже кода будет страница, содержащая ссылку на саму себя.

<HTML>
<HEAD><TITLE>
Пример</TITLE></HEAD>
<BODY>

^var[my_URI;^uri[]]
<A HREF=^var[my_URI]>Вот я: ^var[my_URI]</A>
</BODY>
</HTML>

Внимание! Если аргумент реально не используется при вычислении значения оператора, то Парсер может и не вычислить его. Это повышает производительность системы, но может подвести вас, если вы поместили в этот аргумент оператор, чтобы воспользоваться его побочным эффектом.

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

^macro[nav_link;назад;-1;`<<<<<<`]
^macro[
nav_link;вперед;+1;`>>>>>>`]

1.3. Макросы

1.3.1. Общее представление о макросах

Макросы применяются для описания элементов, повторяющихся на одной или нескольких страницах сайта. Это могут быть стандартные надписи, колонтитулы, ссылки, меню и т. п. Предпочитая строгости определений их внятность, скажем, что макрос — это фрагмент текста, который вставляется Парсером в обрабатываемый шаблон страницы. Текст макроса оказывается там, куда HTML-кодер поставил соответствующий вызов. В этом смысле макрос напоминает оператор. Принципиальное отличие состоит в том, что HTML-кодер сам создает макросы, необходимые ему для работы. В тексте макроса можно использовать операторы и вызывать другие макросы. Кроме того, в описании макроса могут быть указаны поименованные аргументы. При вызове макроса HTML-кодер может указать значения каждого из них. Тогда, встретив в тексте макроса имя аргумента, предваряемое символом $ (знак доллара), Парсер заменит такое сочетание значением этого аргумента.

Замечание. Немного забегая вперед, поясним, что в Парсере предусмотрены два принципиально различных способа вызова макросов. Во-первых, макрос можно вызвать с помощью оператора macro (см. п. 1.3.4). Во-вторых, если в шаблоне описаны макросы с именами autoexec или main, они будет вызваны Парсером автоматически (см. п. 1.3.5).

1.3.2. Наглядный пример использования макроса

Прежде чем в деталях описать правила составления и вызова макросов, рассмотрим один несложный пример.

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

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


_macro.cfg

@my_phone[text_before_phone] выводит телефон с "преамбулой"
<B><I>$text_before_phone</I> +7 (095) 229-85-23</B>

Это макрос. Первая строка представляет собой заголовок макроса. Парсер не будет вставлять его в шаблон страницы, зато в нем указано имя макроса, my_phone, и задан список его аргументов. В данном случае аргумент один — text_before_phone. Мы воспользуемся им для передачи макросу вводной фразы.

Теперь создадим два шаблона для русской и английской версий страницы.


russian.html

<HTML>
<HEAD><TITLE>
Как с нами связаться</TITLE></HEAD>
<BODY>

^macro[my_phone;Наш номер телефона:]
</BODY>
</HTML>


english.html

<HTML>
<HEAD><TITLE>
Contacts</TITLE></HEAD>
<BODY>

^macro[my_phone;Our phone number:]
</BODY>
</HTML>

В обоих шаблонах третья строка содержит вызов макроса my_phone. Для вызова используется оператор macro. В качестве первого аргумента этому оператору всегда передается имя вызываемого макроса. Последующие аргументы, начиная со второго, передаются вызываемому макросу. Иными словами, второй аргумент оператора macro — это первый аргумент макроса и т. д.

В результате обработки Парсером приведенных выше шаблонов получим следующие страницы.


russian.html

<HTML>
<HEAD><TITLE>
Как с нами связаться</TITLE></HEAD>
<BODY>
<B><I>
Наш номер телефона:</I> +7 (095) 229-85-23</B>
</BODY>
</HTML>


english.html

<HTML>
<HEAD><TITLE>
Contacts</TITLE></HEAD>
<BODY>
<B><I>
Our phone number:</I> +7 (095) 229-85-23</B>
</BODY>
</HTML>

1.3.3. Правила записи макросов

Макрос представляет собой конструкцию следующего вида:

@имя_макроса[аргумент1;аргумент2;...аргументN] комментарий
текст_макроса

Макрос начинается однострочным заголовком, первый символ которого (@, т. н. собака) обязательно должен располагаться в первой позиции строки. Имя макроса может состоять из латинских букв, цифр и символов подчеркивания, но не должно начинаться с цифры. Такие же требования предъявляются к именам аргументов.

За списком аргументов можно поместить произвольный (но умещающийся в той же строке) комментарий. Количество строк, занимаемых текстом макроса, не ограничено.

Символ $ (знак доллара) и следующее непосредственно за ним имя аргумента макроса заменяются переданным при вызове значением этого аргумента. Если же знак доллара является частью текста макроса, его следует удвоить. Например, так: ИТОГО: $$$total_cost (первые два знака доллара будут преобразованы в один, а третий вместе с именем аргумента будет заменен значением аргумента).

Описание макроса можно разместить

  • в том шаблоне, откуда он вызывается;
  • в файле _macro.cfg, местонахождение которого — корневой каталог веб-сервера;
  • в любом другом файле.

Макросы, описанные в файле _macro.cfg, могут быть вызваны в любом шаблоне. Для того чтобы сделать доступными макросы, описанные в другом файле (но не в _macro.cfg), применяют оператор macro_use (см. п. 3.2.3). В качестве аргумента этому оператору передают путь к файлу (или к файлам) с описаниями макросов.

Внимание! Если в шаблоне встречаются определения макросов, то весь не относящийся к ним код Парсером игнорируется.

1.3.4. Вызов макросов с помощью оператора macro

Вызов макроса с помощью оператора macro мы уже продемонстрировали в приведенном выше примере.

^macro[имя_макроса;аргумент1;аргумент2;...аргументN]

В качестве первого аргумента указывается имя вызываемого макроса. Затем указываются значения аргументов, передаваемых макросу.

Внимание! Передаваемые макросу значения аргументов перед их вставкой в текст макроса не обрабатываются Парсером.

1.3.5. Шаблоны с описаниями макросов. Макрос main

Шаблоны, содержащие описания макросов, обрабатываются Парсером особым образом. Код, не входящий ни в один из макросов, игнорируется. Если в шаблоне описан макрос с именем main, он вызывается автоматически — этим обработка шаблона исчерпывается. В том случае, если макрос main обращается к другим макросам, описанным в том же файле или в других файлах, они будут вызваны.

Для чего используется такой механизм вызова макросов? С помощью операторов и макросов можно вставлять в код страниц разнообразные стандартные фрагменты. А что делать, если необходимо описать повторяющееся структурное решение? Допустим, все страницы сайта состоят из верхнего колонтитула, блока содержания и нижнего колонтитула. Теперь потребовалось расположить информацию из нижнего колонтитула слева от блока содержания, а не под ним. Иными словами, показать то же самое, но в другом месте. Свести подобную задачу к переписыванию вынесенных в отдельный файл общих “вставок” будет нелегко, особенно если нижние колонтитулы страниц различаются. Для ее решения лучше использовать механизм автоматического вызова макросов.

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

Сначала опишем в файле _macro.cfg макросы, общие для всех страниц. Макрос html задает общую единообразную структуру страниц, а макрос fixed формирует общий верхний колонтитул.


_macro.cfg

@html[title;body] основной код страницы (спец. колонтитул снизу)
<HTML>
<HEAD><TITLE>
$title</TITLE></HEAD>
<BODY>
   <P>
^macro[fixed]</P>
   $body
   <P>^macro[custom]</P>
</BODY>
</HTML>

@fixed[] общий верхний колонтитул
   <I>Верхний колонтитул, общий для всех страниц</I>

Внимательный читатель заметил, что макрос custom, к которому обращается макрос html, в файле _macro.cfg не описан. Макрос с этим именем мы опишем в шаблоне каждой из страниц. Он будет использоваться для формирования уникального для каждой страницы нижнего колонтитула (а затем левого поля).

В отдельных HTML-файлах создадим несколько шаблонов страниц.


gray_kid.html

@main[] стишок про козлика
   ^macro[html;
          Серенький козлик;
          Жил-был у бабушки серенький козлик,<br>
          Вот как, вот как, серый козел.
   ]
@
custom[] колонтитул для стишка про козлика
   <P><I>Нижний колонтитул, индивидуальный для каждой страницы</I></P>
   <P>
Телефон отдела копытных: 123-45-67</P>


kind_beetle.html

@main[] стишок про жука
   ^macro[html;
          Добрый жук;
          Встаньте, дети, встаньте в круг,<br>
          Жил на свете добрый жук.
   ]
@
custom[] колонтитул для стишка про жука
   <P><I>Нижний колонтитул, индивидуальный для каждой страницы</I></P>
   <P>
Телефон отдела насекомых: 765-43-21</P>

Теперь вернемся к файлу _macro.cfg и перепишем макрос html таким образом, что содержимое нижнего колонтитула на всех страницах будет появляться слева от блока содержания.


_macro.cfg

@html[title;body] основной код страницы (спец. колонтитул слева)
<HTML>
<HEAD><TITLE>
$title</TITLE></HEAD>
<BODY>
   <P>
^macro[fixed]</P>
   <TABLE BORDER=
1><TR>
      <TD>
Теперь на всех страницах он слева!^macro[custom]</TD>
      <TD>
$body</TD>
   </TR></TABLE>
</BODY>
</HTML>

Обратите внимание, сколько бы ни было страниц и каковы бы ни были нижние колонтитулы, исправлять все равно пришлось бы только макрос html.

1.3.6. Инициализация страниц. Макрос autoexec

Макрос autoexec обычно используют для того, чтобы подгрузить описания макросов из других файлов (но не из _macro.cfg) или инициализировать переменные (см. п. 1.5). Если в шаблоне описан макрос с таким именем, он будет вызван автоматически в первую очередь (перед вызовом макроса main). Результат, получаемый при вызове макроса autoexec, Парсером игнорируется.

Пример. Используем макрос autoexec для того, чтобы инициализировать переменную title и подгрузить описания макросов из файла _my_macro.cfg.

@main[] HTML-код страницы
   <HTML>
   <HEAD><TITLE>
Пример использования макроса autoexec</TITLE></HEAD>
   <BODY>
      <H1>
^var[title]</H1>
   </BODY>
   </HTML>

@autoexec[] инициализация страницы
   ^macro_use[my_macro.cfg]
   ^var[title;Используем макрос autoexec]

1.4. Таблицы

1.4.1. Зачем нужны таблицы?

Вернемся к примеру, рассмотренному в п. 1.3.2. Вы помните, что номер телефона, который должен был отображаться на разных страницах сайта, мы вынесли в текст макроса my_phone. Если теперь потребуется отображать еще адрес и время работы, нам ничто не помешает также внести эти данные в макрос. Например, так.

@my_contacts[text_before_phone;text_before_address;text_before_time]
<B><I>$text_before_address</I> Москва, Газетный переулок</B>
<B><I>
$text_before_time</I> 10:00-19:00</B>
<B><I>
$text_before_phone</I> +7 (095) 229-85-23</B>

Можно поместить в текст макроса сведения обо всех представительствах компании, но пользоваться им будет уже неудобно. Представьте себе, какой объем ручной правки потребуется для того, чтобы, допустим, изменить оформление всех надписей, если представительств будет штук пятьдесят. Наконец, если данные хранятся не у кого-нибудь из нас в голове, а в базе данных, не станем же мы вручную переносить их в текст макроса! Поэтому для работы с данными, представленными в виде таблиц, в Парсере предусмотрено специальное средство — таблица.

1.4.2. Механизм таблиц в Парсере

Механизм таблиц предназначен для работы с данными табличного формата. Данные, которые хранятся в текстовом файле или в базе данных, можно загрузить в таблицу — после этого к ним можно будет обращаться из шаблонов страниц. Жесткой связи между таблицей и каким-либо источником данных нет; можно использовать таблицу только для работы с данными в оперативной памяти. Таблица идентифицируется своим именем. Столбцы таблицы имеют номера и одновременно могут быть поименованы. Если столбцы таблицы поименованы, к ним можно обращаться как по их именам, так и по номерам. К непоименованным столбцам таблицы обращаются только по номерам.

1.4.3. Текущая таблица

Прежде чем приступить к работе с той или иной таблицей, необходимо назначить ее текущей. Для этого служит оператор context.

^context[имя_таблицы;код]

В первом аргументе передается имя таблицы, во втором — код, для которого эта таблица назначается текущей. Код обрабатывается Парсером.

Замечание. Если таблица с указанным именем не существует, она создается.

Замечание. Код, передаваемый оператору context в свою очередь может содержать вызовы этого оператора.

^context[table1;
         ^rem[
Текущая таблица - table1]
         ^context[
table2;
                  ^rem[
Текущая таблица - table2]
         ]
         ^rem[
Текущая таблица - снова table1]
]

Замечание. Если ни одна таблица не назначена текущей с помощью оператора context, то текущей является безымянная таблица. Использовать ее не рекомендуется.

1.4.4. Заполнение таблицы данными

Текущую таблицу можно заполнить данными из источников следующих типов:

  • Код (а именно: оператор config — см. п. 3.6.1).
  • Текстовый файл в формате tab-delimited. В таких файлах соседние строки таблицы разделены символом перевода строки, а значения в соседних столбцах — символом табуляции. Для загрузки в текущую таблицу данных из файла, устроенного подобным образом, служит оператор load (см. п. 3.6.3).
  • Результат выполнения запроса на языке SQL. Для подключения к серверу баз данных в Парсере предусмотрен оператор server, а для работы с запросами — sql (см. п. 3.5.2).

Далее мы будем активно использовать оператор load в примерах, поэтому сейчас рассмотрим его более подробно.

^load[имя_файла] Данные из файла с указанным именем загружаются в текущую таблицу.
^load[named;имя_файла] Данные из файла с указанным именем загружаются в текущую таблицу. Значение named указывает, что первая строка файла содержит не данные, а имена столбцов.

Замечание. Имя файла на диске должно начинаться символом подчеркивания, который не указывается в аргументе оператора.

Внимание! При загрузке данных в таблицу предыдущее содержимое этой таблицы теряется.

Пример. Загрузим в таблицу с именем contacts координаты нескольких представительств компании. Сначала создадим файл с именем _contacts.dat и наберем в нем следующий текст.


_contacts.dat

address >                   time >          phone
Москва, Газетный переулок > 10:00-19:00 >   229-85-23
Антарктида >                круглосуточно > 229-88-33

Не забудьте, что значения в соседних столбцах (например, слова address и time или Антарктида и круглосуточно) должны быть разделены не пробелами, а одним символом табуляции. Приведенный ниже фрагмент кода загрузит данные из этого файла в таблицу с именем contacts. Имена столбцов таблицы будут взяты из первой строки файла.


load_contacts.html

^context[contacts;
         ^load[named;
contacts.dat]
]

1.4.5. Текущая строка, навигация и поиск в таблице

В каждой таблице имеется текущая строка. Оператор item (см. п. 1.4.5) возвращает значение, расположенное на пересечении заданного столбца и текущей строки. В только что созданной таблице текущей является первая строка.

Побочным эффектом ряда операторов является смена текущей строки. Если номер новой текущей строки больше (или меньше) номера предыдущей текущей строки на N, будем говорить, что произошло перемещение на N строк вперед (или назад).

Для перемещения на определенное “расстояние” от текущей строки используют оператор shift (см. п. 3.6.9). Для перемещения к строке, у которой в определенном столбце находится заданное значение, используют оператор locate (см. п. 3.6.8). Для того чтобы “обойти” все строки таблицы, породив для каждой из них некоторый код, используют операторы menu (см. п. 3.6.6) и table (см. п. 3.6.7).

1.4.6. Обращение к данным в таблице

Оператор item для текущей таблицы возвращает значение, расположенное на пересечении текущей строки и столбца с определенным именем или номером. Этот оператор имеет несколько форматов вызова.

^item[имя_или_номер_столбца] Для текущей таблицы возвращает значение, расположенное на пересечении указанного столбца и текущей строки.
^item[next;имя_или_номер_столбца]
^item[prev;имя_или_номер_столбца]
Для текущей таблицы возвращает значение, расположенное на пересечении указанного столбца и строки, которая следует за текущей (или предшествует ей).
^item[имя_таблицы;имя_или_номер_столбца] Для указанной таблицы возвращает значение, расположенное на пересечении указанного столбца и текущей строки.

Пример. Модифицируем пример, приведенный в п. 1.4.4. Выведем данные из первой строки таблицы.


show_contacts.html

<HTML>
<HEAD><TITLE>
Пример использования оператора item</TITLE></HEAD>
<BODY>

^context[contacts;
         ^load[named;
contacts.dat]
         Адрес: ^item[address]
         Время работы: ^item[time]
         Телефон: ^item[phone]
]

</BODY>
</HTML>

1.4.7. Перебор строк текущей таблицы

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

^menu[код] Последовательно делает текущей каждую строку текущей таблицы. Для каждой строки обрабатывает переданный код. Перебор начинается с первой строки таблицы и заканчивается последней.
^menu[код;код_разделитель] То же самое, но вдобавок код, переданный во втором аргументе, будет вставлен между непустыми результатами обработки строк.

Пример. Модифицируем пример, приведенный в п. 1.4.6. Отобразим данные из текущей таблицы в виде HTML-таблицы.


show_contacts_as_table.html

<HTML>
<HEAD><TITLE>
Пример использования оператора menu</TITLE></HEAD>
<BODY>

^context[contacts;
         ^load[named;
contacts.dat]
         <TABLE>
            <TR>
               <TD>
Адрес</TD>
               <TD>
Время работы</TD>
               <TD>
Телефон</TD>
            </TR>

            ^menu[<TR>
                     <TD>
^item[address]</TD>
                     <TD>
^item[time]</TD>
                     <TD>
^item[phone]</TD>
                  </TR>

            ]
         </TABLE>
]
</BODY>
</HTML>

1.5. Переменные

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

Для того чтобы завести переменную, достаточно присвоить ей то или иное значение. Имя переменной может состоять из латинских букв, цифр и символов подчеркивания, но не должно начинаться цифрой.

Значения переменных, вообще говоря, являются строками, однако операторы могут интерпретировать их как целые числа в десятичной, восьмеричной или шестнадцатеричной записи или как действительные числа.

Для работы с переменными используется оператор var. С помощью этого оператора вы можете присваивать переменным значения и считывать значения переменных.

^var[имя_переменной;значение] Переменной присваивается указанное значение.
^var[имя_переменной;операция;операнд] Над значением переменной и операндом выполняется операция. Результат заносится в переменную. Допустимы следующие операции: + (сложение), - (вычитание), * (умножение), / (деление) и . (конкатенация строк).
^var[имя_переменной;строка_формата;
     математическое_выражение]
Значение математического выражения (см. п. 1.7) вычисляется и преобразовывается к виду, определяемому строкой формата (см. п. 1.8). Полученный результат записывается в переменную.
^var[имя_переменной] Возвращает значение переменной.

1.6. Уровни обработки

В коде, который обрабатывается Парсером, могут встречаться выражения на языках HTML, JavaScript и SQL. Между тем результаты, возвращаемые некоторыми операторами, а именно item, form, cookie, var и env, вообще говоря, могут не соответствовать синтаксису этих языков. Например, если переменная neravenstvo содержит значение A<B, то вызов ^var[neravenstvo] выдаст результат, непригодный для вставки в HTML-код (так как браузер может “запутаться” в тегах). Поэтому в Парсере предусмотрен механизм уровней обработки, позволяющий при вставке в код “пройтись напильничком” по результатам этих операторов. В зависимости от установленного уровня обработки в них выполняются те или иные замены.

Существуют следующие уровни обработки:

  • html — символы ", <, > и & заменяются строками &quot;, &lt;, &gt;, и &amp; соответственно. Символ табуляции заменяется пробелом;
  • config — символы табуляции и перевода строки заменяются пробелом;
  • javascript — символы с кодами 255d, 209d (буква я в кодировках windows-1251 и koi8-r соответственно) для обеспечения совместимости с Netscape Navigator 3 заменяются на . Символы ', " и \ предваряются символом \. Символы с кодами 10d и 13d преобразуются в \n и \r соответственно;
  • sql — для сервера Oracle символ ' заменяется парой '', символ табуляции — пробелом. Для сервера MySQL символы ', " и \ предваряются символом \. Символы с кодами 10d и 13d преобразуются в символы \n и \r соответственно. Символ табуляции заменяется пробелом;
  • none — никакие замены не выполняются.

По умолчанию установлен уровень обработки html. Для переключения уровней обработки используют оператор level.

^level[уровень_обработки;код]

Для переданного кода устанавливается указанный уровень обработки. Если при обработке этого кода встретится один из операторов item, form, cookie, var или env, то его результат будет преобразован в соответствии с установленным уровнем обработки.

Замечание. Для кода, расположенного внутри операторов config и sql, соответствующий уровень обработки устанавливается автоматически.

1.7. Математические и логические выражения

Математические выражения в языке Парсера составляются по обычным правилам с использованием знаков математических операций, имен функций и круглых скобок. Операндами в математическом выражении могут быть константы, значения, взятые из таблиц, и переменные.

Некоторые операторы, например if, используют значение математического выражения в качестве критерия при выборе одной альтернативы из двух предложенных. В таких случаях будем говорить, что мы имеем дело не с математическим, а с логическим значением. Любое отличное от нуля число интерпретируется как логическое значение ИСТИНА, а 0 — как логическое значение ЛОЖЬ. Если значение выражения отлично от нуля, будем называть такое выражение истинным, в противном случае — ложным.

Замечание. Можно подставлять в математическое выражение переменные без оператора var. Достаточно указать в качестве операнда имя переменной, например, вместо ^var[mnogo_deneg] написать просто mnogo_deneg. Аналогично, обращаясь в математическом выражении к элементам таблиц, можно не использовать оператор item. Для того чтобы обозначить элемент таблицы, используйте такую форму записи: имя_таблицы::имя_столбца или ::имя_столбца (для текущей таблицы).

Замечание. Точность вычислений зависит от платформы, на которой установлены веб-сервер и Парсер. На большинстве платформ мы сможем работать со значениями в диапазоне ±10307 с пятнадцатью значащими цифрами.

Арифметические операции

Знаки операции Операция
+ Сложение
- Вычитание
* Умножение
/ Деление
% Остаток от деления. Для отрицательных чисел результат отличается от принятого в математике, например –11%2=–1

Побитовые операции

Знаки операции Операция
~ Побитовая инверсия
^ Побитовая операция XOR
& Побитовая операция AND
| Побитовая операции OR

Логические операции

Для всех логических операций результат равен 1, если условие выполняется, и 0 в противном случае.

Знаки операции Операция
< Меньше
> Больше
<= Меньше или равно
>= Больше или равно
== Равно
!= Неравно
&& Логическая операция AND
|| Логическая операция OR
! Логическая операция NOT

Функции

Имя функции Функция
round() Округление до ближайшего целого. Например, round(–1.23)=–1, round(–1.58)=–2, round(1.58)=2
floor() Операция округления до целого в меньшую сторону, например floor(1.23)=1, floor(–1.23)=–2
ceiling() Операция округления до целого в большую сторону, например ceiling(1.23)=2, ceiling(–1.23)=–1
abs() Абсолютная величина (модуль), например abs(1.23)=1.23, abs(–1.23)=1.23
sign() Знак выражения. Например, sign(1.23)=1, sign(0)=0, sign(–1.23)=–1

1.8. Форматные строки

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

Замечание для тех, кто знаком с программированием на языке Си. Форматная строка устроена так же, как в функции printf.

Тип — определяет способ преобразования числа в строку. Существуют следующие типы:

d — десятичное целое число со знаком;
u — десятичное целое число без знака;
o — восьмеричное целое число без знака;
x — шестнадцатеричное целое число без знака; для вывода цифр, больших 9, используются буквы a, b, c, d, e, f;
X — шестнадцатеричное целое число без знака; для вывода цифр, больших 9, используются буквы A, B, C, D, E, F;
f — действительное число.

Точность — точность представления дробной части, т. е. количество знаков после запятой. Если для отображения дробной части значения требуется больше знаков, то значение округляется. Обычно точность указывают в том случае, если используется тип преобразования f. Для других типов указывать точность не рекомендуется. Если точность не указана, то для типа преобразования f она по умолчанию принимается равной 6. Если указана точность 0, то число выводится без дробной части.

Длина — количество знаков, отводимое для значения. Может получиться так, что для отображения полученного значения требуется меньше символов, чем указано в блоке Длина. Например, указана длина 10, а получено значение 123. В этом случае слева к значению будет приписано семь пробелов. Если нужно, чтобы слева приписывались не пробелы, а нули, следует в начале блока Длина поместить 0, например, написать не 10, а 010. Блок Длина может отсутствовать, тогда для значения будет отведено ровно столько символов, сколько требуется для его отображения.


E-mail: mailbox@parser.ruCopyright © 1997-2001 Студия Артемия Лебедева
`