From 806cf6d76ab557ceebf5ac5d22f3e39076e1ab61 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sun, 17 Apr 2005 16:43:48 +0000 Subject: Added assert_tag and assert_no_tag as a much improved alternative to the deprecated assert_template_xpath_match #1126 [Jamis Buck] git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@1195 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- .../vendor/html-scanner/html/document.rb | 63 ++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 actionpack/lib/action_controller/vendor/html-scanner/html/document.rb (limited to 'actionpack/lib/action_controller/vendor/html-scanner/html/document.rb') diff --git a/actionpack/lib/action_controller/vendor/html-scanner/html/document.rb b/actionpack/lib/action_controller/vendor/html-scanner/html/document.rb new file mode 100644 index 0000000000..a196bdea44 --- /dev/null +++ b/actionpack/lib/action_controller/vendor/html-scanner/html/document.rb @@ -0,0 +1,63 @@ +require 'html/tokenizer' +require 'html/node' + +module HTML + + # A top-level HTMl document. You give it a body of text, and it will parse that + # text into a tree of nodes. + class Document + + # The root of the parsed document. + attr_reader :root + + # Create a new Document from the given text. + def initialize(text) + tokenizer = Tokenizer.new(text) + @root = Node.new(nil) + node_stack = [ @root ] + while token = tokenizer.next + node = Node.parse(node_stack.last, tokenizer.line, tokenizer.position, token) + + node_stack.last.children << node unless node.tag? && node.closing == :close + if node.tag? && !node.childless? + if node_stack.length > 1 && node.closing == :close + if node_stack.last.name == node.name + node_stack.pop + else + open_start = node_stack.last.position - 20 + open_start = 0 if open_start < 0 + close_start = node.position - 20 + close_start = 0 if close_start < 0 + warn <