lib/moxml/document.rb in moxml-0.1.0 vs lib/moxml/document.rb in moxml-0.1.1
- old
+ new
@@ -1,99 +1,87 @@
+# frozen_string_literal: true
+
+require_relative "node"
+require_relative "element"
+require_relative "text"
+require_relative "cdata"
+require_relative "comment"
+require_relative "processing_instruction"
+require_relative "declaration"
+require_relative "namespace"
+require_relative "doctype"
+
module Moxml
class Document < Node
- def self.parse(input, options = {})
- new(Moxml.adapter.parse(input, options))
+ def root=(element)
+ adapter.set_root(@native, element.native)
end
def root
- wrap_node(adapter.root(native))
+ root_element = adapter.root(@native)
+ root_element ? Element.wrap(root_element, context) : nil
end
def create_element(name)
- Element.new(adapter.create_element(native, name))
+ Element.new(adapter.create_element(name), context)
end
def create_text(content)
- Text.new(adapter.create_text(native, content))
+ Text.new(adapter.create_text(content), context)
end
def create_cdata(content)
- Cdata.new(adapter.create_cdata(native, content))
+ Cdata.new(adapter.create_cdata(content), context)
end
def create_comment(content)
- Comment.new(adapter.create_comment(native, content))
+ Comment.new(adapter.create_comment(content), context)
end
+ def create_doctype(name, external_id, system_id)
+ Doctype.new(
+ adapter.create_doctype(name, external_id, system_id),
+ context
+ )
+ end
+
def create_processing_instruction(target, content)
ProcessingInstruction.new(
- adapter.create_processing_instruction(native, target, content)
+ adapter.create_processing_instruction(target, content),
+ context
)
end
- def to_xml(options = {})
- adapter.serialize(native, options)
+ def create_declaration(version = "1.0", encoding = "UTF-8", standalone = nil)
+ decl = adapter.create_declaration(version, encoding, standalone)
+ Declaration.new(decl, context)
end
- def encoding
- declaration&.encoding
- end
+ def add_child(node)
+ node = prepare_node(node)
- def encoding=(encoding)
- (declaration || add_declaration).encoding = encoding
- end
-
- def version
- declaration&.version
- end
-
- def version=(version)
- (declaration || add_declaration).version = version
- end
-
- def standalone
- declaration&.standalone
- end
-
- def standalone=(standalone)
- (declaration || add_declaration).standalone = standalone
- end
-
- def declaration
- children.find { |node| node.is_a?(Declaration) }
- end
-
- def add_declaration(version = "1.0", encoding = "UTF-8", standalone = nil)
- decl = Declaration.new(version, encoding, standalone)
- if declaration
- declaration.replace(decl)
+ if node.is_a?(Declaration)
+ if children.empty?
+ adapter.add_child(@native, node.native)
+ else
+ adapter.add_previous_sibling(children.first.native, node.native)
+ end
+ elsif root && !node.is_a?(ProcessingInstruction) && !node.is_a?(Comment)
+ raise Error, "Document already has a root element"
else
- add_child(decl)
+ adapter.add_child(@native, node.native)
end
- decl
+ self
end
- def css(selector)
- NodeSet.new(adapter.css(native, selector))
+ def xpath(expression, namespaces = nil)
+ native_nodes = adapter.xpath(@native, expression, namespaces)
+ NodeSet.new(native_nodes, context)
end
- def xpath(expression, namespaces = {})
- NodeSet.new(adapter.xpath(native, expression, namespaces))
- end
-
- def at_css(selector)
- node = adapter.at_css(native, selector)
- node.nil? ? nil : wrap_node(node)
- end
-
- def at_xpath(expression, namespaces = {})
- node = adapter.at_xpath(native, expression, namespaces)
- node.nil? ? nil : wrap_node(node)
- end
-
- private
-
- def create_native_node
- adapter.create_document
+ def at_xpath(expression, namespaces = nil)
+ if (native_node = adapter.at_xpath(@native, expression, namespaces))
+ Node.wrap(native_node, context)
+ end
end
end
end