|
|
| version 1.249, 2017/02/08 19:14:51 | version 1.251, 2017/02/15 23:45:14 |
|---|---|
| Line 1 | Line 1 |
| !сделано | |
| Xне сделано, видимо, не будет сделано | |
| без значка - будет сделано | |
| операторы | операторы |
| !^eval(выражение)[формат] выражение, кроме обычных функций:: | ^eval(выражение)[формат] выражение, кроме обычных функций: |
| !допустимы #комментарии | допустимы #комментарии |
| работают до конца строки или закрывающейся круглой скобки | работают до конца строки или закрывающейся круглой скобки |
| внутри комментария допустимы вложенные круглые скобки | внутри комментария допустимы вложенные круглые скобки |
| !из неочевидных операторов: | из неочевидных операторов: |
| !| побитный xor | | побитный xor |
| !|| логический xor | || логический xor |
| ~ побитное отрицание | ~ побитное отрицание |
| \ целочисленное деление 10\3=3 | \ целочисленное деление 10\3=3 |
| !def для проверки defined, | def для проверки defined, |
| пустая строка не defined | пустая строка не defined |
| пустая таблица не defined | пустая таблица не defined |
| пустой hash не defined | пустой hash не defined |
| ^if(method $hash.delete){yes} | eq ne lt gt le ge для сравнения строк, |
| !eq ne lt gt le ge для сравнения строк, | in "/dir/" для проверки, находится ли текущий документ в каталоге |
| !in "/dir/" для проверки | ["внутри не допустимы выражения, если надо сравнить со сложным, |
| ["внутри не допустимы, если надо сравнить со сложным, | пусть это будет переменная] |
| пусть это будет переменная]. | is 'type' для проверки типа левого операнда, |
| !is 'type' для проверки типа левого операнда, | можно проверить, "не hash ли параметр метода?" |
| скажем, можно проверить, "не hash ли параметр метода?" | -f для проверки существования файла на диске, |
| !-f для проверки существования файла на диске, | -d для проверки существования каталога на диске, |
| !-d для проверки существования каталога на диске, | строка в кавычках или апострофах - строка, без кавычек или апострофов строка до |
| !строка в кавычках|апострофах - строка, без кавычек|апострофов строка до | |
| ближайшего whitespace | ближайшего whitespace |
| !числовой литерал бывает 0xABC | числовой литерал бывает 0xABC |
| !приоритеты: | приоритеты: |
| /* logical */ | /* logical */ |
| %left "!||" | %left "!||" |
| %left "||" | %left "||" |
| %left "&&" | %left "&&" |
| %left '<' '>' "<=" ">=" "lt" "gt" "le" "ge" | %left '<' '>' "<=" ">=" "lt" "gt" "le" "ge" |
| %left "==" "!=" "eq" "ne" | %left "==" "!=" "eq" "ne" |
| %left "is" "def" "in" "-f" "-d" | %left "is" "def" "in" "-f" "-d" |
| %left '!' | %left '!' |
| условие ? когдаДа: когдаНет | |
| /* bitwise */ | /* bitwise */ |
| %left '!|' | %left '!|' |
| %left '|' | %left '|' |
| %left '&' | %left '&' |
| %left '~' | %left '~' |
| /* numerical */ | /* numerical */ |
| %left '-' '+' | %left '-' '+' |
| %left '*' '/' '%' '\\' | %left '*' '/' '%' '\\' |
| %left NEG /* negation: unary - */ | %left '~' /* negation: unary */ |
| !литералы | литералы |
| true | true |
| false | false |
| ^if(условие){когда да}{когда нет} | |
| !^if(условие){когда да}{когда нет} | ^if(условие1){да}[(условие2){да}[(условие2){да}[...]]]{нет} -- количество доп. условий не ограничено (в общем elseif это :) |
| !^if(условие1){да}[(условие2){да}[(условие2){да}[...]]]{нет} -- количество доп. условий не ограничено (в общем elseif это :) | |
| !^switch[значение]{^case[вариант1[;вариант2...]]{действие}^case[DEFAULT]{действие по умолчанию}} | ^switch[значение]{^case[вариант1[;вариант2...]]{действие}^case[DEFAULT]{действие по умолчанию}} |
| !^while(условие){тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}] | |
| !^for[i](0;4){тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}] | ^while(условие){тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}] |
| !^use[модуль] | |
| !^try{ | ^for[i](0;4){тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}] |
| ^try{ | |
| ... | ... |
| !^throw[sql.connect[;вася[;болван]]] // был ^error[текст] | ^throw[sql.connect[;вася[;болван]]] // был ^error[текст] |
| !^throw[ | ^throw[ |
| $.type[sql.connect] | $.type[sql.connect] |
| $.source[вася] | $.source[вася] |
| $.comment[болван] | $.comment[болван] |
| ] | ] |
| ... | ... |
| }{ | }{ |
| Line 75 Xне сделано, видимо, не | Line 70 Xне сделано, видимо, не |
| $exception.handled(1|true) ^rem{флаг, что exception обработан} | $exception.handled(1|true) ^rem{флаг, что exception обработан} |
| .... | .... |
| } | } |
| ^switch[$exception.type]{ | ^switch[$exception.type]{ |
| ^case[sql;mail]{ | ^case[sql;mail]{ |
| $exception.handled(1) | $exception.handled(1) |
| Line 91 Xне сделано, видимо, не | Line 85 Xне сделано, видимо, не |
| } | } |
| } | } |
| } | } |
| !^break[] + - обрывает цикл | |
| !^continue[] + - обрывает итерацию цикла | ^break[] - обрывает цикл |
| !^untaint[[as-is|file-spec|uri|http-header|mail-header|sql|js|json|parser-code|regex|xml|html|optimized-[as-is|xml|html]]]{код} | ^break(true|false) - обрывает цикл, если true |
| ^continue[] - обрывает итерацию цикла | |
| ^continue(true|false) - обрывает итерацию цикла, если true | |
| ^return[] - обрывает выполнение метода | |
| ^return[value] - присваивает $result значение value и обрывает выполнение метода | |
| ^untaint[[as-is|file-spec|uri|http-header|mail-header|sql|js|json|parser-code|regex|xml|html|optimized-[as-is|xml|html]]]{код} | |
| default as-is | default as-is |
| !^taint[[lang]][код] | |
| ^taint[[lang]][код] | |
| default "just tainted, language unknown" | default "just tainted, language unknown" |
| !^process[[$caller.CLASS|$object|$КЛАСС:CLASS]]{строка, которая будет process-ed, как код}[ | |
| ^apply-taint[[lang;]текст] | |
| выполняет заданные в строке преобразования, неопределенно грязное как lang, на выходе чистая строка | |
| ^process[[$caller.CLASS|$object|$КЛАСС:CLASS]]{строка, которая будет process-ed, как код}[ | |
| $.main[во что переименовать @main] | $.main[во что переименовать @main] |
| $.file[имя файла из которого, якобы, данный текст] | $.file[имя файла из которого, якобы, данный текст] |
| $.lineno(номер строки в файле, откуда данный текст. можно отрицательный) | $.lineno(номер строки в файле, откуда данный текст. можно отрицательный) |
| ] | ] |
| !^process..[путь][во что переименовать @main] | ^process..[путь][во что переименовать @main] |
| по умолчанию, методы компилируются в $self [в случае оператора, $self=$MAIN:CLASS] | по умолчанию, методы компилируются в $self [в случае оператора, $self=$MAIN:CLASS] |
| !^connect[protocol://строка соединения]]{код с ^sql[...]-ями} | |
| !mysql://user:pass@{host[:port]|[/unix/socket]}/database? | ^connect[protocol://строка соединения]]{код с ^sql[...]-ями} |
| mysql://user:pass@{host[:port]|[/unix/socket]}/database? | |
| ClientCharset=parser-charset << charset in which parser thinks client works | ClientCharset=parser-charset << charset in which parser thinks client works |
| charset=UTF-8& | charset=UTF-8& |
| timeout=3& | timeout=3& |
| Line 115 Xне сделано, видимо, не | Line 123 Xне сделано, видимо, не |
| autocommit=1 | autocommit=1 |
| autocommit если выставить в 0, будет делать commit/rollback | autocommit если выставить в 0, будет делать commit/rollback |
| !pgsql://user:pass@{host[:port]|[local]}/database? | pgsql://user:pass@{host[:port]|[local]}/database? |
| client_encoding=win,[to-find-out] | client_encoding=win,[to-find-out] |
| &datestyle=ISO,SQL,Postgres,European,NonEuropean=US,German,DEFAULT=ISO | &datestyle=ISO,SQL,Postgres,European,NonEuropean=US,German,DEFAULT=ISO |
| &ClientCharset=parser-charset << charset in which parser thinks client works | &ClientCharset=parser-charset << charset in which parser thinks client works |
| !oracle://user:pass@service? | oracle://user:pass@service? |
| NLS_LANG=RUSSIAN_AMERICA.CL8MSWIN1251& | NLS_LANG=RUSSIAN_AMERICA.CL8MSWIN1251& |
| NLS_LANGUAGE language-dependent conventions | NLS_LANGUAGE language-dependent conventions |
| NLS_TERRITORY territory-dependent conventions | NLS_TERRITORY territory-dependent conventions |
| Line 133 Xне сделано, видимо, не | Line 141 Xне сделано, видимо, не |
| ORA_ENCRYPT_LOGIN=TRUE | ORA_ENCRYPT_LOGIN=TRUE |
| ClientCharset=parser-charset << charset in which parser thinks client works | ClientCharset=parser-charset << charset in which parser thinks client works |
| !odbc://DSN=dsn^;UID=user^;PWD=password^;ClientCharset=parser-charset | odbc://DSN=dsn^;UID=user^;PWD=password^;ClientCharset=parser-charset |
| ClientCharset << charset in which parser thinks client works | ClientCharset << charset in which parser thinks client works |
| !sqlite://DBfile? | sqlite://DBfile? |
| ClientCharset=parser-charset& << charset in which parser thinks client works | ClientCharset=parser-charset& << charset in which parser thinks client works |
| autocommit=1 | autocommit=1 |
| Line 152 sqlite /www/parser3/libparser3sqlite.so | Line 160 sqlite /www/parser3/libparser3sqlite.so |
| odbc c:\drives\y\parser3project\odbc\debug\parser3odbc.dll | odbc c:\drives\y\parser3project\odbc\debug\parser3odbc.dll |
| }] | }] |
| ] | ] |
| !в таблице у oracle в столбце клиентской библиотеки | в таблице у oracle в столбце клиентской библиотеки |
| допустимо задать environment параметры инициализации(если они не заданы иначе заранее), | допустимо задать environment параметры инициализации(если они не заданы иначе заранее), |
| допустимы имена, начинающиеся на NLS_ ORA_ и ORACLE_, или оканчивающиеся на + | допустимы имена, начинающиеся на NLS_ ORA_ и ORACLE_, или оканчивающиеся на + |
| под win32 | под win32 |
| Line 169 odbc c:\drives\y\parser3project\odbc\deb | Line 177 odbc c:\drives\y\parser3project\odbc\deb |
| ВНИМАНИЕ: при работе с большими текстовыми блоками в oracle&pgsql[а лучше всегда], | ВНИМАНИЕ: при работе с большими текстовыми блоками в oracle&pgsql[а лучше всегда], |
| ставить такой префикс перед открывающим апострофом, впритык, везде без проблелов | ставить такой префикс перед открывающим апострофом, впритык, везде без проблелов |
| /**имя_поля**/'literal' | /**имя_поля**/'literal' |
| !^rem{} | |
| !^cache[файл](секунд){код}[{catch код}] | ^rem{} |
| !относительное задание времени | комментарий, удаляется при компиляции |
| !скэшировать строку, которая получается при выполнении кода на 'секунд' секунд | |
| !если 0секунд, значит не кэшировать, а старый такой стереть | ^cache[файл](секунд){код}[{catch код}] |
| !в catch коде $exception.handled[cache] ^rem{флаг, что exception обработан} | относительное задание времени |
| !^cache[файл][expires date]{код}[{catch код}] | скешировать строку, которая получается при выполнении кода на 'секунд' секунд |
| !абсолютное задание времени | если 0 секунд, значит не кешировать, а старый такой стереть |
| !^cache[файл] удалить файл [не ругает, если его нет] | в catch коде $exception.handled[cache] ^rem{флаг, что exception обработан} |
| !^cache(секунд) | ^cache[файл][expires date]{код}[{catch код}] |
| !^cache[expires date] | абсолютное задание времени |
| !сигнализирует вышестоящему ^cache "уменьши до стольких-то 'секунд'/'expires'" | ^cache[файл] удалить файл [не ругает, если его нет] |
| !в пределе: ^cache(0) отменить кэширование | ^cache(секунд) |
| !^cache[] выдаёт текущую expires date | ^cache[expires date] |
| сигнализирует вышестоящему ^cache "уменьши до стольких-то 'секунд'/'expires'" | |
| !у всех методов есть локальная переменная $result, если в неё что положить, | в пределе: ^cache(0) отменить кеширование |
| !то _это_ будет результатом макроса, а не его тело | ^cache[] выдаёт текущую expires date |
| !у всех методов есть локальная переменная $caller, в ней лежит родительский stack frame, | |
| !если туда записать | у всех методов есть локальная переменная $result, если в неё что положить, |
| то это будет результатом метода, а не его тело | |
| !use(^use или @USE) ищет файл... | |
| !1. ...если путь начинается с /, то считается, что это путь от корня веб пространства | у всех методов есть локальная переменная $caller, в ней лежит родительский stack frame, |
| !есть глобальная строка/таблица $MAIN:CLASS_PATH с путём/путями к каталогу с классами. | можно записать в его локальную переменную |
| !корень путя/путей считается от корня веб пространства. | |
| !2. ...относительно строчки из table $MAIN:CLASS_PATH, снизу вверх | use(^use или @USE) ищет и подключает файл: |
| задавайте её в конфигурационном auto.p вашего сайта | 1. если путь начинается с /, то считается, что это путь от корня веб пространства |
| 2. относительно текущей директории. | |
| !глобальная табличка $CHARSETS[$.название[имя файла]] | 3. относительно строк из table $MAIN:CLASS_PATH, снизу вверх. |
| !задаёт какие буквы считаются какими(whitespace, letter, etc), а также их unicode | $MAIN:CLASS_PATH - глобальная строка или таблица с путём или путями к каталогу |
| !формат: tab delimited файл, с заголовком: | с классами (от корня веб пространства), задавайте её в конфигурационном auto.p |
| ! char white-space digit hex-digit letter word lowercase unicode1 unicode2 | |
| ! A x x x a 0x0041 0xFF21 | глобальная табличка $CHARSETS[$.название[имя файла]] |
| ! где char и lowercase могут быть буквами, а могут быть и 0xКОДАМИ | задаёт какие буквы считаются какими(whitespace, letter, etc), а также их unicode |
| ! если символ имеет единственное unicode представление, равное самому символу, | формат: tab delimited файл, с заголовком: |
| ! можно не указывать unicode | char white-space digit hex-digit letter word lowercase unicode1 unicode2 |
| !всегда есть кодировка UTF-8, | A x x x a 0x0041 0xFF21 |
| !она является кодировкой по-умолчанию для request и response | где char и lowercase могут быть буквами, а могут быть и 0xКОДАМИ |
| !ВНИМАНИЕ: имя кодировки case sensitive | если символ имеет единственное unicode представление, равное самому символу, можно не указывать unicode |
| всегда есть кодировка UTF-8, она является кодировкой по-умолчанию для request и response | |
| ВНИМАНИЕ: имя кодировки case insensitive | |
| синтаксис | синтаксис |
| !$имя[новое значение] | $имя[новое значение] |
| !$имя(математическое выражение нового значения) | $имя(математическое выражение нового значения) |
| !$имя{код нового значения} | $имя{код нового значения} |
| !$имя whitespace или ${имя}неважно подстановка значения | $имя whitespace или ${имя}неважно подстановка значения |
| !^имя параметры вызов | ^имя параметры вызов |
| !$имя.CLASS класс значения | $имя.CLASS класс значения |
| !$имя.CLASS_NAME имя класса | $имя.CLASS_NAME имя класса |
| !$имя[$.key[] () {}] конструктор элемента переменной-хэша $имя.key | $имя[$.key[] () {}] конструктор элемента переменной-хэша $имя.key |
| !^method[$.key[] () {}] конструктор элемента параметра-хеша $parameter.key | ^method[$.key[] () {}] конструктор элемента параметра-хеша $parameter.key |
| $CLASS.имя обращение к переменной класса | $CLASS.имя обращение к переменной класса |
| имя заканчивается перед: пробел tab linefeed ; ] } ) " < > + * / % & | = ! ' , ? {уточнить} | имя заканчивается перед: пробел tab linefeed ; ] } ) " < > + * / % & | = ! ' , ? {уточнить} |
| т.е. можно | т.е. можно $имя,aaaa |
| $имя,aaaa | но если нужно после имени букву, скажем -, то ${имя}- |
| но если нужно после имени букву, скажем -, то | |
| ${имя}- | |
| в выражениях + и - являются дополнительными концами имени | в выражениях + и - являются дополнительными концами имени |
| !можно обращаться к составным объектам так: $name.subname | |
| !где subname бывает: | можно обращаться к составным объектам так: $name.subname где subname бывает: |
| ! строка | строка |
| ! $переменная | $переменная |
| ! строка$переменная | строка$переменная |
| ! [код, вычисляющий строку] | [код, вычисляющий строку] |
| например: $хэш[$.возраст(88)] $достать[$.поле[возраст]] ^хэш.[$достать.поле].format{%05d} | например: $хэш[$.возраст(88)] $достать[$.поле[возраст]] ^хэш.[$достать.поле].format{%05d} |
| параметры:=один или много параметров | параметры := один или много параметров |
| параметр:= | параметр := |
| !(математическое выражение) вычисляется много раз внутри вызова, | (математическое выражение) вычисляется много раз внутри вызова, |
| | ![код] вычисляется один раз перед вызовом, | | [код] вычисляется один раз перед вызовом, |
| | !{код} вычисляется 0 или много раз внутри вызова, | | {код} вычисляется 0 или много раз внутри вызова, |
| !везде допустимы ; внутри - делает много параметров в одних скобках | везде допустимы ; внутри - делает много параметров в одних скобках |
| void | |
| !void | доступны все методы, присутствующие у объекта класса string, результат как у пустой строки |
| !доступны все методы, присутствующие у объекта класса string, результат как у пустой строки | ^void:sql{запрос без результата}{$.bind[см. table::sql]} |
| !^void:sql{запрос без результата}{$.bind[см. table::sql]} | |
| int,double | |
| ^имя.int[] целочисленное значение | |
| !int,double | ^имя.double[] double значение |
| !^имя.int[] целочисленное значение | ^имя.bool[] .bool(true|false) bool значение |
| !^имя.double[]+ double значение | ^имя.inc(на сколько +) |
| !^имя.bool[] + .bool(true|false) bool значение | ^имя.dec(на сколько -) |
| !^имя.inc(на сколько +) | ^имя.mul(на сколько *) |
| !^имя.dec(на сколько -) | ^имя.div(на сколько /) |
| !^имя.mul(на сколько *) | ^имя.mod(на сколько %) |
| !^имя.div(на сколько /) | ^имя.format[формат] |
| !^имя.mod(на сколько %) | ^int/double:sql{query}[[$.limit(2) $.offset(4) $.default{0} $.bind[см. table::sql]]] |
| !^имя.format[формат] | |
| !^int/double:sql{query}[[$.limit(2) $.offset(4) $.default{0} $.bind[см. table::sql]]] | |
| запрос, результат которого должен быть один столбец/одна строка | запрос, результат которого должен быть один столбец/одна строка |
| !string | string |
| !в выражении | в выражении |
| !def значение равно "не пуста?" | def значение равно "не пуста?" |
| !логическое/числовое значение равно попытке преобразовывания к double, | логическое/числовое значение равно попытке преобразовывания к double, |
| пустая строка тихо преобразуется к 0 | пустая строка тихо преобразуется к 0 |
| пример: | пример: |
| ^if(def $form:name) не пуста? | ^if(def $form:name) не пуста? |
| ^if($user.isAlive) истина? [автопреобразование к числу, не ноль?] | ^if($user.isAlive) истина? [автопреобразование к числу, не ноль?] |
| !^string:sql{query}[[$.limit(1) $.offset(4) $.default{n/a} $.bind[см. table::sql]]] | |
| ^string:sql{query}[[$.limit(1) $.offset(4) $.default{n/a} $.bind[см. table::sql]]] | |
| результат запроса должен быть один столбец/одна строка | результат запроса должен быть один столбец/одна строка |
| !^строка.int[] .int(default) целочисленное значение строки. | |
| ^строка.int[] .int(default) целочисленное значение строки. | |
| если ломается преобразование, берётся default | |
| ^строка.double[] .double(default) double значение строки | |
| если ломается преобразование, берётся default | если ломается преобразование, берётся default |
| !^строка.double[]+ .double(default) double значение строки | |
| !^строка.bool[] + .bool(default) bool значение строки | ^строка.bool[] .bool(default) bool значение строки |
| если ломается преобразование, берётся default | если ломается преобразование, берётся default |
| !^строка.format[формат] %d %.2f %02d... | |
| !^строка.match[шаблон-строка|шаблон-regex][[опции поиска]] $prematch $match $postmatch $1 $2... | ^строка.format[формат] %d %.2f %02d... |
| ^строка.match[шаблон-строка|шаблон-regex][[опции поиска]] $prematch $match $postmatch $1 $2... | |
| опции поиска= | опции поиска= |
| i CASELESS | i CASELESS |
| x whitespace in regex ignored | x whitespace in regex ignored |
| Line 287 odbc c:\drives\y\parser3project\odbc\deb | Line 300 odbc c:\drives\y\parser3project\odbc\deb |
| ' создавать столбцы prematch, match, postmatch | ' создавать столбцы prematch, match, postmatch |
| n вернуть цисло с количеством найденных совпадений, а не таблицу с результатами | n вернуть цисло с количеством найденных совпадений, а не таблицу с результатами |
| U инвертировать смысл модификатора '?' | U инвертировать смысл модификатора '?' |
| !^строка.match[шаблон-строка|шаблон-regex][опции поиска]{замена} | |
| ^строка.match[шаблон-строка|шаблон-regex][опции поиска]{замена} | |
| опции поиска+= | опции поиска+= |
| g заменить все вхождения, а не одно | g заменить все вхождения, а не одно |
| !^строка.split[разделитель][[lrhv]][[название столбца для вертикального разбиения]] | |
| ^строка.split[разделитель][[lrhv]][[название столбца для вертикального разбиения]] | |
| l слева направо [default] | l слева направо [default] |
| r справа налево | r справа налево |
| h nameless таблица с ключами 0, 1, 2, ... | h nameless таблица с ключами 0, 1, 2, ... |
| v таблица из 1 столбца 'piece' или как передадут [default] | v таблица из 1 столбца 'piece' или как передадут [default] |
| !^строка.{l|r}split[разделитель] таблица из столбца $piece | |
| ^строка.{l|r}split[разделитель] таблица из столбца $piece | |
| оставлен для совместимости | оставлен для совместимости |
| !^строка.upper|lower[] | |
| !^строка.length[] | ^строка.upper|lower[] |
| !^строка.mid(P[;N]) | |
| ^строка.length[] | |
| ^строка.mid(P[;N]) | |
| без N - "до конца строки" | без N - "до конца строки" |
| !^строка.left(N), -1 выдает всю строку | |
| !^строка.right(N) | ^строка.left(N), -1 выдает всю строку |
| !^строка.pos[подстрока] | |
| !^строка.pos[подстрока](позиция, с которой ищем) | ^строка.right(N) |
| ^строка.pos[подстрока] | |
| ^строка.pos[подстрока](позиция, с которой ищем) | |
| <0 = не найдено | <0 = не найдено |
| !^строка.replace[$таблица_подстановок_строка_на_строку] | |
| !^строка.replace[$что;$на-что] | ^строка.replace[$таблица_подстановок_строка_на_строку] |
| !^строка.save[[append;]путь] | |
| !^строка.save[путь[;$.charset[в какой кодировке сохраняем] $.append(true)]] | ^строка.replace[$что;$на-что] |
| !^строка.normalize[] выдает другую строку, в которой фрагменты на одном языке объединены | |
| полезно делать перед сложными match операциями, если вы знаете, что входная строка | ^строка.save[[append;]путь] |
| состоит из большого числа фрагментов | |
| !^строка.trim[start|both|end|left|right[;chars]] выкидывает chars из начала/конца/и начала и конца | ^строка.save[путь[;$.charset[в какой кодировке сохраняем] $.append(true)]] |
| ^строка.trim[start|both|end|left|right[;chars]] выкидывает chars из начала/конца/и начала и конца | |
| default 'chars' -- whitespace chars | default 'chars' -- whitespace chars |
| !^строка.trim[chars] выкидывает chars из начала и конца | |
| !^строка.base64[] encode | |
| !^string:base64[encoded[;$.strict(true)]] decode | |
| !^строка.idna[] IDNA кодирование, поддержка кириллических доменов | |
| !^string:idna[encoded] IDNA декодирование, поддержка кириллических доменов | |
| !^строка.js-escape[] кодирование для передачи в JS (%uXXXX) | |
| !^string:js-unescape[escaped] декодирование переданного из js | |
| !^string:unescape[js|uri;escaped; $.charset[] ] декодирование переданного из js или uri | |
| !table | ^строка.trim[chars] выкидывает chars из начала и конца |
| в выражении | |
| ^строка.base64[] encode | |
| ^string:base64[encoded[;$.strict(true)]] decode | |
| ^строка.idna[] | |
| IDNA кодирование, поддержка кириллических доменов | |
| ^string:idna[encoded] | |
| IDNA декодирование, поддержка кириллических доменов | |
| ^строка.js-escape[] кодирование для передачи в JS (%uXXXX) | |
| ^string:js-unescape[escaped] декодирование переданного из js | |
| ^string:unescape[js|uri;escaped; $.charset[] ] декодирование переданного из js или uri | |
| table | |
| в выражении | |
| логическое значение равно "не пуста?" | логическое значение равно "не пуста?" |
| числовое значение равно count[] | числовое значение равно count[] |
| !^table::create[[nameless]]{данные}[[$.separator[^#09]]] старое имя "set" | ^table::create[[nameless]]{данные}[[$.separator[^#09] $.encloser[]]] |
| !^table::create[table][[$.limit(1) $.offset(5) $.offset[cur] $.reverse(1)]] | ^table::create[table][[$.limit(1) $.offset(5) $.offset[cur] $.reverse(1)]] |
| клонирует таблицу | клонирует таблицу |
| reverse << сзаду на перёд (работает пока только в locate, в table::create НЕ работает) | reverse - в обратном порядке |
| !^table::load[[nameless;]путь[;опции]] | ^table::load[[nameless;]путь[;опции]] |
| !если не nameless, названия колонок берутся из первой строки | если не nameless, названия колонок берутся из первой строки |
| !пустые строки, и строки в первой колонке содержащие '#', игнорируются | пустые строки, и строки в первой колонке содержащие '#', игнорируются |
| !$.separator[^#09] | $.separator[^#09] |
| !$.encloser["] по-умолчанию, нет. | $.encloser["] по-умолчанию, нет. |
| !^table::sql{query}[[$.limit(2) $.offset(4) $.bind[hash] todo:$.default{ ^table::create[...] }]] | ^table::sql{query}[[$.limit(2) $.offset(4) $.bind[hash]]] |
| bind привязывает переменные в запросе к их значениям | bind привязывает переменные в запросе к их значениям |
| пока реализован только для oracle | пока реализован только для oracle |
| в запросе надо написать ":имя" | в запросе надо написать ":имя" |
| в параметре bind передать hash, из которого возьмётся(или куда запишется) значение | в параметре bind передать hash, из которого возьмётся (или куда запишется) значение |
| !^таблица.save[[nameless|append;]путь[;опции, см. load]] | ^таблица.save[[nameless|append;]путь[;опции, см. load]] |
| !$таблица.поле | $таблица.поле |
| !$таблица.поле[новое значение] | $таблица.поле[новое значение] |
| !$таблица.fields из named таблицы выдаёт текущую запись как Hash | $таблица.fields из named таблицы выдаёт текущую запись как Hash |
| !^таблица.menu{тело}[[разделитель]] | ^таблица.menu{тело}[[разделитель]] |
| !^таблица.offset[] печатает offset | ^таблица.foreach[позиция;значение]{тело}[[разделитель]] |
| !^таблица.offset[[whence]](5) сдвигает | ^таблица.line[] 1-based offset |
| !whence=cur|set | ^таблица.offset[] печатает offset |
| !без whence - это cur | ^таблица.offset[[whence]](5) сдвигает |
| !^таблица.count[], ^таблица.count[rows] - количество строк в таблице | whence=cur|set, без whence - это cur |
| !^таблица.count[columns] - количество столбцов таблицы | ^таблица.count[], ^таблица.count[rows] - количество строк в таблице |
| !^таблица.count[cells] - количество ячеек в текущей строке таблицы | ^таблица.count[columns] - количество столбцов таблицы |
| !^таблица.line[] 1-based offset | ^таблица.count[cells] - количество ячеек в текущей строке таблицы |
| !^таблица.sort{{ключеделатель строка}|(ключеделатель число)}[{desc|asc}] default=asc | ^таблица.sort{{ключеделатель строка}|(ключеделатель число)}[{desc|asc}] default=asc |
| !^таблица.append{данные} | ^таблица.append{данные} |
| !^таблица.append[ $.имя столбца[значение столбца] ] | ^таблица.append[ $.имя столбца[значение столбца] ] |
| !^таблица.insert{данные} добавить запись на текущую позицию | ^таблица.insert{данные} добавить запись на текущую позицию |
| !^таблица.insert[ $.имя столбца[значение столбца] ] | ^таблица.insert[ $.имя столбца[значение столбца] ] |
| !^таблица.delete[] - стирает запись с текущей позиции | ^таблица.delete[] - стирает запись с текущей позиции |
| !^таблица.join[таблица][$.limit(1) $.offset(5) $.offset[cur]] - добавляет записи из таблицы. | ^таблица.join[таблица][$.limit(1) $.offset(5) $.offset[cur]] - добавляет записи из таблицы. |
| таблицы должны иметь одинаковую структуру. | таблицы должны иметь одинаковую структуру. |
| !^таблица.flip[] выдаёт транспонированную, надо куда-то сложить, потом пользовать | ^таблица.flip[] выдаёт транспонированную, надо куда-то сложить, потом пользовать |
| !^таблица.locate[поле;значение][[$.limit(1) $.offset(5) $.offset[cur] $.reverse(1)]] | ^таблица.locate[поле;значение][[$.limit(1) $.offset(5) $.offset[cur] $.reverse(1)]] |
| передвигает текущую строку, если найдёт. выдаёт bool | передвигает текущую строку, если найдёт. выдаёт bool |
| !^таблица.locate(логическое выражение)[[$.limit(1) $.offset(5) $.offset[cur] $.reverse(1)]] | ^таблица.locate(логическое выражение)[[$.limit(1) $.offset(5) $.offset[cur] $.reverse(1)]] |
| передвигает текущую строку, если найдёт. выдаёт bool | передвигает текущую строку, если найдёт. выдаёт bool |
| !^таблица.hash{[поле]|{код}|(выражение)}[[поле значений|table поля значений]][[$.distinct(1) $.distinct[tables]]] | ^таблица.hash{[поле]|{код}|(выражение)}[[поле значений|table поля значений]{код значения}][[$.distinct(1) $.distinct[tables] $.type[hash]]] |
| значением $hash.ключ будет hash в котором поля значений будут ключами | по умолчанию значением $hash.ключ будет hash в котором поля значений будут ключами |
| поля значений могут быть не указаны, тогда ими будут все столбцы, включая ключевой | поля значений могут быть не указаны, тогда ими будут все столбцы, включая ключевой |
| если distinct содержит true, то не будет ошибки при повторяющихся ключах | если distinct содержит true, то не будет ошибки при повторяющихся ключах |
| если distinct содержит tables, то будет создан hash из таблиц, содержащих строки с ключом | если distinct содержит tables, то будет создан hash из таблиц, содержащих строки с ключом |
| !^таблица.columns[[название столбца]]+ таблица из одного столбца 'column' или как передадут | $.type[string/table] поменять значение элемента на строку (указать одну колонку) или таблицу |
| !$отобранное[^таблица.select(выражение)] = таблица из тех же столбцов и строк, у которых условие совпало | ^таблица.columns[[название столбца]] + таблица из одного столбца 'column' или как передадут |
| $отобранное[^таблица.select(выражение)] = таблица из тех же столбцов и строк, у которых условие совпало | |
| $adults[^man.select($man.age>=18)] | $adults[^man.select($man.age>=18)] |
| ^таблица.color[цвет1;цвет2] | ^таблица.color[цвет1;цвет2] |
| !hash | hash |
| !в выражении | в выражении |
| !логическое значение равно "не пуста?" | логическое значение равно "не пуст?", хеш с _default уже не пуст |
| !числовое значение равно _count[] | числовое значение равно count[] |
| !$хеш.ключ | $хеш.ключ |
| !_default - специальный ключ, если задан, | !_default - специальный ключ, если задан, |
| то при обращении по ключу, которому нет соответствия, выдаётся _default значение | то при обращении по ключу, которому нет соответствия, выдаётся _default значение |
| !$хеш.fields выдает $hash. чтобы класс hash был чуть больше похож на класс table | $хеш.fields выдает $hash. чтобы класс hash был чуть больше похож на класс table |
| !^hash::create[[!copy_from_hash|copy_from_hashfile]] | ^hash::create[[|copy_from_hash|copy_from_hashfile]] |
| создаёт новый hash, копию старого | создаёт новый hash, копию старого |
| !^хеш.add[слагаемое] | ^хеш.add[слагаемое] |
| перезаписывает одноимённые | перезаписывает одноимённые |
| !^хеш.sub[вычитаемое] | ^хеш.sub[вычитаемое] |
| !^хеш.union[b] = объединение | ^хеш.union[b] = объединение |
| одноимённые остаются | одноимённые остаются |
| !^хеш.intersection[b] = пересечение | ^хеш.intersection[b] = пересечение |
| значения хеш | значения хеш |
| !^хеш.intersects[b] = bool | ^хеш.intersects[b] = bool |
| !^hash::sql{запрос}[[$.distinct(1) $.limit(2) $.offset(4) todo:$.default{$.field[]...}]] | ^hash::sql{запрос}[[$.distinct(1) $.limit(2) $.offset(4) $.type[hash|string|table]]] |
| получается hash(ключи=значения первая колонка ответа) | получается hash(ключи=значения первая колонка ответа) of hash(ключи=названия остальных колонкок ответа) или |
| of hash(ключи=названия остальных колонкок ответа) | string=значение каждого элемента - строка, при надо указать ровно два столбца или |
| !^хеш.keys[[название колонки с ключами]]+ таблица из одного столбца key или как передадут | table=значение каждого элемента - таблица |
| !^хеш.count[] | ^хеш.keys[[название колонки с ключами]] + таблица из одного столбца key или как передадут |
| !^хеш.foreach[key;value]{тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}] | ^хеш.count[] |
| !^хеш.delete[ключ] удалить ключ | ^хеш.foreach[key;value]{тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}] |
| !^хеш.contain[ключ] - существует ли в хеше ключ (bool) | ^хеш.delete[ключ] удалить ключ |
| !^хэш.at[first|last][[key|value|hash]] | ^хеш.contain[ключ] - существует ли в хеше ключ (bool) |
| !^хэш.at([-]N)[[key|value|hash]] | ^хэш.at[first|last][[key|value|hash]] |
| ^хэш.at([-]N)[[key|value|hash]] | |
| доступ к заданным элементам упорядоченного хеша | доступ к заданным элементам упорядоченного хеша |
| !^хэш.sort[key;value]{{ключеделатель строка}|(ключеделатель число)}[[desc|asc]] default=asc | ^хэш.sort[key;value]{{ключеделатель строка}|(ключеделатель число)}[[desc|asc]] default=asc |
| !hashfile | !hashfile |
| !^hashfile::open[filename] | !^hashfile::open[filename] |
| Line 958 xdoc(xnode) | Line 994 xdoc(xnode) |
| $x[^xdoc::create[$f]] | $x[^xdoc::create[$f]] |
| !::load[file.xml[;опции]] | !::load[file.xml[;опции]] |
| !.transform[rules.xsl|xdoc][[params hash]] выдаёт dom | !.transform[rules.xsl|xdoc][[params hash]] выдаёт dom |
| шаблон кэшируется, кэш обновляется при изменении даты файла шаблона, | шаблон кешируется, кеш обновляется при изменении даты файла шаблона, |
| или изменении даты файла "имя шаблона.stamp"[проверка даты stamp приоритетнее] | или изменении даты файла "имя шаблона.stamp"[проверка даты stamp приоритетнее] |
| <xsl:output | <xsl:output |
| !method = "xml" | "html" | "text" | !method = "xml" | "html" | "text" |
| Line 1270 DATA::=string | file | hash | Line 1306 DATA::=string | file | hash |
| !http.status ^file::load[http://ok/there] host found, connection accepted, status!=200 | !http.status ^file::load[http://ok/there] host found, connection accepted, status!=200 |
| !date.range ^date::create(1950;1;1) date out of valid range | !date.range ^date::create(1950;1;1) date out of valid range |
| !если в MAIN определён $SIGPIPE(1) то в случае, если обработка была прервана пользователем, сообщение | если в MAIN определён $SIGPIPE(1) то в случае, если обработка была прервана пользователем, сообщение |
| об этом будет записано в parser3.log (раньше оно всегда писалось) | об этом будет записано в parser3.log (раньше оно всегда писалось) |
| !если описание метода содержит локальную переменную result в явном виде | если описание метода содержит локальную переменную result в явном виде |
| (есть и неявная переменная) | (есть и неявная переменная) |
| то код вывода строковых литералов не попадает в конечный байт-код, | то код вывода пробельных литералов не попадает в конечный байт-код. |
| а непробельные символы считаются синтаксической ошибкой | |
| для вывода чего бы то ни было надо пользоваться этой переменной | |