Стиль pgo0

Посмотрим на типичную таблицу:

Здесь области H являются разделителями строк в таблице, кроме самой верхней и самой нижней H, которые не разделяют строки, а ограничивают таблицу. Если в таблице n строк, то один ограничитель идентифицируется как +Hx, так и -Hn-x, например, для x == 3 +H1 - это тот же самый разделитель, что и -H2. U - это вехнее оформление каждой строки, а D - нижнее оформление. Каждая из этих областей так же имеет по 2 идентификатора, по номеру сверху или по номеру снизу. Разделение на H, U и D формально условно, поскольку +Dx-1 Hx Ux можно рассматривать как единый объект, но такое деление введено для удобства описания дизайна и по разному обрабатывается в специальном случае отсутствия текста в строке.

Аналогично V - разделители колонок в строке, кроме самой левой и самой правой, которые не разделяют колонки, а ограничивают строку. К каждому ограничителю можно обращаться двумя способами, как и к H. Каждая колонка в строке имеет левое оформление L и правое R с таким же правилом идентификации по номеру слева или справа.

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

Пример простого описания стиля:

#name pgo0 ULRU
# +H0
<table>

# -H0
</table>

# +H


# +U
  <tr>
# = id 0 1
# +D
  </tr>
# +V

# const1
Text of const - no \n at end of it
# const2
Another const with \n at end of it

# -V0
# +L
    <td>
# +R
    </td>
# -N
-
       
В этом описании определен стиль с именем name, который обслуживается описываемым здесь интерпретатором pgo0. В этом стиле определены 2 текстовые константы с именами const1 и const2 и комплект для оформления вывода таблиц. В этом комплекте в строке с # = задана перестановка колонок таблицы при оформлении к выводу.

Каждая область ищется в описании по двум своим полным идентификаторам (+ и -), используется первое найденное определение. Если точное определение не найдено, то ищется первое определение без номера (с каким либо: + или - знаком), и если не найдено, то определение для соответствующей области отсутствует, при выводе по стилю заменяется пустой строкой. Определения без номера, которые отличаются только знаком, не должны встречаться в одном стиле, иначе певедение неопределено.

Если поле к выводу имеет значение NULL, то соответствующие этому полю L и R оформление не выводится. Если для этого нулевого поля задан N, то выводится содержимое этого элемента без L и R. Вывод V оформления от значений в таблице не зависит и выводится всегда, когда задано.

Если в оформляемой строке нет ни одного элемента оформления V и все значения в строке равны NULL, то элементы U и D оформления этой строки не выводятся. Вывод элементов оформления H происходит всегда при наличии соответствующего места между строками таблицы или над первой и под последней строкой таблицы и от содержимого полей таблицы не зависит.

Если стиль вывода таблицы применяется не к Pq (Результат #select или #binpresel, когда размер таблицы точно известен), а к потоковым #strselect или #binselect, у которых стиль применяется на лету при неизвестной заранее длинне, элементы оформления -H, -U и -D с любыми номерами могут быть применены только к последней строке.

Если в стиле имеется несколько определений одного элемента, то работает последнее из них. Если к одному месту может быть применено 2 разных оформления (+оформление и -оформление), то используется то, которое определено раньше, если приоритет не переопределен флагами.

Если в стиле есть строка перестановки колонок, то описанным выше образом оформляется таблица, полученная после перестановки согласно описателю. Эта таблица имеет столько колонок, сколько позиций в описателе, каждая позиция задает номер колонки (с 0) или имя колонки исходной таблицы, которая будет колонкой выходной таблицы. Одну колонку исходной таблицы можно использовать для выходной таблицы несколько раз или не использовать вовсе. Имена колонок определяются той СУБД, которая создала таблицу, существование имен не гарантируется. Если в операторе перестановки указана несуществующая (по имени или номеру) колонка исходной таблицы, то колонка выходной таблицы будет состоять из значений NULL.

Как показано в примере, у этого стиля могут быть флаги, слегка меняющие поведение стиля.

H
Выводить все U и D элементы, даже если в соответствующей строке нет ни одного непустого значения и ни одного элемента оформления.
U
Если в Pq 0 строк, то выводить элемент оформления, соответствующий +H0. Если в стиле заданы и +H0, и -H0, то выбирается +H0 независимо от их порядка задания в стиле. Если нет обоих, тогда обычным образом используется +H. Если задан также флаг D, то выводится сначала элемент, управляемый U, потом элемент, управляемый D.
UU
Если на одну горизонтальную позицию (H, U, D) претендуют 2 элемента оформления, то выбирается элемент со знаком +.
D
Если в Pq 0 строк, то выводить элемент оформления, соответствующий -H0. Если в стиле заданы и +H0, и -H0, то выбирается -H0 независимо от их порядка задания в стиле. Если нет обоих, тогда обычным образом используется +H. Если задан также флаг U, то выводится сначала элемент, управляемый U, потом элемент, управляемый D.
DD
Если на одну горизонтальную позицию (H, U, D) претендуют 2 элемента оформления, то выбирается элемент со знаком -.
V
Выводить все L и R элементы, даже если значение в ячейке между ними NULL.
L
Если в Pq 0 колонок, то выводить элемент оформления, соответствующий +V0. Если в стиле заданы и +V0, и -V0, то выбирается +V0 независимо от их порядка задания в стиле. Если нет обоих, тогда обычным образом используется +V. Если задан также флаг R, то выводится сначала элемент, управляемый L, потом элемент, управляемый R.
LL
Если на одну вертикальную позицию (V, L, R) претендуют 2 элемента оформления, то выбирается элемент со знаком +.
R
Если в Pq 0 колонок, то выводить элемент оформления, соответствующий -V0. Если в стиле заданы и +V0, и -V0, то выбирается -V0 независимо от их порядка задания в стиле. Если нет обоих, тогда обычным образом используется +V. Если задан также флаг L, то выводится сначала элемент, управляемый L, потом элемент, управляемый D.
RR
Если на одну вертикальную позицию (V, L, R) претендуют 2 элемента оформления, то выбирается элемент со знаком -.
Взаимное расположение букв в блоке флагов значения не имеет. Комбинация UUDD эквивалентна UD, а LLRR эквивалентна LR.

Стили этого интерпретатора можно догружать в регистр, в котором уже есть стиль этого же интерпретатора, при этом флаги берутся от последней загрузки, а определения сливаются так, как если бы тексты обоих стилей были бы конкатенированы, вновь загружаемый после уже загруженного. Новые определения дополняют стиль (если таких не было раньше) или заменяют уже существовавшие.


А.А.Бабайлов (C)2003..2022