diff --git a/Rakefile b/Rakefile
index e0485b20..7143e754 100644
--- a/Rakefile
+++ b/Rakefile
@@ -26,3 +26,5 @@ RDoc::Task.new do |rdoc|
rdoc.rdoc_files.include(*spec.source_paths)
rdoc.rdoc_files.include(*spec.extra_rdoc_files)
end
+
+load "#{__dir__}/tasks/tocs.rake"
diff --git a/doc/rexml/tasks/rdoc/child.rdoc b/doc/rexml/tasks/rdoc/child.rdoc
new file mode 100644
index 00000000..89536381
--- /dev/null
+++ b/doc/rexml/tasks/rdoc/child.rdoc
@@ -0,0 +1,87 @@
+== Class Child
+
+Class Child includes module Node;
+see {Tasks for Node}[node_rdoc.html].
+
+:include: ../tocs/child_toc.rdoc
+
+=== Relationships
+
+==== Task: Set the Parent
+
+Use method {Child#parent=}[../../../../REXML/Parent.html#method-i-parent-3D]
+to set the parent:
+
+ e0 = REXML::Element.new('foo')
+ e1 = REXML::Element.new('bar')
+ e1.parent # => nil
+ e1.parent = e0
+ e1.parent # =>
+
+==== Task: Insert Previous Sibling
+
+Use method {Child#previous_sibling=}[../../../../REXML/Parent.html#method-i-previous_sibling-3D]
+to insert a previous sibling:
+
+ xml_string = ''
+ d = REXML::Document.new(xml_string)
+ d.root.to_a # => [, ]
+ c = d.root[1] # =>
+ b = REXML::Element.new('b')
+ c.previous_sibling = b
+ d.root.to_a # => [, , ]
+
+==== Task: Insert Next Sibling
+
+Use method {Child#next_sibling=}[../../../../REXML/Parent.html#method-i-next-sibling-3D]
+to insert a previous sibling:
+
+ xml_string = ''
+ d = REXML::Document.new(xml_string)
+ d.root.to_a # => [, ]
+ a = d.root[0] # =>
+ b = REXML::Element.new('b')
+ a.next_sibling = b
+ d.root.to_a # => [, , ]
+
+=== Removal or Replacement
+
+==== Task: Remove Child from Parent
+
+Use method {Child#remove}[../../../../REXML/Parent.html#method-i-remove]
+to remove a child from its parent; returns the removed child:
+
+ xml_string = ''
+ d = REXML::Document.new(xml_string)
+ d.root.to_a # => [, , ]
+ b = d.root[1] # =>
+ b.remove # =>
+ d.root.to_a # => [, ]
+
+==== Task: Replace Child
+
+Use method {Child#replace_with}[../../../../REXML/Parent.html#method-i-replace]
+to replace a child;
+returns the replaced child:
+
+ xml_string = ''
+ d = REXML::Document.new(xml_string)
+ d.root.to_a # => [, , ]
+ b = d.root[1] # =>
+ d = REXML::Element.new('d')
+ b.replace_with(d) # =>
+ d.root.to_a # => [, , ]
+
+=== Document
+
+==== Task: Get the Document
+
+Use method {Child#document}[../../../../REXML/Parent.html#method-i-document]
+to get the document for the child:
+
+ xml_string = ''
+ d = REXML::Document.new(xml_string)
+ d.root.to_a # => [, , ]
+ b = d.root[1] # =>
+ b.document == d # => true
+ REXML::Child.new.document # => nil
diff --git a/doc/rexml/tasks/rdoc/document.rdoc b/doc/rexml/tasks/rdoc/document.rdoc
new file mode 100644
index 00000000..96d03351
--- /dev/null
+++ b/doc/rexml/tasks/rdoc/document.rdoc
@@ -0,0 +1,276 @@
+== Class Document
+
+Class Document has methods from its superclasses and included modules;
+see:
+
+- {Tasks for Element}[element_rdoc.html].
+- {Tasks for Parent}[parent_rdoc.html].
+- {Tasks for Child}[child_rdoc.html].
+- {Tasks for Node}[node_rdoc.html].
+- {Module Enumerable}[https://docs.ruby-lang.org/en/master/Enumerable.html].
+
+:include: ../tocs/document_toc.rdoc
+
+=== New Document
+
+==== Task: Create an Empty Document
+
+Use method {Document::new}[../../../../REXML/Document.html#method-c-new]
+to create an empty document.
+
+ d = REXML::Document.new
+
+==== Task: Parse a \String into a New Document
+
+Use method {Document::new}[../../../../REXML/Document.html#method-c-new]
+to parse an XML string into a new document:
+
+ xml_string = 'textmore'
+ d = REXML::Document.new(xml_string)
+ d.root # => ... >
+
+==== Task: Parse an \IO Stream into a New Document
+
+Use method {Document::new}[../../../../REXML/Document.html#method-c-new]
+to parse an XML \IO stream into a new document:
+
+ xml_string = 'textmore'
+ File.write('t.xml', xml_string)
+ d = File.open('t.xml', 'r') do |file|
+ REXML::Document.new(file)
+ end
+ d.root # => ... >
+
+==== Task: Create a Document from an Existing Document
+
+Use method {Document::new}[../../../../REXML/Document.html#method-c-new]
+to create a document from an existing document.
+The context and attributes are copied to the new document,
+but not the children:
+
+ xml_string = 'textmore'
+ d = REXML::Document.new(xml_string)
+ d.children # => [ ... >]
+ d.context = {raw: :all, compress_whitespace: :all}
+ d.add_attributes({'bar' => 0, 'baz' => 1})
+ d1 = REXML::Document.new(d)
+ d1.context # => {:raw=>:all, :compress_whitespace=>:all}
+ d1.attributes # => {"bar"=>bar='0', "baz"=>baz='1'}
+ d1.children # => []
+
+==== Task: Clone a Document
+
+Use method {Document#clone}[../../../../REXML/Document.html#method-i-clone]
+to clone a document.
+The context and attributes are copied to the new document,
+but not the children:
+
+ xml_string = 'textmore'
+ d = REXML::Document.new(xml_string)
+ d.children # => [ ... >]
+ d.context = {raw: :all, compress_whitespace: :all}
+ d.add_attributes({'bar' => 0, 'baz' => 1})
+ d1 = d.clone # => < bar='0' baz='1'/>
+ d1.context # => {:raw=>:all, :compress_whitespace=>:all}
+ d1.attributes # => {"bar"=>bar='0', "baz"=>baz='1'}
+ d1.children # => []
+
+=== Document Type
+
+==== Task: Get the Document Type
+
+Use method {Document#doctype}[../../../../REXML/Document.html#method-i-doctype]
+to get the document type:
+
+ d = REXML::Document.new('')
+ d.doctype.class # => REXML::DocType
+ d = REXML::Document.new('')
+ d.doctype.class # => nil
+
+==== Task: Set the Document Type
+
+Use method {document#add}[../../../../REXML/Document.html#method-i-add]
+to add or replace the document type:
+
+ d = REXML::Document.new('')
+ d.doctype.class # => nil
+ d.add(REXML::DocType.new('foo'))
+ d.doctype.class # => REXML::DocType
+
+=== XML Declaration
+
+==== Task: Get the XML Declaration
+
+Use method {document#xml_decl}[../../../../REXML/Document.html#method-i-xml_decl]
+to get the XML declaration:
+
+ d = REXML::Document.new('')
+ d.xml_decl.class # => REXML::XMLDecl
+ d.xml_decl # =>
+ d = REXML::Document.new('')
+ d.xml_decl.class # => REXML::XMLDecl
+ d.xml_decl # =>
+
+==== Task: Set the XML Declaration
+
+Use method {document#add}[../../../../REXML/Document.html#method-i-add]
+to replace the XML declaration:
+
+ d = REXML::Document.new('')
+ d.add(REXML::XMLDecl.new)
+
+=== Children
+
+==== Task: Add an Element Child
+
+Use method
+{document#add_element}[../../../../REXML/Document.html#method-i-add_element]
+to add an element to the document:
+
+ d = REXML::Document.new('')
+ d.add_element(REXML::Element.new('root'))
+ d.children # => []
+
+==== Task: Add a Non-Element Child
+
+Use method
+{document#add}[../../../../REXML/Document.html#method-i-add]
+to add a non-element to the document:
+
+ xml_string = 'textmore'
+ d = REXML::Document.new(xml_string)
+ d.add(REXML::Text.new('foo'))
+ d.children # => [ ... >, "foo"]
+
+=== Writing
+
+==== Task: Write to $stdout
+
+Use method
+{document#write}[../../../../REXML/Document.html#method-i-write]
+to write the document to $stdout:
+
+ xml_string = 'textmore'
+ d = REXML::Document.new(xml_string)
+ d.write
+
+Output:
+
+ textmore
+
+==== Task: Write to IO Stream
+
+Use method
+{document#write}[../../../../REXML/Document.html#method-i-write]
+to write the document to $stdout:
+
+ xml_string = 'textmore'
+ d = REXML::Document.new(xml_string)
+ File.open('t.xml', 'w') do |file|
+ d.write(file)
+ end
+ p File.read('t.xml')
+
+Output:
+
+ "textmore"
+
+==== Task: Write with No Indentation
+
+Use method
+{document#write}[../../../../REXML/Document.html#method-i-write]
+to write the document with no indentation:
+
+ xml_string = ''
+ d = REXML::Document.new(xml_string)
+ d.write({indent: 0})
+
+Output:
+
+
+
+
+
+
+
+
+
+==== Task: Write with Specified Indentation
+
+Use method
+{document#write}[../../../../REXML/Document.html#method-i-write]
+to write the document with a specified indentation:
+
+ xml_string = ''
+ d = REXML::Document.new(xml_string)
+ d.write({indent: 2})
+
+Output:
+
+
+
+
+
+
+
+
+
+=== Querying
+
+==== Task: Get the Document
+
+Use method
+{document#document}[../../../../REXML/Document.html#method-i-document]
+to get the document (+self+); overrides Element#document:
+
+ xml_string = ''
+ d = REXML::Document.new(xml_string)
+ d.document == d # => true
+
+==== Task: Get the Encoding
+
+Use method
+{document#document}[../../../../REXML/Document.html#method-i-document]
+to get the document (+self+); overrides Element#document:
+
+ xml_string = ''
+ d = REXML::Document.new(xml_string)
+ d.encoding # => "UTF-8"
+
+==== Task: Get the Node Type
+
+Use method
+{document#node_type}[../../../../REXML/Document.html#method-i-node_type]
+to get the node type (+:document+); overrides Element#node_type:
+
+ xml_string = ''
+ d = REXML::Document.new(xml_string)
+ d.node_type # => :document
+
+==== Task: Get the Root Element
+
+Use method
+{document#root}[../../../../REXML/Document.html#method-i-root]
+to get the root element:
+
+ xml_string = ''
+ d = REXML::Document.new(xml_string)
+ d.root # => ... >
+
+==== Task: Determine Whether Stand-Alone
+
+Use method
+{document#stand_alone?}[../../../../REXML/Document.html#method-i-stand_alone-3F]
+to get the stand-alone value:
+
+ d = REXML::Document.new('')
+ d.stand_alone? # => "yes"
+
+==== Task: Get the Version
+
+Use method
+{document#version}[../../../../REXML/Document.html#method-i-version]
+to get the version:
+
+ d = REXML::Document.new('')
+ d.version # => "2.0"
diff --git a/doc/rexml/tasks/rdoc/element.rdoc b/doc/rexml/tasks/rdoc/element.rdoc
new file mode 100644
index 00000000..f229275f
--- /dev/null
+++ b/doc/rexml/tasks/rdoc/element.rdoc
@@ -0,0 +1,602 @@
+== Class Element
+
+Class Element has methods from its superclasses and included modules;
+see:
+
+- {Tasks for Parent}[parent_rdoc.html].
+- {Tasks for Child}[child_rdoc.html].
+- {Tasks for Node}[node_rdoc.html].
+- {Module Enumerable}[https://docs.ruby-lang.org/en/master/Enumerable.html].
+
+:include: ../tocs/element_toc.rdoc
+
+=== New Element
+
+==== Task: Create a Default Element
+
+Use method
+{Element::new}[../../../../REXML/Element.html#method-c-new]
+with no arguments to create a default element:
+
+ e = REXML::Element.new
+ e.name # => "UNDEFINED"
+ e.parent # => nil
+ e.context # => nil
+
+==== Task: Create a Named Element
+
+Use method
+{Element::new}[../../../../REXML/Element.html#method-c-new]
+with a string name argument
+to create a named element:
+
+ e = REXML::Element.new('foo')
+ e.name # => "foo"
+ e.parent # => nil
+ e.context # => nil
+
+==== Task: Create an Element with Name and Parent
+
+Use method
+{Element::new}[../../../../REXML/Element.html#method-c-new]
+with name and parent arguments
+to create an element with name and parent:
+
+ p = REXML::Parent.new
+ e = REXML::Element.new('foo', p)
+ e.name # => "foo"
+ e.parent # => #]>
+ e.context # => nil
+
+==== Task: Create an Element with Name, Parent, and Context
+
+Use method
+{Element::new}[../../../../REXML/Element.html#method-c-new]
+with name, parent, and context arguments
+to create an element with name, parent, and context:
+
+ p = REXML::Parent.new
+ e = REXML::Element.new('foo', p, {compress_whitespace: :all})
+ e.name # => "foo"
+ e.parent # => #]>
+ e.context # => {:compress_whitespace=>:all}
+
+==== Task: Create a Shallow Clone
+
+Use method
+{Element#clone}[../../../../REXML/Element.html#method-i-clone]
+to create a shallow clone of an element,
+copying only the name, attributes, and context:
+
+ e0 = REXML::Element.new('foo', nil, {compress_whitespace: :all})
+ e0.add_attribute(REXML::Attribute.new('bar', 'baz'))
+ e0.context = {compress_whitespace: :all}
+ e1 = e0.clone # =>
+ e1.name # => "foo"
+ e1.context # => {:compress_whitespace=>:all}
+
+=== Attributes
+
+==== Task: Create and Add an Attribute
+
+Use method
+{Element#add_attribute}[../../../../REXML/Element.html#method-i-add_attribute]
+to create and add an attribute:
+
+ e = REXML::Element.new
+ e.add_attribute('attr', 'value') # => "value"
+ e['attr'] # => "value"
+ e.add_attribute('attr', 'VALUE') # => "VALUE"
+ e['attr'] # => "VALUE"
+
+==== Task: Add an Existing Attribute
+
+Use method
+{Element#add_attribute}[../../../../REXML/Element.html#method-i-add_attribute]
+to add an existing attribute:
+
+ e = REXML::Element.new
+ a = REXML::Attribute.new('attr', 'value')
+ e.add_attribute(a)
+ e['attr'] # => "value"
+ a = REXML::Attribute.new('attr', 'VALUE')
+ e.add_attribute(a)
+ e['attr'] # => "VALUE"
+
+==== Task: Add Multiple Attributes from a Hash
+
+Use method
+{Element#add_attributes}[../../../../REXML/Element.html#method-i-add_attributes]
+to add multiple attributes from a hash:
+
+ e = REXML::Element.new
+ h = {'foo' => 0, 'bar' => 1}
+ e.add_attributes(h)
+ e['foo'] # => "0"
+ e['bar'] # => "1"
+
+==== Task: Add Multiple Attributes from an Array
+
+Use method
+{Element#add_attributes}[../../../../REXML/Element.html#method-i-add_attributes]
+to add multiple attributes from an array:
+
+ e = REXML::Element.new
+ a = [['foo', 0], ['bar', 1]]
+ e.add_attributes(a)
+ e['foo'] # => "0"
+ e['bar'] # => "1"
+
+==== Task: Retrieve the Value for an Attribute Name
+
+Use method
+{Element#[]}[../../../../REXML/Element.html#method-i-5B-5D]
+to retrieve the value for an attribute name:
+
+ e = REXML::Element.new
+ e.add_attribute('attr', 'value') # => "value"
+ e['attr'] # => "value"
+
+==== Task: Retrieve the Attribute Value for a Name and Namespace
+
+Use method
+{Element#attribute}[../../../../REXML/Element.html#method-i-attribute]
+to retrieve the value for an attribute name:
+
+ xml_string = ""
+ d = REXML::Document.new(xml_string)
+ e = d.root
+ e.attribute("x") # => x='x'
+ e.attribute("x", "a") # => a:x='a:x'
+
+==== Task: Delete an Attribute
+
+Use method
+{Element#delete_attribute}[../../../../REXML/Element.html#method-i-delete_attribute]
+to remove an attribute:
+
+ e = REXML::Element.new('foo')
+ e.add_attribute('bar', 'baz')
+ e.delete_attribute('bar')
+ e.delete_attribute('bar')
+ e['bar'] # => nil
+
+==== Task: Determine Whether the Element Has Attributes
+
+Use method
+{Element#has_attributes?}[../../../../REXML/Element.html#method-i-has_attributes-3F]
+to determine whether the element has attributes:
+
+ e = REXML::Element.new('foo')
+ e.has_attributes? # => false
+ e.add_attribute('bar', 'baz')
+ e.has_attributes? # => true
+
+=== Children
+
+Element Children
+
+==== Task: Create and Add an Element
+
+Use method
+{Element#add_element}[../../../../REXML/Element.html#method-i-add_element]
+to create a new element and add it to this element:
+
+ e0 = REXML::Element.new('foo')
+ e0.add_element('bar')
+ e0.children # => []
+
+==== Task: Add an Existing Element
+
+Use method
+{Element#add_element}[../../../../REXML/Element.html#method-i-add_element]
+to add an element to this element:
+
+ e0 = REXML::Element.new('foo')
+ e1 = REXML::Element.new('bar')
+ e0.add_element(e1)
+ e0.children # => []
+
+==== Task: Create and Add an Element with Attributes
+
+Use method
+{Element#add_element}[../../../../REXML/Element.html#method-i-add_element]
+to create a new element with attributes, and add it to this element:
+
+ e0 = REXML::Element.new('foo')
+ e0.add_element('bar', {'name' => 'value'})
+ e0.children # => []
+
+==== Task: Add an Existing Element with Added Attributes
+
+Use method
+{Element#add_element}[../../../../REXML/Element.html#method-i-add_element]
+to add an element to this element:
+
+ e0 = REXML::Element.new('foo')
+ e1 = REXML::Element.new('bar')
+ e0.add_element(e1, {'name' => 'value'})
+ e0.children # => []
+
+==== Task: Delete a Specified Element
+
+Use method
+{Element#delete_element}[../../../../REXML/Element.html#method-i-delete_element]
+to remove a specified element from this element:
+
+ e0 = REXML::Element.new('foo')
+ e1 = REXML::Element.new('bar')
+ e0.add_element(e1)
+ e0.children # => []
+ e0.delete_element(e1)
+ e0.children # => []
+
+==== Task: Delete an Element by Index
+
+Use method
+{Element#delete_element}[../../../../REXML/Element.html#method-i-delete_element]
+to remove an element from this element by index:
+
+ e0 = REXML::Element.new('foo')
+ e1 = REXML::Element.new('bar')
+ e0.add_element(e1)
+ e0.children # => []
+ e0.delete_element(1)
+ e0.children # => []
+
+==== Task: Delete an Element by XPath
+
+Use method
+{Element#delete_element}[../../../../REXML/Element.html#method-i-delete_element]
+to remove an element from this element by XPath:
+
+ e0 = REXML::Element.new('foo')
+ e1 = REXML::Element.new('bar')
+ e0.add_element(e1)
+ e0.children # => []
+ e0.delete_element('//bar/')
+ e0.children # => []
+
+==== Task: Determine Whether Element Children
+
+Use method
+{Element#has_elements?}[../../../../REXML/Element.html#method-i-has_elements-3F]
+to determine whether the element has element children:
+
+ e0 = REXML::Element.new('foo')
+ e0.has_elements? # => false
+ e0.add_element(REXML::Element.new('bar'))
+ e0.has_elements? # => true
+
+==== Task: Get Element Descendants by XPath
+
+Use method
+{Element#get_elements}[../../../../REXML/Element.html#method-i-get_elements]
+to fetch all element descendant children by XPath:
+
+ xml_string = <<-EOT
+
+
+
+
+
+ EOT
+ d = REXML::Document.new(xml_string)
+ d.root.get_elements('//a') # => [ ... >, ]
+
+==== Task: Get Next Element Sibling
+
+Use method
+{Element#next_element}[../../../../REXML/Element.html#method-i-next_element]
+to retrieve the next element sibling:
+
+ d = REXML::Document.new 'text'
+ d.root.elements['b'].next_element #->
+ d.root.elements['c'].next_element #-> nil
+
+==== Task: Get Previous Element Sibling
+
+Use method
+{Element#previous_element}[../../../../REXML/Element.html#method-i-previous_element]
+to retrieve the previous element sibling:
+
+ d = REXML::Document.new 'text'
+ d.root.elements['c'].previous_element #->
+ d.root.elements['b'].previous_element #-> nil
+
+Text Children
+
+==== Task: Add a Text Node
+
+Use method
+{Element#add_text}[../../../../REXML/Element.html#method-i-add_text]
+to add a text node to the element:
+
+ d = REXML::Document.new('foobar')
+ e = d.root
+ e.add_text(REXML::Text.new('baz'))
+ e.to_a # => ["foo", , "bar", "baz"]
+ e.add_text(REXML::Text.new('baz'))
+ e.to_a # => ["foo", , "bar", "baz", "baz"]
+
+==== Task: Replace the First Text Node
+
+Use method
+{Element#text=}[../../../../REXML/Element.html#method-i-text-3D]
+to replace the first text node in the element:
+
+ d = REXML::Document.new('textmore')
+ e = d.root
+ e.to_a # => [, "text", , "more", ]
+ e.text = 'oops'
+ e.to_a # => [, "oops", , "more", ]
+
+==== Task: Remove the First Text Node
+
+Use method
+{Element#text=}[../../../../REXML/Element.html#method-i-text-3D]
+to remove the first text node in the element:
+
+ d = REXML::Document.new('textmore')
+ e = d.root
+ e.to_a # => [, "text", , "more", ]
+ e.text = nil
+ e.to_a # => [, , "more", ]
+
+==== Task: Retrieve the First Text Node
+
+Use method
+{Element#get_text}[../../../../REXML/Element.html#method-i-get_text]
+to retrieve the first text node in the element:
+
+ d = REXML::Document.new('textmore')
+ e = d.root
+ e.to_a # => [, "text", , "more", ]
+ e.get_text # => "text"
+
+==== Task: Retrieve a Specific Text Node
+
+Use method
+{Element#get_text}[../../../../REXML/Element.html#method-i-get_text]
+to retrieve the first text node in a specified element:
+
+ d = REXML::Document.new "some text this is bold! more text"
+ e = d.root
+ e.get_text('//root') # => "some text "
+ e.get_text('//b') # => "this is bold!"
+
+==== Task: Determine Whether the Element has Text Nodes
+
+Use method
+{Element#has_text?}[../../../../REXML/Element.html#method-i-has_text-3F]
+to determine whethe the element has text:
+
+ e = REXML::Element.new('foo')
+ e.has_text? # => false
+ e.add_text('bar')
+ e.has_text? # => true
+
+Other Children
+
+==== Task: Get the Child at a Given Index
+
+Use method
+{Element#[]}[../../../../REXML/Element.html#method-i-5B-5D]
+to retrieve the child at a given index:
+
+ d = REXML::Document.new '>textmore'
+ e = d.root
+ e[0] # =>
+ e[1] # => "text"
+ e[2] # =>
+
+==== Task: Get All CDATA Children
+
+Use method
+{Element#cdatas}[../../../../REXML/Element.html#method-i-cdatas]
+to retrieve all CDATA children:
+
+ xml_string = <<-EOT
+
+
+
+
+ EOT
+ d = REXML::Document.new(xml_string)
+ d.root.cdatas # => ["foo", "bar"]
+
+==== Task: Get All Comment Children
+
+Use method
+{Element#comments}[../../../../REXML/Element.html#method-i-comments]
+to retrieve all comment children:
+
+ xml_string = <<-EOT
+
+
+
+
+ EOT
+ d = REXML::Document.new(xml_string)
+ d.root.comments.map {|comment| comment.to_s } # => ["foo", "bar"]
+
+==== Task: Get All Processing Instruction Children
+
+Use method
+{Element#instructions}[../../../../REXML/Element.html#method-i-instructions]
+to retrieve all processing instruction children:
+
+ xml_string = <<-EOT
+
+
+
+
+ EOT
+ d = REXML::Document.new(xml_string)
+ instructions = d.root.instructions.map {|instruction| instruction.to_s }
+ instructions # => ["", ""]
+
+==== Task: Get All Text Children
+
+Use method
+{Element#texts}[../../../../REXML/Element.html#method-i-texts]
+to retrieve all text children:
+
+ xml_string = 'textmore'
+ d = REXML::Document.new(xml_string)
+ d.root.texts # => ["text", "more"]
+
+=== Namespaces
+
+==== Task: Add a Namespace
+
+Use method
+{Element#add_namespace}[../../../../REXML/Element.html#method-i-add_namespace]
+to add a namespace to the element:
+
+ e = REXML::Element.new('foo')
+ e.add_namespace('bar')
+ e.namespaces # => {"xmlns"=>"bar"}
+
+==== Task: Delete the Default Namespace
+
+Use method
+{Element#delete_namespace}[../../../../REXML/Element.html#method-i-delete_namespace]
+to remove the default namespace from the element:
+
+ d = REXML::Document.new ""
+ d.to_s # => ""
+ d.root.delete_namespace # =>
+ d.to_s # => ""
+
+==== Task: Delete a Specific Namespace
+
+Use method
+{Element#delete_namespace}[../../../../REXML/Element.html#method-i-delete_namespace]
+to remove a specific namespace from the element:
+
+ d = REXML::Document.new ""
+ d.to_s # => ""
+ d.root.delete_namespace # =>
+ d.to_s # => ""
+ d.root.delete_namespace('foo')
+ d.to_s # => ""
+
+==== Task: Get a Namespace URI
+
+Use method
+{Element#namespace}[../../../../REXML/Element.html#method-i-namespace]
+to retrieve a speficic namespace URI for the element:
+
+ xml_string = <<-EOT
+
+
+
+
+
+
+ EOT
+ d = REXML::Document.new(xml_string)
+ b = d.elements['//b']
+ b.namespace # => "1"
+ b.namespace('y') # => "2"
+
+==== Task: Retrieve Namespaces
+
+Use method
+{Element#namespaces}[../../../../REXML/Element.html#method-i-namespaces]
+to retrieve all namespaces for the element:
+
+ xml_string = ''
+ d = REXML::Document.new(xml_string)
+ d.root.attributes.namespaces # => {"xmlns"=>"foo", "x"=>"bar", "y"=>"twee"}
+
+==== Task: Retrieve Namespace Prefixes
+
+Use method
+{Element#prefixes}[../../../../REXML/Element.html#method-i-prefixes]
+to retrieve all prefixes (namespace names) for the element:
+
+ xml_string = <<-EOT
+
+
+
+
+
+
+ EOT
+ d = REXML::Document.new(xml_string, {compress_whitespace: :all})
+ d.elements['//a'].prefixes # => ["x", "y"]
+ d.elements['//b'].prefixes # => ["x", "y"]
+ d.elements['//c'].prefixes # => ["x", "y", "z"]
+
+=== Iteration
+
+==== Task: Iterate Over Elements
+
+Use method
+{Element#each_element}[../../../../REXML/Element.html#method-i-each_element]
+to iterate over element children:
+
+ d = REXML::Document.new 'bbd'
+ d.root.each_element {|e| p e }
+
+Output:
+
+ ... >
+ ... >
+ ... >
+
+
+==== Task: Iterate Over Elements Having a Specified Attribute
+
+Use method
+{Element#each_element_with_attribute}[../../../../REXML/Element.html#method-i-each_element_with_attribute]
+to iterate over element children that have a specified attribute:
+
+ d = REXML::Document.new ''
+ a = d.root
+ a.each_element_with_attribute('id') {|e| p e }
+
+Output:
+
+
+
+
+
+==== Task: Iterate Over Elements Having a Specified Attribute and Value
+
+Use method
+{Element#each_element_with_attribute}[../../../../REXML/Element.html#method-i-each_element_with_attribute]
+to iterate over element children that have a specified attribute and value:
+
+ d = REXML::Document.new ''
+ a = d.root
+ a.each_element_with_attribute('id', '1') {|e| p e }
+
+Output:
+
+
+
+
+==== Task: Iterate Over Elements Having Specified Text
+
+Use method
+{Element#each_element_with_text}[../../../../REXML/Element.html#method-i-each_element_with_text]
+to iterate over element children that have specified text:
+
+
+=== Context
+
+#whitespace
+#ignore_whitespace_nodes
+#raw
+
+=== Other Getters
+
+#document
+#root
+#root_node
+#node_type
+#xpath
+#inspect
diff --git a/doc/rexml/tasks/rdoc/node.rdoc b/doc/rexml/tasks/rdoc/node.rdoc
new file mode 100644
index 00000000..d5d2e12a
--- /dev/null
+++ b/doc/rexml/tasks/rdoc/node.rdoc
@@ -0,0 +1,97 @@
+== Module Node
+
+:include: ../tocs/node_toc.rdoc
+
+=== Siblings
+
+==== Task: Find Previous Sibling
+
+Use method
+{Node.previous_sibling_node}[../../../../REXML/Node.html#method-i-previous_sibling]
+to retrieve the previous sibling:
+
+ d = REXML::Document.new('')
+ b = d.root[1] # =>
+ b.previous_sibling_node # =>
+
+==== Task: Find Next Sibling
+
+Use method
+{Node.next_sibling_node}[../../../../REXML/Node.html#method-i-next_sibling]
+to retrieve the next sibling:
+
+ d = REXML::Document.new('')
+ b = d.root[1] # =>
+ b.next_sibling_node # =>
+
+=== Position
+
+==== Task: Find Own Index Among Siblings
+
+Use method
+{Node.index_in_parent}[../../../../REXML/Node.html#method-i-index_in_parent]
+to retrieve the 1-based index of this node among its siblings:
+
+ d = REXML::Document.new('')
+ b = d.root[1] # =>
+ b.index_in_parent # => 2
+
+=== Recursive Traversal
+
+==== Task: Traverse Each Recursively
+
+Use method
+{Node.each_recursive}[../../../../REXML/Node.html#method-i-each_recursive]
+to traverse a tree of nodes recursively:
+
+ xml_string = ''
+ d = REXML::Document.new(xml_string)
+ d.root.each_recursive {|node| p node }
+
+Output:
+
+ ... >
+ ... >
+
+ ... >
+
+
+=== Recursive Search
+
+==== Task: Traverse Each Recursively
+
+Use method
+{Node.find_first_recursive}[../../../../REXML/Node.html#method-i-find_first_recursive]
+to search a tree of nodes recursively:
+
+ xml_string = ''
+ d = REXML::Document.new(xml_string)
+ d.root.find_first_recursive {|node| node.name == 'c' } # =>
+
+=== Representation
+
+==== Task: Represent a String
+
+Use method {Node.to_s}[../../../../REXML/Node.html#method-i-to_s]
+to represent the node as a string:
+
+ xml_string = ''
+ d = REXML::Document.new(xml_string)
+ d.root.to_s # => ""
+
+=== Parent?
+
+==== Task: Determine Whether the Node is a Parent
+
+Use method {Node.parent?}[../../../../REXML/Node.html#method-i-parent-3F]
+to determine whether the node is a parent;
+class Text derives from Node:
+
+ d = REXML::Document.new('textmore')
+ t = d.root[1] # => "text"
+ t.parent? # => false
+
+Class Parent also derives from Node, but overrides this method:
+
+ p = REXML::Parent.new
+ p.parent? # => true
diff --git a/doc/rexml/tasks/rdoc/parent.rdoc b/doc/rexml/tasks/rdoc/parent.rdoc
new file mode 100644
index 00000000..54f1dbe3
--- /dev/null
+++ b/doc/rexml/tasks/rdoc/parent.rdoc
@@ -0,0 +1,267 @@
+== Class Parent
+
+Class Parent has methods from its superclasses and included modules;
+see:
+
+- {Tasks for Child}[child_rdoc.html].
+- {Tasks for Node}[node_rdoc.html].
+- {Module Enumerable}[https://docs.ruby-lang.org/en/master/Enumerable.html].
+
+:include: ../tocs/parent_toc.rdoc
+
+=== Queries
+
+==== Task: Get the Count of Children
+
+Use method {Parent#size}[../../../../REXML/Parent.html#method-i-size]
+(or its alias +length+) to get the count of the parent's children:
+
+ p = REXML::Parent.new
+ p.size # => 0
+ xml_string = ''
+ d = REXML::Document.new(xml_string)
+ d.root.size # => 3
+
+==== Task: Get the Child at a Given Index
+
+Use method {Parent#[]}[../../../../REXML/Parent.html#method-i-5B-5D]
+to get the child at a given index:
+
+ xml_string = ''
+ d = REXML::Document.new(xml_string)
+ d.root[1] # =>
+ d.root[-1] # =>
+ d.root[50] # => nil
+
+==== Task: Get the Index of a Given Child
+
+Use method {Parent#index}[../../../../REXML/Parent.html#method-i-index]
+to get the index (0-based offset) of a child:
+
+ d = REXML::Document.new('')
+ root = d.root
+ e0 = REXML::Element.new('foo')
+ e1 = REXML::Element.new('bar')
+ root.add(e0) # =>
+ root.add(e1) # =>
+ root.add(e0) # =>
+ root.add(e1) # =>
+ root.index(e0) # => 0
+ root.index(e1) # => 1
+
+==== Task: Get the Children
+
+Use method {Parent#children}[../../../../REXML/Parent.html#method-i-children]
+(or its alias +to_a+) to get the parent's children:
+
+ xml_string = ''
+ d = REXML::Document.new(xml_string)
+ d.root.children # => [, , ]
+
+==== Task: Determine Whether the Node is a Parent
+
+Use method {Parent#parent?}[../../../../REXML/Parent.html#method-i-parent-3F]
+to determine whether the node is a parent;
+class Text derives from Node:
+
+ d = REXML::Document.new('textmore')
+ t = d.root[1] # => "text"
+ t.parent? # => false
+
+Class Parent also derives from Node, but overrides this method:
+
+ p = REXML::Parent.new
+ p.parent? # => true
+
+=== Additions
+
+==== Task: Add a Child at the Beginning
+
+Use method {Parent#unshift}[../../../../REXML/Parent.html#method-i-unshift]
+to add a child as at the beginning of the children:
+
+ xml_string = ''
+ d = REXML::Document.new(xml_string)
+ d.root.children # => [, , ]
+ d.root.unshift REXML::Element.new('d')
+ d.root.children # => [, , , ]
+
+==== Task: Add a Child at the End
+
+Use method {Parent#<<}[../../../../REXML/Parent.html#method-i-3C-3C]
+(or an alias +push+ or +add+) to add a child as at the end of the children:
+
+ xml_string = ''
+ d = REXML::Document.new(xml_string)
+ d.root.children # => [, , ]
+ d.root << REXML::Element.new('d')
+ d.root.children # => [, , , ]
+
+==== Task: Replace a Child with Another Child
+
+Use method {Parent#replace}[../../../../REXML/Parent.html#method-i-replace]
+
+ xml_string = ''
+ d = REXML::Document.new(xml_string)
+ d.root.children # => [, , ]
+ b = d.root[1] # =>
+ d.replace_child(b, REXML::Element.new('d'))
+ d.root.children # => [, ]
+
+==== Task: Replace Multiple Children with Another Child
+
+Use method {Parent#[]=}[../../../../REXML/Parent.html#method-i-parent-5B-5D-3D]
+to replace multiple consecutive children with another child:
+
+ xml_string = ''
+ d = REXML::Document.new(xml_string)
+ d.root.children # => [, , , ]
+ d.root[1, 2] = REXML::Element.new('x')
+ d.root.children # => [, , ]
+ d.root[1, 5] = REXML::Element.new('x')
+ d.root.children # => [, ] # BUG?
+
+==== Task: Insert Child Before a Given Child
+
+Use method {Parent#insert_before}[../../../../REXML/Parent.html#method-i-insert_before]
+to insert a child immediately before a given child:
+
+ xml_string = ''
+ d = REXML::Document.new(xml_string)
+ d.root.children # => [, , ]
+ b = d.root[1] # =>
+ x = REXML::Element.new('x')
+ d.root.insert_before(b, x)
+ d.root.children # => [, , , ]
+
+==== Task: Insert Child After a Given Child
+
+Use method {Parent#insert_after}[../../../../REXML/Parent.html#method-i-insert_after]
+to insert a child immediately after a given child:
+
+ xml_string = ''
+ d = REXML::Document.new(xml_string)
+ d.root.children # => [, , ]
+ b = d.root[1] # =>
+ x = REXML::Element.new('x')
+ d.root.insert_after(b, x)
+ d.root.children # => [, , , ]
+
+=== Deletions
+
+==== Task: Remove a Given Child
+
+Use method {Parent#delete}[../../../../REXML/Parent.html#method-i-delete]
+to remove all occurrences of a given child:
+
+ d = REXML::Document.new('')
+ a = REXML::Element.new('a')
+ b = REXML::Element.new('b')
+ d.root.add(a)
+ d.root.add(b)
+ d.root.add(a)
+ d.root.add(b)
+ d.root.children # => [, , , ]
+ d.root.delete(b)
+ d.root.children # => [, ]
+
+==== Task: Remove the Child at a Specified Offset
+
+Use method {Parent#delete_at}[../../../../REXML/Parent.html#method-i-delete_at]
+to remove the child at a specified offset:
+
+ d = REXML::Document.new('')
+ a = REXML::Element.new('a')
+ b = REXML::Element.new('b')
+ d.root.add(a)
+ d.root.add(b)
+ d.root.add(a)
+ d.root.add(b)
+ d.root.children # => [, , , ]
+ d.root.delete_at(2)
+ d.root.children # => [, , ]
+
+==== Task: Remove Children That Meet Specified Criteria
+
+Use method {Parent#delete_if}[../../../../REXML/Parent.html#method-i-delete_if]
+to remove children that meet criteria specified in the given block:
+
+ d = REXML::Document.new('')
+ d.root.add(REXML::Element.new('x'))
+ d.root.add(REXML::Element.new('xx'))
+ d.root.add(REXML::Element.new('xxx'))
+ d.root.add(REXML::Element.new('xxxx'))
+ d.root.children # => [, , , ]
+ d.root.delete_if {|child| child.name.size.odd? }
+ d.root.children # => [, ]
+
+=== Iterations
+
+==== Task: Iterate Over Children
+
+Use method {Parent#each_child}[../../../../REXML/Parent.html#method-i-each_child]
+(or its alias +each+) to iterate over all children:
+
+ xml_string = ''
+ d = REXML::Document.new(xml_string)
+ d.root.children # => [, , ]
+ d.root.each_child {|child| p child }
+
+Output:
+
+
+
+
+
+==== Task: Iterate Over Child Indexes
+
+Use method {Parent#each_index}[../../../../REXML/Parent.html#method-i-each_index]
+to iterate over all child indexes:
+
+ xml_string = ''
+ d = REXML::Document.new(xml_string)
+ d.root.children # => [, , ]
+ d.root.each_index {|child| p child }
+
+Output:
+
+ 0
+ 1
+ 2
+
+=== Clones
+
+==== Task: Clone Deeply
+
+Use method {Parent#deep_clone}[../../../../REXML/Parent.html#method-i-deep_clone]
+to clone deeply; that is, to clone every nested node that is a Parent object:
+
+ xml_string = <<-EOT
+
+
+
+ Everyday Italian
+ Giada De Laurentiis
+ 2005
+ 30.00
+
+
+ Harry Potter
+ J K. Rowling
+ 2005
+ 29.99
+
+
+ Learning XML
+ Erik T. Ray
+ 2003
+ 39.95
+
+
+ EOT
+ d = REXML::Document.new(xml_string)
+ root = d.root
+ shallow = root.clone
+ deep = root.deep_clone
+ shallow.to_s.size # => 12
+ deep.to_s.size # => 590
diff --git a/doc/rexml/tasks/tocs/child_toc.rdoc b/doc/rexml/tasks/tocs/child_toc.rdoc
new file mode 100644
index 00000000..a2083a09
--- /dev/null
+++ b/doc/rexml/tasks/tocs/child_toc.rdoc
@@ -0,0 +1,12 @@
+Tasks on this page:
+
+- {Relationships}[#label-Relationships]
+ - {Task: Set the Parent}[#label-Task-3A+Set+the+Parent]
+ - {Task: Insert Previous Sibling}[#label-Task-3A+Insert+Previous+Sibling]
+ - {Task: Insert Next Sibling}[#label-Task-3A+Insert+Next+Sibling]
+- {Removal or Replacement}[#label-Removal+or+Replacement]
+ - {Task: Remove Child from Parent}[#label-Task-3A+Remove+Child+from+Parent]
+ - {Task: Replace Child}[#label-Task-3A+Replace+Child]
+- {Document}[#label-Document]
+ - {Task: Get the Document}[#label-Task-3A+Get+the+Document]
+
diff --git a/doc/rexml/tasks/tocs/document_toc.rdoc b/doc/rexml/tasks/tocs/document_toc.rdoc
new file mode 100644
index 00000000..5db055ff
--- /dev/null
+++ b/doc/rexml/tasks/tocs/document_toc.rdoc
@@ -0,0 +1,30 @@
+Tasks on this page:
+
+- {New Document}[#label-New+Document]
+ - {Task: Create an Empty Document}[#label-Task-3A+Create+an+Empty+Document]
+ - {Task: Parse a String into a New Document}[#label-Task-3A+Parse+a+String+into+a+New+Document]
+ - {Task: Parse an IO Stream into a New Document}[#label-Task-3A+Parse+an+IO+Stream+into+a+New+Document]
+ - {Task: Create a Document from an Existing Document}[#label-Task-3A+Create+a+Document+from+an+Existing+Document]
+ - {Task: Clone a Document}[#label-Task-3A+Clone+a+Document]
+- {Document Type}[#label-Document+Type]
+ - {Task: Get the Document Type}[#label-Task-3A+Get+the+Document+Type]
+ - {Task: Set the Document Type}[#label-Task-3A+Set+the+Document+Type]
+- {XML Declaration}[#label-XML+Declaration]
+ - {Task: Get the XML Declaration}[#label-Task-3A+Get+the+XML+Declaration]
+ - {Task: Set the XML Declaration}[#label-Task-3A+Set+the+XML+Declaration]
+- {Children}[#label-Children]
+ - {Task: Add an Element Child}[#label-Task-3A+Add+an+Element+Child]
+ - {Task: Add a Non-Element Child}[#label-Task-3A+Add+a+Non-Element+Child]
+- {Writing}[#label-Writing]
+ - {Task: Write to $stdout}[#label-Task-3A+Write+to+-24stdout]
+ - {Task: Write to IO Stream}[#label-Task-3A+Write+to+IO+Stream]
+ - {Task: Write with No Indentation}[#label-Task-3A+Write+with+No+Indentation]
+ - {Task: Write with Specified Indentation}[#label-Task-3A+Write+with+Specified+Indentation]
+- {Querying}[#label-Querying]
+ - {Task: Get the Document}[#label-Task-3A+Get+the+Document]
+ - {Task: Get the Encoding}[#label-Task-3A+Get+the+Encoding]
+ - {Task: Get the Node Type}[#label-Task-3A+Get+the+Node+Type]
+ - {Task: Get the Root Element}[#label-Task-3A+Get+the+Root+Element]
+ - {Task: Determine Whether Stand-Alone}[#label-Task-3A+Determine+Whether+Stand-Alone]
+ - {Task: Get the Version}[#label-Task-3A+Get+the+Version]
+
diff --git a/doc/rexml/tasks/tocs/element_toc.rdoc b/doc/rexml/tasks/tocs/element_toc.rdoc
new file mode 100644
index 00000000..60a504a5
--- /dev/null
+++ b/doc/rexml/tasks/tocs/element_toc.rdoc
@@ -0,0 +1,55 @@
+Tasks on this page:
+
+- {New Element}[#label-New+Element]
+ - {Task: Create a Default Element}[#label-Task-3A+Create+a+Default+Element]
+ - {Task: Create a Named Element}[#label-Task-3A+Create+a+Named+Element]
+ - {Task: Create an Element with Name and Parent}[#label-Task-3A+Create+an+Element+with+Name+and+Parent]
+ - {Task: Create an Element with Name, Parent, and Context}[#label-Task-3A+Create+an+Element+with+Name-2C+Parent-2C+and+Context]
+ - {Task: Create a Shallow Clone}[#label-Task-3A+Create+a+Shallow+Clone]
+- {Attributes}[#label-Attributes]
+ - {Task: Create and Add an Attribute}[#label-Task-3A+Create+and+Add+an+Attribute]
+ - {Task: Add an Existing Attribute}[#label-Task-3A+Add+an+Existing+Attribute]
+ - {Task: Add Multiple Attributes from a Hash}[#label-Task-3A+Add+Multiple+Attributes+from+a+Hash]
+ - {Task: Add Multiple Attributes from an Array}[#label-Task-3A+Add+Multiple+Attributes+from+an+Array]
+ - {Task: Retrieve the Value for an Attribute Name}[#label-Task-3A+Retrieve+the+Value+for+an+Attribute+Name]
+ - {Task: Retrieve the Attribute Value for a Name and Namespace}[#label-Task-3A+Retrieve+the+Attribute+Value+for+a+Name+and+Namespace]
+ - {Task: Delete an Attribute}[#label-Task-3A+Delete+an+Attribute]
+ - {Task: Determine Whether the Element Has Attributes}[#label-Task-3A+Determine+Whether+the+Element+Has+Attributes]
+- {Children}[#label-Children]
+ - {Task: Create and Add an Element}[#label-Task-3A+Create+and+Add+an+Element]
+ - {Task: Add an Existing Element}[#label-Task-3A+Add+an+Existing+Element]
+ - {Task: Create and Add an Element with Attributes}[#label-Task-3A+Create+and+Add+an+Element+with+Attributes]
+ - {Task: Add an Existing Element with Added Attributes}[#label-Task-3A+Add+an+Existing+Element+with+Added+Attributes]
+ - {Task: Delete a Specified Element}[#label-Task-3A+Delete+a+Specified+Element]
+ - {Task: Delete an Element by Index}[#label-Task-3A+Delete+an+Element+by+Index]
+ - {Task: Delete an Element by XPath}[#label-Task-3A+Delete+an+Element+by+XPath]
+ - {Task: Determine Whether Element Children}[#label-Task-3A+Determine+Whether+Element+Children]
+ - {Task: Get Element Descendants by XPath}[#label-Task-3A+Get+Element+Descendants+by+XPath]
+ - {Task: Get Next Element Sibling}[#label-Task-3A+Get+Next+Element+Sibling]
+ - {Task: Get Previous Element Sibling}[#label-Task-3A+Get+Previous+Element+Sibling]
+ - {Task: Add a Text Node}[#label-Task-3A+Add+a+Text+Node]
+ - {Task: Replace the First Text Node}[#label-Task-3A+Replace+the+First+Text+Node]
+ - {Task: Remove the First Text Node}[#label-Task-3A+Remove+the+First+Text+Node]
+ - {Task: Retrieve the First Text Node}[#label-Task-3A+Retrieve+the+First+Text+Node]
+ - {Task: Retrieve a Specific Text Node}[#label-Task-3A+Retrieve+a+Specific+Text+Node]
+ - {Task: Determine Whether the Element has Text Nodes}[#label-Task-3A+Determine+Whether+the+Element+has+Text+Nodes]
+ - {Task: Get the Child at a Given Index}[#label-Task-3A+Get+the+Child+at+a+Given+Index]
+ - {Task: Get All CDATA Children}[#label-Task-3A+Get+All+CDATA+Children]
+ - {Task: Get All Comment Children}[#label-Task-3A+Get+All+Comment+Children]
+ - {Task: Get All Processing Instruction Children}[#label-Task-3A+Get+All+Processing+Instruction+Children]
+ - {Task: Get All Text Children}[#label-Task-3A+Get+All+Text+Children]
+- {Namespaces}[#label-Namespaces]
+ - {Task: Add a Namespace}[#label-Task-3A+Add+a+Namespace]
+ - {Task: Delete the Default Namespace}[#label-Task-3A+Delete+the+Default+Namespace]
+ - {Task: Delete a Specific Namespace}[#label-Task-3A+Delete+a+Specific+Namespace]
+ - {Task: Get a Namespace URI}[#label-Task-3A+Get+a+Namespace+URI]
+ - {Task: Retrieve Namespaces}[#label-Task-3A+Retrieve+Namespaces]
+ - {Task: Retrieve Namespace Prefixes}[#label-Task-3A+Retrieve+Namespace+Prefixes]
+- {Iteration}[#label-Iteration]
+ - {Task: Iterate Over Elements}[#label-Task-3A+Iterate+Over+Elements]
+ - {Task: Iterate Over Elements Having a Specified Attribute}[#label-Task-3A+Iterate+Over+Elements+Having+a+Specified+Attribute]
+ - {Task: Iterate Over Elements Having a Specified Attribute and Value}[#label-Task-3A+Iterate+Over+Elements+Having+a+Specified+Attribute+and+Value]
+ - {Task: Iterate Over Elements Having Specified Text}[#label-Task-3A+Iterate+Over+Elements+Having+Specified+Text]
+- {Context}[#label-Context]
+- {Other Getters}[#label-Other+Getters]
+
diff --git a/doc/rexml/tasks/tocs/master_toc.rdoc b/doc/rexml/tasks/tocs/master_toc.rdoc
new file mode 100644
index 00000000..ccc2f401
--- /dev/null
+++ b/doc/rexml/tasks/tocs/master_toc.rdoc
@@ -0,0 +1,135 @@
+== Table of Contents
+
+=== {Child}[../../tasks/rdoc/child_rdoc.html]
+- {Relationships}[../../tasks/rdoc/child_rdoc.html#label-Relationships]
+ - {Task: Set the Parent}[../../tasks/rdoc/child_rdoc.html#label-Task-3A+Set+the+Parent]
+ - {Task: Insert Previous Sibling}[../../tasks/rdoc/child_rdoc.html#label-Task-3A+Insert+Previous+Sibling]
+ - {Task: Insert Next Sibling}[../../tasks/rdoc/child_rdoc.html#label-Task-3A+Insert+Next+Sibling]
+- {Removal or Replacement}[../../tasks/rdoc/child_rdoc.html#label-Removal+or+Replacement]
+ - {Task: Remove Child from Parent}[../../tasks/rdoc/child_rdoc.html#label-Task-3A+Remove+Child+from+Parent]
+ - {Task: Replace Child}[../../tasks/rdoc/child_rdoc.html#label-Task-3A+Replace+Child]
+- {Document}[../../tasks/rdoc/child_rdoc.html#label-Document]
+ - {Task: Get the Document}[../../tasks/rdoc/child_rdoc.html#label-Task-3A+Get+the+Document]
+
+=== {Document}[../../tasks/rdoc/document_rdoc.html]
+- {New Document}[../../tasks/rdoc/document_rdoc.html#label-New+Document]
+ - {Task: Create an Empty Document}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Create+an+Empty+Document]
+ - {Task: Parse a String into a New Document}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Parse+a+String+into+a+New+Document]
+ - {Task: Parse an IO Stream into a New Document}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Parse+an+IO+Stream+into+a+New+Document]
+ - {Task: Create a Document from an Existing Document}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Create+a+Document+from+an+Existing+Document]
+ - {Task: Clone a Document}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Clone+a+Document]
+- {Document Type}[../../tasks/rdoc/document_rdoc.html#label-Document+Type]
+ - {Task: Get the Document Type}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Get+the+Document+Type]
+ - {Task: Set the Document Type}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Set+the+Document+Type]
+- {XML Declaration}[../../tasks/rdoc/document_rdoc.html#label-XML+Declaration]
+ - {Task: Get the XML Declaration}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Get+the+XML+Declaration]
+ - {Task: Set the XML Declaration}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Set+the+XML+Declaration]
+- {Children}[../../tasks/rdoc/document_rdoc.html#label-Children]
+ - {Task: Add an Element Child}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Add+an+Element+Child]
+ - {Task: Add a Non-Element Child}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Add+a+Non-Element+Child]
+- {Writing}[../../tasks/rdoc/document_rdoc.html#label-Writing]
+ - {Task: Write to $stdout}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Write+to+-24stdout]
+ - {Task: Write to IO Stream}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Write+to+IO+Stream]
+ - {Task: Write with No Indentation}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Write+with+No+Indentation]
+ - {Task: Write with Specified Indentation}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Write+with+Specified+Indentation]
+- {Querying}[../../tasks/rdoc/document_rdoc.html#label-Querying]
+ - {Task: Get the Document}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Get+the+Document]
+ - {Task: Get the Encoding}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Get+the+Encoding]
+ - {Task: Get the Node Type}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Get+the+Node+Type]
+ - {Task: Get the Root Element}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Get+the+Root+Element]
+ - {Task: Determine Whether Stand-Alone}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Determine+Whether+Stand-Alone]
+ - {Task: Get the Version}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Get+the+Version]
+
+=== {Element}[../../tasks/rdoc/element_rdoc.html]
+- {New Element}[../../tasks/rdoc/element_rdoc.html#label-New+Element]
+ - {Task: Create a Default Element}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Create+a+Default+Element]
+ - {Task: Create a Named Element}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Create+a+Named+Element]
+ - {Task: Create an Element with Name and Parent}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Create+an+Element+with+Name+and+Parent]
+ - {Task: Create an Element with Name, Parent, and Context}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Create+an+Element+with+Name-2C+Parent-2C+and+Context]
+ - {Task: Create a Shallow Clone}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Create+a+Shallow+Clone]
+- {Attributes}[../../tasks/rdoc/element_rdoc.html#label-Attributes]
+ - {Task: Create and Add an Attribute}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Create+and+Add+an+Attribute]
+ - {Task: Add an Existing Attribute}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Add+an+Existing+Attribute]
+ - {Task: Add Multiple Attributes from a Hash}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Add+Multiple+Attributes+from+a+Hash]
+ - {Task: Add Multiple Attributes from an Array}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Add+Multiple+Attributes+from+an+Array]
+ - {Task: Retrieve the Value for an Attribute Name}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Retrieve+the+Value+for+an+Attribute+Name]
+ - {Task: Retrieve the Attribute Value for a Name and Namespace}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Retrieve+the+Attribute+Value+for+a+Name+and+Namespace]
+ - {Task: Delete an Attribute}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Delete+an+Attribute]
+ - {Task: Determine Whether the Element Has Attributes}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Determine+Whether+the+Element+Has+Attributes]
+- {Children}[../../tasks/rdoc/element_rdoc.html#label-Children]
+ - {Task: Create and Add an Element}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Create+and+Add+an+Element]
+ - {Task: Add an Existing Element}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Add+an+Existing+Element]
+ - {Task: Create and Add an Element with Attributes}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Create+and+Add+an+Element+with+Attributes]
+ - {Task: Add an Existing Element with Added Attributes}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Add+an+Existing+Element+with+Added+Attributes]
+ - {Task: Delete a Specified Element}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Delete+a+Specified+Element]
+ - {Task: Delete an Element by Index}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Delete+an+Element+by+Index]
+ - {Task: Delete an Element by XPath}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Delete+an+Element+by+XPath]
+ - {Task: Determine Whether Element Children}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Determine+Whether+Element+Children]
+ - {Task: Get Element Descendants by XPath}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Get+Element+Descendants+by+XPath]
+ - {Task: Get Next Element Sibling}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Get+Next+Element+Sibling]
+ - {Task: Get Previous Element Sibling}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Get+Previous+Element+Sibling]
+ - {Task: Add a Text Node}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Add+a+Text+Node]
+ - {Task: Replace the First Text Node}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Replace+the+First+Text+Node]
+ - {Task: Remove the First Text Node}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Remove+the+First+Text+Node]
+ - {Task: Retrieve the First Text Node}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Retrieve+the+First+Text+Node]
+ - {Task: Retrieve a Specific Text Node}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Retrieve+a+Specific+Text+Node]
+ - {Task: Determine Whether the Element has Text Nodes}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Determine+Whether+the+Element+has+Text+Nodes]
+ - {Task: Get the Child at a Given Index}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Get+the+Child+at+a+Given+Index]
+ - {Task: Get All CDATA Children}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Get+All+CDATA+Children]
+ - {Task: Get All Comment Children}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Get+All+Comment+Children]
+ - {Task: Get All Processing Instruction Children}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Get+All+Processing+Instruction+Children]
+ - {Task: Get All Text Children}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Get+All+Text+Children]
+- {Namespaces}[../../tasks/rdoc/element_rdoc.html#label-Namespaces]
+ - {Task: Add a Namespace}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Add+a+Namespace]
+ - {Task: Delete the Default Namespace}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Delete+the+Default+Namespace]
+ - {Task: Delete a Specific Namespace}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Delete+a+Specific+Namespace]
+ - {Task: Get a Namespace URI}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Get+a+Namespace+URI]
+ - {Task: Retrieve Namespaces}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Retrieve+Namespaces]
+ - {Task: Retrieve Namespace Prefixes}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Retrieve+Namespace+Prefixes]
+- {Iteration}[../../tasks/rdoc/element_rdoc.html#label-Iteration]
+ - {Task: Iterate Over Elements}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Iterate+Over+Elements]
+ - {Task: Iterate Over Elements Having a Specified Attribute}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Iterate+Over+Elements+Having+a+Specified+Attribute]
+ - {Task: Iterate Over Elements Having a Specified Attribute and Value}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Iterate+Over+Elements+Having+a+Specified+Attribute+and+Value]
+ - {Task: Iterate Over Elements Having Specified Text}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Iterate+Over+Elements+Having+Specified+Text]
+- {Context}[../../tasks/rdoc/element_rdoc.html#label-Context]
+- {Other Getters}[../../tasks/rdoc/element_rdoc.html#label-Other+Getters]
+
+=== {Node}[../../tasks/rdoc/node_rdoc.html]
+- {Siblings}[../../tasks/rdoc/node_rdoc.html#label-Siblings]
+ - {Task: Find Previous Sibling}[../../tasks/rdoc/node_rdoc.html#label-Task-3A+Find+Previous+Sibling]
+ - {Task: Find Next Sibling}[../../tasks/rdoc/node_rdoc.html#label-Task-3A+Find+Next+Sibling]
+- {Position}[../../tasks/rdoc/node_rdoc.html#label-Position]
+ - {Task: Find Own Index Among Siblings}[../../tasks/rdoc/node_rdoc.html#label-Task-3A+Find+Own+Index+Among+Siblings]
+- {Recursive Traversal}[../../tasks/rdoc/node_rdoc.html#label-Recursive+Traversal]
+ - {Task: Traverse Each Recursively}[../../tasks/rdoc/node_rdoc.html#label-Task-3A+Traverse+Each+Recursively]
+- {Recursive Search}[../../tasks/rdoc/node_rdoc.html#label-Recursive+Search]
+ - {Task: Traverse Each Recursively}[../../tasks/rdoc/node_rdoc.html#label-Task-3A+Traverse+Each+Recursively]
+- {Representation}[../../tasks/rdoc/node_rdoc.html#label-Representation]
+ - {Task: Represent a String}[../../tasks/rdoc/node_rdoc.html#label-Task-3A+Represent+a+String]
+- {Parent?}[../../tasks/rdoc/node_rdoc.html#label-Parent-3F]
+ - {Task: Determine Whether the Node is a Parent}[../../tasks/rdoc/node_rdoc.html#label-Task-3A+Determine+Whether+the+Node+is+a+Parent]
+
+=== {Parent}[../../tasks/rdoc/parent_rdoc.html]
+- {Queries}[../../tasks/rdoc/parent_rdoc.html#label-Queries]
+ - {Task: Get the Count of Children}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Get+the+Count+of+Children]
+ - {Task: Get the Child at a Given Index}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Get+the+Child+at+a+Given+Index]
+ - {Task: Get the Index of a Given Child}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Get+the+Index+of+a+Given+Child]
+ - {Task: Get the Children}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Get+the+Children]
+ - {Task: Determine Whether the Node is a Parent}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Determine+Whether+the+Node+is+a+Parent]
+- {Additions}[../../tasks/rdoc/parent_rdoc.html#label-Additions]
+ - {Task: Add a Child at the Beginning}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Add+a+Child+at+the+Beginning]
+ - {Task: Add a Child at the End}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Add+a+Child+at+the+End]
+ - {Task: Replace a Child with Another Child}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Replace+a+Child+with+Another+Child]
+ - {Task: Replace Multiple Children with Another Child}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Replace+Multiple+Children+with+Another+Child]
+ - {Task: Insert Child Before a Given Child}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Insert+Child+Before+a+Given+Child]
+ - {Task: Insert Child After a Given Child}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Insert+Child+After+a+Given+Child]
+- {Deletions}[../../tasks/rdoc/parent_rdoc.html#label-Deletions]
+ - {Task: Remove a Given Child}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Remove+a+Given+Child]
+ - {Task: Remove the Child at a Specified Offset}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Remove+the+Child+at+a+Specified+Offset]
+ - {Task: Remove Children That Meet Specified Criteria}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Remove+Children+That+Meet+Specified+Criteria]
+- {Iterations}[../../tasks/rdoc/parent_rdoc.html#label-Iterations]
+ - {Task: Iterate Over Children}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Iterate+Over+Children]
+ - {Task: Iterate Over Child Indexes}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Iterate+Over+Child+Indexes]
+- {Clones}[../../tasks/rdoc/parent_rdoc.html#label-Clones]
+ - {Task: Clone Deeply}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Clone+Deeply]
+
diff --git a/doc/rexml/tasks/tocs/node_toc.rdoc b/doc/rexml/tasks/tocs/node_toc.rdoc
new file mode 100644
index 00000000..d9114faf
--- /dev/null
+++ b/doc/rexml/tasks/tocs/node_toc.rdoc
@@ -0,0 +1,16 @@
+Tasks on this page:
+
+- {Siblings}[#label-Siblings]
+ - {Task: Find Previous Sibling}[#label-Task-3A+Find+Previous+Sibling]
+ - {Task: Find Next Sibling}[#label-Task-3A+Find+Next+Sibling]
+- {Position}[#label-Position]
+ - {Task: Find Own Index Among Siblings}[#label-Task-3A+Find+Own+Index+Among+Siblings]
+- {Recursive Traversal}[#label-Recursive+Traversal]
+ - {Task: Traverse Each Recursively}[#label-Task-3A+Traverse+Each+Recursively]
+- {Recursive Search}[#label-Recursive+Search]
+ - {Task: Traverse Each Recursively}[#label-Task-3A+Traverse+Each+Recursively]
+- {Representation}[#label-Representation]
+ - {Task: Represent a String}[#label-Task-3A+Represent+a+String]
+- {Parent?}[#label-Parent-3F]
+ - {Task: Determine Whether the Node is a Parent}[#label-Task-3A+Determine+Whether+the+Node+is+a+Parent]
+
diff --git a/doc/rexml/tasks/tocs/parent_toc.rdoc b/doc/rexml/tasks/tocs/parent_toc.rdoc
new file mode 100644
index 00000000..68fc0b70
--- /dev/null
+++ b/doc/rexml/tasks/tocs/parent_toc.rdoc
@@ -0,0 +1,25 @@
+Tasks on this page:
+
+- {Queries}[#label-Queries]
+ - {Task: Get the Count of Children}[#label-Task-3A+Get+the+Count+of+Children]
+ - {Task: Get the Child at a Given Index}[#label-Task-3A+Get+the+Child+at+a+Given+Index]
+ - {Task: Get the Index of a Given Child}[#label-Task-3A+Get+the+Index+of+a+Given+Child]
+ - {Task: Get the Children}[#label-Task-3A+Get+the+Children]
+ - {Task: Determine Whether the Node is a Parent}[#label-Task-3A+Determine+Whether+the+Node+is+a+Parent]
+- {Additions}[#label-Additions]
+ - {Task: Add a Child at the Beginning}[#label-Task-3A+Add+a+Child+at+the+Beginning]
+ - {Task: Add a Child at the End}[#label-Task-3A+Add+a+Child+at+the+End]
+ - {Task: Replace a Child with Another Child}[#label-Task-3A+Replace+a+Child+with+Another+Child]
+ - {Task: Replace Multiple Children with Another Child}[#label-Task-3A+Replace+Multiple+Children+with+Another+Child]
+ - {Task: Insert Child Before a Given Child}[#label-Task-3A+Insert+Child+Before+a+Given+Child]
+ - {Task: Insert Child After a Given Child}[#label-Task-3A+Insert+Child+After+a+Given+Child]
+- {Deletions}[#label-Deletions]
+ - {Task: Remove a Given Child}[#label-Task-3A+Remove+a+Given+Child]
+ - {Task: Remove the Child at a Specified Offset}[#label-Task-3A+Remove+the+Child+at+a+Specified+Offset]
+ - {Task: Remove Children That Meet Specified Criteria}[#label-Task-3A+Remove+Children+That+Meet+Specified+Criteria]
+- {Iterations}[#label-Iterations]
+ - {Task: Iterate Over Children}[#label-Task-3A+Iterate+Over+Children]
+ - {Task: Iterate Over Child Indexes}[#label-Task-3A+Iterate+Over+Child+Indexes]
+- {Clones}[#label-Clones]
+ - {Task: Clone Deeply}[#label-Task-3A+Clone+Deeply]
+
diff --git a/rexml.gemspec b/rexml.gemspec
index 660dca27..620a8981 100644
--- a/rexml.gemspec
+++ b/rexml.gemspec
@@ -42,6 +42,13 @@ Gem::Specification.new do |spec|
end
end
end
+ tasks_path = "tasks"
+ tasks_dir = File.join(__dir__, tasks_path)
+ Dir.chdir(doc_dir) do
+ Dir.glob("**/*.rake").each do |task_file|
+ files << "#{tasks_path}/#{task_file}"
+ end
+ end
spec.files = files
spec.rdoc_options.concat(["--main", "README.md"])
spec.extra_rdoc_files = rdoc_files
diff --git a/tasks/tocs.rake b/tasks/tocs.rake
new file mode 100644
index 00000000..a08f5a9f
--- /dev/null
+++ b/tasks/tocs.rake
@@ -0,0 +1,95 @@
+require "tmpdir"
+
+class TOCsGenerator
+ include Rake::DSL
+
+ def generate
+ doc_tasks_dir = File.join(__dir__, "..", "doc", "rexml", "tasks")
+ cd(doc_tasks_dir) do
+ lis_by_name = extract_lis
+ generate_files(lis_by_name)
+ end
+ end
+
+ private
+ def extract_lis
+ lis_by_name = {}
+ Dir.mktmpdir do |tmpdir|
+ sh("rdoc", "--op", tmpdir, "--force-output", "rdoc")
+ cd("#{tmpdir}/rdoc") do
+ Dir.new('.').entries.each do |html_file_path|
+ next if html_file_path.start_with?('.')
+ toc_lis = []
+ File.open(html_file_path, 'r') do |file|
+ in_toc = false
+ file.each_line do |line|
+ unless in_toc
+ if line.include?('')
+ in_toc = true
+ next
+ end
+ end
+ if in_toc
+ break if line.include?('
')
+ toc_lis.push(line.chomp)
+ end
+ end
+ end
+ key = html_file_path.sub('_rdoc.html', '')
+ lis_by_name[key] = toc_lis
+ end
+ end
+ end
+ lis_by_name
+ end
+
+ def generate_files(lis_by_name)
+ File.open('tocs/master_toc.rdoc', 'w') do |master_toc_file|
+ master_toc_file.write("== Table of Contents\n\n")
+ cd('tocs') do
+ entries = Dir.entries('.')
+ entries.delete_if {|entry| entry.start_with?('.') }
+ entries.delete_if {|entry| entry == 'master_toc.rdoc' }
+ lis_by_name.keys.sort.each do |name|
+ lis = lis_by_name[name]
+ toc_file_name = name + '_toc.rdoc'
+ entries.delete(toc_file_name)
+ File.open(toc_file_name, 'w') do |class_file|
+ class_file.write("Tasks on this page:\n\n")
+ lis.each_with_index do |li, i|
+ _, temp = li.split('"', 2)
+ link, temp = temp.split('">', 2)
+ text = temp.sub('', '')
+ indentation = text.start_with?('Task') ? ' ' : ''
+ toc_entry = "#{indentation}- {#{text}}[#{link}]\n"
+ if i == 0
+ text = text.split(' ')[1]
+ link = "../../tasks/rdoc/#{text.downcase}_rdoc.html"
+ master_toc_file.write("=== {#{text}}[#{link}]\n")
+ next
+ end
+ master_link = "../../tasks/rdoc/#{toc_file_name.sub('_toc.rdoc', '_rdoc.html')}#{link}"
+ master_toc_entry = "#{indentation}- {#{text}}[#{master_link}]\n"
+ master_toc_file.write(master_toc_entry)
+ class_file.write(toc_entry)
+ end
+ master_toc_file.write("\n")
+ class_file.write("\n")
+ end
+ end
+ unless entries.empty?
+ message = "Some entries not updated: #{entries}"
+ raise message
+ end
+ end
+ end
+ end
+end
+
+namespace :tocs do
+ desc "Generate TOCs"
+ task :generate do
+ generator = TOCsGenerator.new
+ generator.generate
+ end
+end