All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.helger.html.EHTMLElement Maven / Gradle / Ivy

/**
 * Copyright (C) 2014-2016 Philip Helger (www.helger.com)
 * philip[at]helger[dot]com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.helger.html;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;

import com.helger.commons.annotation.Nonempty;
import com.helger.commons.collection.ext.CommonsHashSet;
import com.helger.commons.collection.ext.ICommonsSet;
import com.helger.commons.string.StringHelper;

/**
 * Contains a list of all HTML element names.
 *
 * @author Philip Helger
 */
public enum EHTMLElement
{
  A ("a", false, EHTMLContentModelType.FLOW),
  ABBR ("abbr", false, EHTMLContentModelType.PHRASING),
  ADDRESS ("address", false, EHTMLContentModelType.FLOW),
  APPLET ("applet", false, EHTMLContentModelType.FLOW),
  AREA ("area", true, EHTMLContentModelType.PHRASING),
  ARTICLE ("article", false, EHTMLContentModelType.FLOW),
  ASIDE ("aside", false, EHTMLContentModelType.FLOW),
  AUDIO ("audio", false, EHTMLContentModelType.FLOW),
  B ("b", false, EHTMLContentModelType.PHRASING),
  BASE ("base", true, EHTMLContentModelType.EMPTY),
  BDI ("bdi", false, EHTMLContentModelType.PHRASING),
  BDO ("bdo", false, EHTMLContentModelType.PHRASING),
  BLOCKQUOTE ("blockquote", false, EHTMLContentModelType.FLOW),
  BODY ("body", false, EHTMLContentModelType.SPECIAL),
  BR ("br", true, EHTMLContentModelType.PHRASING),
  BUTTON ("button", false, EHTMLContentModelType.PHRASING),
  CANVAS ("canvas", false, EHTMLContentModelType.FLOW),
  CAPTION ("caption", false, EHTMLContentModelType.FLOW),
  CENTER ("center", false, EHTMLContentModelType.LEGACY_PHRASING),
  CITE ("cite", false, EHTMLContentModelType.PHRASING),
  CODE ("code", false, EHTMLContentModelType.PHRASING),
  COL ("col", true, EHTMLContentModelType.EMPTY),
  COLGROUP ("colgroup", false, EHTMLContentModelType.CHILD),
  COMMAND ("command", false, EHTMLContentModelType.PHRASING_METADATA),
  DATA ("data", false, EHTMLContentModelType.PHRASING),
  DATALIST ("datalist", false, EHTMLContentModelType.PHRASING),
  DD ("dd", false, EHTMLContentModelType.FLOW),
  DEL ("del", false, EHTMLContentModelType.FLOW),
  DETAILS ("details", false, EHTMLContentModelType.FLOW),
  DFN ("dfn", false, EHTMLContentModelType.PHRASING),
  DIR ("dir", false, EHTMLContentModelType.LEGACY_PHRASING),
  DIV ("div", false, EHTMLContentModelType.FLOW),
  DL ("dl", false, EHTMLContentModelType.FLOW),
  DT ("dt", false, EHTMLContentModelType.FLOW),
  EM ("em", false, EHTMLContentModelType.PHRASING),
  EMBED ("embed", true, EHTMLContentModelType.PHRASING),
  FIELDSET ("fieldset", false, EHTMLContentModelType.FLOW),
  FIGCAPTION ("figcaption", false, EHTMLContentModelType.FLOW),
  FIGURE ("figure", false, EHTMLContentModelType.FLOW),
  FONT ("font", false, EHTMLContentModelType.UNDEFINED),
  FOOTER ("footer", false, EHTMLContentModelType.FLOW),
  FORM ("form", false, EHTMLContentModelType.FLOW),
  FRAME ("frame", true, EHTMLContentModelType.UNDEFINED),
  FRAMESET ("frameset", false, EHTMLContentModelType.UNDEFINED),
  H1 ("h1", false, EHTMLContentModelType.FLOW),
  H2 ("h2", false, EHTMLContentModelType.FLOW),
  H3 ("h3", false, EHTMLContentModelType.FLOW),
  H4 ("h4", false, EHTMLContentModelType.FLOW),
  H5 ("h5", false, EHTMLContentModelType.FLOW),
  H6 ("h6", false, EHTMLContentModelType.FLOW),
  HEAD ("head", false, EHTMLContentModelType.SPECIAL),
  HEADER ("header", false, EHTMLContentModelType.FLOW),
  HGROUP ("hgroup", false, EHTMLContentModelType.FLOW),
  HR ("hr", true, EHTMLContentModelType.FLOW),
  HTML ("html", false, EHTMLContentModelType.SPECIAL),
  I ("i", false, EHTMLContentModelType.PHRASING),
  IFRAME ("iframe", false, EHTMLContentModelType.PHRASING),
  IMG ("img", true, EHTMLContentModelType.PHRASING),
  INS ("ins", false, EHTMLContentModelType.FLOW),
  INPUT ("input", true, EHTMLContentModelType.PHRASING),
  KBD ("kbd", false, EHTMLContentModelType.PHRASING),
  KEYGEN ("keygen", true, EHTMLContentModelType.PHRASING),
  LABEL ("label", false, EHTMLContentModelType.PHRASING),
  LEGEND ("legend", false, EHTMLContentModelType.CHILD),
  LI ("li", false, EHTMLContentModelType.CHILD),
  LINK ("link", true, EHTMLContentModelType.METADATA),
  MAIN ("main", false, EHTMLContentModelType.FLOW),
  MAP ("map", false, EHTMLContentModelType.FLOW),
  MARK ("mark", false, EHTMLContentModelType.PHRASING),
  MENU ("menu", false, EHTMLContentModelType.FLOW),
  MENUITEM ("menuitem", false, EHTMLContentModelType.FLOW),
  META ("meta", true, EHTMLContentModelType.METADATA),
  METER ("meter", false, EHTMLContentModelType.PHRASING),
  NAV ("nav", false, EHTMLContentModelType.FLOW),
  NOBR ("nobr", false, EHTMLContentModelType.UNDEFINED),
  NOSCRIPT ("noscript", false, EHTMLContentModelType.FLOW_METADATA),
  OBJECT ("object", false, EHTMLContentModelType.FLOW),
  OL ("ol", false, EHTMLContentModelType.FLOW),
  OPTGROUP ("optgroup", false, EHTMLContentModelType.CHILD),
  OPTION ("option", false, EHTMLContentModelType.CHILD),
  OUTPUT ("output", false, EHTMLContentModelType.PHRASING),
  P ("p", false, EHTMLContentModelType.FLOW),
  PARAM ("param", false, EHTMLContentModelType.CHILD),
  PICTURE ("picture", false, EHTMLContentModelType.FLOW_METADATA),
  PRE ("pre", false, EHTMLContentModelType.FLOW),
  PROGRESS ("progress", false, EHTMLContentModelType.PHRASING),
  RP ("rp", false, EHTMLContentModelType.CHILD),
  RT ("rt", false, EHTMLContentModelType.CHILD),
  RUBY ("ruby", false, EHTMLContentModelType.PHRASING),
  Q ("q", false, EHTMLContentModelType.PHRASING),
  S ("s", false, EHTMLContentModelType.PHRASING),
  SAMP ("samp", false, EHTMLContentModelType.PHRASING),
  SCRIPT ("script", false, EHTMLContentModelType.PHRASING_METADATA),
  SECTION ("section", false, EHTMLContentModelType.FLOW),
  SELECT ("select", false, EHTMLContentModelType.PHRASING),
  SMALL ("small", false, EHTMLContentModelType.PHRASING),
  SOURCE ("source", true, EHTMLContentModelType.CHILD),
  SPAN ("span", false, EHTMLContentModelType.PHRASING),
  STRONG ("strong", false, EHTMLContentModelType.PHRASING),
  SUB ("sub", false, EHTMLContentModelType.PHRASING),
  SUMMARY ("summary", false, EHTMLContentModelType.CHILD),
  SUP ("sup", false, EHTMLContentModelType.PHRASING),
  STYLE ("style", false, EHTMLContentModelType.METADATA),
  TABLE ("table", false, EHTMLContentModelType.FLOW),
  TBODY ("tbody", false, EHTMLContentModelType.CHILD),
  TD ("td", false, EHTMLContentModelType.CHILD),
  TEXTAREA ("textarea", false, EHTMLContentModelType.PHRASING),
  // Any, except the html element, the head element, the body element, or the
  // frameset element:
  TEMPLATE ("template", false, EHTMLContentModelType.SPECIAL),
  TFOOT ("tfoot", false, EHTMLContentModelType.CHILD),
  TH ("th", false, EHTMLContentModelType.CHILD),
  THEAD ("thead", false, EHTMLContentModelType.CHILD),
  TIME ("time", false, EHTMLContentModelType.PHRASING),
  TITLE ("title", false, EHTMLContentModelType.CHILD),
  TR ("tr", false, EHTMLContentModelType.CHILD),
  TRACK ("track", true, EHTMLContentModelType.CHILD),
  U ("u", false, EHTMLContentModelType.PHRASING),
  UL ("ul", false, EHTMLContentModelType.FLOW),
  VAR ("var", false, EHTMLContentModelType.PHRASING),
  VIDEO ("video", false, EHTMLContentModelType.FLOW),
  WBR ("wbr", true, EHTMLContentModelType.PHRASING);

