module Hpricot
FORM_TAGS = [ :form, :input, :select, :textarea ]
SELF_CLOSING_TAGS = [ :base, :meta, :link, :hr, :br, :param, :img, :area, :input, :col ]
# Common sets of attributes.
AttrCore = [:id, :class, :style, :title]
AttrI18n = [:lang, 'xml:lang'.intern, :dir]
AttrEvents = [:onclick, :ondblclick, :onmousedown, :onmouseup, :onmouseover, :onmousemove,
:onmouseout, :onkeypress, :onkeydown, :onkeyup]
AttrFocus = [:accesskey, :tabindex, :onfocus, :onblur]
AttrHAlign = [:align, :char, :charoff]
AttrVAlign = [:valign]
Attrs = AttrCore + AttrI18n + AttrEvents
# All the tags and attributes from XHTML 1.0 Strict
class XHTMLStrict
class << self
attr_accessor :tags, :tagset, :forms, :self_closing, :doctype
end
@doctype = ["-//W3C//DTD XHTML 1.0 Strict//EN", "DTD/xhtml1-strict.dtd"]
@tagset = {
:html => AttrI18n + [:id, :xmlns],
:head => AttrI18n + [:id, :profile],
:title => AttrI18n + [:id],
:base => [:href, :id],
:meta => AttrI18n + [:id, :http, :name, :content, :scheme, 'http-equiv'.intern],
:link => Attrs + [:charset, :href, :hreflang, :type, :rel, :rev, :media],
:style => AttrI18n + [:id, :type, :media, :title, 'xml:space'.intern],
:script => [:id, :charset, :type, :src, :defer, 'xml:space'.intern],
:noscript => Attrs,
:body => Attrs + [:onload, :onunload],
:div => Attrs,
:p => Attrs,
:ul => Attrs,
:ol => Attrs,
:li => Attrs,
:dl => Attrs,
:dt => Attrs,
:dd => Attrs,
:address => Attrs,
:hr => Attrs,
:pre => Attrs + ['xml:space'.intern],
:blockquote => Attrs + [:cite],
:ins => Attrs + [:cite, :datetime],
:del => Attrs + [:cite, :datetime],
:a => Attrs + AttrFocus + [:charset, :type, :name, :href, :hreflang, :rel, :rev, :shape, :coords],
:span => Attrs,
:bdo => AttrCore + AttrEvents + [:lang, 'xml:lang'.intern, :dir],
:br => AttrCore,
:em => Attrs,
:strong => Attrs,
:dfn => Attrs,
:code => Attrs,
:samp => Attrs,
:kbd => Attrs,
:var => Attrs,
:cite => Attrs,
:abbr => Attrs,
:acronym => Attrs,
:q => Attrs + [:cite],
:sub => Attrs,
:sup => Attrs,
:tt => Attrs,
:i => Attrs,
:b => Attrs,
:big => Attrs,
:small => Attrs,
:object => Attrs + [:declare, :classid, :codebase, :data, :type, :codetype, :archive, :standby, :height, :width, :usemap, :name, :tabindex],
:param => [:id, :name, :value, :valuetype, :type],
:img => Attrs + [:src, :alt, :longdesc, :height, :width, :usemap, :ismap],
:map => AttrI18n + AttrEvents + [:id, :class, :style, :title, :name],
:area => Attrs + AttrFocus + [:shape, :coords, :href, :nohref, :alt],
:form => Attrs + [:action, :method, :enctype, :onsubmit, :onreset, :accept, :accept],
:label => Attrs + [:for, :accesskey, :onfocus, :onblur],
:input => Attrs + AttrFocus + [:type, :name, :value, :checked, :disabled, :readonly, :size, :maxlength, :src, :alt, :usemap, :onselect, :onchange, :accept],
:select => Attrs + [:name, :size, :multiple, :disabled, :tabindex, :onfocus, :onblur, :onchange],
:optgroup => Attrs + [:disabled, :label],
:option => Attrs + [:selected, :disabled, :label, :value],
:textarea => Attrs + AttrFocus + [:name, :rows, :cols, :disabled, :readonly, :onselect, :onchange],
:fieldset => Attrs,
:legend => Attrs + [:accesskey],
:button => Attrs + AttrFocus + [:name, :value, :type, :disabled],
:table => Attrs + [:summary, :width, :border, :frame, :rules, :cellspacing, :cellpadding],
:caption => Attrs,
:colgroup => Attrs + AttrHAlign + AttrVAlign + [:span, :width],
:col => Attrs + AttrHAlign + AttrVAlign + [:span, :width],
:thead => Attrs + AttrHAlign + AttrVAlign,
:tfoot => Attrs + AttrHAlign + AttrVAlign,
:tbody => Attrs + AttrHAlign + AttrVAlign,
:tr => Attrs + AttrHAlign + AttrVAlign,
:th => Attrs + AttrHAlign + AttrVAlign + [:abbr, :axis, :headers, :scope, :rowspan, :colspan],
:td => Attrs + AttrHAlign + AttrVAlign + [:abbr, :axis, :headers, :scope, :rowspan, :colspan],
:h1 => Attrs,
:h2 => Attrs,
:h3 => Attrs,
:h4 => Attrs,
:h5 => Attrs,
:h6 => Attrs
}
@tags = @tagset.keys
@forms = @tags & FORM_TAGS
@self_closing = @tags & SELF_CLOSING_TAGS
end
# Additional tags found in XHTML 1.0 Transitional
class XHTMLTransitional
class << self
attr_accessor :tags, :tagset, :forms, :self_closing, :doctype
end
@doctype = ["-//W3C//DTD XHTML 1.0 Transitional//EN", "DTD/xhtml1-transitional.dtd"]
@tagset = XHTMLStrict.tagset.merge \
:strike => Attrs,
:center => Attrs,
:dir => Attrs + [:compact],
:noframes => Attrs,
:basefont => [:id, :size, :color, :face],
:u => Attrs,
:menu => Attrs + [:compact],
:iframe => AttrCore + [:longdesc, :name, :src, :frameborder, :marginwidth, :marginheight, :scrolling, :align, :height, :width],
:font => AttrCore + AttrI18n + [:size, :color, :face],
:s => Attrs,
:applet => AttrCore + [:codebase, :archive, :code, :object, :alt, :name, :width, :height, :align, :hspace, :vspace],
:isindex => AttrCore + AttrI18n + [:prompt]
# Additional attributes found in XHTML 1.0 Transitional
{ :script => [:language],
:a => [:target],
:td => [:bgcolor, :nowrap, :width, :height],
:p => [:align],
:h5 => [:align],
:h3 => [:align],
:li => [:type, :value],
:div => [:align],
:pre => [:width],
:body => [:background, :bgcolor, :text, :link, :vlink, :alink],
:ol => [:type, :compact, :start],
:h4 => [:align],
:h2 => [:align],
:object => [:align, :border, :hspace, :vspace],
:img => [:name, :align, :border, :hspace, :vspace],
:link => [:target],
:legend => [:align],
:dl => [:compact],
:input => [:align],
:h6 => [:align],
:hr => [:align, :noshade, :size, :width],
:base => [:target],
:ul => [:type, :compact],
:br => [:clear],
:form => [:name, :target],
:area => [:target],
:h1 => [:align]
}.each do |k, v|
@tagset[k] += v
end
@tags = @tagset.keys
@forms = @tags & FORM_TAGS
@self_closing = @tags & SELF_CLOSING_TAGS
end
end