asciidoctor 1.5.6.2 → 1.5.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of asciidoctor might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.adoc +330 -143
- data/README-fr.adoc +441 -0
- data/README-jp.adoc +418 -0
- data/README-zh_CN.adoc +430 -0
- data/README.adoc +454 -0
- data/Rakefile +57 -0
- data/asciidoctor.gemspec +7 -1
- data/data/locale/attributes-ar.adoc +22 -0
- data/data/locale/attributes-bg.adoc +22 -0
- data/data/locale/attributes-ca.adoc +22 -0
- data/data/locale/attributes-cs.adoc +22 -0
- data/data/locale/attributes-da.adoc +22 -0
- data/data/locale/attributes-de.adoc +22 -0
- data/data/locale/attributes-en.adoc +23 -0
- data/data/locale/attributes-es.adoc +22 -0
- data/data/locale/attributes-fa.adoc +22 -0
- data/data/locale/attributes-fi.adoc +22 -0
- data/data/locale/attributes-fr.adoc +22 -0
- data/data/locale/attributes-hu.adoc +22 -0
- data/data/locale/attributes-id.adoc +22 -0
- data/data/locale/attributes-it.adoc +22 -0
- data/data/locale/attributes-ja.adoc +22 -0
- data/data/locale/attributes-kr.adoc +22 -0
- data/data/locale/attributes-nb.adoc +22 -0
- data/data/locale/attributes-nl.adoc +22 -0
- data/data/locale/attributes-nn.adoc +22 -0
- data/data/locale/attributes-pl.adoc +22 -0
- data/data/locale/attributes-pt.adoc +22 -0
- data/data/locale/attributes-pt_BR.adoc +22 -0
- data/data/locale/attributes-ro.adoc +22 -0
- data/data/locale/attributes-ru.adoc +22 -0
- data/data/locale/attributes-sr.adoc +22 -0
- data/data/locale/attributes-sr_Latn.adoc +22 -0
- data/data/locale/attributes-tr.adoc +22 -0
- data/data/locale/attributes-uk.adoc +22 -0
- data/data/locale/attributes-zh_CN.adoc +22 -0
- data/data/locale/attributes-zh_TW.adoc +22 -0
- data/data/locale/attributes.adoc +8 -649
- data/data/stylesheets/asciidoctor-default.css +77 -72
- data/features/xref.feature +366 -7
- data/lib/asciidoctor.rb +107 -93
- data/lib/asciidoctor/abstract_block.rb +247 -239
- data/lib/asciidoctor/abstract_node.rb +56 -58
- data/lib/asciidoctor/block.rb +3 -3
- data/lib/asciidoctor/callouts.rb +1 -1
- data/lib/asciidoctor/cli/invoker.rb +36 -9
- data/lib/asciidoctor/cli/options.rb +63 -25
- data/lib/asciidoctor/converter.rb +23 -13
- data/lib/asciidoctor/converter/base.rb +4 -0
- data/lib/asciidoctor/converter/docbook45.rb +16 -9
- data/lib/asciidoctor/converter/docbook5.rb +115 -97
- data/lib/asciidoctor/converter/factory.rb +29 -31
- data/lib/asciidoctor/converter/html5.rb +229 -192
- data/lib/asciidoctor/converter/manpage.rb +72 -50
- data/lib/asciidoctor/converter/template.rb +12 -12
- data/lib/asciidoctor/core_ext.rb +5 -1
- data/lib/asciidoctor/core_ext/1.8.7/base64/strict_encode64.rb +6 -0
- data/lib/asciidoctor/document.rb +168 -77
- data/lib/asciidoctor/extensions.rb +79 -47
- data/lib/asciidoctor/helpers.rb +33 -11
- data/lib/asciidoctor/inline.rb +3 -2
- data/lib/asciidoctor/list.rb +2 -1
- data/lib/asciidoctor/logging.rb +122 -0
- data/lib/asciidoctor/parser.rb +406 -382
- data/lib/asciidoctor/path_resolver.rb +169 -162
- data/lib/asciidoctor/reader.rb +166 -121
- data/lib/asciidoctor/section.rb +45 -28
- data/lib/asciidoctor/stylesheets.rb +13 -5
- data/lib/asciidoctor/substitutors.rb +328 -254
- data/lib/asciidoctor/table.rb +105 -48
- data/lib/asciidoctor/timings.rb +34 -6
- data/lib/asciidoctor/version.rb +1 -1
- data/man/asciidoctor.1 +41 -23
- data/man/asciidoctor.adoc +14 -8
- data/test/api_test.rb +1004 -0
- data/test/attributes_test.rb +241 -50
- data/test/blocks_test.rb +549 -124
- data/test/converter_test.rb +170 -78
- data/test/document_test.rb +208 -767
- data/test/extensions_test.rb +188 -53
- data/test/fixtures/custom-backends/slim/html5/block_paragraph.html.slim +1 -1
- data/test/fixtures/custom-backends/slim/html5/block_sidebar.html.slim +1 -1
- data/test/fixtures/file-with-missing-include.adoc +1 -0
- data/test/fixtures/include-file.jsx +8 -0
- data/test/fixtures/lists.adoc +96 -0
- data/test/fixtures/other-chapters.adoc +11 -0
- data/test/fixtures/outer-include.adoc +5 -0
- data/test/fixtures/sample.asciidoc +5 -1
- data/test/fixtures/subdir/index.adoc +3 -0
- data/test/fixtures/subdir/inner-include.adoc +3 -0
- data/test/fixtures/subdir/middle-include.adoc +5 -0
- data/test/fixtures/tagged-class-enclosed.rb +0 -1
- data/test/fixtures/unclosed-tag.adoc +3 -0
- data/test/fixtures/unexpected-end-tag.adoc +4 -0
- data/test/invoker_test.rb +101 -40
- data/test/links_test.rb +266 -72
- data/test/lists_test.rb +243 -45
- data/test/logger_test.rb +211 -0
- data/test/manpage_test.rb +124 -6
- data/test/options_test.rb +46 -1
- data/test/paragraphs_test.rb +23 -10
- data/test/parser_test.rb +30 -1
- data/test/paths_test.rb +115 -33
- data/test/preamble_test.rb +1 -1
- data/test/reader_test.rb +337 -81
- data/test/sections_test.rb +656 -72
- data/test/substitutions_test.rb +182 -57
- data/test/tables_test.rb +324 -57
- data/test/test_helper.rb +77 -32
- data/test/text_test.rb +7 -7
- metadata +67 -3
| @@ -20,7 +20,7 @@ module Asciidoctor | |
| 20 20 | 
             
              #       super
         | 
