README.md in hashtml-0.0.1 vs README.md in hashtml-0.0.2

- old
+ new

@@ -1,4 +1,117 @@ -hashtml +hashtml [ ![Codeship Status for MRod15/hashtml](https://codeship.io/projects/6dd49080-19a4-0132-515f-0a39251edeca/status)](https://codeship.io/projects/34440) [![Build Status](https://travis-ci.org/MRod15/hashtml.svg?branch=master)](https://travis-ci.org/MRod15/hashtml) ======= HashTML is a gem for parsing HTML documents to Ruby Hash-like objects + +## Installation + +HashTML is available as a RubyGem: + + gem install hashtml + +## Usage + +HashTML parses a Nokogiri::HTML::Document or anything that responds +to to_s with a string of valid HTML. +A HashTML object corresponding to the data structure of the given HTML +is generated. + +### Example: + + html = <<-HTML + <html> + <body> + <div id="d1" style="color: blue"> + <h1>hello world!</h1> + </div> + </body> + </html> + HTML + hashtml = HashTML.new(html) + hashtml.inspect # => #<HashTML:0x00000001328650 @root_node=#<HashTML::Node:0x000000013283f8 @name="document", @attributes={}, @children=[#<HashTML::Node:0x00000001327ef8 @name="html", @attributes={}, @children=[#<HashTML::Node:0x00000001327a20 @name="body", @attributes={}, @children=[#<HashTML::Text:0x00000001326300 @text="\n ">, #<HashTML::Node:0x00000001326288 @name="div", @attributes={"id"=>"d1", "style"=>"color: blue"}, @children=[#<HashTML::Text:0x0000000132c8b8 @text="\n ">, #<HashTML::Node:0x0000000132c728 @name="h1", @attributes={}, @children=[#<HashTML::Text:0x0000000132b4e0 @text="hello world!">]>, #<HashTML::Text:0x0000000132a7c0 @text="\n ">]>, #<HashTML::Text:0x00000001329a50 @text="\n ">, #<HashTML::Node:0x000000013299d8 @name="div", @attributes={"id"=>"d2", "style"=>"color: green"}, @children=[#<HashTML::Text:0x000000013306c0 @text="\n ">, #<HashTML::Node:0x00000001330620 @name="p", @attributes={}, @children=[#<HashTML::Text:0x0000000132ef00 @text="Lorem ipsum dolor sit amet, consectetur adipiscing elit.">]>, #<HashTML::Text:0x0000000132e5c8 @text="\n ">]>, #<HashTML::Text:0x0000000132d6f0 @text="\n ">]>]>]>> + + +HashTML allows you to convert the object to a Ruby Hash with to_h. + +### Example: + + html = <<-HTML + <html> + <body> + <div id="d1" style="color: blue"> + <h1>hello world!</h1> + </div> + </body> + </html> + HTML + hashtml = HashTML.new(html) + hashtml.to_h # => {"document"=>{:attributes=>{}, :children=>[{"html"=>{:attributes=>{}, :children=>[{"body"=>{:attributes=>{}, :children=>[{:text=>"\n "}, {"div"=>{:attributes=>{"id"=>"d1", "style"=>"color: blue"}, :children=>[{:text=>"\n "}, {"h1"=>{:attributes=>{}, :children=>[{:text=>"hello world!"}]}}, {:text=>"\n "}]}}, {:text=>"\n "}, {"div"=>{:attributes=>{"id"=>"d2", "style"=>"color: green"}, :children=>[{:text=>"\n "}, {"p"=>{:attributes=>{}, :children=>[{:text=>"Lorem ipsum dolor sit amet, consectetur adipiscing elit."}]}}, {:text=>"\n "}]}}, {:text=>"\n "}]}}]}}]}} + + +You can access elements and change them simply by "navigating" trough them. +And when you're done, simply regenerate your HTML by doing to_html! + +### Example: + + html = <<-HTML + <html> + <body> + <div id="d1" style="color: blue"> + <h1>hello world!</h1> + </div> + </body> + </html> + HTML + + hashtml = HashTML.new(html) + hashtml.document.hmtl.body.div.inspect # => #<HashTML::Node:0x00000000b6c128 @name="div", @attributes={"id"=>"d1", "style"=>"color: blue"}, @children=[#<HashTML::Text:0x00000000b72528 @text="\n ">, #<HashTML::Node:0x00000000b72348 @name="h1", @attributes={}, @children=[#<HashTML::Text:0x00000000b71268 @text="hello world!">]>, #<HashTML::Text:0x00000000b704a8 @text="\n ">]> + + hashtml.document.hmtl.body.div.attributes['id'] = 'new_id1' + hashtml.document.hmtl.body.div.inspect # => #<HashTML::Node:0x00000000b6c128 @name="div", @attributes={"id"=>"new_id1", "style"=>"color: blue"}, @children=[#<HashTML::Text:0x00000000b72528 @text="\n ">, #<HashTML::Node:0x00000000b72348 @name="h1", @attributes={}, @children=[#<HashTML::Text:0x00000000b71268 @text="hello world!">]>, #<HashTML::Text:0x00000000b704a8 @text="\n ">]> + + hashtml.document.hmtl.body.div.h1.text # => 'hello world!' + hashtml.document.hmtl.body.div.h1.text = 'such edit! wow' + hashtml.document.hmtl.body.div.h1.text # => 'such edit! wow' + + hashtml.to_html # => <document><html><body> + <div id="new_id1" style="color: blue"> + <h1>such edit! wow</h1> + </div> + </body></html></document> + + +Worried about navigating and having tons of elements with the same tag at the same level? +That's not a problem! Just identify the node by it's attributes! + +### Example: + + html = <<-HTML + <html> + <body> + <div class="main"> + <span id="s1" style="color: blue"> + <h1>hello world!</h1> + </span> + <span id="s2" style="color: green"> + <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> + </span> + </div> + </body> + </html> + HTML + + hashtml = HashTML.new(html) + hashtml.document.html.body.div.span({'id' => 's2'}).attributes['id'] = 'new_id2' + hashtml.document.html.body.div.span({'id' => 's1'}).h1.text = 'such edit! much navigation! wow' + + hashtml.to_html # => <document><html><body> + <div class="main"> + <span id="s1" style="color: blue"> + <h1>such edit! much navigation! wow</h1> + </span> + <span id="new_id2" style="color: green"> + <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> + </span> + </div> + </body></html></document> +