parser

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

 

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

Есть кое-что...

Юзер 28.09.2005 08:01

У меня есть поделка одна, в качестве результата формирует двухуровневый хеш.
секция [default] или строки без указания секции попадают в первый уровень, остальные - hash.имя_секции
Можете использовать как базу для дальшейней работы.
Буду благодарен за советы и дополнения.
--
@_parse_config[cfg_file][data;block_name;key;value;commented]
$block_name(0)
$result[^hash::create[]]
#> Ïðèíöèïèàëüíûé âîïðîñ  - ñ÷èòàòü ôàéë êàê ñòðîêó èëè ñðàçó êàê òàáëèöó?
#> â ñëó÷àå åñëè â ôàéëå åñòü ñèìâîëû òàáóëÿöèè, òî îíè "îòðåæóò" ÷àñòè ñòðîê.
^if(^cfg_file.pos[^#0A]<=0){
	$data[^table::load[nameless;$cfg_file]]
}{
	$data[^table::create[nameless]{$cfg_file}]
}
^data.menu{
	$string[^data.0.trim[]]
	^switch[^string.left(1)]{
		^case[#;/;^;]{$commented(1)}
		^case[DEFAULT]{$commented(0)}
	}
	^if($commented == 0 && ^string.length[]>2){
		^if(^string.left(1) eq '[' && ^string.right(1) eq ']'){
			$block_name[^string.mid(1;^string.length[]-2)]
			$block_name[^block_name.trim[]]
		}{
			^if(^string.pos[=] > 0){
				$key[^string.left(^string.pos[=])] 
				$key[^key.trim[]]
				
				$value[^string.right(^string.length[] - ^string.pos[=] -1)]
				$value[^value.trim[both; '"^;]]

				^if(^value.lower[] eq 'true'){$value(1)}
				^if(^value.lower[] eq 'false'){$value(0)}
				
				^if($block_name is string && ^block_name.lower[] eq 'default'){
					$block_name(^block_name.double(0))
				}
				
				
				^if($block_name is double){
					$result.$key[$value]
				}{
					^if($result.$block_name is void){
						$result.$block_name[^hash::create[]]
					}
					
					^result.$block_name.add[$.$key[$value]]
				}
			}
		}
	}
}