2 // System.Web.Compilation.AspTokenizer
5 // Gonzalo Paniagua Javier (gonzalo@ximian.com)
7 // (C) 2002,2003 Ximian, Inc (http://www.ximian.com)
11 using System.Collections;
15 namespace System.Web.Compilation
19 public const int EOF = 0;
20 public const int IDENTIFIER = 1000;
21 public const int DIRECTIVE = 1001;
22 public const int ATTVALUE = 1002;
23 public const int TEXT = 1003;
24 public const int DOUBLEDASH = 1004;
25 public const int CLOSING = 1005;
42 public AspTokenizer (TextReader reader)
45 sb = new StringBuilder ();
47 hasPutBack = inTag = false;
52 get { return verbatim; }
53 set { verbatim = value; }
56 public void put_back ()
59 throw new HttpException ("put_back called twice!");
62 position -= Value.Length;
65 public int get_token ()
69 position += Value.Length;
76 current_token = NextToken ();
80 bool is_identifier_start_character (char c)
82 return (Char.IsLetter (c) || c == '_' );
85 bool is_identifier_part_character (char c)
87 return (Char.IsLetterOrDigit (c) || c == '_' || c == '-');
94 if (c == '\r' && sr.Peek () == '\n') {
112 int ReadAttValue (int start)
117 if (start == '"' || start == '\'') {
121 sb.Append ((char) start);
126 bool inServerTag = false;
128 while ((c = sr.Peek ()) != -1) {
129 if (c == '%' && last == '<') {
131 } else if (inServerTag && c == '>' && last == '%') {
133 } else if (!inServerTag) {
134 if (!quoted && (c == '/' || c == '>' || Char.IsWhiteSpace ((char) c))) {
136 } else if (quoted && c == quoteChar && last != '\\') {
142 sb.Append ((char) c);
147 return Token.ATTVALUE;
155 while ((c = read_char ()) != -1){
158 sb.Append ((char) c);
162 if (inTag && (c == '"' || c == '\''))
163 return ReadAttValue (c);
167 sb.Append ((char) c);
173 sb.Append ((char) c);
177 if (current_token == '<' && "%/!".IndexOf ((char) c) != -1){
178 sb.Append ((char) c);
182 if (inTag && current_token == '%' && "@#=".IndexOf ((char) c) != -1){
183 sb.Append ((char) c);
187 if (inTag && c == '-' && sr.Peek () == '-'){
190 return Token.DOUBLEDASH;
194 sb.Append ((char) c);
195 while ((c = sr.Peek ()) != -1 && c != '<')
196 sb.Append ((char) read_char ());
198 return (c != -1 || sb.Length > 0) ? Token.TEXT : Token.EOF;
201 if (inTag && current_token == '=' && !Char.IsWhiteSpace ((char) c))
202 return ReadAttValue (c);
204 if (inTag && is_identifier_start_character ((char) c)){
205 sb.Append ((char) c);
206 while ((c = sr.Peek ()) != -1) {
207 if (!is_identifier_part_character ((char) c) && c != ':')
209 sb.Append ((char) read_char ());
212 if (current_token == '@' && Directive.IsDirective (sb.ToString ()))
213 return Token.DIRECTIVE;
215 return Token.IDENTIFIER;
218 if (!Char.IsWhiteSpace ((char) c)) {
219 sb.Append ((char) c);
227 public string Value {
233 val = sb.ToString ();
239 get { return inTag; }
240 set { inTag = value; }
243 public int BeginLine {
244 get { return begline; }
247 public int BeginColumn {
248 get { return begcol; }
255 public int EndColumn {
259 public int Position {
260 get { return position; }