// Jericho HTML Parser - Java based library for analysing and manipulating HTML
// Version 3.2
// Copyright (C) 2004-2009 Martin Jericho
// http://jericho.htmlparser.net/
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of either one of the following licences:
//
// 1. The Eclipse Public License (EPL) version 1.0,
// included in this distribution in the file licence-epl-1.0.html
// or available at http://www.eclipse.org/legal/epl-v10.html
//
// 2. The GNU Lesser General Public License (LGPL) version 2.1 or later,
// included in this distribution in the file licence-lgpl-2.1.txt
// or available at http://www.gnu.org/licenses/lgpl.txt
//
// This library is distributed on an "AS IS" basis,
// WITHOUT WARRANTY OF ANY KIND, either express or implied.
// See the individual licence texts for more details.
package net.htmlparser.jericho;
import java.util.*;
/**
* Contains {@linkplain TagType tag types} representing Microsoft® <a target="_blank" href="http://en.wikipedia.org/wiki/Conditional_comment">conditional comments</a>.
* <p>
* Officially there are only two types of conditional comment,
* <a target="_blank" href="http://en.wikipedia.org/wiki/Conditional_comment#Downlevel-hidden_conditional_comment">downlevel-hidden</a> and
* <a target="_blank" href="http://en.wikipedia.org/wiki/Conditional_comment#Downlevel-revealed_conditional_comment">downlevel-revealed</a>,
* with each defining a start tag containing an "<code>if</code>" expression and an end tag containing the text "<code>endif</code>".
* <p>
* These four official tags are represented by the tag types
* {@link #DOWNLEVEL_HIDDEN_IF}, {@link #DOWNLEVEL_HIDDEN_ENDIF}, {@link #DOWNLEVEL_REVEALED_IF} and {@link #DOWNLEVEL_REVEALED_ENDIF}.
* <p>
* The conditional expression of an instance of any of the "<code>if</code>" tag types can be extracted using the {@link StartTag#getTagContent()} method.
* For example, if the variable <code>conditionalCommentIfTag</code> represents the tag <code><![if !IE]></code>, then the expression
* <code>conditionalCommentIfTag.getTagContent().toString().trim()</code> yields the string "<code>!IE</code>".
* <p>
* Conditional comments are only recognised by Internet Explorer. All other browsers recognise
* <a target="_blank" href="http://en.wikipedia.org/wiki/Conditional_comment#Downlevel-hidden_conditional_comment">downlevel-hidden</a> conditional comments as
* normal {@linkplain StartTagType#COMMENT comments}, and ignore
* <a target="_blank" href="http://en.wikipedia.org/wiki/Conditional_comment#Downlevel-revealed_conditional_comment">downlevel-revealed</a> conditional comment tags as
* unrecognised.
* <p>
* The use of <a target="_blank" href="http://en.wikipedia.org/wiki/Conditional_comment#Downlevel-revealed_conditional_comment">downlevel-revealed</a> conditional comments
* is generally avoided because they represent invalid HTML code. They can however be replaced by functionally equivalent syntactical constructs based on
* <a target="_blank" href="http://en.wikipedia.org/wiki/Conditional_comment#Downlevel-hidden_conditional_comment">downlevel-hidden</a> conditional comments
* so that the HTML remains valid.
* These composite constructs are represented by the tag types
* {@link #DOWNLEVEL_REVEALED_VALIDATING_IF}, {@link #DOWNLEVEL_REVEALED_VALIDATING_ENDIF} and {@link #DOWNLEVEL_REVEALED_VALIDATING_SIMPLIFIED_IF}.
* <p>
* Because none of the conditional comment end tags start with "<code></</code>", they are represented in this library as
* {@linkplain StartTagType start tag types}, and the parser makes no attempt to match if-endif tag pairs to form {@linkplain Element elements}.
* <p>
* The tag types defined in this class are not {@linkplain TagType#register() registered} by default.
*/
public final class MicrosoftConditionalCommentTagTypes {
/**
* The tag type given to a <a target="_blank" href="http://en.wikipedia.org/wiki/Conditional_comment#Downlevel-hidden_conditional_comment">downlevel-hidden conditional comment</a> <code>if</code> tag
* (<code><!--[if<var> ... </var>]></code>).
* <p>
* The corresponding end tag is represented by the tag type {@link #DOWNLEVEL_HIDDEN_ENDIF}.
* <p>
* <dl>
* <dt>Properties:</dt>
* <dd>
* <table class="bordered" style="margin: 15px" cellspacing="0">
* <tr><th>Property<th>Value
* <tr><td>{@link StartTagType#getDescription() Description}<td>Microsoft downlevel-hidden conditional comment IF
* <tr><td>{@link StartTagType#getStartDelimiter() StartDelimiter}<td><code><!--[if</code>
* <tr><td>{@link StartTagType#getClosingDelimiter() ClosingDelimiter}<td><code>]></code>
* <tr><td>{@link StartTagType#isServerTag() IsServerTag}<td><code>false</code>
* <tr><td>{@link StartTagType#getNamePrefix() NamePrefix}<td><code>!--[if</code>
* <tr><td>{@link StartTagType#getCorrespondingEndTagType() CorrespondingEndTagType}<td><code>null</code>
* <tr><td>{@link StartTagType#hasAttributes() HasAttributes}<td><code>false</code>
* <tr><td>{@link StartTagType#isNameAfterPrefixRequired() IsNameAfterPrefixRequired}<td><code>false</code>
* </table>
* <dt>Example:</dt>
* <dd><code><!--[if IE]></code></dd>
* </dl>
*/
public static final StartTagType DOWNLEVEL_HIDDEN_IF=StartTagTypeMicrosoftDownlevelHiddenConditionalCommentIf.INSTANCE;
/**
* The tag type given to a <a target="_blank" href="http://en.wikipedia.org/wiki/Conditional_comment#Downlevel-hidden_conditional_comment">downlevel-hidden conditional comment</a> <code>endif</code> tag
* (<code><![endif]--></code>).
* <p>
* The corresponding start tag is represented by the tag type {@link #DOWNLEVEL_HIDDEN_IF}.
* <p>
* Although this functions as an end tag, it is represented in this library as a {@linkplain StartTagType start tag type} because it does not start with the characters "<code></</code>".
* <p>
* <dl>
* <dt>Properties:</dt>
* <dd>
* <table class="bordered" style="margin: 15px" cellspacing="0">
* <tr><th>Property<th>Value
* <tr><td>{@link StartTagType#getDescription() Description}<td>Microsoft downlevel-hidden conditional comment ENDIF
* <tr><td>{@link StartTagType#getStartDelimiter() StartDelimiter}<td><code><![endif]--></code>
* <tr><td>{@link StartTagType#getClosingDelimiter() ClosingDelimiter}<td><i>(empty string)</i>
* <tr><td>{@link StartTagType#isServerTag() IsServerTag}<td><code>false</code>
* <tr><td>{@link StartTagType#getNamePrefix() NamePrefix}<td><code>![endif]--></code>
* <tr><td>{@link StartTagType#getCorrespondingEndTagType() CorrespondingEndTagType}<td><code>null</code>
* <tr><td>{@link StartTagType#hasAttributes() HasAttributes}<td><code>false</code>
* <tr><td>{@link StartTagType#isNameAfterPrefixRequired() IsNameAfterPrefixRequired}<td><code>false</code>
* </table>
* <dt>Example:</dt>
* <dd><code><![endif]></code></dd>
* </dl>
*/
public static final StartTagType DOWNLEVEL_HIDDEN_ENDIF=StartTagTypeMicrosoftDownlevelHiddenConditionalCommentEndif.INSTANCE;
/**
* The tag type given to a <a target="_blank" href="http://en.wikipedia.org/wiki/Conditional_comment#Downlevel-revealed_conditional_comment">downlevel-revealed conditional comment</a> <code>if</code> tag
* (<code><![if<var> ... </var>]></code>).
* <p>
* The corresponding end tag is represented by the tag type {@link #DOWNLEVEL_REVEALED_ENDIF}.
* <p>
* <dl>
* <dt>Properties:</dt>
* <dd>
* <table class="bordered" style="margin: 15px" cellspacing="0">
* <tr><th>Property<th>Value
* <tr><td>{@link StartTagType#getDescription() Description}<td>Microsoft downlevel-revealed conditional comment IF
* <tr><td>{@link StartTagType#getStartDelimiter() StartDelimiter}<td><code><![if</code>
* <tr><td>{@link StartTagType#getClosingDelimiter() ClosingDelimiter}<td><code>]></code>
* <tr><td>{@link StartTagType#isServerTag() IsServerTag}<td><code>false</code>
* <tr><td>{@link StartTagType#getNamePrefix() NamePrefix}<td><code>![if</code>
* <tr><td>{@link StartTagType#getCorrespondingEndTagType() CorrespondingEndTagType}<td><code>null</code>
* <tr><td>{@link StartTagType#hasAttributes() HasAttributes}<td><code>false</code>
* <tr><td>{@link StartTagType#isNameAfterPrefixRequired() IsNameAfterPrefixRequired}<td><code>false</code>
* </table>
* <dt>Example:</dt>
* <dd><code><![if !IE]></code></dd>
* </dl>
*/
public static final StartTagType DOWNLEVEL_REVEALED_IF=StartTagTypeMicrosoftDownlevelRevealedConditionalCommentIf.INSTANCE;
/**
* The tag type given to a <a target="_blank" href="http://en.wikipedia.org/wiki/Conditional_comment#Downlevel-revealed_conditional_comment">downlevel-revealed conditional comment</a> <code>endif</code> tag
* (<code><![endif]></code>).
* <p>
* The corresponding start tag is represented by the tag type {@link #DOWNLEVEL_REVEALED_IF}.
* <p>
* Although this functions as an end tag, it is represented in this library as a {@linkplain StartTagType start tag type} because it does not start with the characters "<code></</code>".
* <p>
* <dl>
* <dt>Properties:</dt>
* <dd>
* <table class="bordered" style="margin: 15px" cellspacing="0">
* <tr><th>Property<th>Value
* <tr><td>{@link StartTagType#getDescription() Description}<td>Microsoft downlevel-revealed conditional comment ENDIF
* <tr><td>{@link StartTagType#getStartDelimiter() StartDelimiter}<td><code><![endif]></code>
* <tr><td>{@link StartTagType#getClosingDelimiter() ClosingDelimiter}<td><i>(empty string)</i>
* <tr><td>{@link StartTagType#isServerTag() IsServerTag}<td><code>false</code>
* <tr><td>{@link StartTagType#getNamePrefix() NamePrefix}<td><code>![endif]></code>
* <tr><td>{@link StartTagType#getCorrespondingEndTagType() CorrespondingEndTagType}<td><code>null</code>
* <tr><td>{@link StartTagType#hasAttributes() HasAttributes}<td><code>false</code>
* <tr><td>{@link StartTagType#isNameAfterPrefixRequired() IsNameAfterPrefixRequired}<td><code>false</code>
* </table>
* <dt>Example:</dt>
* <dd><code><![endif]></code></dd>
* </dl>
*/
public static final StartTagType DOWNLEVEL_REVEALED_ENDIF=StartTagTypeMicrosoftDownlevelRevealedConditionalCommentEndif.INSTANCE;
/**
* The tag type given to a validating <a target="_blank" href="http://en.wikipedia.org/wiki/Conditional_comment#Downlevel-revealed_conditional_comment">downlevel-revealed conditional comment</a> <code>if</code> tag
* (<code><!--[if<var> ... </var>]><!--></code>).
* <p>
* The corresponding end tag is represented by the tag type {@link #DOWNLEVEL_REVEALED_VALIDATING_ENDIF}.
* <p>
* This tag is actually a composite syntactical construct containing a
* <a target="_blank" href="http://en.wikipedia.org/wiki/Conditional_comment#Downlevel-hidden_conditional_comment">downlevel-hidden conditional comment</a> <code>if</code> tag.
* <p>
* <dl>
* <dt>Properties:</dt>
* <dd>
* <table class="bordered" style="margin: 15px" cellspacing="0">
* <tr><th>Property<th>Value
* <tr><td>{@link StartTagType#getDescription() Description}<td>Microsoft downlevel-revealed validating conditional comment IF
* <tr><td>{@link StartTagType#getStartDelimiter() StartDelimiter}<td><code><!--[if</code>
* <tr><td>{@link StartTagType#getClosingDelimiter() ClosingDelimiter}<td><code>]><!--></code>
* <tr><td>{@link StartTagType#isServerTag() IsServerTag}<td><code>false</code>
* <tr><td>{@link StartTagType#getNamePrefix() NamePrefix}<td><code>!--[if</code>
* <tr><td>{@link StartTagType#getCorrespondingEndTagType() CorrespondingEndTagType}<td><code>null</code>
* <tr><td>{@link StartTagType#hasAttributes() HasAttributes}<td><code>false</code>
* <tr><td>{@link StartTagType#isNameAfterPrefixRequired() IsNameAfterPrefixRequired}<td><code>false</code>
* </table>
* <dt>Example:</dt>
* <dd><code><!--[if !(IE 5)]><!--></code></dd>
* </dl>
*/
public static final StartTagType DOWNLEVEL_REVEALED_VALIDATING_IF=StartTagTypeMicrosoftDownlevelRevealedValidatingConditionalCommentIf.INSTANCE;
/**
* The tag type given to a validating <a target="_blank" href="http://en.wikipedia.org/wiki/Conditional_comment#Downlevel-revealed_conditional_comment">downlevel-revealed conditional comment</a> <code>endif</code> tag
* (<code><!--<![endif]--></code>).
* <p>
* The corresponding start tag is represented by the tag type {@link #DOWNLEVEL_REVEALED_VALIDATING_IF}.
* <p>
* This tag is actually a composite syntactical construct containing a
* <a target="_blank" href="http://en.wikipedia.org/wiki/Conditional_comment#Downlevel-hidden_conditional_comment">downlevel-hidden conditional comment</a> <code>endif</code> tag.
* <p>
* Although this functions as an end tag, it is represented in this library as a {@linkplain StartTagType start tag type} because it does not start with the characters "<code></</code>".
* <p>
* <dl>
* <dt>Properties:</dt>
* <dd>
* <table class="bordered" style="margin: 15px" cellspacing="0">
* <tr><th>Property<th>Value
* <tr><td>{@link StartTagType#getDescription() Description}<td>Microsoft downlevel-revealed validating conditional comment ENDIF
* <tr><td>{@link StartTagType#getStartDelimiter() StartDelimiter}<td><code><!--<![endif]--></code>
* <tr><td>{@link StartTagType#getClosingDelimiter() ClosingDelimiter}<td><i>(empty string)</i>
* <tr><td>{@link StartTagType#isServerTag() IsServerTag}<td><code>false</code>
* <tr><td>{@link StartTagType#getNamePrefix() NamePrefix}<td><code>!--<![endif]--></code>
* <tr><td>{@link StartTagType#getCorrespondingEndTagType() CorrespondingEndTagType}<td><code>null</code>
* <tr><td>{@link StartTagType#hasAttributes() HasAttributes}<td><code>false</code>
* <tr><td>{@link StartTagType#isNameAfterPrefixRequired() IsNameAfterPrefixRequired}<td><code>false</code>
* </table>
* <dt>Example:</dt>
* <dd><code><!--<![endif]--></code></dd>
* </dl>
*/
public static final StartTagType DOWNLEVEL_REVEALED_VALIDATING_ENDIF=StartTagTypeMicrosoftDownlevelRevealedValidatingConditionalCommentEndif.INSTANCE;
/**
* The tag type given to a validating simplified <a target="_blank" href="http://en.wikipedia.org/wiki/Conditional_comment#Downlevel-revealed_conditional_comment">downlevel-revealed conditional comment</a> <code>if</code> tag
* (<code><!--[if<var> ... </var>]>--></code>).
* <p>
* This form of validating downlevel-revealed conditional comment must only be used when the condition always evaluated to false in Internet Explorer,
* which means the condition should be either "<code>false</code>" or "<code>!IE</code>".
* <p>
* The corresponding end tag is represented by the tag type {@link #DOWNLEVEL_REVEALED_VALIDATING_ENDIF}, which is identical to the corresponding end tag of {@link #DOWNLEVEL_REVEALED_VALIDATING_IF}.
* <p>
* This tag is actually a composite syntactical construct containing a
* <a target="_blank" href="http://en.wikipedia.org/wiki/Conditional_comment#Downlevel-hidden_conditional_comment">downlevel-hidden conditional comment</a> <code>if</code> tag.
* <p>
* <dl>
* <dt>Properties:</dt>
* <dd>
* <table class="bordered" style="margin: 15px" cellspacing="0">
* <tr><th>Property<th>Value
* <tr><td>{@link StartTagType#getDescription() Description}<td>Microsoft downlevel-revealed validating simplified conditional comment IF
* <tr><td>{@link StartTagType#getStartDelimiter() StartDelimiter}<td><code><!--[if</code>
* <tr><td>{@link StartTagType#getClosingDelimiter() ClosingDelimiter}<td><code>]>--></code>
* <tr><td>{@link StartTagType#isServerTag() IsServerTag}<td><code>false</code>
* <tr><td>{@link StartTagType#getNamePrefix() NamePrefix}<td><code>!--[if</code>
* <tr><td>{@link StartTagType#getCorrespondingEndTagType() CorrespondingEndTagType}<td><code>null</code>
* <tr><td>{@link StartTagType#hasAttributes() HasAttributes}<td><code>false</code>
* <tr><td>{@link StartTagType#isNameAfterPrefixRequired() IsNameAfterPrefixRequired}<td><code>false</code>
* </table>
* <dt>Example:</dt>
* <dd><code><!--[if !IE]>--></code></dd>
* </dl>
*/
public static final StartTagType DOWNLEVEL_REVEALED_VALIDATING_SIMPLIFIED_IF=StartTagTypeMicrosoftDownlevelRevealedValidatingSimplifiedConditionalCommentIf.INSTANCE;
private static final TagType[] TAG_TYPES={
DOWNLEVEL_HIDDEN_IF,
DOWNLEVEL_HIDDEN_ENDIF,
DOWNLEVEL_REVEALED_IF,
DOWNLEVEL_REVEALED_ENDIF,
DOWNLEVEL_REVEALED_VALIDATING_IF, // this must come after DOWNLEVEL_HIDDEN_IF so it has higher precedence
DOWNLEVEL_REVEALED_VALIDATING_SIMPLIFIED_IF, // this must come after DOWNLEVEL_HIDDEN_IF so it has higher precedence
DOWNLEVEL_REVEALED_VALIDATING_ENDIF
};
private MicrosoftConditionalCommentTagTypes() {}
/**
* {@linkplain TagType#register() Registers} all of the tag types defined in this class at once.
* <p>
* The tag types must be registered before the parser will recognise them.
*/
public static void register() {
for (TagType tagType : TAG_TYPES) tagType.register();
}
/**
* {@linkplain TagType#deregister() Deregisters} all of the tag types defined in this class at once.
*/
public static void deregister() {
for (TagType tagType : TAG_TYPES) tagType.deregister();
}
/**
* Indicates whether the specified tag type is defined in this class.
*
* @param tagType the {@link TagType} to test.
* @return <code>true</code> if the specified tag type is defined in this class, otherwise <code>false</code>.
*/
public static boolean defines(final TagType tagType) {
for (TagType definedTagType : TAG_TYPES) if (tagType==definedTagType) return true;
return false;
}
}