ronin-web 0.3.0.rc1 → 1.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (148) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +11 -0
  3. data/.github/workflows/ruby.yml +31 -0
  4. data/.gitignore +13 -0
  5. data/.mailmap +1 -0
  6. data/.ruby-version +1 -0
  7. data/COPYING.txt +3 -3
  8. data/ChangeLog.md +115 -70
  9. data/Gemfile +42 -37
  10. data/README.md +159 -145
  11. data/Rakefile +12 -3
  12. data/bin/ronin-web +9 -17
  13. data/data/new/nokogiri.rb.erb +12 -0
  14. data/data/new/server.rb.erb +22 -0
  15. data/data/new/spider.rb.erb +26 -0
  16. data/data/new/webapp/.gitignore +15 -0
  17. data/data/new/webapp/.ruby-version.erb +1 -0
  18. data/data/new/webapp/Dockerfile.erb +11 -0
  19. data/data/new/webapp/Gemfile +6 -0
  20. data/data/new/webapp/app.rb.erb +15 -0
  21. data/data/new/webapp/config.ru +4 -0
  22. data/data/new/webapp/docker-compose.yml.erb +9 -0
  23. data/gemspec.yml +32 -14
  24. data/lib/ronin/web/cli/command.rb +36 -0
  25. data/lib/ronin/web/cli/commands/diff.rb +106 -0
  26. data/lib/ronin/web/cli/commands/html.rb +174 -0
  27. data/lib/ronin/web/cli/commands/irb.rb +56 -0
  28. data/lib/ronin/web/cli/commands/new/nokogiri.rb +85 -0
  29. data/lib/ronin/web/cli/commands/new/server.rb +96 -0
  30. data/lib/ronin/web/cli/commands/new/spider.rb +315 -0
  31. data/lib/ronin/web/cli/commands/new/webapp.rb +123 -0
  32. data/lib/ronin/web/cli/commands/new.rb +64 -0
  33. data/lib/ronin/web/cli/commands/reverse_proxy.rb +215 -0
  34. data/lib/ronin/web/cli/commands/server.rb +155 -0
  35. data/lib/ronin/web/cli/commands/spider.rb +822 -0
  36. data/lib/ronin/web/cli/ruby_shell.rb +50 -0
  37. data/lib/ronin/web/cli.rb +44 -0
  38. data/lib/ronin/web/html.rb +85 -0
  39. data/lib/ronin/web/mechanize.rb +34 -36
  40. data/lib/ronin/web/root.rb +27 -0
  41. data/lib/ronin/web/version.rb +7 -10
  42. data/lib/ronin/web/xml.rb +85 -0
  43. data/lib/ronin/web.rb +372 -13
  44. data/man/ronin-web-diff.1 +41 -0
  45. data/man/ronin-web-diff.1.md +30 -0
  46. data/man/ronin-web-html.1 +89 -0
  47. data/man/ronin-web-html.1.md +66 -0
  48. data/man/ronin-web-irb.1 +31 -0
  49. data/man/ronin-web-irb.1.md +22 -0
  50. data/man/ronin-web-new-nokogiri.1 +41 -0
  51. data/man/ronin-web-new-nokogiri.1.md +30 -0
  52. data/man/ronin-web-new-server.1 +45 -0
  53. data/man/ronin-web-new-server.1.md +33 -0
  54. data/man/ronin-web-new-spider.1 +173 -0
  55. data/man/ronin-web-new-spider.1.md +129 -0
  56. data/man/ronin-web-new-webapp.1 +53 -0
  57. data/man/ronin-web-new-webapp.1.md +39 -0
  58. data/man/ronin-web-new.1 +59 -0
  59. data/man/ronin-web-new.1.md +44 -0
  60. data/man/ronin-web-reverse-proxy.1 +63 -0
  61. data/man/ronin-web-reverse-proxy.1.md +47 -0
  62. data/man/ronin-web-server.1 +59 -0
  63. data/man/ronin-web-server.1.md +43 -0
  64. data/man/ronin-web-spider.1 +225 -0
  65. data/man/ronin-web-spider.1.md +168 -0
  66. data/man/ronin-web.1 +41 -0
  67. data/man/ronin-web.1.md +30 -0
  68. data/ronin-web.gemspec +39 -109
  69. data/spec/cli/ruby_shell_spec.rb +14 -0
  70. data/spec/html_spec.rb +43 -0
  71. data/spec/mechanize_spec.rb +72 -0
  72. data/spec/spec_helper.rb +5 -3
  73. data/spec/web_spec.rb +97 -0
  74. data/spec/xml_spec.rb +42 -0
  75. metadata +236 -224
  76. data/.gemtest +0 -0
  77. data/data/ronin/web/user_agents.yml +0 -247
  78. data/lib/ronin/network/mixins/web.rb +0 -258
  79. data/lib/ronin/web/config.rb +0 -34
  80. data/lib/ronin/web/extensions/nokogiri/xml/attr.rb +0 -47
  81. data/lib/ronin/web/extensions/nokogiri/xml/document.rb +0 -48
  82. data/lib/ronin/web/extensions/nokogiri/xml/element.rb +0 -57
  83. data/lib/ronin/web/extensions/nokogiri/xml/node.rb +0 -86
  84. data/lib/ronin/web/extensions/nokogiri/xml/text.rb +0 -47
  85. data/lib/ronin/web/extensions/nokogiri/xml.rb +0 -27
  86. data/lib/ronin/web/extensions/nokogiri.rb +0 -23
  87. data/lib/ronin/web/extensions.rb +0 -23
  88. data/lib/ronin/web/middleware/base.rb +0 -144
  89. data/lib/ronin/web/middleware/directories.rb +0 -179
  90. data/lib/ronin/web/middleware/files.rb +0 -144
  91. data/lib/ronin/web/middleware/filters/campaign_filter.rb +0 -77
  92. data/lib/ronin/web/middleware/filters/ip_filter.rb +0 -73
  93. data/lib/ronin/web/middleware/filters/path_filter.rb +0 -73
  94. data/lib/ronin/web/middleware/filters/referer_filter.rb +0 -71
  95. data/lib/ronin/web/middleware/filters/user_agent_filter.rb +0 -71
  96. data/lib/ronin/web/middleware/filters/vhost_filter.rb +0 -71
  97. data/lib/ronin/web/middleware/filters.rb +0 -28
  98. data/lib/ronin/web/middleware/helpers.rb +0 -145
  99. data/lib/ronin/web/middleware/proxy.rb +0 -265
  100. data/lib/ronin/web/middleware/proxy_request.rb +0 -262
  101. data/lib/ronin/web/middleware/request.rb +0 -79
  102. data/lib/ronin/web/middleware/response.rb +0 -33
  103. data/lib/ronin/web/middleware/router.rb +0 -167
  104. data/lib/ronin/web/middleware/rule.rb +0 -103
  105. data/lib/ronin/web/middleware.rb +0 -27
  106. data/lib/ronin/web/proxy/app.rb +0 -32
  107. data/lib/ronin/web/proxy/base.rb +0 -46
  108. data/lib/ronin/web/proxy/web.rb +0 -46
  109. data/lib/ronin/web/proxy.rb +0 -25
  110. data/lib/ronin/web/server/app.rb +0 -32
  111. data/lib/ronin/web/server/base.rb +0 -461
  112. data/lib/ronin/web/server/web.rb +0 -66
  113. data/lib/ronin/web/server.rb +0 -25
  114. data/lib/ronin/web/spider.rb +0 -120
  115. data/lib/ronin/web/user_agents.rb +0 -196
  116. data/lib/ronin/web/web.rb +0 -560
  117. data/spec/helpers/output.rb +0 -3
  118. data/spec/web/extensions/nokogiri_spec.rb +0 -38
  119. data/spec/web/helpers/rack_app.rb +0 -24
  120. data/spec/web/helpers/root/test1/index.html +0 -1
  121. data/spec/web/helpers/root/test1/test1.txt +0 -1
  122. data/spec/web/helpers/root/test1.txt +0 -1
  123. data/spec/web/helpers/root/test2/test2.txt +0 -1
  124. data/spec/web/helpers/root/test2.txt +0 -1
  125. data/spec/web/helpers/root/test3/test3.txt +0 -1
  126. data/spec/web/helpers/root/test3.txt +0 -1
  127. data/spec/web/helpers/root.rb +0 -15
  128. data/spec/web/mechanize_spec.rb +0 -62
  129. data/spec/web/middleware/directories_spec.rb +0 -86
  130. data/spec/web/middleware/files_spec.rb +0 -57
  131. data/spec/web/middleware/filters/campaign_filter_spec.rb +0 -30
  132. data/spec/web/middleware/filters/ip_filter_spec.rb +0 -25
  133. data/spec/web/middleware/filters/path_filter_spec.rb +0 -29
  134. data/spec/web/middleware/filters/referer_filter_spec.rb +0 -25
  135. data/spec/web/middleware/filters/user_agent_filter_spec.rb +0 -25
  136. data/spec/web/middleware/filters/vhost_filter_spec.rb +0 -23
  137. data/spec/web/middleware/proxy_spec.rb +0 -67
  138. data/spec/web/middleware/response_spec.rb +0 -20
  139. data/spec/web/middleware/router_spec.rb +0 -65
  140. data/spec/web/middleware/rule_spec.rb +0 -37
  141. data/spec/web/proxy/base_spec.rb +0 -8
  142. data/spec/web/server/base_spec.rb +0 -77
  143. data/spec/web/server/classes/public1/static1.txt +0 -1
  144. data/spec/web/server/classes/public2/static2.txt +0 -1
  145. data/spec/web/server/classes/sub_app.rb +0 -13
  146. data/spec/web/server/classes/test_app.rb +0 -20
  147. data/spec/web/user_agents_spec.rb +0 -56
  148. data/spec/web/web_spec.rb +0 -101
