2
// System.Web.Compilation.AspTokenizer
5
// Gonzalo Paniagua Javier (gonzalo@ximian.com)
7
// (C) 2002,2003 Ximian, Inc (http://www.ximian.com)
11
// Permission is hereby granted, free of charge, to any person obtaining
12
// a copy of this software and associated documentation files (the
13
// "Software"), to deal in the Software without restriction, including
14
// without limitation the rights to use, copy, modify, merge, publish,
15
// distribute, sublicense, and/or sell copies of the Software, and to
16
// permit persons to whom the Software is furnished to do so, subject to
17
// the following conditions:
19
// The above copyright notice and this permission notice shall be
20
// included in all copies or substantial portions of the Software.
22
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32
using System.Collections;
37
namespace AspNetEdit.Editor.Persistence
41
public const int EOF = 0x0200000;
42
public const int IDENTIFIER = 0x0200001;
43
public const int DIRECTIVE = 0x0200002;
44
public const int ATTVALUE = 0x0200003;
45
public const int TEXT = 0x0200004;
46
public const int DOUBLEDASH = 0x0200005;
47
public const int CLOSING = 0x0200006;
54
StringBuilder sb, odds;
67
public AspTokenizer (TextReader reader)
70
sb = new StringBuilder ();
71
odds= new StringBuilder();
73
hasPutBack = inTag = false;
78
get { return verbatim; }
79
set { verbatim = value; }
82
public void put_back ()
85
throw new HttpException ("put_back called twice!");
88
position -= Value.Length;
91
public int get_token ()
95
position += Value.Length;
102
current_token = NextToken ();
103
return current_token;
106
bool is_identifier_start_character (char c)
108
return (Char.IsLetter (c) || c == '_' );
111
bool is_identifier_part_character (char c)
113
return (Char.IsLetterOrDigit (c) || c == '_' || c == '-');
116
void ungetc (int value)
121
// Only '/' passes through here now.
122
// If we ever let \n here, update 'line'
137
if (c == '\r' && sr.Peek () == '\n') {
155
int ReadAttValue (int start)
160
if (start == '"' || start == '\'') {
164
sb.Append ((char) start);
169
bool inServerTag = false;
171
while ((c = sr.Peek ()) != -1) {
172
if (c == '%' && last == '<') {
174
} else if (inServerTag && c == '>' && last == '%') {
176
} else if (!inServerTag) {
177
if (!quoted && c == '/') {
182
} else if (c == '>') {
186
} else if (!quoted && (c == '>' || Char.IsWhiteSpace ((char) c))) {
188
} else if (quoted && c == quoteChar && last != '\\') {
194
sb.Append ((char) c);
199
return Token.ATTVALUE;
208
while ((c = read_char ()) != -1){
211
sb.Append ((char) c);
215
if (inTag && expectAttrValue && (c == '"' || c == '\''))
216
return ReadAttValue (c);
220
sb.Append ((char) c);
226
sb.Append ((char) c);
230
if (current_token == '<' && "%/!".IndexOf ((char) c) != -1){
231
sb.Append ((char) c);
235
if (inTag && current_token == '%' && "@#=".IndexOf ((char) c) != -1){
236
sb.Append ((char) c);
240
if (inTag && c == '-' && sr.Peek () == '-'){
243
return Token.DOUBLEDASH;
247
sb.Append ((char) c);
248
while ((c = sr.Peek ()) != -1 && c != '<')
249
sb.Append ((char) read_char ());
251
return (c != -1 || sb.Length > 0) ? Token.TEXT : Token.EOF;
254
if (inTag && current_token == '=' && !Char.IsWhiteSpace ((char) c))
255
return ReadAttValue (c);
257
if (inTag && is_identifier_start_character ((char) c)){
258
sb.Append ((char) c);
259
while ((c = sr.Peek ()) != -1) {
260
if (!is_identifier_part_character ((char) c) && c != ':')
262
sb.Append ((char) read_char ());
265
if (current_token == '@' && Directive.IsDirective (sb.ToString ()))
266
return Token.DIRECTIVE;
268
return Token.IDENTIFIER;
271
if (!Char.IsWhiteSpace ((char) c)) {
272
sb.Append ((char) c);
275
// keep otherwise discarded characters in case we need.
276
odds.Append((char) c);
282
public string Value {
288
val = sb.ToString ();
295
return odds.ToString();
300
get { return inTag; }
301
set { inTag = value; }
304
// Hack for preventing confusion with VB comments (see bug #63451)
305
public bool ExpectAttrValue {
306
get { return expectAttrValue; }
307
set { expectAttrValue = value; }
310
public int BeginLine {
311
get { return begline; }
314
public int BeginColumn {
315
get { return begcol; }
322
public int EndColumn {
326
public int Position {
327
get { return position; }