|
|
|
еще вариант на тему:
# Вначале два макроса, которые не нужны, если парсер знает комманды ^length и ^mid...
############################################################
@length[string]
^var[temp_length;$string]^var[temp_i;0]^var[exit;0]^while[exit<1;^ifdef[^match[.{^var[temp_i]};;^var[temp_length]];^var[temp_i;+;1];^var[exit;1]^var[temp_i;-;1]]]^var[temp_i]
@end
############################################################
@substr[string;first;numbers]
^var[temp_substr;$string]^context[temp_substr;^match[(.{^eval[$first-1]})(.{$numbers});;^var[temp_substr]]^item[temp_substr;\2]]
@end
# это в общем к делу не относится, просто юзать ЭТО удобнее, чем писать все в одну строчку :)
############################################################
# обрезаем все пробельные символы в начале и в конце строки
@trim[source]
^level[none;^match[\s+$$;;;^match[^^\s+;;;$source]]]
@end
@translit[txt]
^macro[trim;^context[translit;
# эту загрузку данных в контекст тоже надо отсюда убрать в @autoexec
^load[named;translit.cfg]
^for[translit_i;1;^macro[length;$txt];
^var[translit_cur;^macro[substr;$txt;^var[translit_i];1]]
^ifdef[^match[[^^а-яА-Я];g;^var[translit_cur]];
^var[translit;.;^var[translit_cur]]
;
^var[translit;.;^item[translit;^var[translit_cur]]]
]
]
]^var[translit]]
@end
Содержимое файла _translit.cfg (две строки, грузится как именованый контекст!):
Б В Ч З Д Е Ц Ъ Й К Л М Н О П Р Т У Ф Х Ж И Г Ю Ы Э Я Щ Ш Ь А С б в ч з д е ц ъ й к л м н о п р т у ф х ж и г ю ы э я щ ш ь а с
a b v g d e zh z i j k l m n o p r s t u f h c ch sh shch q y e ju ja a b v g d e zh z i j k l m n o p r s t u f h c ch sh shch q y e ju ja Т.е. тут идея немного другая: не делаем menu|locate по контексту, а обращаемся к столбцу по имени :) (это идея Leechy)
Баг с заглавными буквами имеет место быть :)
|