@@ -0,0 +1,50 @@
1
+ #
2
+ # ronin-web - A collection of useful web helper methods and commands.
3
+ #
4
+ # Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
5
+ #
6
+ # ronin-web is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # ronin-web is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with ronin-web. If not, see <https://www.gnu.org/licenses/>.
18
+ #
19
+
20
+ require 'ronin/core/cli/ruby_shell'
21
+
22
+ module Ronin
23
+ module Web
24
+ class CLI
25
+ #
26
+ # The interactive Ruby shell for {Ronin::Web}.
27
+ #
28
+ class RubyShell < Core::CLI::RubyShell
29
+
30
+ #
31
+ # Initializes the `ronin-web` Ruby shell.
32
+ #
33
+ # @param [String] name
34
+ # The name of the IRB shell.
35
+ #
36
+ # @param [Object] context
37
+ # Custom context to launch IRB from within.
38
+ #
39
+ # @param [Hash{Symbol => Object}] kwargs
40
+ # Additional keyword arguments for
41
+ # `Ronin::Core::CLI::RubyShell#initialize`.
42
+ #
43
+ def initialize(name: 'ronin-web', context: Web, **kwargs)
44
+ super(name: name, context: context, **kwargs)
45
+ end
46
+
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,44 @@
1
+ #
2
+ # ronin-web - A collection of useful web helper methods and commands.
3
+ #
4
+ # Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
5
+ #
6
+ # ronin-web is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # ronin-web is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with ronin-web. If not, see <https://www.gnu.org/licenses/>.
18
+ #
19
+
20
+ require 'command_kit/commands'
21
+ require 'command_kit/commands/auto_load'
22
+
23
+ module Ronin
24
+ module Web
25
+ #
26
+ # The `ronin-web` command-line interface (CLI).
27
+ #
28
+ # @api private
29
+ #
30
+ # @since 1.0.0
31
+ #
32
+ class CLI
33
+
34
+ include CommandKit::Commands
35
+ include CommandKit::Commands::AutoLoad.new(
36
+ dir: "#{__dir__}/cli/commands",
37
+ namespace: "#{self}::Commands"
38
+ )
39
+
40
+ command_name 'ronin-web'
41
+
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,85 @@
1
+ #
2
+ # ronin-web - A collection of useful web helper methods and commands.
3
+ #
4
+ # Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
5
+ #
6
+ # ronin-web is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # ronin-web is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with ronin-web. If not, see <https://www.gnu.org/licenses/>.
18
+ #
19
+
20
+ require 'nokogiri'
21
+
22
+ module Ronin
23
+ module Web
24
+ #
25
+ # HTML helper methods.
26
+ #
27
+ # @since 1.0.0
28
+ #
29
+ module HTML
30
+ #
31
+ # Parses the body of a document into a HTML document object.
32
+ #
33
+ # @param [String, IO] html
34
+ # The HTML to parse.
35
+ #
36
+ # @yield [doc]
37
+ # If a block is given, it will be passed the newly created document
38
+ # object.
39
+ #
40
+ # @yieldparam [Nokogiri::HTML::Document] doc
41
+ # The new HTML document object.
42
+ #
43
+ # @return [Nokogiri::HTML::Document]
44
+ # The new HTML document object.
45
+ #
46
+ # @see http://rubydoc.info/gems/nokogiri/Nokogiri/HTML/Document
47
+ #
48
+ # @api public
49
+ #
50
+ def self.parse(html)
51
+ doc = Nokogiri::HTML.parse(html)
52
+ yield doc if block_given?
53
+ return doc
54
+ end
55
+
56
+ #
57
+ # Creates a new `Nokogiri::HTML::Builder`.
58
+ #
59
+ # @yield []
60
+ # The block that will be used to construct the HTML document.
61
+ #
62
+ # @return [Nokogiri::HTML::Builder]
63
+ # The new HTML builder object.
64
+ #
65
+ # @example
66
+ # HTML.build do
67
+ # html {
68
+ # body {
69
+ # div(style: 'display:none;') {
70
+ # object(classid: 'blabla')
71
+ # }
72
+ # }
73
+ # }
74
+ # end
75
+ #
76
+ # @see http://rubydoc.info/gems/nokogiri/Nokogiri/HTML/Builder
77
+ #
78
+ # @api public
79
+ #
80
+ def self.build(&block)
81
+ Nokogiri::HTML::Builder.new(&block)
82
+ end
83
+ end
84
+ end
85
+ end
@@ -1,49 +1,50 @@
1
1
  #
