| /******************************************************************************* |
| * Copyright (c) 2004 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.wst.html.core.internal.document; |
| |
| |
| |
| /** |
| */ |
| class TagScanner { |
| |
| private String tag = null; |
| private int offset = 0; |
| private int length = 0; |
| private boolean oneLine = false; |
| |
| /** |
| */ |
| TagScanner(String tag, int offset) { |
| super(); |
| |
| this.tag = tag; |
| this.offset = offset; |
| if (tag != null) |
| this.length = tag.length(); |
| } |
| |
| /** |
| */ |
| TagScanner(String tag, int offset, boolean oneLine) { |
| this(tag, offset); |
| |
| this.oneLine = oneLine; |
| } |
| |
| /** |
| */ |
| int getNextOffset() { |
| for (; this.offset < this.length; this.offset++) { |
| char c = this.tag.charAt(this.offset); |
| if (!isEnd(c)) |
| break; |
| } |
| return this.offset; |
| } |
| |
| /** |
| */ |
| int getOffset() { |
| return this.offset; |
| } |
| |
| /** |
| */ |
| private final boolean isEnd(char c) { |
| return (this.oneLine && (c == '\r' || c == '\n')); |
| } |
| |
| /** |
| */ |
| private static boolean isEqual(char c) { |
| return (c == '='); |
| } |
| |
| /** |
| */ |
| private static boolean isQuote(char c) { |
| return (c == '"' || c == '\''); |
| } |
| |
| /** |
| */ |
| private static boolean isSpace(char c) { |
| return Character.isWhitespace(c); |
| } |
| |
| /** |
| */ |
| private char nextChar() { |
| for (; this.offset < this.length; this.offset++) { |
| char c = this.tag.charAt(this.offset); |
| if (isEnd(c)) |
| break; |
| if (!isSpace(c)) |
| return c; |
| } |
| return 0; |
| } |
| |
| /** |
| */ |
| String nextName() { |
| if (this.tag == null) |
| return null; |
| if (this.offset >= this.length) |
| return null; |
| |
| if (nextChar() == 0) |
| return null; |
| |
| int nameOffset = this.offset; |
| for (; this.offset < this.length; this.offset++) { |
| char c = this.tag.charAt(this.offset); |
| if (isEnd(c) || isSpace(c)) |
| break; |
| if (isEqual(c) && this.offset > nameOffset) |
| break; |
| } |
| if (this.offset == nameOffset) |
| return null; |
| |
| return this.tag.substring(nameOffset, this.offset); |
| } |
| |
| /** |
| */ |
| String nextValue() { |
| if (this.tag == null) |
| return null; |
| if (this.offset >= this.length) |
| return null; |
| |
| char seperator = nextChar(); |
| if (!isEqual(seperator)) |
| return null; |
| this.offset++; // skip '=' |
| char quote = nextChar(); |
| if (quote == 0) |
| return null; |
| if (isQuote(quote)) |
| this.offset++; |
| else |
| quote = 0; |
| |
| int valueOffset = this.offset; |
| for (; this.offset < this.length; this.offset++) { |
| char c = this.tag.charAt(this.offset); |
| if (isEnd(c)) { |
| quote = 0; |
| break; |
| } |
| if (quote == 0) { |
| if (isSpace(c)) |
| break; |
| } |
| else { |
| if (c == quote) |
| break; |
| } |
| } |
| int valueEnd = this.offset; |
| if (quote != 0 && this.offset < this.length) |
| this.offset++; |
| if (valueEnd == valueOffset) |
| return null; |
| |
| return this.tag.substring(valueOffset, valueEnd); |
| } |
| } |