  private static final ICommonsSet  s_aSelfClosedElements = new CommonsHashSet <> ();

  private final String m_sElementNameLC;
  private final String m_sElementNameUC;
  private final boolean m_bMayBeSelfClosed;
  private final EHTMLContentModelType m_eType;

  private EHTMLElement (@Nonnull @Nonempty final String sElementName,
                        final boolean bMayBeSelfClosed,
                        @Nonnull final EHTMLContentModelType eType)
  {
    m_sElementNameLC = sElementName.toLowerCase (CHTMLCharset.LOCALE);
    m_sElementNameUC = sElementName.toUpperCase (CHTMLCharset.LOCALE);
    m_bMayBeSelfClosed = bMayBeSelfClosed;
    m_eType = eType;
  }

  /**
   * @return The defined element name in any lower case. Neither
   *         null nor empty.
   */
  @Nonnull
  @Nonempty
  public String getElementName ()
  {
    return m_sElementNameLC;
  }

  /**
   * @return The defined element name in upper case characters. Neither
   *         null nor empty.
   */
  @Nonnull
  @Nonempty
  public String getElementNameUpperCase ()
  {
    return m_sElementNameUC;
  }

  /**
   * @return true if this element may be self-closed (e.g. <br
   *         />), and false if not (e.g.
   *         <link...></link>)
   */
  public boolean mayBeSelfClosed ()
  {
    return m_bMayBeSelfClosed;
  }