| 21 21 | 
             
              #       outfilesuffix '.txt'
         | 
| 22 22 | 
             
              #     end
         | 
| 23 | 
            -
              #     def convert node, transform = nil
         | 
| 23 | 
            +
              #     def convert node, transform = nil, opts = {}
         | 
| 24 24 | 
             
              #       case (transform ||= node.node_name)
         | 
| 25 25 | 
             
              #       when 'document'
         | 
| 26 26 | 
             
              #         node.content
         | 
| @@ -86,44 +86,52 @@ module Asciidoctor | |
| 86 86 | 
             
                      syntax = 'html'
         | 
| 87 87 | 
             
                    end
         | 
| 88 88 | 
             
                    {
         | 
| 89 | 
            -
                       | 
| 90 | 
            -
                       | 
| 91 | 
            -
                       | 
| 92 | 
            -
                       | 
| 89 | 
            +
                      :basebackend => base,
         | 
| 90 | 
            +
                      :outfilesuffix => ext,
         | 
| 91 | 
            +
                      :filetype => type,
         | 
| 92 | 
            +
                      :htmlsyntax => syntax
         | 
| 93 93 | 
             
                    }
         | 
| 94 94 | 
             
                  end
         | 
| 95 95 |  | 
| 96 96 | 
             
                  def filetype value = nil
         | 
| 97 97 | 
             
                    if value
         | 
