diff --git a/README b/README index cc03aac..3fb215e 100644 --- a/README +++ b/README @@ -7,7 +7,7 @@ This is just a little scripting work, feel free to use it, change it, damn it or Features -------- - * supported tags: h1, h2, p, em, strong, blockquote, code, img, a, hr, li, ol, ul + * supported tags: h1, h2, h3, h4, h5, h6, p, em, strong, blockquote, code, img, a, hr, li, ol, ul * nested lists * inline and block code @@ -16,8 +16,8 @@ Usage 1. Include ReverseMarkdown class to your application 2. get an instance: r = ReverseMarkdown.new 3. parse a HTML string and save the return value: markdown = r.parse_string(html_string) - + Look at ------- wmd-editor: http://wmd-editor.com/ - markdown syntax: http://daringfireball.net/projects/markdown/ \ No newline at end of file + markdown syntax: http://daringfireball.net/projects/markdown/ diff --git a/reverse_markdown.rb b/reverse_markdown.rb index 67ce1a0..2a506c7 100644 --- a/reverse_markdown.rb +++ b/reverse_markdown.rb @@ -13,10 +13,10 @@ # TODO # - ol numbering is buggy, in fact doesn't matter for markdown code -# - +# - class ReverseMarkdown - + # set basic variables: # - @li_counter: numbering list item (li) tags in an ordered list (ol) # - @links: hold the links for adding them to the bottom of the @output @@ -31,7 +31,7 @@ def initialize() @indent = 0 @errors = [] end - + # Invokes the HTML parsing by using a string. Returns the markdown code in @output. # To garantuee well-formed xml for REXML a element will be added, but has no effect. # After parsing all elements, the 'reference style'-links will be inserted. @@ -41,7 +41,7 @@ def parse_string(string) insert_links() @output end - + # Parsing an element and its children (recursive) and writing its markdown code to @output # 1. do indent for nested list items # 2. add the markdown opening tag for this element @@ -54,18 +54,18 @@ def parse_element(element, parent) @output << indent() if name.eql?(:li) # 2. @output << opening(element, parent) - + # 3a. if (element.has_text? and element.children.size < 2) @output << text_node(element, parent) end - + # 3b. if element.has_elements? element.children.each do |child| # increase indent if nested list @indent += 1 if element.name=~/(ul|ol)/ and parent.eql?(:li) - + if child.node_type.eql?(:element) parse_element(child, element.name.to_sym) else @@ -75,12 +75,12 @@ def parse_element(element, parent) @output << child.to_s end end - + # decrease indent if end of nested list @indent -= 1 if element.name=~/(ul|ol)/ and parent.eql?(:li) end end - + # 4. @output << ending(element, parent) end @@ -99,6 +99,14 @@ def opening(type, parent) "" when :h2 "## " + when :h3 + "### " + when :h4 + "#### " + when :h5 + "##### " + when :h6 + "###### " when :em "*" when :strong @@ -122,7 +130,7 @@ def opening(type, parent) "" end end - + # Returns the closing markdown tag, like opening() def ending(type, parent) case type.name.to_sym @@ -130,6 +138,14 @@ def ending(type, parent) " #\n\n" when :h2 " ##\n\n" + when :h3 + " ###\n\n" + when :h4 + " ####\n\n" + when :h5 + " #####\n\n" + when :h6 + " ######\n\n" when :p parent.eql?(:root) ? "\n\n" : "\n" when :ol @@ -160,7 +176,7 @@ def ending(type, parent) "" end end - + # Perform indent: two space, @indent times - quite simple! :) def indent str = "" @@ -169,7 +185,7 @@ def indent end str end - + # Return the content of element, which should be just text. # If its a code block to indent of 4 spaces. # For block quotation add a leading '>' @@ -182,7 +198,7 @@ def text_node(element, parent) element.text end end - + # Insert the mentioned reference style links. def insert_links @output << "\n" @@ -190,14 +206,14 @@ def insert_links @output << " [#{index+1}]: #{@links[index]}\n" end end - + # Print out all errors, that occured and have been written to @errors. def print_errors @errors.each do |error| puts error end end - + # Perform a benchmark on a given string n-times. def speed_benchmark(string, n) initialize() @@ -205,7 +221,7 @@ def speed_benchmark(string, n) test.report("reverse markdown:") { n.times do; parse_string(string); initialize(); end; } end end - + end if __FILE__ == $0 @@ -264,7 +280,7 @@ def speed_benchmark(string, n) dolore magna aliquyam erat, sed

-This should also be shown, even if it's not wrapped in an element. +This should also be shown, even if it's not wrapped in an element.

nur ein text! nur eine maschine!