parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Типа ОТК :)

egr 21.05.2004 15:05 / 21.05.2004 15:08

Какой комшарный стиль! Тут на колене накидал более цивилизованнный вариант:
# $Id: typograf.p,v 1.4.5.0 2004/05/21 Eugene Spearance Exp $

@CLASS
typograf

########################################
# Определение пути к классу
#####
@auto[filespec][full_path]
$full_path[^file:dirname[$filespec]]
$c_dir[/^full_path.trim[start;$request:document-root]]
$hash[^hash::create[]]
$_hTypeInfo[
	$.[css][
		$.tag[style]
		$.replace[css]
	]
	$.[javascript][
		$.tag[script]
		$.replace[js]
	]
	$.[js][
		$.tag[script]
		$.replace[js]
	]
	$.[pre][
		$.tag[pre]
		$.replace[pre]
	]
]
### End @auto


########################################
# Обработка текста
# 
# $.dirty_text[текст] - который нужно типографировать
# $.regex_path[путь_к_файлу] - с альтернативной таблицей правил (включая имя файла)
# $.symbols_path[путь_к_файлу] - с альтернативной таблицей замен символов (включая имя файла)
#
#####
@text_process[params][regex_path]
^if(def $params.dirty_text){
	^memory:compact[]
	^if(def $params.regex_path){$regex_path[$params.regex_path]}{$regex_path[$c_dir/regex.cfg]}

	^rem{ *** Заменяю символы UTF-8 и символы мнемоники на печатные *** }
	$result[^prepare_text[$params.dirty_text;$params.symbols_path]]

	^rem{ *** Удаляю таблицы стилей, скрипты, пре-формаченый текст и теги. ПОРЯДОК УДАЛЕНИЯ НЕ МЕНЯТЬ!!! *** }
	$result[^remove[$result;css]]
	$result[^remove[$result;js]]
	$result[^remove[$result;pre]]
	$result[^remove[$result;tag]]

	^rem{ *** Обрабатываю текст правилами *** }
	^if(!$regex){
		$regex[^table::load[$regex_path]]
	}
	^regex.menu{
		^if(def $regex.reg1){
			$result[^result.match[$regex.reg1][$regex.reg2]{^process{^taint[as-is][$regex.reg3]}}]
		}
	}

	^rem{ *** Возвращаю таблицы стилей, скрипты, пре-формаченый текст и теги ПОРЯДОК ВОЗВРАТА НЕ МЕНЯТЬ!!! *** }
	$result[^return[$result;tag]]
	$result[^return[$result;pre]]
	$result[^return[$result;js]]
	$result[^return[$result;css]]
	^memory:compact[]
}
### End @text_process


########################################
# Замена символов в UTF кодировке и символов "мнемоников" на печатные символы
#####
@prepare_text[dirty_text;symbols_path]
^if(!$table_symbols){
	$table_symbols[^table::load[nameless;^if(def $symbol_path){$symbol_path}{$c_dir/replace.cfg}]]
}
$result[^dirty_text.replace[$table_symbols]]
### End @prepare_text


########################################
# Замена тегов, скриптов и внутренних CSS на <*>, <js>, <css>
#
# tag - заменяю теги на <*>
# css - заменяю встроенные таблицы стилей на <css>
# js, javascript - заменяю скрипты на <js>
# pre - заменяю предварительно форматированный текст на <pre>
#
#####
@remove[prepared_text;text_type][counter;lTypeInfo]
$counter(0)
^hash.add[$.[$text_type][^hash::create[]]]
^if(def $text_type){
	$result[^prepared_text.match[
		(
			<(^_getTag[$text_type])[^^>]*>.*?</\2>
		)
	][gix]{<^_getReplace[$text_type]>^hash.[$text_type].add[$.[$counter][$match.1]]^counter.inc[]}]
}{
	$result[^prepared_text.match[(<[^^>]+>)][g]{<*>^hash.[$text_type].add[$.[$counter][$match.1]]^counter.inc[]}]
}
### End @remove


########################################
# Возврат тегов, скриптов и внутренних CSS
#####
@return[matched_text;text_type][counter]
$counter(0)
$result[$matched_text]
^if(def $hash.[$text_type]){
	^if(def $text_type){
		$result[^result.match[(<^_getReplace[$text_type]>)][g]{$hash.[$text_type].[$counter]^counter.inc[]}]
	}{
		$result[^result.match[(<\*>)][g]{$hash.[$text_type].[$counter]^counter.inc[]}]
	}
}
### End @return

########################################
# Тег
@_getTag[sType]
$result[$_hTypeInfo.[$sType].tag]

########################################
# Замена
@_getReplace[sType]
$result[$_hTypeInfo.[$sType].replace]
PS: Совсем испортился Миша :(