summaryrefslogtreecommitdiffstats
path: root/parser/htmlparser/nsElementTable.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'parser/htmlparser/nsElementTable.cpp')
-rw-r--r--parser/htmlparser/nsElementTable.cpp623
1 files changed, 623 insertions, 0 deletions
diff --git a/parser/htmlparser/nsElementTable.cpp b/parser/htmlparser/nsElementTable.cpp
new file mode 100644
index 000000000..80f581a16
--- /dev/null
+++ b/parser/htmlparser/nsElementTable.cpp
@@ -0,0 +1,623 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=2 sw=2 et tw=78: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+#include "nsIAtom.h"
+#include "nsElementTable.h"
+
+/*****************************************************************************
+ Now it's time to list all the html elements all with their capabilities...
+******************************************************************************/
+
+// The Element Table (sung to the tune of Modern Major General)
+
+const nsHTMLElement gHTMLElements[] = {
+ {
+ /*tag*/ eHTMLTag_unknown,
+ /*parent,leaf*/ kNone, true
+ },
+ {
+ /*tag*/ eHTMLTag_a,
+ /*parent,leaf*/ kSpecial, false
+ },
+ {
+ /*tag*/ eHTMLTag_abbr,
+ /*parent,leaf*/ kPhrase, false
+ },
+ {
+ /*tag*/ eHTMLTag_acronym,
+ /*parent,leaf*/ kPhrase, false
+ },
+ {
+ /*tag*/ eHTMLTag_address,
+ /*parent,leaf*/ kBlock, false
+ },
+ {
+ /*tag*/ eHTMLTag_applet,
+ /*parent,leaf*/ kSpecial, false
+ },
+ {
+ /*tag*/ eHTMLTag_area,
+ /*parent,leaf*/ kNone, true
+ },
+ {
+ /*tag*/ eHTMLTag_article,
+ /*parent,leaf*/ kBlock, false
+ },
+ {
+ /*tag*/ eHTMLTag_aside,
+ /*parent,leaf*/ kBlock, false
+ },
+ {
+ /*tag*/ eHTMLTag_audio,
+ /*parent,leaf*/ kSpecial, false
+ },
+ {
+ /*tag*/ eHTMLTag_b,
+ /*parent,leaf*/ kFontStyle, false
+ },
+ {
+ /*tag*/ eHTMLTag_base,
+ /*parent,leaf*/ kHeadContent, true
+ },
+ {
+ /*tag*/ eHTMLTag_basefont,
+ /*parent,leaf*/ kSpecial, true
+ },
+ {
+ /*tag*/ eHTMLTag_bdo,
+ /*parent,leaf*/ kSpecial, false
+ },
+ {
+ /*tag*/ eHTMLTag_bgsound,
+ /*parent,leaf*/ (kFlowEntity|kHeadMisc), true
+ },
+ {
+ /*tag*/ eHTMLTag_big,
+ /*parent,leaf*/ kFontStyle, false
+ },
+ {
+ /*tag*/ eHTMLTag_blockquote,
+ /*parent,leaf*/ kBlock, false
+ },
+ {
+ /*tag*/ eHTMLTag_body,
+ /*parent,leaf*/ kHTMLContent, false
+ },
+ {
+ /*tag*/ eHTMLTag_br,
+ /*parent,leaf*/ kSpecial, true
+ },
+ {
+ /*tag*/ eHTMLTag_button,
+ /*parent,leaf*/ kFormControl, false
+ },
+ {
+ /*tag*/ eHTMLTag_canvas,
+ /*parent,leaf*/ kSpecial, false
+ },
+ {
+ /*tag*/ eHTMLTag_caption,
+ /*parent,leaf*/ kNone, false
+ },
+ {
+ /*tag*/ eHTMLTag_center,
+ /*parent,leaf*/ kBlock, false
+ },
+ {
+ /*tag*/ eHTMLTag_cite,
+ /*parent,leaf*/ kPhrase, false
+ },
+ {
+ /*tag*/ eHTMLTag_code,
+ /*parent,leaf*/ kPhrase, false
+ },
+ {
+ /*tag*/ eHTMLTag_col,
+ /*parent,leaf*/ kNone, true
+ },
+ {
+ /*tag*/ eHTMLTag_colgroup,
+ /*parent,leaf*/ kNone, false
+ },
+ {
+ /*tag*/ eHTMLTag_content,
+ /*parent,leaf*/ kNone, false
+ },
+ {
+ /*tag*/ eHTMLTag_data,
+ /*parent,leaf*/ kPhrase, false
+ },
+ {
+ /*tag*/ eHTMLTag_datalist,
+ /*parent,leaf*/ kSpecial, false
+ },
+ {
+ /*tag*/ eHTMLTag_dd,
+ /*parent,leaf*/ kInlineEntity, false
+ },
+ {
+ /*tag*/ eHTMLTag_del,
+ /*parent,leaf*/ kFlowEntity, false
+ },
+ {
+ /*tag*/ eHTMLTag_details,
+ /*parent,leaf*/ kBlock, false
+ },
+ {
+ /*tag*/ eHTMLTag_dfn,
+ /*parent,leaf*/ kPhrase, false
+ },
+ {
+ /*tag*/ eHTMLTag_dir,
+ /*parent,leaf*/ kList, false
+ },
+ {
+ /*tag*/ eHTMLTag_div,
+ /*parent,leaf*/ kBlock, false
+ },
+ {
+ /*tag*/ eHTMLTag_dl,
+ /*parent,leaf*/ kBlock, false
+ },
+ {
+ /*tag*/ eHTMLTag_dt,
+ /*parent,leaf*/ kInlineEntity, false
+ },
+ {
+ /*tag*/ eHTMLTag_em,
+ /*parent,leaf*/ kPhrase, false
+ },
+ {
+ /*tag*/ eHTMLTag_embed,
+ /*parent,leaf*/ kSpecial, true
+ },
+ {
+ /*tag*/ eHTMLTag_fieldset,
+ /*parent,leaf*/ kBlock, false
+ },
+ {
+ /*tag*/ eHTMLTag_figcaption,
+ /*parent,leaf*/ kPhrase, false
+ },
+ {
+ /*tag*/ eHTMLTag_figure,
+ /*parent,leaf*/ kBlock, false
+ },
+ {
+ /*tag*/ eHTMLTag_font,
+ /*parent,leaf*/ kFontStyle, false
+ },
+ {
+ /*tag*/ eHTMLTag_footer,
+ /*parent,leaf*/ kBlock, false
+ },
+ {
+ /*tag*/ eHTMLTag_form,
+ /*parent,leaf*/ kBlock, false
+ },
+ {
+ /*tag*/ eHTMLTag_frame,
+ /*parent,leaf*/ kNone, true
+ },
+ {
+ /*tag*/ eHTMLTag_frameset,
+ /*parent,leaf*/ kHTMLContent, false
+ },
+ {
+ /*tag*/ eHTMLTag_h1,
+ /*parent,leaf*/ kHeading, false
+ },
+ {
+ /*tag*/ eHTMLTag_h2,
+ /*parent,leaf*/ kHeading, false
+ },
+ {
+ /*tag*/ eHTMLTag_h3,
+ /*parent,leaf*/ kHeading, false
+ },
+ {
+ /*tag*/ eHTMLTag_h4,
+ /*parent,leaf*/ kHeading, false
+ },
+ {
+ /*tag*/ eHTMLTag_h5,
+ /*parent,leaf*/ kHeading, false
+ },
+ {
+ /*tag*/ eHTMLTag_h6,
+ /*parent,leaf*/ kHeading, false
+ },
+ {
+ /*tag*/ eHTMLTag_head,
+ /*parent,leaf*/ kHTMLContent, false
+ },
+ {
+ /*tag*/ eHTMLTag_header,
+ /*parent,leaf*/ kBlock, false
+ },
+ {
+ /*tag*/ eHTMLTag_hgroup,
+ /*parent,leaf*/ kBlock, false
+ },
+ {
+ /*tag*/ eHTMLTag_hr,
+ /*parent,leaf*/ kBlock, true
+ },
+ {
+ /*tag*/ eHTMLTag_html,
+ /*parent,leaf*/ kNone, false
+ },
+ {
+ /*tag*/ eHTMLTag_i,
+ /*parent,leaf*/ kFontStyle, false
+ },
+ {
+ /*tag*/ eHTMLTag_iframe,
+ /*parent,leaf*/ kSpecial, false
+ },
+ {
+ /*tag*/ eHTMLTag_image,
+ /*parent,leaf*/ kSpecial, true
+ },
+ {
+ /*tag*/ eHTMLTag_img,
+ /*parent,leaf*/ kSpecial, true
+ },
+ {
+ /*tag*/ eHTMLTag_input,
+ /*parent,leaf*/ kFormControl, true
+ },
+ {
+ /*tag*/ eHTMLTag_ins,
+ /*parent,leaf*/ kFlowEntity, false
+ },
+ {
+ /*tag*/ eHTMLTag_kbd,
+ /*parent,leaf*/ kPhrase, false
+ },
+ {
+ /*tag*/ eHTMLTag_keygen,
+ /*parent,leaf*/ kFlowEntity, true
+ },
+ {
+ /*tag*/ eHTMLTag_label,
+ /*parent,leaf*/ kFormControl, false
+ },
+ {
+ /*tag*/ eHTMLTag_legend,
+ /*parent,leaf*/ kNone, false
+ },
+ {
+ /*tag*/ eHTMLTag_li,
+ /*parent,leaf*/ kBlockEntity, false
+ },
+ {
+ /*tag*/ eHTMLTag_link,
+ /*parent,leaf*/ kAllTags - kHeadContent, true
+ },
+ {
+ /*tag*/ eHTMLTag_listing,
+ /*parent,leaf*/ kPreformatted, false
+ },
+ {
+ /*tag*/ eHTMLTag_main,
+ /*parent,leaf*/ kBlock, false
+ },
+ {
+ /*tag*/ eHTMLTag_map,
+ /*parent,leaf*/ kSpecial, false
+ },
+ {
+ /*tag*/ eHTMLTag_mark,
+ /*parent,leaf*/ kSpecial, false
+ },
+ {
+ /*tag*/ eHTMLTag_marquee,
+ /*parent,leaf*/ kSpecial, false
+ },
+ {
+ /*tag*/ eHTMLTag_menu,
+ /*parent,leaf*/ kList, false
+ },
+ {
+ /*tag*/ eHTMLTag_menuitem,
+ /*parent,leaf*/ kFlowEntity, false
+ },
+ {
+ /*tag*/ eHTMLTag_meta,
+ /*parent,leaf*/ kHeadContent, true
+ },
+ {
+ /*tag*/ eHTMLTag_meter,
+ /*parent,leaf*/ kFormControl, false
+ },
+ {
+ /*tag*/ eHTMLTag_multicol,
+ /*parent,leaf*/ kBlock, false
+ },
+ {
+ /*tag*/ eHTMLTag_nav,
+ /*parent,leaf*/ kBlock, false
+ },
+ {
+ /*tag*/ eHTMLTag_nobr,
+ /*parent,leaf*/ kExtensions, false
+ },
+ {
+ /*tag*/ eHTMLTag_noembed,
+ /*parent,leaf*/ kFlowEntity, false
+ },
+ {
+ /*tag*/ eHTMLTag_noframes,
+ /*parent,leaf*/ kFlowEntity, false
+ },
+ {
+ /*tag*/ eHTMLTag_noscript,
+ /*parent,leaf*/ kFlowEntity|kHeadMisc, false
+ },
+ {
+ /*tag*/ eHTMLTag_object,
+ /*parent,leaf*/ kSpecial, false
+ },
+ {
+ /*tag*/ eHTMLTag_ol,
+ /*parent,leaf*/ kList, false
+ },
+ {
+ /*tag*/ eHTMLTag_optgroup,
+ /*parent,leaf*/ kNone, false
+ },
+ {
+ /*tag*/ eHTMLTag_option,
+ /*parent,leaf*/ kNone, false
+ },
+ {
+ /*tag*/ eHTMLTag_output,
+ /*parent,leaf*/ kSpecial, false
+ },
+ {
+ /*tag*/ eHTMLTag_p,
+ /*parent,leaf*/ kBlock, false
+ },
+ {
+ /*tag*/ eHTMLTag_param,
+ /*parent,leaf*/ kSpecial, true
+ },
+ {
+ /*tag*/ eHTMLTag_picture,
+ /*parent,leaf*/ kSpecial, false
+ },
+ {
+ /*tag*/ eHTMLTag_plaintext,
+ /*parent,leaf*/ kExtensions, false
+ },
+ {
+ /*tag*/ eHTMLTag_pre,
+ /*parent,leaf*/ kBlock|kPreformatted, false
+ },
+ {
+ /*tag*/ eHTMLTag_progress,
+ /*parent,leaf*/ kFormControl, false
+ },
+ {
+ /*tag*/ eHTMLTag_q,
+ /*parent,leaf*/ kSpecial, false
+ },
+ {
+ /*tag*/ eHTMLTag_rb,
+ /*parent,leaf*/ kPhrase, false
+ },
+ {
+ /*tag*/ eHTMLTag_rp,
+ /*parent,leaf*/ kPhrase, false
+ },
+ {
+ /*tag*/ eHTMLTag_rt,
+ /*parent,leaf*/ kPhrase, false
+ },
+ {
+ /*tag*/ eHTMLTag_rtc,
+ /*parent,leaf*/ kPhrase, false
+ },
+ {
+ /*tag*/ eHTMLTag_ruby,
+ /*parent,leaf*/ kPhrase, false
+ },
+ {
+ /*tag*/ eHTMLTag_s,
+ /*parent,leaf*/ kFontStyle, false
+ },
+ {
+ /*tag*/ eHTMLTag_samp,
+ /*parent,leaf*/ kPhrase, false
+ },
+ {
+ /*tag*/ eHTMLTag_script,
+ /*parent,leaf*/ (kSpecial|kHeadContent), false
+ },
+ {
+ /*tag*/ eHTMLTag_section,
+ /*parent,leaf*/ kBlock, false
+ },
+ {
+ /*tag*/ eHTMLTag_select,
+ /*parent,leaf*/ kFormControl, false
+ },
+ {
+ /*tag*/ eHTMLTag_shadow,
+ /*parent,leaf*/ kFlowEntity, false
+ },
+ {
+ /*tag*/ eHTMLTag_small,
+ /*parent,leaf*/ kFontStyle, false
+ },
+ {
+ /*tag*/ eHTMLTag_source,
+ /*parent,leaf*/ kSpecial, true
+ },
+ {
+ /*tag*/ eHTMLTag_span,
+ /*parent,leaf*/ kSpecial, false
+ },
+ {
+ /*tag*/ eHTMLTag_strike,
+ /*parent,leaf*/ kFontStyle, false
+ },
+ {
+ /*tag*/ eHTMLTag_strong,
+ /*parent,leaf*/ kPhrase, false
+ },
+ {
+ /*tag*/ eHTMLTag_style,
+ /*parent,leaf*/ kAllTags - kHeadContent, false
+ },
+ {
+ /*tag*/ eHTMLTag_sub,
+ /*parent,leaf*/ kSpecial, false
+ },
+ {
+ /*tag*/ eHTMLTag_summary,
+ /*parent,leaf*/ kBlock, false
+ },
+ {
+ /*tag*/ eHTMLTag_sup,
+ /*parent,leaf*/ kSpecial, false
+ },
+ {
+ /*tag*/ eHTMLTag_table,
+ /*parent,leaf*/ kBlock, false
+ },
+ {
+ /*tag*/ eHTMLTag_tbody,
+ /*parent,leaf*/ kNone, false
+ },
+ {
+ /*tag*/ eHTMLTag_td,
+ /*parent,leaf*/ kNone, false
+ },
+ {
+ /*tag*/ eHTMLTag_textarea,
+ /*parent,leaf*/ kFormControl, false
+ },
+ {
+ /*tag*/ eHTMLTag_tfoot,
+ /*parent,leaf*/ kNone, false
+ },
+ {
+ /*tag*/ eHTMLTag_th,
+ /*parent,leaf*/ kNone, false
+ },
+ {
+ /*tag*/ eHTMLTag_thead,
+ /*parent,leaf*/ kNone, false
+ },
+ {
+ /*tag*/ eHTMLTag_template,
+ /*parent,leaf*/ kNone, false
+ },
+ {
+ /*tag*/ eHTMLTag_time,
+ /*parent,leaf*/ kPhrase, false
+ },
+ {
+ /*tag*/ eHTMLTag_title,
+ /*parent,leaf*/ kHeadContent, false
+ },
+ {
+ /*tag*/ eHTMLTag_tr,
+ /*parent,leaf*/ kNone, false
+ },
+ {
+ /*tag*/ eHTMLTag_track,
+ /*parent,leaf*/ kSpecial, true
+ },
+ {
+ /*tag*/ eHTMLTag_tt,
+ /*parent,leaf*/ kFontStyle, false
+ },
+ {
+ /*tag*/ eHTMLTag_u,
+ /*parent,leaf*/ kFontStyle, false
+ },
+ {
+ /*tag*/ eHTMLTag_ul,
+ /*parent,leaf*/ kList, false
+ },
+ {
+ /*tag*/ eHTMLTag_var,
+ /*parent,leaf*/ kPhrase, false
+ },
+ {
+ /*tag*/ eHTMLTag_video,
+ /*parent,leaf*/ kSpecial, false
+ },
+ {
+ /*tag*/ eHTMLTag_wbr,
+ /*parent,leaf*/ kExtensions, true
+ },
+ {
+ /*tag*/ eHTMLTag_xmp,
+ /*parent,leaf*/ kInlineEntity|kPreformatted, false
+ },
+ {
+ /*tag*/ eHTMLTag_text,
+ /*parent,leaf*/ kFlowEntity, true
+ },
+ {
+ /*tag*/ eHTMLTag_whitespace,
+ /*parent,leaf*/ kFlowEntity|kHeadMisc, true
+ },
+ {
+ /*tag*/ eHTMLTag_newline,
+ /*parent,leaf*/ kFlowEntity|kHeadMisc, true
+ },
+ {
+ /*tag*/ eHTMLTag_comment,
+ /*parent,leaf*/ kFlowEntity|kHeadMisc, false
+ },
+ {
+ /*tag*/ eHTMLTag_entity,
+ /*parent,leaf*/ kFlowEntity, false
+ },
+ {
+ /*tag*/ eHTMLTag_doctypeDecl,
+ /*parent,leaf*/ kFlowEntity, false
+ },
+ {
+ /*tag*/ eHTMLTag_markupDecl,
+ /*parent,leaf*/ kFlowEntity, false
+ },
+ {
+ /*tag*/ eHTMLTag_instruction,
+ /*parent,leaf*/ kFlowEntity, false
+ },
+ {
+ /*tag*/ eHTMLTag_userdefined,
+ /*parent,leaf*/ (kFlowEntity|kHeadMisc), false
+ },
+};
+
+/*********************************************************************************************/
+
+bool nsHTMLElement::IsContainer(eHTMLTags aChild)
+{
+ return !gHTMLElements[aChild].mLeaf;
+}
+
+bool nsHTMLElement::IsMemberOf(int32_t aSet) const
+{
+ return TestBits(aSet,mParentBits);
+}
+
+#ifdef DEBUG
+void CheckElementTable()
+{
+ for (eHTMLTags t = eHTMLTag_unknown; t <= eHTMLTag_userdefined; t = eHTMLTags(t + 1)) {
+ NS_ASSERTION(gHTMLElements[t].mTagID == t, "gHTMLElements entries does match tag list.");
+ }
+}
+#endif