| 98 | 
            -
                      backend_info[ | 
| 98 | 
            +
                      backend_info[:filetype] = value
         | 
| 99 99 | 
             
                    else
         | 
| 100 | 
            -
                      backend_info[ | 
| 100 | 
            +
                      backend_info[:filetype]
         | 
| 101 101 | 
             
                    end
         | 
| 102 102 | 
             
                  end
         | 
| 103 103 |  | 
| 104 104 | 
             
                  def basebackend value = nil
         | 
| 105 105 | 
             
                    if value
         | 
| 106 | 
            -
                      backend_info[ | 
| 106 | 
            +
                      backend_info[:basebackend] = value
         | 
| 107 107 | 
             
                    else
         | 
| 108 | 
            -
                      backend_info[ | 
| 108 | 
            +
                      backend_info[:basebackend]
         | 
| 109 109 | 
             
                    end
         | 
| 110 110 | 
             
                  end
         | 
| 111 111 |  | 
| 112 112 | 
             
                  def outfilesuffix value = nil
         | 
| 113 113 | 
             
                    if value
         | 
| 114 | 
            -
                      backend_info[ | 
| 114 | 
            +
                      backend_info[:outfilesuffix] = value
         | 
| 115 115 | 
             
                    else
         | 
| 116 | 
            -
                      backend_info[ | 
| 116 | 
            +
                      backend_info[:outfilesuffix]
         | 
| 117 117 | 
             
                    end
         | 
| 118 118 | 
             
                  end
         | 
| 119 119 |  | 
| 120 120 | 
             
                  def htmlsyntax value = nil
         | 
| 121 121 | 
             
                    if value
         | 
| 122 | 
            -
                      backend_info[ | 
| 122 | 
            +
                      backend_info[:htmlsyntax] = value
         | 
| 123 123 | 
             
                    else
         | 
| 124 | 
            -
                      backend_info[ | 
| 124 | 
            +
                      backend_info[:htmlsyntax]
         | 
| 125 125 | 
             
                    end
         | 
| 126 126 | 
             
                  end
         | 
| 127 | 
            +
             | 
| 128 | 
            +
                  def supports_templates
         | 
| 129 | 
            +
                    backend_info[:supports_templates] = true
         | 
| 130 | 
            +
                  end
         | 
| 131 | 
            +
             | 
| 132 | 
            +
                  def supports_templates?
         | 
| 133 | 
            +
                    backend_info[:supports_templates]
         | 
| 134 | 
            +
                  end
         | 
| 127 135 | 
             
                end
         | 
| 128 136 |  | 
| 129 137 | 
             
                class << self
         | 
| @@ -183,6 +191,8 @@ module Asciidoctor | |
| 183 191 | 
             
                  raise ::NotImplementedError
         | 
| 184 192 | 
             
                end
         | 
| 185 193 |  | 
| 194 | 
            +
                alias handles? respond_to?
         | 
| 195 | 
            +
             | 
| 186 196 | 
             
                # Alias for backward compatibility.
         | 
| 187 197 | 
             
                alias convert_with_options convert
         | 
| 188 198 | 
             
              end
         | 
| @@ -9,11 +9,15 @@ module Asciidoctor | |
| 9 9 | 
             
              # Concrete subclasses must implement the {#convert} method and, optionally,
         | 
| 10 10 | 
             
              # the {#convert_with_options} method.
         | 
| 11 11 | 
             
              class Converter::Base
         | 
| 12 | 
            +
                include Logging
         | 
| 12 13 | 
             
                include Converter
         | 
| 13 14 | 
             
              end
         | 
| 14 15 |  | 
| 15 16 | 
             
              # An abstract base class for built-in {Converter} classes.
         | 
| 17 | 
            +
              # Does not inherit from Converter.
         | 
| 16 18 | 
             
              class Converter::BuiltIn
         | 
| 19 | 
            +
                include Logging
         | 
| 20 | 
            +
             | 
| 17 21 | 
             
                def initialize backend, opts = {}
         | 
| 18 22 | 
             
                end
         | 
| 19 23 |  | 
| @@ -18,8 +18,8 @@ module Asciidoctor | |
| 18 18 |  | 
| 19 19 | 
             
                def olist node
         | 
| 20 20 | 
             
                  result = []
         | 
| 21 | 
            -
                  num_attribute = node.style ? %( numeration="#{node.style}") :  | 
| 22 | 
            -
                  start_attribute = (node.attr? 'start') ? %( override="#{node.attr 'start'}") :  | 
| 21 | 
            +
                  num_attribute = node.style ? %( numeration="#{node.style}") : ''
         | 
| 22 | 
            +
                  start_attribute = (node.attr? 'start') ? %( override="#{node.attr 'start'}") : ''
         | 
| 23 23 | 
             
                  result << %(<orderedlist#{common_attributes node.id, node.role, node.reftext}#{num_attribute}>)
         | 
| 24 24 | 
             
                  result << %(<title>#{node.title}</title>) if node.title?
         | 
| 25 25 | 
             
                  node.items.each_with_index do |item, idx|
         | 
| @@ -52,11 +52,18 @@ module Asciidoctor | |
| 52 52 | 
             
                  end
         | 
| 53 53 | 
             
                end
         | 
| 54 54 |  | 
| 55 | 
            -
                def  | 
| 56 | 
            -
                   | 
| 57 | 
            -
             | 
| 58 | 
            -
             | 
| 59 | 
            -
             | 
| 55 | 
            +
                def author_tag doc, index = nil
         | 
| 56 | 
            +
                  if index
         | 
| 57 | 
            +
                    firstname_key = %(firstname_#{index})
         | 
| 58 | 
            +
                    middlename_key = %(middlename_#{index})
         | 
| 59 | 
            +
                    lastname_key = %(lastname_#{index})
         | 
| 60 | 
            +
                    email_key = %(email_#{index})
         | 
| 61 | 
            +
                  else
         | 
| 62 | 
            +
                    firstname_key = 'firstname'
         | 
| 63 | 
            +
                    middlename_key = 'middlename'
         | 
| 64 | 
            +
                    lastname_key = 'lastname'
         | 
| 65 | 
            +
                    email_key = 'email'
         | 
| 66 | 
            +
                  end
         | 
| 60 67 |  | 
| 61 68 | 
             
                  result = []
         | 
| 62 69 | 
             
                  result << '<author>'
         | 
| @@ -80,7 +87,7 @@ module Asciidoctor | |
| 80 87 | 
             
                  %(<!DOCTYPE #{root_tag_name} PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">)
         | 
| 81 88 | 
             
                end
         | 
| 82 89 |  | 
| 83 | 
            -
                def  | 
| 90 | 
            +
                def document_info_tag doc, info_tag_prefix
         | 
| 84 91 | 
             
                  super doc, info_tag_prefix, true
         | 
| 85 92 | 
             
                end
         | 
| 86 93 |  | 
| @@ -92,7 +99,7 @@ module Asciidoctor | |
| 92 99 | 
             
                  if (ns = doc.attr 'xmlns')
         | 
| 93 100 | 
             
                    ns.empty? ? ' xmlns="http://docbook.org/ns/docbook"' : %( xmlns="#{ns}")
         | 
| 94 101 | 
             
                  else
         | 
| 95 | 
            -
                     | 
| 102 | 
            +
                    ''
         | 
| 96 103 | 
             
                  end
         | 
| 97 104 | 
             
                end
         | 
| 98 105 | 
             
              end
         | 
| @@ -4,6 +4,7 @@ module Asciidoctor | |
| 4 4 | 
             
              # similar to the docbook45 backend from AsciiDoc Python, but migrated to the
         | 
| 5 5 | 
             
              # DocBook 5 specification.
         | 
| 6 6 | 
             
              class Converter::DocBook5Converter < Converter::BuiltIn
         | 
| 7 | 
            +
                CopyrightRx = /^(.+?)(?: ((?:\d{4}\-)?\d{4}))?$/
         | 
| 7 8 | 
             
                ImageMacroRx = /^image::?(.+?)\[(.*?)\]$/
         | 
| 8 9 |  | 
| 9 10 | 
             
                def document node
         | 
| @@ -29,9 +30,9 @@ module Asciidoctor | |
| 29 30 | 
             
                      result << '<?asciidoc-numbered?>'
         | 
| 30 31 | 
             
                    end
         | 
| 31 32 | 
             
                  end
         | 
| 32 | 
            -
                  lang_attribute = (node.attr? 'nolang') ?  | 
| 33 | 
            +
                  lang_attribute = (node.attr? 'nolang') ? '' : %( #{lang_attribute_name}="#{node.attr 'lang', 'en'}")
         | 
| 33 34 | 
             
                  result << %(<#{root_tag_name}#{document_ns_attributes node}#{lang_attribute}>)
         | 
| 34 | 
            -
                  result << ( | 
| 35 | 
            +
                  result << (document_info_tag node, root_tag_name) unless node.noheader
         | 
| 35 36 | 
             
                  result << node.content if node.blocks?
         | 
| 36 37 | 
             
                  unless (footer_docinfo = node.docinfo :footer).empty?
         | 
| 37 38 | 
             
                    result << footer_docinfo
         | 
| @@ -51,9 +52,9 @@ module Asciidoctor | |
| 51 52 | 
             
                  else
         | 
| 52 53 | 
             
                    tag_name = node.sectname
         | 
| 53 54 | 
             
                  end
         | 
| 55 | 
            +
                  title_el = node.special && (node.option? 'untitled') ? '' : %(<title>#{node.title}</title>\n)
         | 
| 54 56 | 
             
                  %(<#{tag_name}#{common_attributes node.id, node.role, node.reftext}>
         | 
| 55 | 
            -
             | 
| 56 | 
            -
            #{node.content}
         | 
| 57 | 
            +
            #{title_el}#{node.content}
         | 
| 57 58 | 
             
            </#{tag_name}>)
         | 
| 58 59 | 
             
                end
         | 
| 59 60 |  | 
| @@ -116,7 +117,7 @@ module Asciidoctor | |
| 116 117 | 
             
                      end
         | 
| 117 118 | 
             
                      result << %(</entry>
         | 
| 118 119 | 
             
            <entry>)
         | 
| 119 | 
            -
                       | 
| 120 | 
            +
                      if dd
         | 
| 120 121 | 
             
                        result << %(<simpara>#{dd.text}</simpara>) if dd.text?
         | 
| 121 122 | 
             
                        result << dd.content if dd.blocks?
         | 
| 122 123 | 
             
                      end
         | 
| @@ -148,7 +149,7 @@ module Asciidoctor | |
| 148 149 |  | 
| 149 150 | 
             
                      result << %(</#{label_tag}>) if label_tag
         | 
| 150 151 | 
             
                      result << %(<#{item_tag}>)
         | 
| 151 | 
            -
                       | 
| 152 | 
            +
                      if dd
         | 
| 152 153 | 
             
                        result << %(<simpara>#{dd.text}</simpara>) if dd.text?
         | 
| 153 154 | 
             
                        result << dd.content if dd.blocks?
         | 
| 154 155 | 
             
                      end
         | 
| @@ -184,19 +185,19 @@ module Asciidoctor | |
| 184 185 | 
             
                  # See http://tdg.docbook.org/tdg/4.5/imagedata-x.html#d0e79635
         | 
| 185 186 | 
             
                  if node.attr? 'scaledwidth'
         | 
| 186 187 | 
             
                    width_attribute = %( width="#{node.attr 'scaledwidth'}")
         | 
| 187 | 
            -
                    depth_attribute =  | 
| 188 | 
            -
                    scale_attribute =  | 
| 188 | 
            +
                    depth_attribute = ''
         | 
| 189 | 
            +
                    scale_attribute = ''
         | 
| 189 190 | 
             
                  elsif node.attr? 'scale'
         | 
| 190 191 | 
             
                    # QUESTION should we set the viewport using width and depth? (the scaled image would be contained within this box)
         | 
| 191 | 
            -
                    #width_attribute = (node.attr? 'width') ? %( width="#{node.attr 'width'}") :  | 
| 192 | 
            -
                    #depth_attribute = (node.attr? 'height') ? %( depth="#{node.attr 'height'}") :  | 
| 192 | 
            +
                    #width_attribute = (node.attr? 'width') ? %( width="#{node.attr 'width'}") : ''
         | 
| 193 | 
            +
                    #depth_attribute = (node.attr? 'height') ? %( depth="#{node.attr 'height'}") : ''
         | 
| 193 194 | 
             
                    scale_attribute = %( scale="#{node.attr 'scale'}")
         | 
| 194 195 | 
             
                  else
         | 
| 195 | 
            -
                    width_attribute = (node.attr? 'width') ? %( contentwidth="#{node.attr 'width'}") :  | 
| 196 | 
            -
                    depth_attribute = (node.attr? 'height') ? %( contentdepth="#{node.attr 'height'}") :  | 
| 197 | 
            -
                    scale_attribute =  | 
| 196 | 
            +
                    width_attribute = (node.attr? 'width') ? %( contentwidth="#{node.attr 'width'}") : ''
         | 
| 197 | 
            +
                    depth_attribute = (node.attr? 'height') ? %( contentdepth="#{node.attr 'height'}") : ''
         | 
| 198 | 
            +
                    scale_attribute = ''
         | 
| 198 199 | 
             
                  end
         | 
| 199 | 
            -
                  align_attribute = (node.attr? 'align') ? %( align="#{node.attr 'align'}") :  | 
| 200 | 
            +
                  align_attribute = (node.attr? 'align') ? %( align="#{node.attr 'align'}") : ''
         | 
| 200 201 |  | 
| 201 202 | 
             
                  mediaobject = %(<mediaobject>
         | 
| 202 203 | 
             
            <imageobject>
         | 
| @@ -222,9 +223,9 @@ module Asciidoctor | |
| 222 223 | 
             
                  listing_attributes = (common_attributes node.id, node.role, node.reftext)
         | 
| 223 224 | 
             
                  if node.style == 'source' && (node.attr? 'language')
         | 
| 224 225 | 
             
                    numbering = (node.attr? 'linenums', nil, false) ? 'numbered' : 'unnumbered'
         | 
| 225 | 
            -
                    listing_content = %(<programlisting#{informal ? listing_attributes :  | 
| 226 | 
            +
                    listing_content = %(<programlisting#{informal ? listing_attributes : ''} language="#{node.attr 'language', '', false}" linenumbering="#{numbering}">#{node.content}</programlisting>)
         | 
| 226 227 | 
             
                  else
         | 
| 227 | 
            -
                    listing_content = %(<screen#{informal ? listing_attributes :  | 
| 228 | 
            +
                    listing_content = %(<screen#{informal ? listing_attributes : ''}>#{node.content}</screen>)
         | 
| 228 229 | 
             
                  end
         | 
| 229 230 | 
             
                  if informal
         | 
| 230 231 | 
             
                    listing_content
         | 
| @@ -260,8 +261,7 @@ module Asciidoctor | |
| 260 261 | 
             
                    equation = node.content
         | 
| 261 262 | 
             
                  end
         | 
| 262 263 | 
             
                  if node.style == 'asciimath'
         | 
| 263 | 
            -
                    if ((defined? ::AsciiMath) || ( | 
| 264 | 
            -
                        (@asciimath_available = Helpers.require_library 'asciimath', true, :warn)))
         | 
| 264 | 
            +
                    if (@asciimath ||= ((defined? ::AsciiMath) || (Helpers.require_library 'asciimath', true, :warn)).nil? ? :unavailable : :loaded) == :loaded
         | 
| 265 265 | 
             
                      # NOTE fop requires jeuclid to process raw mathml
         | 
| 266 266 | 
             
                      equation_data = (::AsciiMath.parse equation).to_mathml 'mml:', 'xmlns:mml' => 'http://www.w3.org/1998/Math/MathML'
         | 
| 267 267 | 
             
                    else
         | 
| @@ -287,8 +287,8 @@ module Asciidoctor | |
| 287 287 |  | 
| 288 288 | 
             
                def olist node
         | 
| 289 289 | 
             
                  result = []
         | 
| 290 | 
            -
                  num_attribute = node.style ? %( numeration="#{node.style}") :  | 
| 291 | 
            -
                  start_attribute = (node.attr? 'start') ? %( startingnumber="#{node.attr 'start'}") :  | 
| 290 | 
            +
                  num_attribute = node.style ? %( numeration="#{node.style}") : ''
         | 
| 291 | 
            +
                  start_attribute = (node.attr? 'start') ? %( startingnumber="#{node.attr 'start'}") : ''
         | 
| 292 292 | 
             
                  result << %(<orderedlist#{common_attributes node.id, node.role, node.reftext}#{num_attribute}#{start_attribute}>)
         | 
| 293 293 | 
             
                  result << %(<title>#{node.title}</title>) if node.title?
         | 
| 294 294 | 
             
                  node.items.each do |item|
         | 
| @@ -305,7 +305,7 @@ module Asciidoctor | |
| 305 305 | 
             
                  case node.style
         | 
| 306 306 | 
             
                  when 'abstract'
         | 
| 307 307 | 
             
                    if node.parent == node.document && node.document.doctype == 'book'
         | 
| 308 | 
            -
                      warn ' | 
| 308 | 
            +
                      logger.warn 'abstract block cannot be used in a document without a title when doctype is book. Excluding block content.'
         | 
| 309 309 | 
             
                      ''
         | 
| 310 310 | 
             
                    else
         | 
| 311 311 | 
             
                      %(<abstract>
         | 
| @@ -314,7 +314,7 @@ module Asciidoctor | |
| 314 314 | 
             
                    end
         | 
| 315 315 | 
             
                  when 'partintro'
         | 
| 316 316 | 
             
                    unless node.level == 0 && node.parent.context == :section && node.document.doctype == 'book'
         | 
| 317 | 
            -
                       | 
| 317 | 
            +
                      logger.error 'partintro block can only be used when doctype is book and must be a child of a book part. Excluding block content.'
         | 
| 318 318 | 
             
                      ''
         | 
| 319 319 | 
             
                    else
         | 
| 320 320 | 
             
                      %(<partintro#{common_attributes node.id, node.role, node.reftext}>
         | 
| @@ -322,7 +322,24 @@ module Asciidoctor | |
| 322 322 | 
             
            </partintro>)
         | 
| 323 323 | 
             
                    end
         | 
| 324 324 | 
             
                  else
         | 
| 325 | 
            -
                    node. | 
| 325 | 
            +
                    reftext = node.reftext if (id = node.id)
         | 
| 326 | 
            +
                    role = node.role
         | 
| 327 | 
            +
                    if node.title?
         | 
| 328 | 
            +
                      %(<formalpara#{common_attributes id, role, reftext}>
         | 
| 329 | 
            +
            <title>#{node.title}</title>
         | 
| 330 | 
            +
            <para>#{content_spacer = node.content_model == :compound ? LF : ''}#{node.content}#{content_spacer}</para>
         | 
| 331 | 
            +
            </formalpara>)
         | 
| 332 | 
            +
                    elsif id || role
         | 
| 333 | 
            +
                      if node.content_model == :compound
         | 
| 334 | 
            +
                        %(<para#{common_attributes id, role, reftext}>
         | 
| 335 | 
            +
            #{node.content}
         | 
| 336 | 
            +
            </para>)
         | 
| 337 | 
            +
                      else
         | 
| 338 | 
            +
                        %(<simpara#{common_attributes id, role, reftext}>#{node.content}</simpara>)
         | 
| 339 | 
            +
                      end
         | 
| 340 | 
            +
                    else
         | 
| 341 | 
            +
                      resolve_content node
         | 
| 342 | 
            +
                    end
         | 
| 326 343 | 
             
                  end
         | 
| 327 344 | 
             
                end
         | 
| 328 345 |  | 
| @@ -352,22 +369,7 @@ module Asciidoctor | |
| 352 369 | 
             
                end
         | 
| 353 370 |  | 
| 354 371 | 
             
                def quote node
         | 
| 355 | 
            -
                   | 
| 356 | 
            -
                  result << %(<blockquote#{common_attributes node.id, node.role, node.reftext}>)
         | 
| 357 | 
            -
                  result << %(<title>#{node.title}</title>) if node.title?
         | 
| 358 | 
            -
                  if (node.attr? 'attribution') || (node.attr? 'citetitle')
         | 
| 359 | 
            -
                    result << '<attribution>'
         | 
| 360 | 
            -
                    if node.attr? 'attribution'
         | 
| 361 | 
            -
                      result << (node.attr 'attribution')
         | 
| 362 | 
            -
                    end
         | 
| 363 | 
            -
                    if node.attr? 'citetitle'
         | 
| 364 | 
            -
                      result << %(<citetitle>#{node.attr 'citetitle'}</citetitle>)
         | 
| 365 | 
            -
                    end
         | 
| 366 | 
            -
                    result << '</attribution>'
         | 
| 367 | 
            -
                  end
         | 
| 368 | 
            -
                  result << (resolve_content node)
         | 
| 369 | 
            -
                  result << '</blockquote>'
         | 
| 370 | 
            -
                  result * LF
         | 
| 372 | 
            +
                  blockquote_tag(node, (node.has_role? 'epigraph') && 'epigraph') { resolve_content node }
         | 
| 371 373 | 
             
                end
         | 
| 372 374 |  | 
| 373 375 | 
             
                def thematic_break node
         | 
| @@ -385,8 +387,11 @@ module Asciidoctor | |
| 385 387 | 
             
                def table node
         | 
| 386 388 | 
             
                  has_body = false
         | 
| 387 389 | 
             
                  result = []
         | 
| 388 | 
            -
                  pgwide_attribute = (node.option? 'pgwide') ? ' pgwide="1"' :  | 
| 389 | 
            -
                   | 
| 390 | 
            +
                  pgwide_attribute = (node.option? 'pgwide') ? ' pgwide="1"' : ''
         | 
| 391 | 
            +
                  if (frame = node.attr 'frame', 'all') == 'ends'
         | 
| 392 | 
            +
                    frame = 'topbot'
         | 
| 393 | 
            +
                  end
         | 
| 394 | 
            +
                  result << %(<#{tag_name = node.title? ? 'table' : 'informaltable'}#{common_attributes node.id, node.role, node.reftext}#{pgwide_attribute} frame="#{frame}" rowsep="#{['none', 'cols'].include?(node.attr 'grid') ? 0 : 1}" colsep="#{['none', 'rows'].include?(node.attr 'grid') ? 0 : 1}"#{(node.attr? 'orientation', 'landscape', false) ? ' orient="land"' : ''}>)
         | 
| 390 395 | 
             
                  if (node.option? 'unbreakable')
         | 
| 391 396 | 
             
                    result << '<?dbfo keep-together="always"?>'
         | 
| 392 397 | 
             
                  elsif (node.option? 'breakable')
         | 
| @@ -412,10 +417,10 @@ module Asciidoctor | |
| 412 417 | 
             
                    rows.each do |row|
         | 
| 413 418 | 
             
                      result << '<row>'
         | 
| 414 419 | 
             
                      row.each do |cell|
         | 
| 415 | 
            -
                        halign_attribute = (cell.attr? 'halign') ? %( align="#{cell.attr 'halign'}") :  | 
| 416 | 
            -
                        valign_attribute = (cell.attr? 'valign') ? %( valign="#{cell.attr 'valign'}") :  | 
| 417 | 
            -
                        colspan_attribute = cell.colspan ? %( namest="col_#{colnum = cell.column.attr 'colnumber'}" nameend="col_#{colnum + cell.colspan - 1}") :  | 
| 418 | 
            -
                        rowspan_attribute = cell.rowspan ? %( morerows="#{cell.rowspan - 1}") :  | 
| 420 | 
            +
                        halign_attribute = (cell.attr? 'halign') ? %( align="#{cell.attr 'halign'}") : ''
         | 
| 421 | 
            +
                        valign_attribute = (cell.attr? 'valign') ? %( valign="#{cell.attr 'valign'}") : ''
         | 
| 422 | 
            +
                        colspan_attribute = cell.colspan ? %( namest="col_#{colnum = cell.column.attr 'colnumber'}" nameend="col_#{colnum + cell.colspan - 1}") : ''
         | 
| 423 | 
            +
                        rowspan_attribute = cell.rowspan ? %( morerows="#{cell.rowspan - 1}") : ''
         | 
| 419 424 | 
             
                        # NOTE <entry> may not have whitespace (e.g., line breaks) as a direct descendant according to DocBook rules
         | 
| 420 425 | 
             
                        entry_start = %(<entry#{halign_attribute}#{valign_attribute}#{colspan_attribute}#{rowspan_attribute}>)
         | 
| 421 426 | 
             
                        if tsec == :head
         | 
| @@ -444,7 +449,7 @@ module Asciidoctor | |
| 444 449 | 
             
                  result << '</tgroup>'
         | 
| 445 450 | 
             
                  result << %(</#{tag_name}>)
         | 
| 446 451 |  | 
| 447 | 
            -
                  warn ' | 
| 452 | 
            +
                  logger.warn 'tables must have at least one body row' unless has_body
         | 
| 448 453 | 
             
                  result * LF
         | 
| 449 454 | 
             
                end
         | 
| 450 455 |  | 
| @@ -464,14 +469,14 @@ module Asciidoctor | |
| 464 469 | 
             
                    result << '</bibliodiv>'
         | 
| 465 470 | 
             
                  else
         | 
| 466 471 | 
             
                    mark_type = (checklist = node.option? 'checklist') ? 'none' : node.style
         | 
| 467 | 
            -
                    mark_attribute = mark_type ? %( mark="#{mark_type}") :  | 
| 472 | 
            +
                    mark_attribute = mark_type ? %( mark="#{mark_type}") : ''
         | 
| 468 473 | 
             
                    result << %(<itemizedlist#{common_attributes node.id, node.role, node.reftext}#{mark_attribute}>)
         | 
| 469 474 | 
             
                    result << %(<title>#{node.title}</title>) if node.title?
         | 
| 470 475 | 
             
                    node.items.each do |item|
         | 
| 471 476 | 
             
                      text_marker = if checklist && (item.attr? 'checkbox')
         | 
| 472 477 | 
             
                        (item.attr? 'checked') ? '✓ ' : '❏ '
         | 
| 473 478 | 
             
                      else
         | 
| 474 | 
            -
                         | 
| 479 | 
            +
                        ''
         | 
| 475 480 | 
             
                      end
         | 
| 476 481 | 
             
                      result << '<listitem>'
         | 
| 477 482 | 
             
                      result << %(<simpara>#{text_marker}#{item.text}</simpara>)
         | 
| @@ -485,22 +490,7 @@ module Asciidoctor | |
| 485 490 | 
             
                end
         | 
| 486 491 |  | 
| 487 492 | 
             
                def verse node
         | 
| 488 | 
            -
                   | 
| 489 | 
            -
                  result << %(<blockquote#{common_attributes node.id, node.role, node.reftext}>)
         | 
| 490 | 
            -
                  result << %(<title>#{node.title}</title>) if node.title?
         | 
| 491 | 
            -
                  if (node.attr? 'attribution') || (node.attr? 'citetitle')
         | 
| 492 | 
            -
                    result << '<attribution>'
         | 
| 493 | 
            -
                    if node.attr? 'attribution'
         | 
| 494 | 
            -
                      result << (node.attr 'attribution')
         | 
| 495 | 
            -
                    end
         | 
| 496 | 
            -
                    if node.attr? 'citetitle'
         | 
| 497 | 
            -
                      result << %(<citetitle>#{node.attr 'citetitle'}</citetitle>)
         | 
| 498 | 
            -
                    end
         | 
| 499 | 
            -
                    result << '</attribution>'
         | 
| 500 | 
            -
                  end
         | 
| 501 | 
            -
                  result << %(<literallayout>#{node.content}</literallayout>)
         | 
| 502 | 
            -
                  result << '</blockquote>'
         | 
| 503 | 
            -
                  result * LF
         | 
| 493 | 
            +
                  blockquote_tag(node, (node.has_role? 'epigraph') && 'epigraph') { %(<literallayout>#{node.content}</literallayout>) }
         | 
| 504 494 | 
             
                end
         | 
| 505 495 |  | 
| 506 496 | 
             
                alias video skip
         | 
| @@ -523,7 +513,8 @@ module Asciidoctor | |
| 523 513 | 
             
                    # NOTE technically node.text should be node.reftext, but subs have already been applied to text
         | 
| 524 514 | 
             
                    %(<anchor#{common_attributes node.id, nil, (text = node.text)}/>#{text})
         | 
| 525 515 | 
             
                  else
         | 
| 526 | 
            -
                    warn %( | 
| 516 | 
            +
                    logger.warn %(unknown anchor type: #{node.type.inspect})
         | 
| 517 | 
            +
                    nil
         | 
| 527 518 | 
             
                  end
         | 
| 528 519 | 
             
                end
         | 
| 529 520 |  | 
| @@ -548,8 +539,8 @@ module Asciidoctor | |
| 548 539 | 
             
                end
         | 
| 549 540 |  | 
| 550 541 | 
             
                def inline_image node
         | 
| 551 | 
            -
                  width_attribute = (node.attr? 'width') ? %( contentwidth="#{node.attr 'width'}") :  | 
| 552 | 
            -
                  depth_attribute = (node.attr? 'height') ? %( contentdepth="#{node.attr 'height'}") :  | 
| 542 | 
            +
                  width_attribute = (node.attr? 'width') ? %( contentwidth="#{node.attr 'width'}") : ''
         | 
| 543 | 
            +
                  depth_attribute = (node.attr? 'height') ? %( contentdepth="#{node.attr 'height'}") : ''
         | 
| 553 544 | 
             
                  %(<inlinemediaobject>
         | 
| 554 545 | 
             
            <imageobject>
         | 
| 555 546 | 
             
            <imagedata fileref="#{node.type == 'icon' ? (node.icon_uri node.target) : (node.image_uri node.target)}"#{width_attribute}#{depth_attribute}/>
         | 
| @@ -606,8 +597,8 @@ module Asciidoctor | |
| 606 597 | 
             
                  :monospaced  => ['<literal>',                '</literal>',     false],
         | 
| 607 598 | 
             
                  :emphasis    => ['<emphasis>',               '</emphasis>',    true],
         | 
| 608 599 | 
             
                  :strong      => ['<emphasis role="strong">', '</emphasis>',    true],
         | 
| 609 | 
            -
                  :double      => [' | 
| 610 | 
            -
                  :single      => [' | 
| 600 | 
            +
                  :double      => ['<quote>',                  '</quote>',       true],
         | 
| 601 | 
            +
                  :single      => ['<quote>',                  '</quote>',       true],
         | 
| 611 602 | 
             
                  :mark        => ['<emphasis role="marked">', '</emphasis>',    false],
         | 
| 612 603 | 
             
                  :superscript => ['<superscript>',            '</superscript>', false],
         | 
| 613 604 | 
             
                  :subscript   => ['<subscript>',              '</subscript>',   false]
         | 
| @@ -615,8 +606,7 @@ module Asciidoctor | |
| 615 606 |  | 
| 616 607 | 
             
                def inline_quoted node
         | 
| 617 608 | 
             
                  if (type = node.type) == :asciimath
         | 
| 618 | 
            -
                    if ((defined? ::AsciiMath) || ( | 
| 619 | 
            -
                        (@asciimath_available = Helpers.require_library 'asciimath', true, :warn)))
         | 
| 609 | 
            +
                    if (@asciimath ||= ((defined? ::AsciiMath) || (Helpers.require_library 'asciimath', true, :warn)).nil? ? :unavailable : :loaded) == :loaded
         | 
| 620 610 | 
             
                      # NOTE fop requires jeuclid to process raw mathml
         | 
| 621 611 | 
             
                      %(<inlineequation>#{(::AsciiMath.parse node.text).to_mathml 'mml:', 'xmlns:mml' => 'http://www.w3.org/1998/Math/MathML'}</inlineequation>)
         | 
| 622 612 | 
             
                    else
         | 
| @@ -642,7 +632,24 @@ module Asciidoctor | |
| 642 632 | 
             
                  end
         | 
| 643 633 | 
             
                end
         | 
| 644 634 |  | 
| 645 | 
            -
                def  | 
| 635 | 
            +
                def common_attributes id, role = nil, reftext = nil
         | 
| 636 | 
            +
                  attrs = id ? %( xml:id="#{id}") : ''
         | 
| 637 | 
            +
                  attrs = %(#{attrs} role="#{role}") if role
         | 
| 638 | 
            +
                  if reftext
         | 
| 639 | 
            +
                    if (reftext.include? '<') && ((reftext = reftext.gsub XmlSanitizeRx, '').include? ' ')
         | 
| 640 | 
            +
                      reftext = (reftext.squeeze ' ').strip
         | 
| 641 | 
            +
                    end
         | 
| 642 | 
            +
                    reftext = (reftext.gsub '"', '"') if reftext.include? '"'
         | 
| 643 | 
            +
                    attrs = %(#{attrs} xreflabel="#{reftext}")
         | 
| 644 | 
            +
                  end
         | 
| 645 | 
            +
                  attrs
         | 
| 646 | 
            +
                end
         | 
| 647 | 
            +
             | 
| 648 | 
            +
                def doctype_declaration root_tag_name
         | 
| 649 | 
            +
                  nil
         | 
| 650 | 
            +
                end
         | 
| 651 | 
            +
             | 
| 652 | 
            +
                def author_tag doc, index = nil
         | 
| 646 653 | 
             
                  firstname_key = index ? %(firstname_#{index}) : 'firstname'
         | 
| 647 654 | 
             
                  middlename_key = index ? %(middlename_#{index}) : 'middlename'
         | 
| 648 655 | 
             
                  lastname_key = index ? %(lastname_#{index}) : 'lastname'
         | 
| @@ -661,40 +668,30 @@ module Asciidoctor | |
| 661 668 | 
             
                  result * LF
         | 
| 662 669 | 
             
                end
         | 
| 663 670 |  | 
| 664 | 
            -
                def  | 
| 665 | 
            -
                   | 
| 666 | 
            -
                  attrs = %(#{attrs} role="#{role}") if role
         | 
| 667 | 
            -
                  if reftext
         | 
| 668 | 
            -
                    if (reftext.include? '<') && ((reftext = reftext.gsub XmlSanitizeRx, '').include? ' ')
         | 
| 669 | 
            -
                      reftext = (reftext.squeeze ' ').strip
         | 
| 670 | 
            -
                    end
         | 
| 671 | 
            -
                    reftext = (reftext.gsub '"', '"') if reftext.include? '"'
         | 
| 672 | 
            -
                    attrs = %(#{attrs} xreflabel="#{reftext}")
         | 
| 673 | 
            -
                  end
         | 
| 674 | 
            -
                  attrs
         | 
| 675 | 
            -
                end
         | 
| 676 | 
            -
             | 
| 677 | 
            -
                def doctype_declaration root_tag_name
         | 
| 678 | 
            -
                  nil
         | 
| 679 | 
            -
                end
         | 
| 680 | 
            -
             | 
| 681 | 
            -
                def document_info_element doc, info_tag_prefix, use_info_tag_prefix = false
         | 
| 682 | 
            -
                  info_tag_prefix = nil unless use_info_tag_prefix
         | 
| 671 | 
            +
                def document_info_tag doc, info_tag_prefix, use_info_tag_prefix = false
         | 
| 672 | 
            +
                  info_tag_prefix = '' unless use_info_tag_prefix
         | 
| 683 673 | 
             
                  result = []
         | 
| 684 674 | 
             
                  result << %(<#{info_tag_prefix}info>)
         | 
| 685 675 | 
             
                  result << document_title_tags(doc.doctitle :partition => true, :use_fallback => true) unless doc.notitle
         | 
| 686 676 | 
             
                  if (date = (doc.attr? 'revdate') ? (doc.attr 'revdate') : ((doc.attr? 'reproducible') ? nil : (doc.attr 'docdate')))
         | 
| 687 677 | 
             
                    result << %(<date>#{date}</date>)
         | 
| 688 678 | 
             
                  end
         | 
| 679 | 
            +
                  if doc.attr? 'copyright'
         | 
| 680 | 
            +
                    CopyrightRx =~ (doc.attr 'copyright')
         | 
| 681 | 
            +
                    result << '<copyright>'
         | 
| 682 | 
            +
                    result << %(<holder>#{$1}</holder>)
         | 
| 683 | 
            +
                    result << %(<year>#{$2}</year>) if $2
         | 
| 684 | 
            +
                    result << '</copyright>'
         | 
| 685 | 
            +
                  end
         | 
| 689 686 | 
             
                  if doc.has_header?
         | 
| 690 687 | 
             
                    if doc.attr? 'author'
         | 
| 691 688 | 
             
                      if (authorcount = (doc.attr 'authorcount').to_i) < 2
         | 
| 692 | 
            -
                        result << ( | 
| 689 | 
            +
                        result << (author_tag doc)
         | 
| 693 690 | 
             
                        result << %(<authorinitials>#{doc.attr 'authorinitials'}</authorinitials>) if doc.attr? 'authorinitials'
         | 
| 694 691 | 
             
                      else
         | 
| 695 692 | 
             
                        result << '<authorgroup>'
         | 
| 696 693 | 
             
                        authorcount.times do |index|
         | 
| 697 | 
            -
                          result << ( | 
| 694 | 
            +
                          result << (author_tag doc, index + 1)
         | 
| 698 695 | 
             
                        end
         | 
| 699 696 | 
             
                        result << '</authorgroup>'
         | 
| 700 697 | 
             
                      end
         | 
| @@ -730,9 +727,11 @@ module Asciidoctor | |
| 730 727 | 
             
                    result << '<refmeta>'
         | 
| 731 728 | 
             
                    result << %(<refentrytitle>#{doc.attr 'mantitle'}</refentrytitle>) if doc.attr? 'mantitle'
         | 
| 732 729 | 
             
                    result << %(<manvolnum>#{doc.attr 'manvolnum'}</manvolnum>) if doc.attr? 'manvolnum'
         | 
| 730 | 
            +
                    result << %(<refmiscinfo class="source">#{doc.attr 'mansource', ' '}</refmiscinfo>)
         | 
| 731 | 
            +
                    result << %(<refmiscinfo class="manual">#{doc.attr 'manmanual', ' '}</refmiscinfo>)
         | 
| 733 732 | 
             
                    result << '</refmeta>'
         | 
| 734 733 | 
             
                    result << '<refnamediv>'
         | 
| 735 | 
            -
                    result  | 
| 734 | 
            +
                    result += (doc.attr 'mannames').map {|n| %(<refname>#{n}</refname>) } if doc.attr? 'mannames'
         | 
| 736 735 | 
             
                    result << %(<refpurpose>#{doc.attr 'manpurpose'}</refpurpose>) if doc.attr? 'manpurpose'
         | 
| 737 736 | 
             
                    result << '</refnamediv>'
         | 
| 738 737 | 
             
                  end
         | 
| @@ -763,13 +762,13 @@ module Asciidoctor | |
| 763 762 | 
             
                end
         | 
| 764 763 |  | 
| 765 764 | 
             
                def title_tag node, optional = true
         | 
| 766 | 
            -
                  !optional || node.title? ? %(<title>#{node.title}</title>\n) :  | 
| 765 | 
            +
                  !optional || node.title? ? %(<title>#{node.title}</title>\n) : ''
         | 
| 767 766 | 
             
                end
         | 
| 768 767 |  | 
| 769 768 | 
             
                def cover_tag doc, face, use_placeholder = false
         | 
| 770 769 | 
             
                  if (cover_image = doc.attr %(#{face}-cover-image))
         | 
| 771 | 
            -
                    width_attr =  | 
| 772 | 
            -
                    depth_attr =  | 
| 770 | 
            +
                    width_attr = ''
         | 
| 771 | 
            +
                    depth_attr = ''
         | 
| 773 772 | 
             
                    if (cover_image.include? ':') && ImageMacroRx =~ cover_image
         | 
| 774 773 | 
             
                      cover_image = doc.image_uri $1
         | 
| 775 774 | 
             
                      unless $2.empty?
         | 
| @@ -794,5 +793,24 @@ module Asciidoctor | |
| 794 793 | 
             
                    %(<cover role="#{face}"/>)
         | 
| 795 794 | 
             
                  end
         | 
| 796 795 | 
             
                end
         | 
| 796 | 
            +
             | 
| 797 | 
            +
                def blockquote_tag node, tag_name = nil
         | 
| 798 | 
            +
                  if tag_name
         | 
| 799 | 
            +
                    start_tag, end_tag = %(<#{tag_name}), %(</#{tag_name}>)
         | 
| 800 | 
            +
                  else
         | 
| 801 | 
            +
                    start_tag, end_tag = '<blockquote', '</blockquote>'
         | 
| 802 | 
            +
                  end
         | 
| 803 | 
            +
                  result = [%(#{start_tag}#{common_attributes node.id, node.role, node.reftext}>)]
         | 
| 804 | 
            +
                  result << %(<title>#{node.title}</title>) if node.title?
         | 
| 805 | 
            +
                  if (node.attr? 'attribution') || (node.attr? 'citetitle')
         | 
| 806 | 
            +
                    result << '<attribution>'
         | 
| 807 | 
            +
                    result << (node.attr 'attribution') if node.attr? 'attribution'
         | 
| 808 | 
            +
                    result << %(<citetitle>#{node.attr 'citetitle'}</citetitle>) if node.attr? 'citetitle'
         | 
| 809 | 
            +
                    result << '</attribution>'
         | 
| 810 | 
            +
                  end
         | 
| 811 | 
            +
                  result << yield
         | 
| 812 | 
            +
                  result << end_tag
         | 
| 813 | 
            +
                  result * LF
         | 
| 814 | 
            +
                end
         | 
| 797 815 | 
             
              end
         | 
| 798 816 | 
             
            end
         |