Новости | FAQ | Авторы | Документация | В действии | Библиотека |
Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
Никита Козин 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[]