cts tree

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
var TreeCts = new Class({
Implements : [Options],
options : { // опции по умолчанию которые не используются, но на будущее;
selector:'',
current:null
},
initialize: function(selector, current, options){
this.setOptions(options);
this.current = $(current);
this.tree = this.create(selector);
return this;
}
});
TreeCts.implement({
create : function(selector){
//Создаём массив для хранения элементов и строку частичного селектора.
var elements = {}, active = "";
//Если текущий элемент задан (аргумент current), то используем его как корневой.
var current = this.current;
if (current != null)
{
elements["root"] = current;
}
//Как и в первом блоке кода, выделяем ключевые части.
selector = selector.match(/(?:#|\.)?\w+/g);
//Проходимся по собранным элементам
for (var i = 0, j = -1, n = selector.length; i < n; i++)
{
//Извлекаем из строки первый символ (он для нас контрольный),
//а также остальную часть строки (контрольный символ не входит в значение конструкции).
var type = selector[i].substring(0, 1), content = selector[i].substring(1);
//Создаём своеобразный автомат.
switch(type)
{
//Добавляем текущему элементу идентификатор
case "#":
current.set("id", content);
break;
//Добавляем текущему элементу CSS-класс
case ".":
current.addClass(content);
break;
default:
if (current == null)
{
//Если текущий элемент не задан, создаём его и определяем как корень.
current = new Element(selector[i]);
elements["root"] = current;
}
else
{
//Если задан, создаём вложенность.
//TODO: Пофиксить этот пробел. div_
//Пробел необходим для обособления элемента в селекторе.
if(active.length > 0) active += ' ';
elements[active] = current;
var el = new Element(selector[i]);
current.adopt(el);
current = el;
}
break;
}
//Добавляем к частичному селектору содержимое обработанной строки.
active += selector[i];
}
//Так как последний элемент остался необработанным,
//добавляем указатель на него после цикла.
elements[active] = current;
//Не забываем добавить указатель на самый вложенный элемент.
elements["last"] = current;
//Возвращяем всё на радость пользователю.
return elements;
}
});