parser

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

 

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

uri (класс): исправления и доработки

Никита Козин 03.02.2006 14:36 / 03.02.2006 14:36

# by Maxim Shipko  mailto:maxim@shipko.com.ua
# based on http://www.egoroff.spb.ru/portfolio/15.html
# tuned by Nikita Kozin mailto:wonder@nightmail.ru
@CLASS
uri


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


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


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


# Возвращает путь для указанного id
@get_uri[id]
^if(!def $self.items){^get[]}
^if(^self.items.locate[id;$id]){
	$result[$self.items.uri]
}{
	^throw[uri.missing;$id;Id '$id' not found]
}
# end @get_uri[]


# Возвращает id страницы, исходя из ее адреса, если страница не найдена -
# рекурсивно продолжает поиск, поднимаясь на одну папку выше
@get_id[uri]
^if(!def $self.items){^get[]}
^if(^self.items.locate[uri;$uri]){
	$result($self.items.id)
}{
	$uri[^uri.match[(.*/).+?/?^$][]{$match.1}]
	^if($uri ne "/"){
		^get_id[$uri]
	}
}
# end @get_id[]