annotate runtime/indent/dtd.vim @ 48:67300faee616 v7-3-618

v7-3-618
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 01 Aug 2012 18:08:28 +0900
parents c16898406ff2
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5
db46d51a3939 Initial revision
axmo
parents:
diff changeset
1 " Vim indent file
db46d51a3939 Initial revision
axmo
parents:
diff changeset
2 " Language: DTD (Document Type Definition for XML)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
3 " Maintainer: Nikolai Weibull <now@bitwi.se>
48
67300faee616 v7-3-618
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
4 " Latest Revision: 2011-07-08
5
db46d51a3939 Initial revision
axmo
parents:
diff changeset
5
db46d51a3939 Initial revision
axmo
parents:
diff changeset
6 let s:cpo_save = &cpo
db46d51a3939 Initial revision
axmo
parents:
diff changeset
7 set cpo&vim
db46d51a3939 Initial revision
axmo
parents:
diff changeset
8
db46d51a3939 Initial revision
axmo
parents:
diff changeset
9 setlocal indentexpr=GetDTDIndent()
db46d51a3939 Initial revision
axmo
parents:
diff changeset
10 setlocal indentkeys=!^F,o,O,>
db46d51a3939 Initial revision
axmo
parents:
diff changeset
11 setlocal nosmartindent
db46d51a3939 Initial revision
axmo
parents:
diff changeset
12
db46d51a3939 Initial revision
axmo
parents:
diff changeset
13 if exists("*GetDTDIndent")
db46d51a3939 Initial revision
axmo
parents:
diff changeset
14 finish
db46d51a3939 Initial revision
axmo
parents:
diff changeset
15 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
16
db46d51a3939 Initial revision
axmo
parents:
diff changeset
17 " TODO: Needs to be adjusted to stop at [, <, and ].
db46d51a3939 Initial revision
axmo
parents:
diff changeset
18 let s:token_pattern = '^[^[:space:]]\+'
db46d51a3939 Initial revision
axmo
parents:
diff changeset
19
db46d51a3939 Initial revision
axmo
parents:
diff changeset
20 function s:lex1(input, start, ...)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
21 let pattern = a:0 > 0 ? a:1 : s:token_pattern
db46d51a3939 Initial revision
axmo
parents:
diff changeset
22 let start = matchend(a:input, '^\_s*', a:start)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
23 if start == -1
db46d51a3939 Initial revision
axmo
parents:
diff changeset
24 return ["", a:start]
db46d51a3939 Initial revision
axmo
parents:
diff changeset
25 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
26 let end = matchend(a:input, pattern, start)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
27 if end == -1
db46d51a3939 Initial revision
axmo
parents:
diff changeset
28 return ["", a:start]
db46d51a3939 Initial revision
axmo
parents:
diff changeset
29 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
30 let token = strpart(a:input, start, end - start)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
31 return [token, end]
db46d51a3939 Initial revision
axmo
parents:
diff changeset
32 endfunction
db46d51a3939 Initial revision
axmo
parents:
diff changeset
33
db46d51a3939 Initial revision
axmo
parents:
diff changeset
34 function s:lex(input, start, ...)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
35 let pattern = a:0 > 0 ? a:1 : s:token_pattern
db46d51a3939 Initial revision
axmo
parents:
diff changeset
36 let info = s:lex1(a:input, a:start, pattern)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
37 while info[0] == '--'
db46d51a3939 Initial revision
axmo
parents:
diff changeset
38 let info = s:lex1(a:input, info[1], pattern)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
39 while info[0] != "" && info[0] != '--'
db46d51a3939 Initial revision
axmo
parents:
diff changeset
40 let info = s:lex1(a:input, info[1], pattern)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
41 endwhile
db46d51a3939 Initial revision
axmo
parents:
diff changeset
42 if info[0] == ""
db46d51a3939 Initial revision
axmo
parents:
diff changeset
43 return info
db46d51a3939 Initial revision
axmo
parents:
diff changeset
44 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
45 let info = s:lex1(a:input, info[1], pattern)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
46 endwhile
db46d51a3939 Initial revision
axmo
parents:
diff changeset
47 return info
db46d51a3939 Initial revision
axmo
parents:
diff changeset
48 endfunction
db46d51a3939 Initial revision
axmo
parents:
diff changeset
49
db46d51a3939 Initial revision
axmo
parents:
diff changeset
50 function s:indent_to_innermost_parentheses(line, end)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
51 let token = '('
db46d51a3939 Initial revision
axmo
parents:
diff changeset
52 let end = a:end
db46d51a3939 Initial revision
axmo
parents:
diff changeset
53 let parentheses = [end - 1]
db46d51a3939 Initial revision
axmo
parents:
diff changeset
54 while token != ""
48
67300faee616 v7-3-618
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
55 let [token, end] = s:lex(a:line, end, '^\%([(),|]\|[A-Za-z0-9_-]\+\|#P\=CDATA\|%[A-Za-z0-9_-]\+;\)[?*+]\=')
5
db46d51a3939 Initial revision
axmo
parents:
diff changeset
56 if token[0] == '('
db46d51a3939 Initial revision
axmo
parents:
diff changeset
57 call add(parentheses, end - 1)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
58 elseif token[0] == ')'
db46d51a3939 Initial revision
axmo
parents:
diff changeset
59 if len(parentheses) == 1
db46d51a3939 Initial revision
axmo
parents:
diff changeset
60 return [-1, end]
db46d51a3939 Initial revision
axmo
parents:
diff changeset
61 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
62 call remove(parentheses, -1)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
63 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
64 endwhile
db46d51a3939 Initial revision
axmo
parents:
diff changeset
65 return [parentheses[-1] - strridx(a:line, "\n", parentheses[-1]), end]
db46d51a3939 Initial revision
axmo
parents:
diff changeset
66 endfunction
db46d51a3939 Initial revision
axmo
parents:
diff changeset
67
db46d51a3939 Initial revision
axmo
parents:
diff changeset
68 " TODO: Line and end could be script global (think OO members).
db46d51a3939 Initial revision
axmo
parents:
diff changeset
69 function GetDTDIndent()
db46d51a3939 Initial revision
axmo
parents:
diff changeset
70 if v:lnum == 1
db46d51a3939 Initial revision
axmo
parents:
diff changeset
71 return 0
db46d51a3939 Initial revision
axmo
parents:
diff changeset
72 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
73
db46d51a3939 Initial revision
axmo
parents:
diff changeset
74 " Begin by searching back for a <! that isn’t inside a comment.
db46d51a3939 Initial revision
axmo
parents:
diff changeset
75 " From here, depending on what follows immediately after, parse to
db46d51a3939 Initial revision
axmo
parents:
diff changeset
76 " where we’re at to determine what to do.
db46d51a3939 Initial revision
axmo
parents:
diff changeset
77 if search('<!', 'bceW') == 0
db46d51a3939 Initial revision
axmo
parents:
diff changeset
78 return indent(v:lnum - 1)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
79 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
80 let lnum = line('.')
db46d51a3939 Initial revision
axmo
parents:
diff changeset
81 let col = col('.')
db46d51a3939 Initial revision
axmo
parents:
diff changeset
82 let indent = indent('.')
39
c16898406ff2 synchorinize version 7.3.081
one@zeus.cr.ie.u-ryukyu.ac.jp
parents: 5
diff changeset
83 let line = lnum == v:lnum ? getline(lnum) : join(getline(lnum, v:lnum - 1), "\n")
5
db46d51a3939 Initial revision
axmo
parents:
diff changeset
84
db46d51a3939 Initial revision
axmo
parents:
diff changeset
85 let [declaration, end] = s:lex1(line, col)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
86 if declaration == ""
db46d51a3939 Initial revision
axmo
parents:
diff changeset
87 return indent + &sw
db46d51a3939 Initial revision
axmo
parents:
diff changeset
88 elseif declaration == '--'
db46d51a3939 Initial revision
axmo
parents:
diff changeset
89 " We’re looking at a comment. Now, simply determine if the comment is
db46d51a3939 Initial revision
axmo
parents:
diff changeset
90 " terminated or not. If it isn’t, let Vim take care of that using
db46d51a3939 Initial revision
axmo
parents:
diff changeset
91 " 'comments' and 'autoindent'. Otherwise, indent to the first lines level.
db46d51a3939 Initial revision
axmo
parents:
diff changeset
92 while declaration != ""
db46d51a3939 Initial revision
axmo
parents:
diff changeset
93 let [declaration, end] = s:lex(line, end)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
94 if declaration == "-->"
db46d51a3939 Initial revision
axmo
parents:
diff changeset
95 return indent
db46d51a3939 Initial revision
axmo
parents:
diff changeset
96 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
97 endwhile
db46d51a3939 Initial revision
axmo
parents:
diff changeset
98 return -1
db46d51a3939 Initial revision
axmo
parents:
diff changeset
99 elseif declaration == 'ELEMENT'
db46d51a3939 Initial revision
axmo
parents:
diff changeset
100 " Check for element name. If none exists, indent one level.
db46d51a3939 Initial revision
axmo
parents:
diff changeset
101 let [name, end] = s:lex(line, end)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
102 if name == ""
db46d51a3939 Initial revision
axmo
parents:
diff changeset
103 return indent + &sw
db46d51a3939 Initial revision
axmo
parents:
diff changeset
104 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
105
db46d51a3939 Initial revision
axmo
parents:
diff changeset
106 " Check for token following element name. This can be a specification of
db46d51a3939 Initial revision
axmo
parents:
diff changeset
107 " whether the start or end tag may be omitted. If nothing is found, indent
db46d51a3939 Initial revision
axmo
parents:
diff changeset
108 " one level.
39
c16898406ff2 synchorinize version 7.3.081
one@zeus.cr.ie.u-ryukyu.ac.jp
parents: 5
diff changeset
109 let [token, end] = s:lex(line, end, '^\%([-O(]\|ANY\|EMPTY\)')
5
db46d51a3939 Initial revision
axmo
parents:
diff changeset
110 let n = 0
db46d51a3939 Initial revision
axmo
parents:
diff changeset
111 while token =~ '[-O]' && n < 2
db46d51a3939 Initial revision
axmo
parents:
diff changeset
112 let [token, end] = s:lex(line, end, '^\%([-O(]\|ANY\|EMPTY\)')
db46d51a3939 Initial revision
axmo
parents:
diff changeset
113 let n += 1
db46d51a3939 Initial revision
axmo
parents:
diff changeset
114 endwhile
db46d51a3939 Initial revision
axmo
parents:
diff changeset
115 if token == ""
db46d51a3939 Initial revision
axmo
parents:
diff changeset
116 return indent + &sw
db46d51a3939 Initial revision
axmo
parents:
diff changeset
117 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
118
db46d51a3939 Initial revision
axmo
parents:
diff changeset
119 " Next comes the content model. If the token we’ve found isn’t a
db46d51a3939 Initial revision
axmo
parents:
diff changeset
120 " parenthesis it must be either ANY, EMPTY or some random junk. Either
db46d51a3939 Initial revision
axmo
parents:
diff changeset
121 " way, we’re done indenting this element, so set it to that of the first
db46d51a3939 Initial revision
axmo
parents:
diff changeset
122 " line so that the terminating “>” winds up having the same indention.
db46d51a3939 Initial revision
axmo
parents:
diff changeset
123 if token != '('
db46d51a3939 Initial revision
axmo
parents:
diff changeset
124 return indent
db46d51a3939 Initial revision
axmo
parents:
diff changeset
125 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
126
db46d51a3939 Initial revision
axmo
parents:
diff changeset
127 " Now go through the content model. We need to keep track of the nesting
db46d51a3939 Initial revision
axmo
parents:
diff changeset
128 " of parentheses. As soon as we hit 0 we’re done. If that happens we must
db46d51a3939 Initial revision
axmo
parents:
diff changeset
129 " have a complete content model. Thus set indention to be the same as that
db46d51a3939 Initial revision
axmo
parents:
diff changeset
130 " of the first line so that the terminating “>” winds up having the same
db46d51a3939 Initial revision
axmo
parents:
diff changeset
131 " indention. Otherwise, we’ll indent to the innermost parentheses not yet
db46d51a3939 Initial revision
axmo
parents:
diff changeset
132 " matched.
db46d51a3939 Initial revision
axmo
parents:
diff changeset
133 let [indent_of_innermost, end] = s:indent_to_innermost_parentheses(line, end)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
134 if indent_of_innermost != -1
db46d51a3939 Initial revision
axmo
parents:
diff changeset
135 return indent_of_innermost
db46d51a3939 Initial revision
axmo
parents:
diff changeset
136 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
137
db46d51a3939 Initial revision
axmo
parents:
diff changeset
138 " Finally, look for any additions and/or exceptions to the content model.
db46d51a3939 Initial revision
axmo
parents:
diff changeset
139 " This is defined by a “+” or “-” followed by another content model
db46d51a3939 Initial revision
axmo
parents:
diff changeset
140 " declaration.
db46d51a3939 Initial revision
axmo
parents:
diff changeset
141 " TODO: Can the “-” be separated by whitespace from the “(”?
db46d51a3939 Initial revision
axmo
parents:
diff changeset
142 let seen = { '+(': 0, '-(': 0 }
db46d51a3939 Initial revision
axmo
parents:
diff changeset
143 while 1
db46d51a3939 Initial revision
axmo
parents:
diff changeset
144 let [additions_exceptions, end] = s:lex(line, end, '^[+-](')
db46d51a3939 Initial revision
axmo
parents:
diff changeset
145 if additions_exceptions != '+(' && additions_exceptions != '-('
db46d51a3939 Initial revision
axmo
parents:
diff changeset
146 let [token, end] = s:lex(line, end)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
147 if token == '>'
db46d51a3939 Initial revision
axmo
parents:
diff changeset
148 return indent
db46d51a3939 Initial revision
axmo
parents:
diff changeset
149 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
150 " TODO: Should use s:lex here on getline(v:lnum) and check for >.
db46d51a3939 Initial revision
axmo
parents:
diff changeset
151 return getline(v:lnum) =~ '^\s*>' || count(values(seen), 0) == 0 ? indent : (indent + &sw)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
152 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
153
db46d51a3939 Initial revision
axmo
parents:
diff changeset
154 " If we’ve seen an addition or exception already and this is of the same
db46d51a3939 Initial revision
axmo
parents:
diff changeset
155 " kind, the user is writing a broken DTD. Time to bail.
db46d51a3939 Initial revision
axmo
parents:
diff changeset
156 if seen[additions_exceptions]
db46d51a3939 Initial revision
axmo
parents:
diff changeset
157 return indent
db46d51a3939 Initial revision
axmo
parents:
diff changeset
158 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
159 let seen[additions_exceptions] = 1
db46d51a3939 Initial revision
axmo
parents:
diff changeset
160
db46d51a3939 Initial revision
axmo
parents:
diff changeset
161 let [indent_of_innermost, end] = s:indent_to_innermost_parentheses(line, end)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
162 if indent_of_innermost != -1
db46d51a3939 Initial revision
axmo
parents:
diff changeset
163 return indent_of_innermost
db46d51a3939 Initial revision
axmo
parents:
diff changeset
164 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
165 endwhile
db46d51a3939 Initial revision
axmo
parents:
diff changeset
166 elseif declaration == 'ATTLIST'
db46d51a3939 Initial revision
axmo
parents:
diff changeset
167 " Check for element name. If none exists, indent one level.
db46d51a3939 Initial revision
axmo
parents:
diff changeset
168 let [name, end] = s:lex(line, end)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
169 if name == ""
db46d51a3939 Initial revision
axmo
parents:
diff changeset
170 return indent + &sw
db46d51a3939 Initial revision
axmo
parents:
diff changeset
171 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
172
db46d51a3939 Initial revision
axmo
parents:
diff changeset
173 " Check for any number of attributes.
db46d51a3939 Initial revision
axmo
parents:
diff changeset
174 while 1
db46d51a3939 Initial revision
axmo
parents:
diff changeset
175 " Check for attribute name. If none exists, indent one level, unless the
db46d51a3939 Initial revision
axmo
parents:
diff changeset
176 " current line is a lone “>”, in which case we indent to the same level
db46d51a3939 Initial revision
axmo
parents:
diff changeset
177 " as the first line. Otherwise, if the attribute name is “>”, we have
db46d51a3939 Initial revision
axmo
parents:
diff changeset
178 " actually hit the end of the attribute list, in which case we indent to
db46d51a3939 Initial revision
axmo
parents:
diff changeset
179 " the same level as the first line.
db46d51a3939 Initial revision
axmo
parents:
diff changeset
180 let [name, end] = s:lex(line, end)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
181 if name == ""
db46d51a3939 Initial revision
axmo
parents:
diff changeset
182 " TODO: Should use s:lex here on getline(v:lnum) and check for >.
db46d51a3939 Initial revision
axmo
parents:
diff changeset
183 return getline(v:lnum) =~ '^\s*>' ? indent : (indent + &sw)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
184 elseif name == ">"
db46d51a3939 Initial revision
axmo
parents:
diff changeset
185 return indent
db46d51a3939 Initial revision
axmo
parents:
diff changeset
186 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
187
db46d51a3939 Initial revision
axmo
parents:
diff changeset
188 " Check for attribute value declaration. If none exists, indent two
db46d51a3939 Initial revision
axmo
parents:
diff changeset
189 " levels. Otherwise, if it’s an enumerated value, check for nested
db46d51a3939 Initial revision
axmo
parents:
diff changeset
190 " parentheses and indent to the innermost one if we don’t reach the end
db46d51a3939 Initial revision
axmo
parents:
diff changeset
191 " of the listc. Otherwise, just continue with looking for the default
db46d51a3939 Initial revision
axmo
parents:
diff changeset
192 " attribute value.
db46d51a3939 Initial revision
axmo
parents:
diff changeset
193 " TODO: Do validation of keywords
db46d51a3939 Initial revision
axmo
parents:
diff changeset
194 " (CDATA|NMTOKEN|NMTOKENS|ID|IDREF|IDREFS|ENTITY|ENTITIES)?
db46d51a3939 Initial revision
axmo
parents:
diff changeset
195 let [value, end] = s:lex(line, end, '^\%((\|[^[:space:]]\+\)')
db46d51a3939 Initial revision
axmo
parents:
diff changeset
196 if value == ""
db46d51a3939 Initial revision
axmo
parents:
diff changeset
197 return indent + &sw * 2
db46d51a3939 Initial revision
axmo
parents:
diff changeset
198 elseif value == 'NOTATION'
db46d51a3939 Initial revision
axmo
parents:
diff changeset
199 " If this is a enumerated value based on notations, read another token
db46d51a3939 Initial revision
axmo
parents:
diff changeset
200 " for the actual value. If it doesn’t exist, indent three levels.
db46d51a3939 Initial revision
axmo
parents:
diff changeset
201 " TODO: If validating according to above, value must be equal to '('.
db46d51a3939 Initial revision
axmo
parents:
diff changeset
202 let [value, end] = s:lex(line, end, '^\%((\|[^[:space:]]\+\)')
db46d51a3939 Initial revision
axmo
parents:
diff changeset
203 if value == ""
db46d51a3939 Initial revision
axmo
parents:
diff changeset
204 return indent + &sw * 3
db46d51a3939 Initial revision
axmo
parents:
diff changeset
205 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
206 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
207
db46d51a3939 Initial revision
axmo
parents:
diff changeset
208 if value == '('
db46d51a3939 Initial revision
axmo
parents:
diff changeset
209 let [indent_of_innermost, end] = s:indent_to_innermost_parentheses(line, end)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
210 if indent_of_innermost != -1
db46d51a3939 Initial revision
axmo
parents:
diff changeset
211 return indent_of_innermost
db46d51a3939 Initial revision
axmo
parents:
diff changeset
212 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
213 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
214
db46d51a3939 Initial revision
axmo
parents:
diff changeset
215 " Finally look for the attribute’s default value. If non exists, indent
db46d51a3939 Initial revision
axmo
parents:
diff changeset
216 " two levels.
39
c16898406ff2 synchorinize version 7.3.081
one@zeus.cr.ie.u-ryukyu.ac.jp
parents: 5
diff changeset
217 let [default, end] = s:lex(line, end, '^\%("\_[^"]*"\|#\(REQUIRED\|IMPLIED\|FIXED\)\)')
5
db46d51a3939 Initial revision
axmo
parents:
diff changeset
218 if default == ""
db46d51a3939 Initial revision
axmo
parents:
diff changeset
219 return indent + &sw * 2
db46d51a3939 Initial revision
axmo
parents:
diff changeset
220 elseif default == '#FIXED'
db46d51a3939 Initial revision
axmo
parents:
diff changeset
221 " We need to look for the fixed value. If non exists, indent three
db46d51a3939 Initial revision
axmo
parents:
diff changeset
222 " levels.
db46d51a3939 Initial revision
axmo
parents:
diff changeset
223 let [default, end] = s:lex(line, end, '^"\_[^"]*"')
db46d51a3939 Initial revision
axmo
parents:
diff changeset
224 if default == ""
db46d51a3939 Initial revision
axmo
parents:
diff changeset
225 return indent + &sw * 3
db46d51a3939 Initial revision
axmo
parents:
diff changeset
226 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
227 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
228 endwhile
db46d51a3939 Initial revision
axmo
parents:
diff changeset
229 elseif declaration == 'ENTITY'
db46d51a3939 Initial revision
axmo
parents:
diff changeset
230 " Check for entity name. If none exists, indent one level. Otherwise, if
db46d51a3939 Initial revision
axmo
parents:
diff changeset
231 " the name actually turns out to be a percent sign, “%”, this is a
db46d51a3939 Initial revision
axmo
parents:
diff changeset
232 " parameter entity. Read another token to determine the entity name and,
db46d51a3939 Initial revision
axmo
parents:
diff changeset
233 " again, if none exists, indent one level.
db46d51a3939 Initial revision
axmo
parents:
diff changeset
234 let [name, end] = s:lex(line, end)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
235 if name == ""
db46d51a3939 Initial revision
axmo
parents:
diff changeset
236 return indent + &sw
db46d51a3939 Initial revision
axmo
parents:
diff changeset
237 elseif name == '%'
db46d51a3939 Initial revision
axmo
parents:
diff changeset
238 let [name, end] = s:lex(line, end)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
239 if name == ""
db46d51a3939 Initial revision
axmo
parents:
diff changeset
240 return indent + &sw
db46d51a3939 Initial revision
axmo
parents:
diff changeset
241 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
242 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
243
db46d51a3939 Initial revision
axmo
parents:
diff changeset
244 " Now check for the entity value. If none exists, indent one level. If it
db46d51a3939 Initial revision
axmo
parents:
diff changeset
245 " does exist, indent to same level as first line, as we’re now done with
db46d51a3939 Initial revision
axmo
parents:
diff changeset
246 " this entity.
db46d51a3939 Initial revision
axmo
parents:
diff changeset
247 "
db46d51a3939 Initial revision
axmo
parents:
diff changeset
248 " The entity value can be a string in single or double quotes (no escapes
db46d51a3939 Initial revision
axmo
parents:
diff changeset
249 " to worry about, as entities are used instead). However, it can also be
db46d51a3939 Initial revision
axmo
parents:
diff changeset
250 " that this is an external unparsed entity. In that case we have to look
db46d51a3939 Initial revision
axmo
parents:
diff changeset
251 " further for (possibly) a public ID and an URI followed by the NDATA
db46d51a3939 Initial revision
axmo
parents:
diff changeset
252 " keyword and the actual notation name. For the public ID and URI, indent
db46d51a3939 Initial revision
axmo
parents:
diff changeset
253 " two levels, if they don’t exist. If the NDATA keyword doesn’t exist,
db46d51a3939 Initial revision
axmo
parents:
diff changeset
254 " indent one level. Otherwise, if the actual notation name doesn’t exist,
db46d51a3939 Initial revision
axmo
parents:
diff changeset
255 " indent two level. If it does, indent to same level as first line, as
db46d51a3939 Initial revision
axmo
parents:
diff changeset
256 " we’re now done with this entity.
db46d51a3939 Initial revision
axmo
parents:
diff changeset
257 let [value, end] = s:lex(line, end)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
258 if value == ""
db46d51a3939 Initial revision
axmo
parents:
diff changeset
259 return indent + &sw
db46d51a3939 Initial revision
axmo
parents:
diff changeset
260 elseif value == 'SYSTEM' || value == 'PUBLIC'
db46d51a3939 Initial revision
axmo
parents:
diff changeset
261 let [quoted_string, end] = s:lex(line, end, '\%("[^"]\+"\|''[^'']\+''\)')
db46d51a3939 Initial revision
axmo
parents:
diff changeset
262 if quoted_string == ""
db46d51a3939 Initial revision
axmo
parents:
diff changeset
263 return indent + &sw * 2
db46d51a3939 Initial revision
axmo
parents:
diff changeset
264 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
265
db46d51a3939 Initial revision
axmo
parents:
diff changeset
266 if value == 'PUBLIC'
db46d51a3939 Initial revision
axmo
parents:
diff changeset
267 let [quoted_string, end] = s:lex(line, end, '\%("[^"]\+"\|''[^'']\+''\)')
db46d51a3939 Initial revision
axmo
parents:
diff changeset
268 if quoted_string == ""
db46d51a3939 Initial revision
axmo
parents:
diff changeset
269 return indent + &sw * 2
db46d51a3939 Initial revision
axmo
parents:
diff changeset
270 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
271 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
272
db46d51a3939 Initial revision
axmo
parents:
diff changeset
273 let [ndata, end] = s:lex(line, end)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
274 if ndata == ""
db46d51a3939 Initial revision
axmo
parents:
diff changeset
275 return indent + &sw
db46d51a3939 Initial revision
axmo
parents:
diff changeset
276 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
277
db46d51a3939 Initial revision
axmo
parents:
diff changeset
278 let [name, end] = s:lex(line, end)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
279 return name == "" ? (indent + &sw * 2) : indent
db46d51a3939 Initial revision
axmo
parents:
diff changeset
280 else
db46d51a3939 Initial revision
axmo
parents:
diff changeset
281 return indent
db46d51a3939 Initial revision
axmo
parents:
diff changeset
282 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
283 elseif declaration == 'NOTATION'
db46d51a3939 Initial revision
axmo
parents:
diff changeset
284 " Check for notation name. If none exists, indent one level.
db46d51a3939 Initial revision
axmo
parents:
diff changeset
285 let [name, end] = s:lex(line, end)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
286 if name == ""
db46d51a3939 Initial revision
axmo
parents:
diff changeset
287 return indent + &sw
db46d51a3939 Initial revision
axmo
parents:
diff changeset
288 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
289
db46d51a3939 Initial revision
axmo
parents:
diff changeset
290 " Now check for the external ID. If none exists, indent one level.
db46d51a3939 Initial revision
axmo
parents:
diff changeset
291 let [id, end] = s:lex(line, end)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
292 if id == ""
db46d51a3939 Initial revision
axmo
parents:
diff changeset
293 return indent + &sw
db46d51a3939 Initial revision
axmo
parents:
diff changeset
294 elseif id == 'SYSTEM' || id == 'PUBLIC'
db46d51a3939 Initial revision
axmo
parents:
diff changeset
295 let [quoted_string, end] = s:lex(line, end, '\%("[^"]\+"\|''[^'']\+''\)')
db46d51a3939 Initial revision
axmo
parents:
diff changeset
296 if quoted_string == ""
db46d51a3939 Initial revision
axmo
parents:
diff changeset
297 return indent + &sw * 2
db46d51a3939 Initial revision
axmo
parents:
diff changeset
298 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
299
db46d51a3939 Initial revision
axmo
parents:
diff changeset
300 if id == 'PUBLIC'
db46d51a3939 Initial revision
axmo
parents:
diff changeset
301 let [quoted_string, end] = s:lex(line, end, '\%("[^"]\+"\|''[^'']\+''\|>\)')
db46d51a3939 Initial revision
axmo
parents:
diff changeset
302 if quoted_string == ""
db46d51a3939 Initial revision
axmo
parents:
diff changeset
303 " TODO: Should use s:lex here on getline(v:lnum) and check for >.
db46d51a3939 Initial revision
axmo
parents:
diff changeset
304 return getline(v:lnum) =~ '^\s*>' ? indent : (indent + &sw * 2)
db46d51a3939 Initial revision
axmo
parents:
diff changeset
305 elseif quoted_string == '>'
db46d51a3939 Initial revision
axmo
parents:
diff changeset
306 return indent
db46d51a3939 Initial revision
axmo
parents:
diff changeset
307 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
308 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
309 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
310
db46d51a3939 Initial revision
axmo
parents:
diff changeset
311 return indent
db46d51a3939 Initial revision
axmo
parents:
diff changeset
312 endif
db46d51a3939 Initial revision
axmo
parents:
diff changeset
313
db46d51a3939 Initial revision
axmo
parents:
diff changeset
314 " TODO: Processing directives could be indented I suppose. But perhaps it’s
db46d51a3939 Initial revision
axmo
parents:
diff changeset
315 " just as well to let the user decide how to indent them (perhaps extending
db46d51a3939 Initial revision
axmo
parents:
diff changeset
316 " this function to include proper support for whatever processing directive
db46d51a3939 Initial revision
axmo
parents:
diff changeset
317 " language they want to use).
db46d51a3939 Initial revision
axmo
parents:
diff changeset
318
db46d51a3939 Initial revision
axmo
parents:
diff changeset
319 " Conditional sections are simply passed along to let Vim decide what to do
db46d51a3939 Initial revision
axmo
parents:
diff changeset
320 " (and hence the user).
db46d51a3939 Initial revision
axmo
parents:
diff changeset
321 return -1
db46d51a3939 Initial revision
axmo
parents:
diff changeset
322 endfunction
db46d51a3939 Initial revision
axmo
parents:
diff changeset
323
db46d51a3939 Initial revision
axmo
parents:
diff changeset
324 let &cpo = s:cpo_save
48
67300faee616 v7-3-618
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
325 unlet s:cpo_save