2
- # Ronin Web - A Ruby library for Ronin that provides support for web
3
- # scraping and spidering functionality.
2
+ # ronin-web - A collection of useful web helper methods and commands.
4
3
  #
5
- # Copyright (c) 2006-2011 Hal Brodigan (postmodern.mod3 at gmail.com)
4
+ # Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
6
5
  #
7
- # This file is part of Ronin Web.
8
- #
9
- # Ronin is free software: you can redistribute it and/or modify
6
+ # ronin-web is free software: you can redistribute it and/or modify
10
7
  # it under the terms of the GNU General Public License as published by
11
8
  # the Free Software Foundation, either version 3 of the License, or
12
9
  # (at your option) any later version.
13
10
  #
14
- # Ronin is distributed in the hope that it will be useful,
11
+ # ronin-web is distributed in the hope that it will be useful,
15
12
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
13
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
14
  # GNU General Public License for more details.
18
15
  #
19
16
  # You should have received a copy of the GNU General Public License
20
- # along with Ronin. If not, see <http://www.gnu.org/licenses/>.
17
+ # along with ronin-web. If not, see <https://www.gnu.org/licenses/>.
21
18
  #
22
19
 
23
- require 'ronin/web/web'
24
- require 'ronin/network/http/proxy'
20
+ require 'ronin/support/network/http'
25
21
 
