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