parser

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

 

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

Класс алфавитного указателя (aindex.p)

BeaVe 21.05.2006 13:55 / 21.05.2006 13:56

Попробовал написать мелкий класс для построения списка алфавитного указателя. В классе имеется таблица с цифрами и буквами (русского и английского алфавита).
@CLASS
aindex

@init[tItems;sItemsColumnName][tblItemsColumns;strActiveLetter]
^if(def $tItems){
	^if(!$tItems is 'table'){
		^throw[aindex;Items is not table.]
	}
	$_prepareActiveLetter{
		$strActiveLetter[^strActiveLetter.trim[]]
		$strActiveLetter[^strActiveLetter.left(1)]
		$strActiveLetter[^strActiveLetter.upper[]]
	}
	$_appendActiveLetter{
		$_prepareActiveLetter
		^tblActiveLetters.append{$strActiveLetter}
	}
	$tblItemsColumns[^tItems.columns[]]
	$tblActiveLetters[^table::create{letter}]
	^switch(^tblItemsColumns.count[]){
		^case(0){
			^try{
				^tItems.menu{
					$strActiveLetter[$tItems.0]
					$_appendActiveLetter
				}
			}{
				^if($exception.comment eq 'column not found'){
					$exception.handled(1)
				}
#				ЕСЛИ ТАБЛИЦА НЕ NAMELESS, ТО ПОКА ТОЧИМ ВАТУ
			}
		}
		^case(1){
			^tItems.menu{
				$strActiveLetter[$tItems.[$tblItemsColumns.column]]
				$_appendActiveLetter
			}
		}
		^case[DEFAULT]{
			^if(!def $sItemsColumnName){
				^throw[aindex;Items column name must be defined.]
			}
			^if(def $sItemsColumnName && !($sItemsColumnName is 'string')){
				^throw[aindex;Items column name is not string.]
			}
			^tItems.menu{
				^try{
					$strActiveLetter[$tItems.[$sItemsColumnName]]
					$_appendActiveLetter
				}{
					^if($exception.comment eq 'column not found'){
						$exception.handled(1)
						^throw[aindex;Items column name is wrong.]
					}
				}
			}
		}
	}
	^if($tblActiveLetters){
		$tblShareLetters[$tblLetters]
		$hshActiveLetters[^tblActiveLetters.hash[letter][$.distinct(1)]]
		$tblLetters[^table::create{letter	group	is_active}]
		^tblShareLetters.menu{
			^tblLetters.append{$tblShareLetters.letter	$tblShareLetters.group	^if($hshActiveLetters.[$tblShareLetters.letter]){1}{0}}
		}
	}
}
#end @init[]

@print[params]
^if(def $params.tag_name){
	<$params.tag_name^if(def $params.tag_attr){$params.tag_attr}>
}
$strTargetURL[^if(def $params.target_url){$params.target_url}{./}]
$strTargetURLSeparator[^if(^params.target_url.pos[?]>=0){^taint[&]}{?}]
$strFormName[^if(def $params.form_name){$params.form_name}{letter}]
^if($params.mode eq 'html'){
	^_printHTML[$params]
}{
	^_printXML[$params]
}
^if(def $params.tag_name){
	</$params.tag_name>
}
#end @print[]

@_printHTML[params][_params]
$_params[^hash::create[$params]]
^if(def $_params.title){
	$_params.title
}
^tblLetters.menu{
	^if($form:[$strFormName] eq $tblLetters.letter){
		$tblLetters.letter
	}{
		<a href="${strTargetURL}${strTargetURLSeparator}${strFormName}=^taint[uri][$tblLetters.letter]">$tblLetters.letter</a>
	}
}
#end @_printHTML[]

@_printXML[params][_params][strLetterType]
$_params[^hash::create[$params]]
^if(def $_params.title){
	<title>$_params.title</title>
}
^tblLetters.menu{
	^if($form:[$strFormName] eq $tblLetters.letter){$strLetterType[current]}
	<aindex
		^if($strLetterType ne 'current'){
			href="${strTargetURL}${strTargetURLSeparator}${strFormName}=^taint[uri][$tblLetters.letter]"
		}
		^if(def $hshGroups.[$tblLetters.group].type){group="$hshGroups.[$tblLetters.group].type"}
		^if(def $hshGroups.[$tblLetters.group].lang){lang="$hshGroups.[$tblLetters.group].lang"}
		^if(def $strLetterType){type="$strLetterType"}
		^try{
			is_active="^if($tblLetters.is_active){1}{0}"
		}{
			$exception.handled(1)
		}
	/>
	$strLetterType[]
}
#end @_printXML[]

@auto[]
$tblGroups[^table::create{id	type	lang
1	numbers	
2	letters	en
3	letters	ru
}]
$tblLetters[^table::create{letter	group
0	1
1	1
2	1
3	1
4	1
5	1
6	1
7	1
8	1
9	1
A	2
B	2
C	2
D	2
E	2
F	2
G	2
H	2
I	2
J	2
K	2
L	2
M	2
N	2
O	2
P	2
Q	2
R	2
S	2
T	2
U	2
V	2
W	2
X	2
Y	2
Z	2
А	3
Б	3
В	3
Г	3
Д	3
Е	3
Ё	3
Ж	3
З	3
И	3
Й	3
К	3
Л	3
М	3
Н	3
О	3
П	3
Р	3
С	3
Т	3
У	3
Ф	3
Х	3
Ц	3
Ч	3
Ш	3
Щ	3
Ъ	3
Ы	3
Ь	3
Э	3
Ю	3
Я	3
}]
$hshGroups[^tblGroups.hash[id]]
#end @auto[]
Примеры использования.
1.
$items[^table::sql{
	SELECT
		item_id,
		title,
		details
	FROM
		items
}]

$aindex[^aindex::init[$items;title]]
^aindex.print[
	$.mode[html]
	$.target_url[/items/]
]
Один из самых неправильных вызовов, т.к. таблица с items передаётся в класс, но в некоторых случаях он пойдёт.
2.
$items_title[^table::create{title
...
}]

$aindex[^aindex::init[$items_title]]
^aindex.print[
	$.tag_name[alfa-index]
	$.target_url[/items/]
]
Впринципе самый нормальный способ использования, т.к. передаются только названия.
3.
$items_title[^table::create[nameless]{
...
}]
$aindex[^aindex::init[$items_title]]
...
Может когда-то пригодиться кому-нибудь такой способ... Правда я в этом совмневаюсь.

Параметры методов.
1. init.
@init[ТАБЛИЦА;НАЗВАНИЕ СТОЛБЦА С ДАННОЙ ТАБЛИЦЫ]
Оба поля являются необязательными... В некоторых случаях можно не использовать этот метод, тогда поидеи будет использоваться внутренняя таблица символов.


2. print.
@print[
	$.mode[STRING]
	$.tag_name[STRING]
	$.tag_attr[STRING]
	$.form_name[STRING]
	$.target_url[STRING]
]
$.mode[XML/HTML]
Способ вывода. По умолчанию "XML".
$.tag_name[]
Название тэга, в котором всё это выводится. По умолчанию ничего нет.
$.tag_attr[]
Аттрибуты для тэга. Доступны только тогда, если определён $.tag_name. По умолчанию также ничего нет.
$.form_name[]
Название элемента формы через который передаётся символ. По умолчанию "letter".
$.target_url[]
URL страницы (для перехода). По умолчанию "./"


Был бы очень рад за разумную критику... В особенности самого кода (т.к. сказать, того пересоздания таблиц).

  • Класс алфавитного указателя (aindex.p), BeaVe 21.05.2006 13:55 / 21.05.2006 13:56