  /**
   * @return true if this element may not be self-closed (e.g.
   *         <link...></link>), false if it may be
   *         self-closed (e.g. <br />)
   */
  public boolean mayNotBeSelfClosed ()
  {
    return !m_bMayBeSelfClosed;
  }

  public boolean isFlowElement ()
  {
    return m_eType.isFlowElement ();
  }

  public boolean isMetadataElement ()
  {
    return m_eType.isMetadataElement ();
  }

  public boolean isPhrasingElement ()
  {
    return m_eType.isPhrasingElement ();
  }

  @Nonnull
  private static ICommonsSet  _getSelfClosedSet ()
  {
    if (s_aSelfClosedElements.isEmpty ())
    {
      // Lazy init, because it cannot be done in the constructor!
      for (final EHTMLElement e : values ())
        if (e.mayBeSelfClosed ())
        {
          // Always use lower cased value
          s_aSelfClosedElements.add (e.m_sElementNameLC);
        }
    }
    return s_aSelfClosedElements;
  }

  /**
   * Check if the passed element may be self closed when creating HTML.
   *
   * @param sElementName
   *        The name of the tag to validate.
   * @return true if the tag may not be self closed.
   */
  public static boolean isTagThatMayBeSelfClosed (@Nullable final String sElementName)
  {
    if (StringHelper.hasNoText (sElementName))
      return false;

    // Always check lower cased
    return _getSelfClosedSet ().contains (sElementName.toLowerCase (CHTMLCharset.LOCALE));
  }

  /**
   * Check if the passed element may not be self closed when creating HTML.
   *
   * @param sElementName
   *        The name of the tag to validate.
   * @return true if the tag may not be self closed.
   */
  public static boolean isTagThatMayNotBeSelfClosed (@Nullable final String sElementName)
  {
    if (StringHelper.hasNoText (sElementName))
      return false;

    // Always check lower cased
    return !_getSelfClosedSet ().contains (sElementName.toLowerCase (CHTMLCharset.LOCALE));
  }

  /**
   * Check if the passed tag is an HTML tag name.
   *
   * @param sTagName
   *        The case sensitive tag name to check.
   * @return true if it is a known HTML tag, false
   *         otherwise.
   */
  public static boolean isHTMLTagName (@Nullable final String sTagName)
  {
    return getFromTagNameOrNull (sTagName) != null;
  }

  /**
   * Get the {@link EHTMLElement} for the passed tag name using case insensitive
   * compare
   *
   * @param sTagName
   *        The case sensitive tag name to check.
   * @return The matching {@link EHTMLElement} or null if no such
   *         element is present.
   */
  @Nullable
  public static EHTMLElement getFromTagNameOrNull (@Nullable final String sTagName)
  {
    if (StringHelper.hasText (sTagName))
      for (final EHTMLElement eElement : values ())
        if (eElement.m_sElementNameLC.equalsIgnoreCase (sTagName))
          return eElement;
    return null;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy