class MaRuKu::REXMLHTMLFragment
An HTMLFragment implementation using REXML
def add_class(class_name)
def add_class(class_name) @fragment.each_element do |c| c.attributes['class'] = ((c.attributes['class']||'').split(' ') + [class_name]).join(' ') end end
def first_node_name
def first_node_name first_child = @fragment.children.first (first_child && first_child.respond_to?(:name)) ? first_child.name : nil end
def initialize(raw_html)
def initialize(raw_html) wrapped = '<!DOCTYPE html PUBLIC //W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" ttp://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd"> l>' + raw_html.strip + '</html>' @fragment = REXML::Document.new(wrapped).root end
def process_markdown_inside_elements(doc)
Process markdown within the contents of some elements and
def process_markdown_inside_elements(doc) elts = [] @fragment.each_element('//*[@markdown]') do |e| elts << e end d = @fragment.children.first if d && HTML_INLINE_ELEMS.include?(first_node_name) elts << d unless d.attributes['markdown'] elts += span_descendents(d) end # find span elements or elements with 'markdown' attribute elts.each do |e| # should we parse block-level or span-level? how = e.attributes['markdown'] e.attributes.delete('markdown') next if "0" == how # user requests no markdown parsing inside parse_blocks = (how == 'block') || BLOCK_TAGS.include?(e.name) # Select all text children of e e.texts.each do |original_text| s = MaRuKu::Out::HTML.escapeHTML(original_text.value) unless s.strip.empty? # TODO extract common functionality parsed = parse_blocks ? doc.parse_text_as_markdown(s) : doc.parse_span(s) # restore leading and trailing spaces padding = /\A(\s*).*?(\s*)\z/.match(s) parsed = [padding[1]] + parsed + [padding[2]] if padding el = doc.md_el(:dummy, parsed) new_html = "<dummy>" el.children_to_html.each do |x| new_html << x.to_s end new_html << "</dummy>" newdoc = REXML::Document.new(new_html).root p = original_text.parent newdoc.children.each do |c| p.insert_before(original_text, c) end p.delete(original_text) end end end end
def span_descendents(e)
-
(Array)
-
Parameters:
-
e
(REXML::Element
) -- An element.
def span_descendents(e) descendents = [] e.each_element do |c| name = c.respond_to?(:name) ? c.name : nil if name && HTML_INLINE_ELEMS.include?(c.name) descendents << c descendents += span_descendents(c) end end end
def to_html
def to_html formatter = REXML::Formatters::Default.new(true) @fragment.children.inject("") do |out, child| out << formatter.write(child, '') end end