annotate runtime/autoload/xmlcomplete.vim @ 557:862863033fdd v7.0158

updated for version 7.0158
author vimboss
date Wed, 23 Nov 2005 21:25:05 +0000
parents
children 25a70b1cd2da
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
557
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
1 " Vim completion script
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
2 " Language: XHTML 1.0 Strict
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
3 " Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
4 " Last Change: 2005 Nov 22
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
5
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
6 " This function will create Dictionary with users namespace strings and values
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
7 " canonical (system) names of data files. Names should be lowercase,
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
8 " descriptive to avoid any future conflicts. For example 'xhtml10s' should be
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
9 " name for data of XHTML 1.0 Strict and 'xhtml10t' for XHTML 1.0 Transitional
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
10 " User interface will be provided by XMLns command defined ...
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
11 " Currently supported canonicals are:
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
12 " xhtml10s - XHTML 1.0 Strict
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
13 " xsl - XSL
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
14 function! xmlcomplete#CreateConnection(canonical, ...)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
15
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
16 " When only one argument provided treat name as default namespace (without
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
17 " 'prefix:').
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
18 if exists("a:1")
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
19 let users = a:1
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
20 else
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
21 let users = 'DEFAULT'
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
22 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
23
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
24 " Source data file. Due to suspected errors in autoload do it with
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
25 " :runtime.
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
26 " TODO: make it properly (using autoload, that is) later
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
27 exe "runtime autoload/xml/".a:canonical.".vim"
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
28
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
29 " Remove all traces of unexisting files to return [] when trying
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
30 " omnicomplete something
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
31 " TODO: give warning about non-existing canonicals - should it be?
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
32 if !exists("g:xmldata_".a:canonical)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
33 unlet! g:xmldata_connection
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
34 return 0
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
35 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
36
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
37 " We need to initialize Dictionary to add key-value pair
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
38 if !exists("g:xmldata_connection")
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
39 let g:xmldata_connection = {}
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
40 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
41
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
42 let g:xmldata_connection[users] = a:canonical
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
43
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
44 endfunction
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
45
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
46 function! xmlcomplete#CreateEntConnection(...)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
47 if a:0 > 0
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
48 let g:xmldata_entconnect = a:1
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
49 else
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
50 let g:xmldata_entconnect = 'DEFAULT'
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
51 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
52 endfunction
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
53
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
54 function! xmlcomplete#CompleteTags(findstart, base)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
55 if a:findstart
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
56 " locate the start of the word
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
57 let line = getline('.')
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
58 let start = col('.') - 1
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
59 let compl_begin = col('.') - 2
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
60
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
61 while start >= 0 && line[start - 1] =~ '\(\k\|[:.-]\)'
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
62 let start -= 1
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
63 endwhile
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
64
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
65 if start >= 0 && line[start - 1] =~ '&'
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
66 let b:entitiescompl = 1
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
67 let b:compl_context = ''
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
68 return start
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
69 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
70
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
71 let b:compl_context = getline('.')[0:(compl_begin)]
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
72 let b:compl_context = matchstr(b:compl_context, '.*<\zs.*')
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
73
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
74 " Make sure we will have only current namespace
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
75 unlet! b:xml_namespace
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
76 let b:xml_namespace = matchstr(b:compl_context, '^\k*\ze:')
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
77 if b:xml_namespace == ''
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
78 let b:xml_namespace = 'DEFAULT'
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
79 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
80
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
81 return start
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
82
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
83 else
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
84 " There is no connction of namespace and data file. Abandon action
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
85 if !exists("g:xmldata_connection") || g:xmldata_connection == {}
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
86 return []
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
87 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
88 " Initialize base return lists
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
89 let res = []
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
90 let res2 = []
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
91 " a:base is very short - we need context
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
92 let context = b:compl_context
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
93 unlet! b:compl_context
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
94
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
95 " Make entities completion
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
96 if exists("b:entitiescompl")
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
97 unlet! b:entitiescompl
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
98
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
99 if !exists("g:xmldata_entconnect") || g:xmldata_entconnect == 'DEFAULT'
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
100 let values = g:xmldata{'_'.g:xmldata_connection['DEFAULT']}['vimxmlentities']
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
101 else
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
102 let values = g:xmldata{'_'.g:xmldata_entconnect}['vimxmlentities']
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
103 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
104
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
105 " Get only lines with entity declarations but throw out
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
106 " parameter-entities - they may be completed in future
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
107 let entdecl = filter(getline(1, "$"), 'v:val =~ "<!ENTITY\\s\\+[^%]"')
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
108
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
109 if len(entdecl) > 0
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
110 let intent = map(copy(entdecl), 'matchstr(v:val, "<!ENTITY\\s\\+\\zs\\(\\k\\|[.-:]\\)\\+\\ze")')
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
111 let values = intent + values
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
112 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
113
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
114 for m in values
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
115 if m =~ '^'.a:base
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
116 call add(res, m.';')
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
117 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
118 endfor
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
119
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
120 return res
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
121
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
122 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
123 if context =~ '>'
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
124 " Generally if context contains > it means we are outside of tag and
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
125 " should abandon action
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
126 return []
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
127 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
128
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
129 " find tags matching with "a:base"
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
130 " If a:base contains white space it is attribute.
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
131 " It could be also value of attribute...
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
132 " We have to get first word to offer
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
133 " proper completions
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
134 if context == ''
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
135 let tag = ''
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
136 else
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
137 let tag = split(context)[0]
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
138 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
139 " Get rid of namespace
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
140 let tag = substitute(tag, '^'.b:xml_namespace.':', '', '')
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
141
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
142
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
143 " Get last word, it should be attr name
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
144 let attr = matchstr(context, '.*\s\zs.*')
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
145 " Possible situations where any prediction would be difficult:
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
146 " 1. Events attributes
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
147 if context =~ '\s'
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
148
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
149 " If attr contains =\s*[\"'] we catched value of attribute
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
150 if attr =~ "=\s*[\"']"
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
151 " Let do attribute specific completion
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
152 let attrname = matchstr(attr, '.*\ze\s*=')
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
153 let entered_value = matchstr(attr, ".*=\\s*[\"']\\zs.*")
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
154
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
155 if tag =~ '^[?!]'
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
156 " Return nothing if we are inside of ! or ? tag
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
157 return []
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
158 else
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
159 let values = g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}[tag][1][attrname]
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
160 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
161
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
162 if len(values) == 0
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
163 return []
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
164 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
165
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
166 " We need special version of sbase
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
167 let attrbase = matchstr(context, ".*[\"']")
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
168 let attrquote = matchstr(attrbase, '.$')
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
169
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
170 for m in values
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
171 " This if is needed to not offer all completions as-is
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
172 " alphabetically but sort them. Those beginning with entered
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
173 " part will be as first choices
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
174 if m =~ '^'.entered_value
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
175 call add(res, m . attrquote.' ')
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
176 elseif m =~ entered_value
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
177 call add(res2, m . attrquote.' ')
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
178 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
179 endfor
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
180
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
181 return res + res2
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
182
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
183 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
184
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
185 if tag =~ '?xml'
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
186 " Two possible arguments for <?xml> plus variation
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
187 let attrs = ['encoding', 'version="1.0"', 'version']
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
188 elseif tag =~ '^!'
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
189 " Don't make completion at all
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
190 return []
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
191 else
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
192 let attrs = keys(g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}[tag][1])
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
193 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
194
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
195 for m in sort(attrs)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
196 if m =~ '^'.attr
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
197 if tag !~ '^[?!]' && len(g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}[tag][1][m]) > 0 && g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}[tag][1][m][0] =~ '^BOOL$'
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
198 call add(res, m)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
199 elseif m =~ '='
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
200 call add(res, m)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
201 else
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
202 call add(res, m.'="')
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
203 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
204 elseif m =~ attr
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
205 if tag !~ '^[?!]' && len(g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}[tag][1][m]) > 0 && g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}[tag][1][m][0] =~ '^BOOL$'
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
206 call add(res, m)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
207 elseif m =~ '='
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
208 call add(res, m)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
209 else
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
210 call add(res2, m.'="')
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
211 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
212 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
213 endfor
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
214
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
215 return res + res2
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
216
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
217 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
218 " Close tag
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
219 let b:unaryTagsStack = "base meta link hr br param img area input col"
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
220 if context =~ '^\/'
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
221 let opentag = xmlcomplete#GetLastOpenTag("b:unaryTagsStack")
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
222 return [opentag.">"]
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
223 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
224
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
225 " Complete elements of XML structure
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
226 " TODO: #REQUIRED, #IMPLIED, #FIXED, #PCDATA - but these should be detected like
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
227 " entities - in first run
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
228 " keywords: CDATA, ID, IDREF, IDREFS, ENTITY, ENTITIES, NMTOKEN, NMTOKENS
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
229 " are hardly recognizable but keep it in reserve
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
230 " also: EMPTY ANY SYSTEM PUBLIC DATA
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
231 if context =~ '^!'
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
232 let tags = ['!ELEMENT', '!DOCTYPE', '!ATTLIST', '!ENTITY', '!NOTATION', '![CDATA[', '![INCLUDE[', '![IGNORE[']
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
233
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
234 for m in tags
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
235 if m =~ '^'.context
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
236 let m = substitute(m, '^!\[\?', '', '')
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
237 call add(res, m)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
238 elseif m =~ context
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
239 let m = substitute(m, '^!\[\?', '', '')
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
240 call add(res2, m)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
241 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
242 endfor
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
243
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
244 return res + res2
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
245
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
246 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
247
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
248 " Complete text declaration
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
249 let g:co = context
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
250 if context =~ '^?'
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
251 let tags = ['?xml']
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
252
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
253 for m in tags
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
254 if m =~ '^'.context
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
255 call add(res, substitute(m, '^?', '', ''))
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
256 elseif m =~ context
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
257 call add(res, substitute(m, '^?', '', ''))
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
258 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
259 endfor
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
260
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
261 return res + res2
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
262
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
263 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
264
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
265 " Deal with tag completion.
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
266 let opentag = xmlcomplete#GetLastOpenTag("b:unaryTagsStack")
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
267 let opentag = substitute(opentag, '^\k*:', '', '')
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
268
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
269 let tags = g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}[opentag][0]
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
270 let context = substitute(context, '^\k*:', '', '')
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
271
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
272 if b:xml_namespace == 'DEFAULT'
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
273 let b:xml_namespace = ''
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
274 else
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
275 let b:xml_namespace .= ':'
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
276 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
277
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
278 for m in tags
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
279 if m =~ '^'.context
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
280 call add(res, b:xml_namespace.m)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
281 elseif m =~ context
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
282 call add(res2, b:xml_namespace.m)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
283 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
284 endfor
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
285
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
286 return res + res2
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
287
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
288 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
289 endfunction
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
290
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
291 " MM: This is greatly reduced closetag.vim used with kind permission of Steven
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
292 " Mueller
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
293 " Changes: strip all comments; delete error messages; add checking for
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
294 " namespace
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
295 " Author: Steven Mueller <diffusor@ugcs.caltech.edu>
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
296 " Last Modified: Tue May 24 13:29:48 PDT 2005
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
297 " Version: 0.9.1
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
298
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
299 function! xmlcomplete#GetLastOpenTag(unaryTagsStack)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
300 let linenum=line('.')
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
301 let lineend=col('.') - 1 " start: cursor position
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
302 let first=1 " flag for first line searched
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
303 let b:TagStack='' " main stack of tags
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
304 let startInComment=s:InComment()
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
305
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
306 if exists("b:xml_namespace")
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
307 if b:xml_namespace == 'DEFAULT'
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
308 let tagpat='</\=\(\k\|[.-]\)\+\|/>'
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
309 else
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
310 let tagpat='</\='.b:xml_namespace.':\(\k\|[.-]\)\+\|/>'
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
311 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
312 else
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
313 let tagpat='</\=\(\k\|[.-:]\)\+\|/>'
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
314 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
315 while (linenum>0)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
316 let line=getline(linenum)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
317 if first
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
318 let line=strpart(line,0,lineend)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
319 else
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
320 let lineend=strlen(line)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
321 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
322 let b:lineTagStack=''
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
323 let mpos=0
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
324 let b:TagCol=0
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
325 while (mpos > -1)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
326 let mpos=matchend(line,tagpat)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
327 if mpos > -1
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
328 let b:TagCol=b:TagCol+mpos
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
329 let tag=matchstr(line,tagpat)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
330
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
331 if exists('b:closetag_disable_synID') || startInComment==s:InCommentAt(linenum, b:TagCol)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
332 let b:TagLine=linenum
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
333 call s:Push(matchstr(tag,'[^<>]\+'),'b:lineTagStack')
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
334 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
335 let lineend=lineend-mpos
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
336 let line=strpart(line,mpos,lineend)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
337 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
338 endwhile
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
339 while (!s:EmptystackP('b:lineTagStack'))
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
340 let tag=s:Pop('b:lineTagStack')
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
341 if match(tag, '^/') == 0 "found end tag
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
342 call s:Push(tag,'b:TagStack')
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
343 elseif s:EmptystackP('b:TagStack') && !s:Instack(tag, a:unaryTagsStack) "found unclosed tag
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
344 return tag
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
345 else
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
346 let endtag=s:Peekstack('b:TagStack')
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
347 if endtag == '/'.tag || endtag == '/'
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
348 call s:Pop('b:TagStack') "found a open/close tag pair
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
349 elseif !s:Instack(tag, a:unaryTagsStack) "we have a mismatch error
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
350 return ''
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
351 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
352 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
353 endwhile
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
354 let linenum=linenum-1 | let first=0
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
355 endwhile
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
356 return ''
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
357 endfunction
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
358
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
359 function! s:InComment()
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
360 return synIDattr(synID(line('.'), col('.'), 0), 'name') =~ 'Comment'
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
361 endfunction
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
362
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
363 function! s:InCommentAt(line, col)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
364 return synIDattr(synID(a:line, a:col, 0), 'name') =~ 'Comment'
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
365 endfunction
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
366
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
367 function! s:SetKeywords()
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
368 let g:IsKeywordBak=&iskeyword
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
369 let &iskeyword='33-255'
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
370 endfunction
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
371
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
372 function! s:RestoreKeywords()
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
373 let &iskeyword=g:IsKeywordBak
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
374 endfunction
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
375
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
376 function! s:Push(el, sname)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
377 if !s:EmptystackP(a:sname)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
378 exe 'let '.a:sname."=a:el.' '.".a:sname
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
379 else
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
380 exe 'let '.a:sname.'=a:el'
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
381 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
382 endfunction
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
383
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
384 function! s:EmptystackP(sname)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
385 exe 'let stack='.a:sname
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
386 if match(stack,'^ *$') == 0
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
387 return 1
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
388 else
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
389 return 0
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
390 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
391 endfunction
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
392
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
393 function! s:Instack(el, sname)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
394 exe 'let stack='.a:sname
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
395 call s:SetKeywords()
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
396 let m=match(stack, '\<'.a:el.'\>')
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
397 call s:RestoreKeywords()
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
398 if m < 0
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
399 return 0
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
400 else
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
401 return 1
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
402 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
403 endfunction
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
404
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
405 function! s:Peekstack(sname)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
406 call s:SetKeywords()
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
407 exe 'let stack='.a:sname
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
408 let top=matchstr(stack, '\<.\{-1,}\>')
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
409 call s:RestoreKeywords()
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
410 return top
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
411 endfunction
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
412
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
413 function! s:Pop(sname)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
414 if s:EmptystackP(a:sname)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
415 return ''
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
416 endif
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
417 exe 'let stack='.a:sname
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
418 call s:SetKeywords()
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
419 let loc=matchend(stack,'\<.\{-1,}\>')
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
420 exe 'let '.a:sname.'=strpart(stack, loc+1, strlen(stack))'
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
421 let top=strpart(stack, match(stack, '\<'), loc)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
422 call s:RestoreKeywords()
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
423 return top
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
424 endfunction
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
425
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
426 function! s:Clearstack(sname)
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
427 exe 'let '.a:sname."=''"
862863033fdd updated for version 7.0158
vimboss
parents:
diff changeset
428 endfunction