parser

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

 

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

дополнения

dev 02.12.2005 18:20 / 02.12.2005 18:25

Ждем, что скажет автор.
В общих чертах, примерно вот так:
@CLASS
uri

# by Maxim Shipko  mailto:maxim@shipko.com.ua
# based on http://www.egoroff.spb.ru/portfolio/15.html

###################################################################
# Конструктор, items - таблица (поля: uri, id, title).
@init[items]
$children_of[^items.hash[parent_id][$.distinct[tables]]]

###################################################################
# Необязательный параметр parent_uri - адрес корневой директории, по умолчанию "/".
# Возвращает таблицу (поля: uri, id, title), содержащую полные адреса всех дочерних директорий.
@get[parent_uri]
^if(!def $parent_uri){$parent_uri[/]}
$_items[^table::create{uri	id	title}]
^_get[$children_of.0;$parent_uri]
$result[$_items]
$_items[]

###################################################################
# внутренний метод, рекурсивно обходит дочерние директории, вычисляет их адреса
# и добавляет их в таблицу _item.
@_get[sibling;parent_uri]
^sibling.menu{
	^_items.append{${parent_uri}$sibling.[dir]/	$sibling.id	$sibling.title}
	^if(def $children_of.[$sibling.id]){
		^_get[$children_of.[$sibling.id];${parent_uri}$sibling.[dir]/]
	}
}



###################################################################
# Параметр - id директории.
# Возвращает полный адрес директории.
@get_uri[id][_]
$_[^get[]]
^if(^_.locate[id;$id]){
	$result[$_.uri]
}{
	^throw[uri.missing;$id;Id '$id' not found]
}

###################################################################
# Параметр - полный адрес директории.
# Возвращает id.
@get_id[uri][_]
# возможно, стоит делать ^trim[]:
#$uri[^uri.trim[]] 
# Исключаем вариант, когда адрес не содержит закрывающего слеша:
#^if(^uri.left(1) ne "/"){$uri[$uri/]}
$_[^get[$uri]]
^if(^_.locate[uri;$uri]){
	$result($_.id)
}{
	^throw[uri.missing;$uri;URI '$uri' not found]
}