]>
Commit | Line | Data |
---|---|---|
1 | ||
2 | (function() { | |
3 | ||
4 | CodeMirror.xmlHints = []; | |
5 | ||
6 | CodeMirror.xmlHint = function(cm, simbol) { | |
7 | ||
8 | if(simbol.length > 0) { | |
9 | var cursor = cm.getCursor(); | |
10 | cm.replaceSelection(simbol); | |
11 | cursor = {line: cursor.line, ch: cursor.ch + 1}; | |
12 | cm.setCursor(cursor); | |
13 | } | |
14 | ||
15 | CodeMirror.simpleHint(cm, getHint); | |
16 | }; | |
17 | ||
18 | var getHint = function(cm) { | |
19 | ||
20 | var cursor = cm.getCursor(); | |
21 | ||
22 | if (cursor.ch > 0) { | |
23 | ||
24 | var text = cm.getRange({line: 0, ch: 0}, cursor); | |
25 | var typed = ''; | |
26 | var simbol = ''; | |
27 | for(var i = text.length - 1; i >= 0; i--) { | |
28 | if(text[i] == ' ' || text[i] == '<') { | |
29 | simbol = text[i]; | |
30 | break; | |
31 | } | |
32 | else { | |
33 | typed = text[i] + typed; | |
34 | } | |
35 | } | |
36 | ||
37 | text = text.slice(0, text.length - typed.length); | |
38 | ||
39 | var path = getActiveElement(text) + simbol; | |
40 | var hints = CodeMirror.xmlHints[path]; | |
41 | ||
42 | if(typeof hints === 'undefined') | |
43 | hints = ['']; | |
44 | else { | |
45 | hints = hints.slice(0); | |
46 | for (var i = hints.length - 1; i >= 0; i--) { | |
47 | if(hints[i].indexOf(typed) != 0) | |
48 | hints.splice(i, 1); | |
49 | } | |
50 | } | |
51 | ||
52 | return { | |
53 | list: hints, | |
54 | from: { line: cursor.line, ch: cursor.ch - typed.length }, | |
55 | to: cursor | |
56 | }; | |
57 | }; | |
58 | }; | |
59 | ||
60 | var getActiveElement = function(text) { | |
61 | ||
62 | var element = ''; | |
63 | ||
64 | if(text.length >= 0) { | |
65 | ||
66 | var regex = new RegExp('<([^!?][^\\s/>]*).*?>', 'g'); | |
67 | ||
68 | var matches = []; | |
69 | var match; | |
70 | while ((match = regex.exec(text)) != null) { | |
71 | matches.push({ | |
72 | tag: match[1], | |
73 | selfclose: (match[0].slice(match[0].length - 2) === '/>') | |
74 | }); | |
75 | } | |
76 | ||
77 | for (var i = matches.length - 1, skip = 0; i >= 0; i--) { | |
78 | ||
79 | var item = matches[i]; | |
80 | ||
81 | if (item.tag[0] == '/') | |
82 | { | |
83 | skip++; | |
84 | } | |
85 | else if (item.selfclose == false) | |
86 | { | |
87 | if (skip > 0) | |
88 | { | |
89 | skip--; | |
90 | } | |
91 | else | |
92 | { | |
93 | element = '<' + item.tag + '>' + element; | |
94 | } | |
95 | } | |
96 | } | |
97 | ||
98 | element += getOpenTag(text); | |
99 | } | |
100 | ||
101 | return element; | |
102 | }; | |
103 | ||
104 | var getOpenTag = function(text) { | |
105 | ||
106 | var open = text.lastIndexOf('<'); | |
107 | var close = text.lastIndexOf('>'); | |
108 | ||
109 | if (close < open) | |
110 | { | |
111 | text = text.slice(open); | |
112 | ||
113 | if(text != '<') { | |
114 | ||
115 | var space = text.indexOf(' '); | |
116 | if(space < 0) | |
117 | space = text.indexOf('\t'); | |
118 | if(space < 0) | |
119 | space = text.indexOf('\n'); | |
120 | ||
121 | if (space < 0) | |
122 | space = text.length; | |
123 | ||
124 | return text.slice(0, space); | |
125 | } | |
126 | } | |
127 | ||
128 | return ''; | |
129 | }; | |
130 | ||
131 | })(); |