26
22
  require 'mechanize'
27
23
 
28
24
  module Ronin
29
25
  module Web
26
+ #
27
+ # Convenience class based on Mechanize.
28
+ #
29
+ # @see http://rubydoc.info/gems/mechanize/Mechanize
30
+ #
30
31
  class Mechanize < ::Mechanize
31
32
 
32
33
  #
33
34
  # Creates a new [Mechanize](http://mechanize.rubyforge.org/) Agent.
34
35
  #
35
- # @param [Hash] options
36
- # Additional options.
37
- #
38
- # @option options [String] :user_agent
39
- # The User-Agent string to use.
40
- #
41
- # @option options [String] :user_agent_alias
42
- # The User-Agent Alias to use.
43
- #
44
- # @option options [Network::HTTP::Proxy, Hash, String] :proxy (Web.proxy)
36
+ # @param [Network::HTTP::Proxy, Hash, String] proxy
45
37
  # Proxy information.
46
38
  #
39
+ # @param [String, :random, :chrome, :chrome_linux, :chrome_macos,
40
+ # :chrome_windows, :chrome_iphone, :chrome_ipad,
41
+ # :chrome_android, :firefox, :firefox_linux, :firefox_macos,
42
+ # :firefox_windows, :firefox_iphone, :firefox_ipad,
43
+ # :firefox_android, :safari, :safari_macos, :safari_iphone,
44
+ # :safari_ipad, :edge, :linux, :macos, :windows, :iphone,
45
+ # :ipad, :android, nil] user_agent
46
+ # The `User-Agent` string to use.
47
+ #
47
48
  # @yield [agent]
