From f30bfb00da021edc06ca56a7636e24c2c8449489 Mon Sep 17 00:00:00 2001 From: Brian Borge Date: Thu, 4 Jun 2020 21:05:28 -0400 Subject: [PATCH 1/4] Represent a node --- node.rb | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 node.rb diff --git a/node.rb b/node.rb new file mode 100644 index 0000000..08a88c7 --- /dev/null +++ b/node.rb @@ -0,0 +1,8 @@ +class Node + attr_accessor :type, :children + + def initialize(type:, children: []) + @type = type + @children = children + end +end From 3dc98cdf0d3e9a43a33438c78f83e15e35c4dde3 Mon Sep 17 00:00:00 2001 From: Brian Borge Date: Thu, 4 Jun 2020 21:07:43 -0400 Subject: [PATCH 2/4] Create Text and Element node types --- node_types.rb | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 node_types.rb diff --git a/node_types.rb b/node_types.rb new file mode 100644 index 0000000..4c84775 --- /dev/null +++ b/node_types.rb @@ -0,0 +1,18 @@ +module NodeTypes + class Text + attr_reader :string + + def initialize(string) + @string = string + end + end + + class Element + attr_reader :tag_name, :attributes + + def initialize(tag_name:, attributes: {}) + @tag_name = tag_name + @attributes = attributes + end + end +end From a2dd02a22d4a44f3edb8deccb187f838978420ec Mon Sep 17 00:00:00 2001 From: Brian Borge Date: Thu, 4 Jun 2020 21:08:08 -0400 Subject: [PATCH 3/4] Build DOM data structure --- dom.rb | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 dom.rb diff --git a/dom.rb b/dom.rb new file mode 100644 index 0000000..c9dce34 --- /dev/null +++ b/dom.rb @@ -0,0 +1,26 @@ +require_relative 'node' +require_relative 'node_types' + +class Dom + attr_reader :root_node + + def initialize(node) + @root_node = node + end + + def self.text_node(string) + Node.new( + type: NodeTypes::Text.new(string) + ) + end + + def self.element_node(tag_name:, attributes: {}, children: []) + Node.new( + type: NodeTypes::Element.new( + tag_name: tag_name, + attributes: attributes + ), + children: children + ) + end +end From 4d64465a87a4216523f2da74ed56addbfff54c0f Mon Sep 17 00:00:00 2001 From: Brian Borge Date: Fri, 5 Jun 2020 21:22:45 -0400 Subject: [PATCH 4/4] wip: - organize project folder structure - NodeTypes inherit from Node - wrap all the code in a WindowBrowser module - Add some node methods: - first_child: fetch the node's first child - children?: fetch the node's children - type: fetch the node's type (e.g. WindowBrowser::NodeTypes::Element) --- dom.rb | 26 -------------- lib/window_browser.rb | 2 ++ lib/window_browser/dom.rb | 45 ++++++++++++++++++++++++ lib/window_browser/node.rb | 22 ++++++++++++ lib/window_browser/node_types/element.rb | 16 +++++++++ lib/window_browser/node_types/text.rb | 15 ++++++++ node.rb | 8 ----- node_types.rb | 18 ---------- 8 files changed, 100 insertions(+), 52 deletions(-) delete mode 100644 dom.rb create mode 100644 lib/window_browser.rb create mode 100644 lib/window_browser/dom.rb create mode 100644 lib/window_browser/node.rb create mode 100644 lib/window_browser/node_types/element.rb create mode 100644 lib/window_browser/node_types/text.rb delete mode 100644 node.rb delete mode 100644 node_types.rb diff --git a/dom.rb b/dom.rb deleted file mode 100644 index c9dce34..0000000 --- a/dom.rb +++ /dev/null @@ -1,26 +0,0 @@ -require_relative 'node' -require_relative 'node_types' - -class Dom - attr_reader :root_node - - def initialize(node) - @root_node = node - end - - def self.text_node(string) - Node.new( - type: NodeTypes::Text.new(string) - ) - end - - def self.element_node(tag_name:, attributes: {}, children: []) - Node.new( - type: NodeTypes::Element.new( - tag_name: tag_name, - attributes: attributes - ), - children: children - ) - end -end diff --git a/lib/window_browser.rb b/lib/window_browser.rb new file mode 100644 index 0000000..e6c3d15 --- /dev/null +++ b/lib/window_browser.rb @@ -0,0 +1,2 @@ +module WindowBrowser +end diff --git a/lib/window_browser/dom.rb b/lib/window_browser/dom.rb new file mode 100644 index 0000000..f216771 --- /dev/null +++ b/lib/window_browser/dom.rb @@ -0,0 +1,45 @@ +require_relative 'node_types/text' +require_relative 'node_types/element' + +module WindowBrowser + class Dom + attr_reader :root_node + + def initialize(node) + @root_node = node + end + + def self.text_node(string) + NodeTypes::Text.new(string: string) + end + + def self.element_node(tag_name:, attributes: {}, children: []) + NodeTypes::Element.new( + tag_name: tag_name, + attributes: attributes, + children: children + ) + end + end +end + +dom = WindowBrowser::Dom.new( + WindowBrowser::Dom.element_node( + tag_name: 'div', + children: [ + WindowBrowser::Dom.element_node(tag_name: 'div'), + WindowBrowser::Dom.element_node(tag_name: 'span'), + WindowBrowser::Dom.element_node(tag_name: 'p'), + WindowBrowser::Dom.element_node( + tag_name: 'div', + children: [ + WindowBrowser::Dom.element_node(tag_name: 'div'), + WindowBrowser::Dom.element_node(tag_name: 'span'), + WindowBrowser::Dom.element_node(tag_name: 'p') + ] + ) + ] + ) +) + +puts dom.root_node.children.count diff --git a/lib/window_browser/node.rb b/lib/window_browser/node.rb new file mode 100644 index 0000000..17867d3 --- /dev/null +++ b/lib/window_browser/node.rb @@ -0,0 +1,22 @@ +module WindowBrowser + class Node + attr_accessor :children + + def initialize(children: []) + @children = children + end + + def first_child + children.first + end + + def children? + children.any? + end + + def type + self.class + end + end +end + diff --git a/lib/window_browser/node_types/element.rb b/lib/window_browser/node_types/element.rb new file mode 100644 index 0000000..0102718 --- /dev/null +++ b/lib/window_browser/node_types/element.rb @@ -0,0 +1,16 @@ +require_relative '../node' + +module WindowBrowser + module NodeTypes + class Element < Node + attr_reader :tag_name, :attributes + + def initialize(tag_name:, attributes: {}, children: []) + @tag_name = tag_name + @attributes = attributes + + super(children: children) + end + end + end +end diff --git a/lib/window_browser/node_types/text.rb b/lib/window_browser/node_types/text.rb new file mode 100644 index 0000000..87d7412 --- /dev/null +++ b/lib/window_browser/node_types/text.rb @@ -0,0 +1,15 @@ +require_relative '../node' + +module WindowBrowser + module NodeTypes + class Text < Node + attr_accessor :string + + def initialize(string:, children: []) + @string = string + + super(children: children) + end + end + end +end diff --git a/node.rb b/node.rb deleted file mode 100644 index 08a88c7..0000000 --- a/node.rb +++ /dev/null @@ -1,8 +0,0 @@ -class Node - attr_accessor :type, :children - - def initialize(type:, children: []) - @type = type - @children = children - end -end diff --git a/node_types.rb b/node_types.rb deleted file mode 100644 index 4c84775..0000000 --- a/node_types.rb +++ /dev/null @@ -1,18 +0,0 @@ -module NodeTypes - class Text - attr_reader :string - - def initialize(string) - @string = string - end - end - - class Element - attr_reader :tag_name, :attributes - - def initialize(tag_name:, attributes: {}) - @tag_name = tag_name - @attributes = attributes - end - end -end