Annotation of parser3/operators.ru.txt, revision 1.1
1.1 ! paf 1: !сделано
! 2: Xне сделано, видимо, не будет сделано
! 3: без значка - будет сделано
! 4:
! 5:
! 6: операторы
! 7: !^eval(выражение)[формат] выражение, кроме обычных функций::
! 8: !из неочевидных операторов:
! 9: # побитный xor
! 10: ## логический xor
! 11: ~ побитное отрицание
! 12: \ целочисленное деление 10/3=3
! 13: !def для проверки defined,
! 14: пустая строка не defined
! 15: пустая таблица не defined
! 16: пустой hash не defined
! 17: !eq ne lt gt le ge для сравнения строк,
! 18: !in "/dir/" для проверки[раньше ^start]
! 19: ["внутри не допустимы, если надо сравнить со сложным,
! 20: пусть это будет переменная].
! 21: !is 'type' для проверки типа левого операнда,
! 22: скажем, можно проверить, "не hash ли параметр метода?"
! 23: !-f для проверки существования файла на диске,
! 24: !-d для проверки существования каталога на диске,
! 25: !строка в кавычках|апострофах - строка, без кавычек|апострофов строка до
! 26: ближайшего whitespace
! 27: !числовой литерал бывает 0xABC
! 28: !приоритеты:
! 29: /* logical */
! 30: %left "##"
! 31: %left "||"
! 32: %left "&&"
! 33: %left '<' '>' "<=" ">=" "lt" "gt" "le" "ge"
! 34: %left "==" "!=" "eq" "ne"
! 35: %left "is" "def" "in" "-f" "-d"
! 36: %left '!'
! 37:
! 38: /* bitwise */
! 39: %left '#'
! 40: %left '|'
! 41: %left '&'
! 42: %left '~'
! 43:
! 44: /* numerical */
! 45: %left '-' '+'
! 46: %left '*' '/' '%' '\\'
! 47: %left NEG /* negation: unary - */
! 48: !^if(условие){когда да}{когда нет}
! 49: !^switch[значение]{^case[вариант1[;вариант2...]]{действие}^case[DEFAULT]{действие по умолчанию}}
! 50: !^while(условие){тело}
! 51: !^for[i](0;4){тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}]
! 52: X^exit[] + - прекращяет обработку запроса.
! 53: удобно сделать после выставления 401 ошибки
! 54: X^return[результат] + - отваливает из выполнения метода,
! 55: выдавая нестандартный результат
! 56: X^break[] + - обрывает цикл
! 57: X^continue[] + - обрывает итерацию цикла
! 58: !^use[модуль]
! 59: !^untaint[[as-is|file-spec|http-header|mail-header|uri|table|sql|js|xml|html|optimized-html]]{код}
! 60: default as-is
! 61: !^taint[[lang]][код]
! 62: default "just tainted, language unknown"
! 63: !^process[строка, которая будет process-ed, как код]
! 64: !^connect[protocol://строка соединения]]{код с ^sql[...]-ями}
! 65: !mysql://user:pass@{host[:port]|[/unix/socket]}/database?
! 66: charset=cp1251_koi8&
! 67: timeout=3&
! 68: compress=1&
! 69: named_pipe=1
! 70:
! 71: !pgsql://user:pass@{host[:port]|[local]}/database
! 72:
! 73: oracle://user:pass@service?
! 74: NLS_LANG=RUSSIAN_AMERICA.CL8MSWIN1251&
! 75: NLS_LANGUAGE language-dependent conventions
! 76: NLS_TERRITORY territory-dependent conventions
! 77: NLS_DATE_FORMAT=YYYY-MM-DD HH24:MI:SS
! 78: NLS_DATE_LANGUAGE language for day and month names
! 79: NLS_NUMERIC_CHARACTERS decimal character and group separator
! 80: NLS_CURRENCY local currency symbol
! 81: NLS_ISO_CURRENCY ISO currency symbol
! 82: NLS_SORT sort sequence
! 83: ORA_ENCRYPT_LOGIN=TRUE
! 84:
! 85: !odbc://DSN=dsn^;UID=user^;PWD=password
! 86:
! 87: для работы connect нужно, чтобы заранее(рекомендуется в системном parser3)
! 88: была определена таблица
! 89: #sql drivers
! 90: $SQL[
! 91: $.drivers[^table::set{protocol driver client
! 92: mysql /www/parser3/libparser3mysql.so /usr/local/lib/mysql/libmysqlclient.so
! 93: pgsql /www/parser3/libparser3pgsql.so /usr/local/pgsql/lib/libpq.so
! 94: oracle /www/parser3/libparser3oracle.so /u01/app/oracle/product/8.1.5/lib/libclntsh.so?ORACLE_HOME=/u01/app/oracle/product/8.1.5&ORA_NLS33=/u01/app/oracle/product/8.1.5/ocommon/nls/admin/data
! 95: odbc c:\drives\y\parser3project\odbc\debug\parser3odbc.dll
! 96: }]
! 97: ]
! 98: !в таблице у oracle в столбце клиентской библиотеки
! 99: допустимо задать environment параметры инициализации(если они не заданы иначе заранее),
! 100: допустимы имена, начинающиеся на NLS_ ORA_ и ORACLE_, или оканчивающиеся на +
! 101: под win32
! 102: необходим PATH+=^;C:\Oracle\Ora81\bin
! 103: к сведению:
! 104: ORA_NLS33 нужен для считывания файлика с клиентской кодировкой(задаваемой NLS_LANG)
! 105: если кодировка не по-умолчанию, обязательно указать в .drivers,
! 106: иначе будет сообщение про неправильный NLS параметр
! 107: (имеют в виду, что не нашли кодировку из NLS_LANG)
! 108: ORACLE_HOME нужен для считывания текстов сообщений об ошибках,
! 109: можно указывать и в строке соединения, но глобален, и лучше вынести за скобки,
! 110: в отличие от клиентской кодировки NLS_LANG, и прочего.
! 111:
! 112: ВНИМАНИЕ: при работе с большими текстовыми блоками в oracle&pgsql[а лучше всегда],
! 113: ставить такой префикс перед открывающим апострофом, впритык, везде без проблелов
! 114: /**имя_поля**/'literal'
! 115: !^rem{}
! 116: !^error[текст]
! 117:
! 118: Xесть глобальный флажок в свойствах/командной строке "не оптимизировать"
! 119: !и есть исключение: ^untaint[html]{код} не оптимизируется безотностительно флажка
! 120:
! 121: !у всех макросов есть локальная переменная $result, если в неё что положить,
! 122: !то _это_ будет результатом макроса, а не его тело
! 123:
! 124: !use(^use или @USE) ищет файл...
! 125: !1. ...если путь начинается с /, то считается, что это путь от корня веб пространства
! 126: !есть глобальная строка/таблица $MAIN:CLASS_PATH с путём/путями к каталогу с классами.
! 127: !корень путя/путей считается от корня веб пространства.
! 128: !2. ...относительно строчки из table $MAIN:CLASS_PATH, снизу вверх
! 129: задавайте её в parser3.conf вашего сайта
! 130:
! 131: !глобальная табличка $CHARSETS[$.название[имя файла]]
! 132: !задаёт какие буквы считаются какими(whitespace, letter, etc), а также их unicode
! 133: !формат: tab delimited файл, с заголовком:
! 134: ! char white-space digit hex-digit letter word lowercase unicode1 unicode2
! 135: ! A x x x a 0x0041 0xFF21
! 136: ! где char и lowercase могут быть буквами, а могут быть и 0xКОДАМИ
! 137: ! если символ имеет единственное unicode представление, равное самому символу,
! 138: ! можно не указывать unicode
! 139: !всегда есть кодировка UTF-8,
! 140: !она является кодировкой по-умолчанию для request и response
! 141: !ВНИМАНИЕ: имя кодировки case sensitive
! 142:
! 143: синтаксис
! 144: !$имя[новое значение]
! 145: !$имя(математическое выражение нового значения)
! 146: !$имя{код нового значения}
! 147: !$имя whitespace или ${имя}неважно подстановка значения
! 148: !^имя параметры вызов
! 149: !$имя.CLASS класс значения
! 150: !$имя[$.key[] () {}] конструктор элемента переменной-хэша $имя.key
! 151: !^method[$.key[] () {}] конструктор элемента параметра-хеша $parameter.key
! 152: $CLASS.имя обращение к переменной класса
! 153:
! 154: имя заканчивается перед: пробел tab linefeed ; ] } ) " < > + * / % & | = ! ' , ? {уточнить}
! 155: т.е. можно
! 156: $имя,aaaa
! 157: но если нужно после имени букву, скажем -, то
! 158: ${имя}-
! 159: в выражениях + и - являются дополнительными концами имени
! 160: !можно обращаться к составным объектам так: $name.subname
! 161: !где subname бывает:
! 162: ! строка
! 163: ! $переменная
! 164: ! строка$переменная
! 165: ! [код, вычисляющий строку]
! 166: например: $хэш[$.возраст(88)] $достать[$.поле[возраст]] ^хэш.[$достать.поле].format{%05d}
! 167:
! 168: параметры:=один или много параметров
! 169: параметр:=
! 170: !(математическое выражение) вычисляется много раз внутри вызова,
! 171: | ![код] вычисляется один раз перед вызовом,
! 172: | !{код} вычисляется 0 или много раз внутри вызова,
! 173: !везде допустимы ; внутри - делает много параметров в одних скобках
! 174:
! 175:
! 176: !void
! 177: !^имя.int[] (default)
! 178: 0 или default
! 179: !^имя.double[] (default)
! 180: 0 или default
! 181: !^void:sql{запрос без результата}
! 182:
! 183: !int,double
! 184: !^имя.int[] целочисленное значение
! 185: !^имя.double[]+ double значение
! 186: !^имя.inc(на сколько +)
! 187: !^имя.dec(на сколько -)
! 188: !^имя.mul(на сколько *)
! 189: !^имя.div(на сколько /)
! 190: !^имя.mod(на сколько %)
! 191: !^имя.format[формат]
! 192: !^int/double:sql{query}[[$.limit(2) $.offset(4) $.default(0)]]
! 193: запрос, результат которого должен быть один столбец/одна строка
! 194:
! 195: !string
! 196: !в выражении
! 197: !def значение равно "не пуста?"
! 198: !логическое/числовое значение равно попытке преобразовывания к double,
! 199: пустая строка тихо преобразуется к 0
! 200:
! 201: пример:
! 202: ^if(def $form:name) не пуста?
! 203: ^if($user.isAlive) истина? [автопреобразование к числу, не ноль?]
! 204: !^string::sql{query}[[$.limit(2) $.offset(4) $.default[n/a]]]
! 205: результат запроса должен быть один столбец/одна строка
! 206: !^имя.int[] .int(default) целочисленное значение строки.
! 207: если ломается преобразование, берётся default
! 208: !^имя.double[]+ .double(default) double значение строки
! 209: если ломается преобразование, берётся default
! 210: !^имя.format{формат} %d %.2f %02d...
! 211: !^строка.match[шаблон][[опции поиска]] $prematch $match $postmatch $1 $2...
! 212: !^строка.match[шаблон][опции поиска]{замена}
! 213: !^строка.{l|r}split[разделитель] таблица из столбца $piece
! 214: !^строка.upper|lower[]
! 215: X^строка.truncate(предел терпенья) стиль :(
! 216: !^строка.length[]
! 217: !^строка.mid(P[;N])
! 218: без N - "до конца строки"
! 219: !^строка.left(N)
! 220: !^строка.right(N)
! 221: !^строка.pos[подстрока]
! 222: <0 = не найдено
! 223: !^строка.replace[$таблица_подстановок_строка_на_строку]
! 224: !^строка.save[[append;]путь]
! 225:
! 226: !table
! 227: в выражении
! 228: логическое значение равно "не пуста?"
! 229: числовое значение равно count[]
! 230: !^table::set[[nameless]]{данные}
! 231: !^table::load[[nameless;]путь]
! 232: !если не nameless, названия колонок берутся из первой строки
! 233: !пустые строки, и строки в первой колонке содержащие '#', игнорируются
! 234: !^table::sql{query}[[$.limit(2) $.offset(4)]]
! 235: !^таблица.save[[nameless|append;]путь]
! 236: !$таблица.поле
! 237: !$таблица.fields+ из named таблицы выдаёт текущую запись как Hash
! 238: !^таблица.menu{тело}[разделитель]
! 239: !^таблица.offset[[whence]](5) сдвигает; без параметра - печатает offset
! 240: !whence=cur|set
! 241: !без whence - это cur
! 242: !^таблица.count[]
! 243: !^таблица.line[] 1-based offset
! 244: !^таблица.sort{{ключеделатель строка}|(ключеделатель число)}[{desc|asc}] default=asc
! 245: !^таблица.append{данные}
! 246: X^таблица.insert{данные}[(n)] добавить запись
! 247: на текущую позицию [добавить запись на позицию n]
! 248: X^таблица.remove(position[;count]) - стирает запись
! 249: из текущей позиции [стирает запись из конкретной позиции]
! 250: [стирает count записей]
! 251: !^таблица.join[таблица] - добавляет записи из таблицы.
! 252: таблицы должны иметь одинаковую структуру.
! 253: !^таблица.flip[] выдаёт транспонированную, надо куда-то сложить, потом пользовать
! 254: !^таблица.locate[поле;значение] выдаёт bool
! 255: !^таблица.hash[поле, что будет ключом][[поле значений|table поля значений]]+
! 256: значением $hash.ключ будет hash в котором поля значений будут ключами
! 257: поля значений могут быть не указаны, тогда ими будут все столбцы, включая ключевой
! 258: !^таблица.columns[]+ таблица из одного столбца $column
! 259:
! 260: !hash
! 261: !в выражении
! 262: !логическое значение равно "не пуста?"
! 263: !числовое значение равно _count[]
! 264: !$hash.ключ
! 265: !_default - специальный ключ, если задан,
! 266: то при обращении по ключу, которому нет соответствия, выдаётся _default значение
! 267: !^hash::create[[!copy_from_hash|!copy_from_hashfile]]
! 268: создаёт новый hash, копию старого
! 269: !^hash.add[слагаемое]
! 270: перезаписывает одноимённые
! 271: !^hash.sub[вычитаемое]
! 272: !^a.union[b] = объединение
! 273: !^a.intersection[b] = пересечение
! 274: !^a.intersects[b] = bool
! 275: !^hash::sql{запрос}[[$.limit(2) $.offset(4)]]
! 276: получается hash(ключи=значения первая колонка ответа)
! 277: of hash(ключи=названия остальных колонкок ответа)
! 278: !^hash._keys[]+ таблица из одного столбца $key
! 279: !^hash._count[]
! 280: !^foreach[key;value]{тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}]
! 281: !^delete[ключ] удалить ключ
! 282:
! 283: !form
! 284: [берётся первый элемент из одноимённых из GET, потом первый из POST]
! 285: !$form:поле = string/file
! 286: !$form:fields = hash со всеми полями формы
! 287: !$form:tables.поле = table с одним столбцом "field" со значениями "поля"
! 288:
! 289: !env
! 290: !$env:переменная
! 291:
! 292: !cookie
! 293: !$cookie:имя считать старое или свежезаданное
! 294: !$cookie:имя[значение] на 90 дней
! 295: !$cookie:имя[$.value[значение] $.expires(дней) или $.expires[session]]
! 296:
! 297: !request
! 298: !$request:query
! 299: !$request:uri
! 300: X!$request:browser это hash, поля:
! 301: !$type = ie/nn и !$version = номер, скажем 5.5
! 302: X$request:user
! 303: X$request:password
! 304: !$request:charset
! 305: Кодировка исходного документа
! 306: !используется при upper/lower и match[][i]
! 307: ПРЕДУПРЕЖДЕНИЕ: класс form получает свои поля после обработки всех auto класса MAIN
! 308: поэтому необходимо задать $request/response:charset в одном из них. не после.
! 309:
! 310: !response
! 311: !$response:поле[значение] и можно считать старое -- $response:поле
! 312: !значение может быть string а может быть hash:
! 313: ! $value[abc] field: {abc}<<часть
! 314: ! $attribute[zzz] field: abc; {attribute=zzz}<<часть
! 315: !$response:body[DATA] замещает стандартный ответ
! 316: !^response:clear[] забыть все заданные response поля
! 317: !$response:charset
! 318: кодировка клиента т.е. та,
! 319: 1) из которой будут перекодированы $form:поля после забирания из browser'а
! 320: 2) в которую документ будет перекодирован перед отдаванием в browser
! 321: 3) в которую будет перекодирован текст языка uri
! 322: не добавляет к content-type ничего, если хочется, это надо сделать вручную
! 323: ПРЕДУПРЕЖДЕНИЕ: класс form получает свои поля после обработки всех auto класса MAIN
! 324: поэтому необходимо задать $request/response:charset в одном из них. не после.
! 325:
! 326: !hashfile
! 327: !^hashfile::open[$DB_HOME;filename]
! 328: !^hashfile.clear[]
! 329: забыть всё
! 330: !.ключ[значение] положить значение навечно
! 331: !.ключ[$.value[значение] $.expires(секунд)} положить значение на expires секунд
! 332: !.ключ достать
! 333: !^cache[ключ](секунд){код}
! 334: !суть то же, что и "положить+достать", но за один раз и компактнее
! 335: !если 0секунд, значит не кэшировать, а старый такой стереть
! 336: !внутри {кода} может быть вызван ^delete[]
! 337: !^delete[[ключ]] удалить ключ
! 338: !буде вызван без параметра изнутри cache, отменяет кэширование блока:
! 339: !блок не будет скэширован, его старое значение будет стёрто
! 340: !^hash[]
! 341: преобразовать в обычный hash
! 342: !^foreach[key|value]{тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}]
! 343:
! 344:
! 345: примеры:
! 346: $uids[^hashfile::assign[/db/uids]]
! 347: $code:clear[/db/cache]]
! 348: $code[^hashfile::assign[/db/cache]]
! 349:
! 350: $random[23847387taduigh345XGHWElxjgdjg]
! 351: $uids.$random[$.value[$uid] $.expires(60*30)]
! 352: $uid[$persistent.logins.$random]
! 353:
! 354: ^code.cache[заголовки новостей](35){....}
! 355:
! 356: !mail
! 357: !:send[$.header-field[] $.charset[кодировка письма] $.body[когда body не строка,
! 358: а hash, отсылается multipart письмо]]
! 359: !если charset указан, письмо перекодируется в этот charset
! 360: !content-type.charset не влияет на перекодирование
! 361: !если body указан строкой, то это текст письма, никаких вложений.
! 362: !если body указан hash, то это части, будут собраны текстовые блоки, затем вложения
! 363: !если имя части начинается со слова text, то это текстовый блок.
! 364: !если имя части начинается со слова attach, то это вложение, формат задания::
! 365: !$attach[$.format[!uue|Xbase64] $.value[DATA] $.file-name[user-file-name]]
! 366: !после имени части может идти целое число, части пойдут в порядке чисел.
! 367: !важно: при multipart не указывать content-type
! 368: ^mail:send[
! 369: # по-умолчанию, совпадает с source encoding.
! 370: # задаёт кодировку body
! 371: $.charset[windows-1251]
! 372: # нет умолчания
! 373: $.content-type[$.value[text/plain] $.charset[windows-1251]]
! 374: $.from["вася" <vasya@design.ru>]
! 375: $.to["петя" <petya@design.ru>]
! 376: $.subject[пойдём пивка]
! 377: $.body[
! 378: слова
! 379: ]
! 380: ]
! 381: ^mail:send[
! 382: $.from["вася" <vasya@design.ru>]
! 383: $.to["петя" <petya@design.ru>]
! 384: $.subject[пойдём пивка]
! 385: $.body[
! 386: $.text[
! 387: # задаёт кодировку body
! 388: $.charset[windows-1251]
! 389: # нет умолчания
! 390: $.content-type[$.value[text/plain] $.charset[windows-1251]]
! 391: $.body[слова]
! 392: ]
! 393: #для удобства скриптования можно указать только одну часть, при этом не будет multipart
! 394: $.attach[
! 395: $.value[^file::load[my beloved.doc]]
! 396: $.file-name[мой любимый.doc]
! 397: ]
! 398: $.attach2[
! 399: $.value[^file::load[my beloved.doc]]
! 400: $.file-name[мой любимый.doc]
! 401: ]
! 402: ]
! 403: ]
! 404:
! 405: !image
! 406: !$картинка[^image::measure[DATA]]
! 407: смотрит на .ext case insensitive,
! 408: умеет мерить пока только .gif и .jpg .jpeg
! 409: !$картинка.src .width .height
! 410: !$картинка.line-width число=ширина линий
! 411: !$картинка.line-style строка=стиль линий '*** * '='*** * *** * *** * '
! 412: !^картинка.html[[hash]] = <img ...>
! 413: !^image::load[фон.gif]
! 414: только gif пока
! 415: !^image::create(размер X;размер Y[;цвет фона default белый]])
! 416: !^картинка.line(x0;y0;x1;y1;0xffFFff)
! 417: !^картинка.fill(x;y;0xffFFff)
! 418: !^картинка.rectangle(x0;y0;x1;y1;0xffFFff)
! 419: !^картинка.bar(x0;y0;x1;y1;0xffFFff)
! 420: !^картинка.replace(hex-цвет1;hex-цвет2)[table x:y вершины_многоугольника]
! 421: !^картинка.polyline+(цвет)[table x:y точки]
! 422: !^картинка.polygon(цвет)[table x:y вершины_многоугольника]
! 423: !^картинка.polybar(цвет)[table x;y вершины_многоугольника]
! 424: !^картинка.font[набор_букв;имя_файла_шрифта.gif](ширина_пробела[;ширина_символа])
! 425: высота символа = высота картинки/количество букв в наборе
! 426: если указана ширина_символа, то monospaced, если 0, то ширина_символа = ширине gif
! 427: !^картинка.text(x;y)[текст_надписи] AS_IS
! 428: !^картинка.length[текст_надписи] AS_IS
! 429: !^картинка.gif[] -- кодирует в FILE с content-type=image/gif
! 430: !^картинка.arc(center x;center y;width;height;start in degrees;end in degrees;color)
! 431: !^картинка.sector(center x;center y;width;height;start in degrees;end in degrees;color)
! 432: !^картинка.circle(center x;center y;r;color)
! 433: !^картинка.copy[source](src x;src y;src w;src h;dst x;dst y[;dest w[;dest h[;tolerance]]])
! 434: при заданных dest_w/dest_h делает изменение размера кусочка
! 435: при уменьшении делает resample
! 436: годится только для уменьшения простой[малоцветной] дребедени вроде графиков/pie,
! 437: для thumbnais не годится.
! 438: при не указанном dest_h сохраняет aspect ratio
! 439: tolerance - некое число[квадрат расстояния в RGB пространстве до искомого цвета],
! 440: определяющее прожорливость выделялки цветов из палитры [default=150]
! 441: меньше - точнее приближает цвета, но они быстро кончаются
! 442: больше - неточно приближает цвет, но бОльшей части хватит
! 443:
! 444: !file
! 445: !$файл_из_post.name
! 446: !$файл_из_post.size
! 447: !$файлtиз_post.text
! 448: !^файл.save[text|binary;имя файла]
! 449: !^file:delete[имя файла]
! 450: !^file:find[имя файла][{когда не нашли}]
! 451: !^file:list[путь[;шаблон]] = table с колонкой name
! 452: !^file::load[text|binary;!big.zip[;!domain_press_release_2001_03_01.zip]]
! 453: !$файл_который_был_loaded.size
! 454: !^file::stat[имя файла]
! 455: !$файл_который_был_stated.size !.adate !.mdate !.cdate
! 456: !^file::cgi[имя файла[;env hash[;1cmd[;2line[;3ar[;4g[;5s]]]]]]]
! 457: возвращённый заголовок рассыпается на $поля
! 458: $status
! 459: $stderr
! 460: !^file::exec[имя файла[;env hash[;1cmd[;2line[;3ar[;4g[;5s;...under win32 max 10 args]]]]]]]
! 461: !^file:move[старое имя файла;новое имя файла]
! 462: можно переименовывать и двигать каталоги[win32: но не через границу дисков]
! 463: каталоги для dest создаются с правами 775
! 464: каталог старого файла стирается, если после move он остаётся пуст
! 465: !^file:lock[имя файла]{код}
! 466: файл при необходимости создаётся
! 467: блокируется
! 468: выполняется код
! 469: разблокируется
! 470:
! 471: !math
! 472: !$math:PI
! 473: !^math:round floor ceiling
! 474: !^math:trunc frac
! 475: !^math:abs sign
! 476: !^math:exp log
! 477: !^math:sin asin cos acos tan atan
! 478: !^math:degrees radians
! 479: !^math:pow sqrt
! 480: !^math:random(ширина диапазона)
! 481:
! 482: !date
! 483: !время типа time можно использовать в выражениях, подставляет
! 484: количество дней с epoch [1 января 1970 (UTC)], дробное
! 485: !всё происходит в localtime,
! 486: !временная зона задаётся вне parser средствами OS
! 487: !^date::now[]
! 488: !^date::set(дней с epoch)
! 489: !^date::set(year;month;day[;hour[;minute[;second]]])
! 490: !$date.year month day hour minute second weekday read-only
! 491: !^date.roll[year|month|day](+/- 1) сдвигает дату
! 492: !^date.sql-string[] %Y-%m-%d %H:%M:%S
! 493: where published='$дата.sql-string[]'
! 494: !^date:calendar[rus|eng;год;месяц] выдаёт таблицу
! 495: !^date:calendar[rus|eng;год;месяц;день] выдаёт таблицу
! 496:
! 497: xdoc(xnode)
! 498: DOM1 attributes:
! 499: !readonly attribute DocumentType doctype
! 500: Xreadonly attribute DOMImplementation implementation
! 501: !readonly attribute Element documentElement
! 502:
! 503: DOM1 methods:
! 504: !Element createElement(in DOMString tagName)
! 505: !DocumentFragment createDocumentFragment()
! 506: !Text createTextNode(in DOMString data)
! 507: !Comment createComment(in DOMString data)
! 508: !CDATASection createCDATASection(in DOMString data)
! 509: !ProcessingInstruction createProcessingInstruction(in DOMString target,in DOMString data)
! 510: !Attr createAttribute(in DOMString name)
! 511: !EntityReference createEntityReference(in DOMString name)
! 512: !NodeList getElementsByTagName(in DOMString tagname)
! 513:
! 514: DOM2 some methods:
! 515: !^.getElementById[elementId] = xnode
! 516: The DOM implementation must have information that says which attributes are of type ID.
! 517: Attributes with the name "ID" are not of type ID unless so defined.
! 518: Implementations that do not know whether attributes are of type ID or not
! 519: are expected to return null.
! 520: !^.getElementsByTagNameNS[namespaceURI;localName] = array of nodes
! 521:
! 522: !кодировка строк и умолчание для $.encoding
! 523: !равно текущей кодировке выходной страницы,
! 524: $response:charset
! 525: ::sql{...}
! 526: !::set{<string/>}
! 527: !::create[qualifiedName]
! 528: !::load[file.xml]
! 529: !.transform[rules.xsl][[params hash]] выдаёт dom
! 530: шаблон кэшируется, кэш обновляется при изменении даты файла шаблона,
! 531: или изменении даты файла "имя шаблона.stamp"[проверка даты stamp приоритетнее]
! 532: <xsl:output
! 533: !method = "xml" | "html" | "text"
! 534: X| qname-but-not-ncname
! 535: !version = nmtoken
! 536: !encoding = string
! 537: !omit-xml-declaration = "yes" | "no"
! 538: !standalone = "yes" | "no"
! 539: X[передал, но xsltSaveResultTo не использовал его]doctype-public = string
! 540: Xесли начинается с "-//W3C//DTD XHTML" то будет выводить XHTML
! 541: X[передал, но xsltSaveResultTo не использовал его]doctype-system = string
! 542: !cdata-section-elements = qnames
! 543: !indent = "yes" | "no"
! 544: !media-type = string />
! 545:
! 546: !.string[output options]
! 547: !.save[file.xml;output options] с шапкой
! 548: !.file[output options] = file
! 549: output options идентичны атрибутам xsl:output
! 550: [исключение: игнорируется cdata-section-elements, нужно будет, сделаю]
! 551: выдаёт media-type при подстановке $response:body[сюда]
! 552:
! 553:
! 554: !xnode
! 555: DOM1 attributes:
! 556: !$node.nodeName
! 557: !$node.nodeValue
! 558: !$node.nodeType = int
! 559: ELEMENT_NODE = 1
! 560: ATTRIBUTE_NODE = 2
! 561: TEXT_NODE = 3
! 562: CDATA_SECTION_NODE = 4
! 563: ENTITY_REFERENCE_NODE = 5
! 564: ENTITY_NODE = 6
! 565: PROCESSING_INSTRUCTION_NODE = 7
! 566: COMMENT_NODE = 8
! 567: DOCUMENT_NODE = 9
! 568: DOCUMENT_TYPE_NODE = 10
! 569: DOCUMENT_FRAGMENT_NODE = 11
! 570: NOTATION_NODE = 12
! 571: $vasyaNode.type==$xnode:ELEMENT_NODE
! 572: !$node.parentNode
! 573: !$node.childNodes = array of nodes
! 574: !$node.firstChild
! 575: !$node.lastChild
! 576: !$node.previousSibling
! 577: !$node.nextSibling
! 578: !$node.ownerDocument = xdoc
! 579: !$element_node.attributes = hash of xnodes
! 580: !$element_node.tagName
! 581: !$attribute_node.specified = boolean
! 582: true if the attribute received its value explicitly in the XML document,
! 583: or if a value was assigned programatically with the setValue function.
! 584: false if the attribute value came from the default value declared in the document's DTD.
! 585: $text_node/cdata_node/comment_node.substringData
! 586: !$pi_node.target = target of this processing instruction
! 587: XML defines this as being the first token following the markup
! 588: that begins the processing instruction.
! 589: document_node.
! 590: readonly attribute DocumentType doctype
! 591: readonly attribute DOMImplementation implementation
! 592: readonly attribute Element documentElement
! 593: document_type_node.
! 594: !readonly attribute DOMString name
! 595: readonly attribute NamedNodeMap entities
! 596: readonly attribute NamedNodeMap notations
! 597: !notation_node.
! 598: !readonly attribute DOMString publicId
! 599: !readonly attribute DOMString systemId
! 600:
! 601: !DOM1 node methods:
! 602: !Node insertBefore(in Node newChild,in Node refChild)
! 603: !Node replaceChild(in Node newChild,in Node oldChild)
! 604: !Node removeChild(in Node oldChild)
! 605: !Node appendChild(in Node newChild)
! 606: !boolean hasChildNodes()
! 607: !Node cloneNode(in boolean deep)
! 608:
! 609: !DOM1 element methods:
! 610: !DOMString getAttribute(in DOMString name)
! 611: !void setAttribute(in DOMString name, in DOMString value) raises(DOMException)
! 612: !void removeAttribute(in DOMString name) raises(DOMException)
! 613: !Attr getAttributeNode(in DOMString name)
! 614: !Attr setAttributeNode(in Attr newAttr) raises(DOMException)
! 615: !/*Attr*/ removeAttributeNode(in Attr oldAttr) raises(DOMException)
! 616: !NodeList getElementsByTagName(in DOMString name)
! 617: !void normalize()
! 618:
! 619:
! 620: !Introduced in DOM Level 2:
! 621: !Node importNode(in Node importedNode, in boolean deep) raises(DOMException)
! 622:
! 623:
! 624: !XPath:
! 625: !^node.select[xpath/query/expression] = array of nodes,
! 626: empty array if nothing found
! 627: !^node.selectSingle[xpath/query/expression] = first node if any
! 628: !^node.selectBool[xpath/query/expression] = bool if any
! 629: !^node.selectNumber[xpath/query/expression] = double if any
! 630: !^node.selectString[xpath/query/expression] = string if any
! 631:
! 632: !error codes(пока придут как текст в случае соответствующих ошибок):
! 633: INDEX_SIZE_ERR
! 634: If index or size is negative, or greater
! 635: than the allowed value
! 636: DOMSTRING_SIZE_ERR
! 637: If the specified range of text does not
! 638: fit into a DOMString
! 639: HIERARCHY_REQUEST_ERR
! 640: If any node is inserted somewhere it
! 641: doesn't belong
! 642: WRONG_DOCUMENT_ERR
! 643: If a node is used in a different
! 644: document than the one that created it
! 645: (that doesn't support it)
! 646: INVALID_CHARACTER_ERR
! 647: If an invalid character is specified,
! 648: such as in a name.
! 649: NO_DATA_ALLOWED_ERR
! 650: If data is specified for a node which
! 651: does not support data
! 652: NO_MODIFICATION_ALLOWED_ERR
! 653: If an attempt is made to modify an
! 654: object where modifications are not
! 655: allowed
! 656: NOT_FOUND_ERR
! 657: If an attempt was made to reference a
! 658: node in a context where it does not
! 659: exist
! 660: NOT_SUPPORTED_ERR
! 661: If the implementation does not support
! 662: the type of object requested
! 663: INUSE_ATTRIBUTE_ERR
! 664: If an attempt is made to add an
! 665: attribute that is already inuse
! 666: elsewhere
! 667:
! 668: !status
! 669: !чтобы класс был доступен, в apache нужно сказать
! 670: <Location /parser-status.html>
! 671: ParserStatusAllowed
! 672: </Location>
! 673: !в cgi доступен везде
! 674: !в isapi не доступен нигде
! 675:
! 676: !$status:sql hash
! 677: !cache table
! 678: url time
! 679: url time
! 680: url time
! 681: !$status:db hash
! 682: !cache hash db_home=>tables table
! 683: name time users
! 684: name time users
! 685: name time users
! 686: !$status:stylesheet
! 687: !cache table
! 688: file time
! 689: file time
! 690: file time
! 691: !$status:charset hash
! 692: !cache table
! 693: file
! 694: file
! 695: file
! 696:
! 697: !MAIN
! 698: это класс, загружаемый на автомате из parser3.conf,
! 699: кучи auto.p и запрашиваемого документа:
! 700: !parser3.conf
! 701: cgi:
! 702: 1) configure sysconfdir|windows directory
! 703: 2)рядом с бинарником parser'а
! 704: isapi: windows directory
! 705: apache module:
! 706: 1) ParserRootConfig [httpd.conf only]
! 707: 2) ParserSiteConfig [can be in .htaccess]
! 708: !auto.p вниз от DOCUMENT_ROOT/ по дереву до каталога с обрабатываемым файлом включительно
! 709: класс собирается из всех этих файлов, последующие становятся родителями предыдущих
! 710: имя последнего загруженного MAIN, имён у предыдущих нет
! 711:
! 712: !после загрузки MAIN класса вызывается его @main[]
! 713: !результат которого передаётся в его @post-process[data] if($data is string) ...
! 714: !результат которого отдаётся пользователю
! 715:
! 716: !если встречается ошибка, её можно красиво сообщить пользователю,
! 717: !определив
! 718: !@exception[origin;source;comment;type;code;stack]
! 719: !origin файл(строка) где случилась проблема
! 720: !source строка, из-за которой случилась проблема
! 721: !comment комментарий english
! 722: !type строка "тип проблемы" (пока пусто)
! 723: !code строка "код проблемы" (пока пусто)
! 724: !stack табличка из колонок origin name,
! 725: там лежат в обратном порядке имена[name] и места вызовов[origin]
! 726: операторов/методов, приведших к ошибке.
! 727:
! 728: !нужно выключить русский apache: CharsetDisable on
! 729:
! 730:
! 731: !DATA::=string | file
! 732:
! 733: ---
! 734: если в MAIN будет определён флаг $ORIGINS(1) то вместо обычного вывода страницы будет
! 735: выдан список фрагментов результата с указанием их происхождения
E-mail: