# coding: utf-8
# frozen_string_literal: true
module Nokogiri
module XML
# DocumentFragment represents a fragment of an \XML document. It provides the same functionality
# exposed by XML::Node and can be used to contain one or more \XML subtrees.
class DocumentFragment < Nokogiri::XML::Node
# The options used to parse the document fragment. Returns the value of any options that were
# passed into the constructor as a parameter or set in a config block, else the default
# options for the specific subclass.
attr_reader :parse_options
class << self
# :call-seq:
# parse(input) { |options| ... } → XML::DocumentFragment
# parse(input, options:) → XML::DocumentFragment
#
# Parse \XML fragment input from a String, and return a new XML::DocumentFragment. This
# method creates a new, empty XML::Document to contain the fragment.
#
# [Required Parameters]
# - +input+ (String) The content to be parsed.
#
# [Optional Keyword Arguments]
# - +options+ (Nokogiri::XML::ParseOptions) Configuration object that determines some
# behaviors during parsing. See ParseOptions for more information. The default value is
# +ParseOptions::DEFAULT_XML+.
#
# [Yields]
# If a block is given, a Nokogiri::XML::ParseOptions object is yielded to the block which
# can be configured before parsing. See Nokogiri::XML::ParseOptions for more information.
#
# [Returns] Nokogiri::XML::DocumentFragment
def parse(tags, options_ = ParseOptions::DEFAULT_XML, options: options_, &block)
new(XML::Document.new, tags, options: options, &block)
end
# Wrapper method to separate the concerns of:
# - the native object allocator's parameter (it only requires `document`)
# - the initializer's parameters
def new(document, ...) # :nodoc:
instance = native_new(document)
instance.send(:initialize, document, ...)
instance
end
end
# :call-seq:
# new(document, input=nil) { |options| ... } → DocumentFragment
# new(document, input=nil, context:, options:) → DocumentFragment
#
# Parse \XML fragment input from a String, and return a new DocumentFragment that is
# associated with the given +document+.
#
# 💡 It's recommended to use either XML::DocumentFragment.parse or Node#parse rather than call
# this method directly.
#
# [Required Parameters]
# - +document+ (XML::Document) The parent document to associate the returned fragment with.
#
# [Optional Parameters]
# - +input+ (String) The content to be parsed.
#
# [Optional Keyword Arguments]
# - +context:+ (Nokogiri::XML::Node) The context node for the subtree created. See
# below for more information.
#
# - +options:+ (Nokogiri::XML::ParseOptions) Configuration object that determines some
# behaviors during parsing. See ParseOptions for more information. The default value is
# +ParseOptions::DEFAULT_XML+.
#
# [Yields]
# If a block is given, a Nokogiri::XML::ParseOptions object is yielded to the block which
# can be configured before parsing. See ParseOptions for more information.
#
# [Returns] XML::DocumentFragment
#
# === Context \Node
#
# If a context node is specified using +context:+, then the fragment will be created by
# calling Node#parse on that node, so the parser will behave as if that Node is the parent of
# the fragment subtree, and will resolve namespaces relative to that node.
#
def initialize(
document, tags = nil,
context_ = nil, options_ = ParseOptions::DEFAULT_XML,
context: context_, options: options_
) # rubocop:disable Lint/MissingSuper
return self unless tags
options = Nokogiri::XML::ParseOptions.new(options) if Integer === options
@parse_options = options
yield options if block_given?
children = if context
# Fix for issue#490
if Nokogiri.jruby?
# fix for issue #770
context.parse("