48
49
  # If a block is given, it will be passed the newly created Mechanize
49
50
  # agent.
@@ -51,26 +52,23 @@ module Ronin
51
52
  # @yieldparam [Mechanize] agent
52
53
  # The new Mechanize agent.
53
54
  #
54
- def initialize(options={})
55
+ def initialize(proxy: Support::Network::HTTP.proxy,
56
+ user_agent: Support::Network::HTTP.user_agent)
55
57
  super()
56
58
 
57
- if options[:user_agent_alias]
58
- self.user_agent_alias = options[:user_agent_alias]
59
- elsif options[:user_agent]
60
- self.user_agent = options[:user_agent]
61
- elsif Web.user_agent
62
- self.user_agent = Web.user_agent
63
- end
59
+ if proxy
60
+ proxy = URI(proxy)
64
61
 
65
- proxy = Network::HTTP::Proxy.new(options[:proxy] || Web.proxy)
62
+ set_proxy(proxy.host,proxy.port,proxy.user,proxy.password)
63
+ end
66
64
 
67
- if proxy[:host]
68
- set_proxy(
69
- proxy[:host],
70
- proxy[:port],
71
- proxy[:user],
72
- proxy[:password]
73
- )
65
+ if user_agent
66
+ self.user_agent = case user_agent
67
+ when Symbol
68
+ Support::Network::HTTP::UserAgents[user_agent]
69
+ else
70
+ user_agent
71
+ end
74
72
  end
75
73
 
76
74
  yield self if block_given?
@@ -0,0 +1,27 @@
1
+ #
2
+ # ronin-web - A collection of useful web helper methods and commands.
3
+ #
4
+ # Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
5
+ #
6
+ # ronin-web is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # ronin-web is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with ronin-web. If not, see <https://www.gnu.org/licenses/>.
18
+ #
19
+
20
+ module Ronin
21
+ module Web
22
+ # Path to `ronin-web` root directory.
23
+ #
24
+ # @api private
25
+ ROOT = File.expand_path(File.join(__dir__,'..','..','..'))
26
+ end
27
+ end
@@ -1,28 +1,25 @@
1
1
  #
