parser

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

 

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

Как мы дважды обманули ^file:dirname[]

Азат Разетдинов 14.07.2004 12:56

Задача была поставлено чётко: есть меню из трёх пунктов.
uri	title
/	О проекте
/staff/	Сотрудники
/trips/	Поездки
Нужно подсветить пункт меню, если пользователь находится в соответствующем разделе или его подразделах. Казалось бы, что проще, поставил проверку
^if(in $menu.uri)
и живи спокойно.

Тут встала проблема № 1: первый пункт меню указывал на корневой каталог и т. о. под-свечивался всегда. «Не беда!» сказали мы и решили использовать
^file:dirname[$request:uri]
. (Благо, разделов третьего уровня не ожидалось.) Особенность этого метода заключается, в том, что для
/foo/
и
/foo/bar.html
он выдает разный ответ. В первом случае
/
, а во втором
/foo
. Проблема решилась так: после аргумента ме-тода был вставлен пробел. Таким образом в обоих случаях выдавалась строка /foo, кото-рую (с добавленным слэшэм) можно было сравнивать с $menu.uri
^if($menu.uri eq ‘^file:dirname[$request:uri ]/’)
Здесь возникла проблема с первым пунктом № 2: если для
/foo/bar/
метод вы-дает
/foo
то для
/
результатом является… точка. А не пустая строка, что было бы удобнее с точки зрения программирования. Мы почесали репу и… ввели ещё один пробел, на сей раз перед аргументом метода. Поставив его также перед $menu.uri
^if($menu.uri’ eq ‘^file:dirname[ $request:uri ]/’)
Конечно, можно было бы создать собственный метод. Чем бы он отличался от стандарт-но? Рассмотрим на примере.
^file:dirname[]
/	.
/foo	/
/foo/	/
/foo/bar	/foo
/foo/bar/	/foo

^my_dirname[]
/	[пустая строка]
/foo	[пустая строка]
/foo/	/foo
/foo/bar	/foo
/foo/bar/	/foo/bar
Резюме: dirname -- наглядный метод с точки зрения человека, но для программирования не пригоден. Почти.