2
- # Ronin Web - A Ruby library for Ronin that provides support for web
3
- # scraping and spidering functionality.
2
+ # ronin-web - A collection of useful web helper methods and commands.
4
3
  #
5
- # Copyright (c) 2006-2011 Hal Brodigan (postmodern.mod3 at gmail.com)
4
+ # Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
6
5
  #
7
- # This file is part of Ronin Web.
8
- #
9
- # Ronin is free software: you can redistribute it and/or modify
6
+ # ronin-web is free software: you can redistribute it and/or modify
10
7
  # it under the terms of the GNU General Public License as published by
11
8
  # the Free Software Foundation, either version 3 of the License, or
12
9
  # (at your option) any later version.
13
10
  #
14
- # Ronin is distributed in the hope that it will be useful,
11
+ # ronin-web is distributed in the hope that it will be useful,
15
12
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
13
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
14
  # GNU General Public License for more details.
18
15
  #
19
16
  # You should have received a copy of the GNU General Public License
20
- # along with Ronin. If not, see <http://www.gnu.org/licenses/>.
17
+ # along with ronin-web. If not, see <https://www.gnu.org/licenses/>.
21
18
  #
22
19
 
23
20
  module Ronin
24
21
  module Web
25
- # Ronin Web Version
26
- VERSION = '0.3.0.rc1'
22
+ # ronin-web Version
23
+ VERSION = '1.0.0.beta1'
27
24
  end
28
25
  end
@@ -0,0 +1,85 @@
1
+ #
2
+ # ronin-web - A collection of useful web helper methods and commands.
3
+ #
4
+ # Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
5
+ #
6
+ # ronin-web is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # ronin-web is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with ronin-web. If not, see <https://www.gnu.org/licenses/>.
18
+ #
19
+
20
+ require 'nokogiri'
21
+
22
+ module Ronin
23
+ module Web
24
+ #
25
+ # XML helper methods.
26
+ #
27
+ # @since 1.0.0
28
+ #
29
+ module XML
30
+ #
31
+ # Parses the body of a document into a HTML document object.
32
+ #
33
+ # @param [String, IO] xml
34
+ # The XML to parse.
35
+ #
36
+ # @yield [doc]
37
+ # If a block is given, it will be passed the newly created document
38
+ # object.
39
+ #
40
+ # @yieldparam [Nokogiri::XML::Document] doc
41
+ # The new XML document object.
42
+ #
43
+ # @return [Nokogiri::XML::Document]
44
+ # The new HTML document object.
45
+ #
46
+ # @see http://rubydoc.info/gems/nokogiri/Nokogiri/XML/Document
47
+ #
48
+ # @api public
49
+ #
50
+ def self.parse(xml)
51
+ doc = Nokogiri::XML.parse(xml)
52
+ yield doc if block_given?
53
+ return doc
54
+ end
55
+
56
+ #
57
+ # Creates a new `Nokogiri::XML::Builder`.
58
+ #
59
+ # @yield []
60
+ # The block that will be used to construct the XML document.
61
+ #
62
+ # @return [Nokogiri::XML::Builder]
63
+ # The new XML builder object.
64
+ #
65
+ # @example
66
+ # HTML.build do
67
+ # html {
68
+ # body {
69
+ # div(style: 'display:none;') {
70
+ # object(classid: 'blabla')
71
+ # }
72
+ # }
73
+ # }
74
+ # end
75
+ #
76
+ # @see http://rubydoc.info/gems/nokogiri/Nokogiri/XML/Builder
77
+ #
78
+ # @api public
79
+ #
80
+ def self.build(&block)
81
+ Nokogiri::XML::Builder.new(&block)
82
+ end
83
+ end
84
+ end
85
+ end