isodoc 0.5.9 → 0.6.0
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.
- checksums.yaml +4 -4
 - data/isodoc.gemspec +1 -0
 - data/lib/isodoc.rb +2 -0
 - data/lib/isodoc/convert.rb +17 -1
 - data/lib/isodoc/footnotes.rb +8 -3
 - data/lib/isodoc/html.rb +65 -27
 - data/lib/isodoc/i18n-en.yaml +1 -1
 - data/lib/isodoc/iso/convert.rb +46 -0
 - data/lib/isodoc/iso/html/header.html +184 -0
 - data/lib/isodoc/iso/html/html_iso_intro.html +34 -0
 - data/lib/isodoc/iso/html/html_iso_titlepage.html +32 -0
 - data/lib/isodoc/iso/html/htmlstyle.scss +46 -0
 - data/lib/isodoc/iso/html/isodoc.scss +679 -0
 - data/lib/isodoc/iso/html/scripts.html +174 -0
 - data/lib/isodoc/iso/html/style-human.scss +1277 -0
 - data/lib/isodoc/iso/html/style-iso.scss +1257 -0
 - data/lib/isodoc/iso/html/word_iso_intro.html +72 -0
 - data/lib/isodoc/iso/html/word_iso_titlepage.html +58 -0
 - data/lib/isodoc/iso/html/wordstyle.scss +1135 -0
 - data/lib/isodoc/iso/wordconvert.rb +34 -0
 - data/lib/isodoc/iso2wordhtml.rb +17 -23
 - data/lib/isodoc/section.rb +1 -1
 - data/lib/isodoc/version.rb +1 -1
 - data/lib/isodoc/wordconvert/comments.rb +0 -15
 - data/lib/isodoc/wordconvert/convert.rb +1 -0
 - data/lib/isodoc/wordconvert/footnotes.rb +0 -12
 - data/lib/isodoc/wordconvert/postprocess.rb +110 -0
 - data/lib/isodoc/wordconvert/wordconvertmodule.rb +18 -130
 - data/lib/isodoc/xref_sect_gen.rb +7 -4
 - data/spec/assets/scripts.html +3 -1
 - data/spec/isodoc/blocks_spec.rb +97 -211
 - data/spec/isodoc/cleanup_spec.rb +27 -0
 - data/spec/isodoc/footnotes_spec.rb +40 -53
 - data/spec/isodoc/i18n_spec.rb +4 -56
 - data/spec/isodoc/inline_spec.rb +7 -98
 - data/spec/isodoc/iso_spec.rb +89 -0
 - data/spec/isodoc/lists_spec.rb +5 -57
 - data/spec/isodoc/postproc_spec.rb +43 -79
 - data/spec/isodoc/ref_spec.rb +4 -17
 - data/spec/isodoc/section_spec.rb +11 -24
 - data/spec/isodoc/table_spec.rb +61 -76
 - data/spec/isodoc/terms_spec.rb +1 -13
 - data/spec/isodoc/xref_spec.rb +21 -164
 - data/spec/spec_helper.rb +21 -1
 - metadata +31 -2
 
| 
         @@ -0,0 +1,34 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module IsoDoc
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Iso
         
     | 
| 
      
 3 
     | 
    
         
            +
                class WordConvert < IsoDoc::Convert
         
     | 
| 
      
 4 
     | 
    
         
            +
                  include IsoDoc::WordConvertModule
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
                  def default_fonts(options)
         
     | 
| 
      
 7 
     | 
    
         
            +
                    b = options[:bodyfont] ||
         
     | 
| 
      
 8 
     | 
    
         
            +
                      (options[:script] == "Hans" ? '"SimSun",serif' :
         
     | 
| 
      
 9 
     | 
    
         
            +
                       '"Cambria",serif')
         
     | 
| 
      
 10 
     | 
    
         
            +
                    h = options[:headerfont] ||
         
     | 
| 
      
 11 
     | 
    
         
            +
                      (options[:script] == "Hans" ? '"SimHei",sans-serif' :
         
     | 
| 
      
 12 
     | 
    
         
            +
                       '"Cambria",serif')
         
     | 
| 
      
 13 
     | 
    
         
            +
                    m = options[:monospacefont] || '"Courier New",monospace'
         
     | 
| 
      
 14 
     | 
    
         
            +
                    "$bodyfont: #{b};\n$headerfont: #{h};\n$monospacefont: #{m};\n"
         
     | 
| 
      
 15 
     | 
    
         
            +
                  end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                  def html_doc_path(file)
         
     | 
| 
      
 18 
     | 
    
         
            +
                    File.join(File.dirname(__FILE__), File.join("html", file))
         
     | 
| 
      
 19 
     | 
    
         
            +
                  end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                  def initialize(options)
         
     | 
| 
      
 22 
     | 
    
         
            +
                    super
         
     | 
| 
      
 23 
     | 
    
         
            +
                    @wordstylesheet = generate_css(html_doc_path("wordstyle.scss"), false, default_fonts(options))
         
     | 
| 
      
 24 
     | 
    
         
            +
                    @standardstylesheet = generate_css(html_doc_path("isodoc.scss"), false, default_fonts(options))
         
     | 
| 
      
 25 
     | 
    
         
            +
                    @header = html_doc_path("header.html")
         
     | 
| 
      
 26 
     | 
    
         
            +
                    @wordcoverpage = html_doc_path("word_iso_titlepage.html")
         
     | 
| 
      
 27 
     | 
    
         
            +
                    @wordintropage = html_doc_path("word_iso_intro.html")
         
     | 
| 
      
 28 
     | 
    
         
            +
                    @ulstyle = "l3"
         
     | 
| 
      
 29 
     | 
    
         
            +
                    @olstyle = "l2"
         
     | 
| 
      
 30 
     | 
    
         
            +
                  end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
                end
         
     | 
| 
      
 33 
     | 
    
         
            +
              end
         
     | 
| 
      
 34 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/isodoc/iso2wordhtml.rb
    CHANGED
    
    | 
         @@ -24,23 +24,17 @@ module IsoDoc 
     | 
|
| 
       24 
24 
     | 
    
         
             
                  [filename, dir]
         
     | 
| 
       25 
25 
     | 
    
         
             
                end
         
     | 
| 
       26 
26 
     | 
    
         | 
| 
       27 
     | 
    
         
            -
                # these are in fact preprocess,
         
     | 
| 
       28 
     | 
    
         
            -
                # but they are extraneous to main HTML file
         
     | 
| 
       29 
     | 
    
         
            -
                def html_header(html, docxml, filename, dir)
         
     | 
| 
       30 
     | 
    
         
            -
                  anchor_names docxml
         
     | 
| 
       31 
     | 
    
         
            -
                  define_head html, filename, dir
         
     | 
| 
       32 
     | 
    
         
            -
                end
         
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
27 
     | 
    
         
             
                # isodoc.css overrides any CSS injected by Html2Doc, which
         
     | 
| 
       35 
28 
     | 
    
         
             
                # is inserted before this CSS.
         
     | 
| 
       36 
29 
     | 
    
         
             
                def define_head(html, filename, _dir)
         
     | 
| 
       37 
30 
     | 
    
         
             
                  html.head do |head|
         
     | 
| 
       38 
31 
     | 
    
         
             
                    head.title { |t| t << filename }
         
     | 
| 
       39 
     | 
    
         
            -
                     
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
      
 32 
     | 
    
         
            +
                    if @standardstylesheet
         
     | 
| 
      
 33 
     | 
    
         
            +
                      head.style do |style|
         
     | 
| 
      
 34 
     | 
    
         
            +
                        stylesheet = File.read(@standardstylesheet).
         
     | 
| 
      
 35 
     | 
    
         
            +
                          gsub("FILENAME", filename)
         
     | 
| 
      
 36 
     | 
    
         
            +
                        style.comment "\n#{stylesheet}\n"
         
     | 
| 
      
 37 
     | 
    
         
            +
                      end
         
     | 
| 
       44 
38 
     | 
    
         
             
                    end
         
     | 
| 
       45 
39 
     | 
    
         
             
                  end
         
     | 
| 
       46 
40 
     | 
    
         
             
                end
         
     | 
| 
         @@ -64,8 +58,6 @@ module IsoDoc 
     | 
|
| 
       64 
58 
     | 
    
         
             
                def make_body2(body, docxml)
         
     | 
| 
       65 
59 
     | 
    
         
             
                  body.div **{ class: "WordSection2" } do |div2|
         
     | 
| 
       66 
60 
     | 
    
         
             
                    info docxml, div2
         
     | 
| 
       67 
     | 
    
         
            -
                    foreword docxml, div2
         
     | 
| 
       68 
     | 
    
         
            -
                    introduction docxml, div2
         
     | 
| 
       69 
61 
     | 
    
         
             
                    div2.p { |p| p << " " } # placeholder
         
     | 
| 
       70 
62 
     | 
    
         
             
                  end
         
     | 
| 
       71 
63 
     | 
    
         
             
                  section_break(body)
         
     | 
| 
         @@ -73,6 +65,8 @@ module IsoDoc 
     | 
|
| 
       73 
65 
     | 
    
         | 
| 
       74 
66 
     | 
    
         
             
                def make_body3(body, docxml)
         
     | 
| 
       75 
67 
     | 
    
         
             
                  body.div **{ class: "WordSection3" } do |div3|
         
     | 
| 
      
 68 
     | 
    
         
            +
                    foreword docxml, div3
         
     | 
| 
      
 69 
     | 
    
         
            +
                    introduction docxml, div3
         
     | 
| 
       76 
70 
     | 
    
         
             
                    middle docxml, div3
         
     | 
| 
       77 
71 
     | 
    
         
             
                    footnotes div3
         
     | 
| 
       78 
72 
     | 
    
         
             
                    comments div3
         
     | 
| 
         @@ -110,13 +104,13 @@ module IsoDoc 
     | 
|
| 
       110 
104 
     | 
    
         | 
| 
       111 
105 
     | 
    
         
             
                def smallcap_parse(node, xml)
         
     | 
| 
       112 
106 
     | 
    
         
             
                  xml.span **{ style: "font-variant:small-caps;" } do |s|
         
     | 
| 
       113 
     | 
    
         
            -
                    s << node. 
     | 
| 
      
 107 
     | 
    
         
            +
                    s << node.inner_html
         
     | 
| 
       114 
108 
     | 
    
         
             
                  end
         
     | 
| 
       115 
109 
     | 
    
         
             
                end
         
     | 
| 
       116 
110 
     | 
    
         | 
| 
       117 
111 
     | 
    
         
             
                def text_parse(node, out)
         
     | 
| 
       118 
112 
     | 
    
         
             
                  return if node.nil? || node.text.nil?
         
     | 
| 
       119 
     | 
    
         
            -
                  text = node. 
     | 
| 
      
 113 
     | 
    
         
            +
                  text = node.to_s
         
     | 
| 
       120 
114 
     | 
    
         
             
                  text = text.gsub("\n", "<br/>").gsub(" ", " ") if in_sourcecode
         
     | 
| 
       121 
115 
     | 
    
         
             
                  out << text
         
     | 
| 
       122 
116 
     | 
    
         
             
                end
         
     | 
| 
         @@ -130,12 +124,12 @@ module IsoDoc 
     | 
|
| 
       130 
124 
     | 
    
         
             
                    text_parse(node, out)
         
     | 
| 
       131 
125 
     | 
    
         
             
                  else
         
     | 
| 
       132 
126 
     | 
    
         
             
                    case node.name
         
     | 
| 
       133 
     | 
    
         
            -
                    when "em" then out.i { |e| e << node. 
     | 
| 
       134 
     | 
    
         
            -
                    when "strong" then out.b { |e| e << node. 
     | 
| 
       135 
     | 
    
         
            -
                    when "sup" then out.sup { |e| e << node. 
     | 
| 
       136 
     | 
    
         
            -
                    when "sub" then out.sub { |e| e << node. 
     | 
| 
       137 
     | 
    
         
            -
                    when "tt" then out.tt { |e| e << node. 
     | 
| 
       138 
     | 
    
         
            -
                    when "strike" then out.s { |e| e << node. 
     | 
| 
      
 127 
     | 
    
         
            +
                    when "em" then out.i { |e| e << node.inner_html }
         
     | 
| 
      
 128 
     | 
    
         
            +
                    when "strong" then out.b { |e| e << node.inner_html }
         
     | 
| 
      
 129 
     | 
    
         
            +
                    when "sup" then out.sup { |e| e << node.inner_html }
         
     | 
| 
      
 130 
     | 
    
         
            +
                    when "sub" then out.sub { |e| e << node.inner_html }
         
     | 
| 
      
 131 
     | 
    
         
            +
                    when "tt" then out.tt { |e| e << node.inner_html }
         
     | 
| 
      
 132 
     | 
    
         
            +
                    when "strike" then out.s { |e| e << node.inner_html }
         
     | 
| 
       139 
133 
     | 
    
         
             
                    when "smallcap" then smallcap_parse(node, out)
         
     | 
| 
       140 
134 
     | 
    
         
             
                    when "br" then out.br
         
     | 
| 
       141 
135 
     | 
    
         
             
                    when "hr" then out.hr
         
     | 
| 
         @@ -144,7 +138,7 @@ module IsoDoc 
     | 
|
| 
       144 
138 
     | 
    
         
             
                    when "callout" then callout_parse(node, out)
         
     | 
| 
       145 
139 
     | 
    
         
             
                    when "stem" then stem_parse(node, out)
         
     | 
| 
       146 
140 
     | 
    
         
             
                    when "clause" then clause_parse(node, out)
         
     | 
| 
       147 
     | 
    
         
            -
             
     | 
| 
      
 141 
     | 
    
         
            +
                      # when "subclause" then clause_parse(node, out)
         
     | 
| 
       148 
142 
     | 
    
         
             
                    when "appendix" then clause_parse(node, out)
         
     | 
| 
       149 
143 
     | 
    
         
             
                    when "xref" then xref_parse(node, out)
         
     | 
| 
       150 
144 
     | 
    
         
             
                    when "eref" then eref_parse(node, out)
         
     | 
    
        data/lib/isodoc/section.rb
    CHANGED
    
    | 
         @@ -113,7 +113,7 @@ module IsoDoc 
     | 
|
| 
       113 
113 
     | 
    
         
             
                end
         
     | 
| 
       114 
114 
     | 
    
         | 
| 
       115 
115 
     | 
    
         
             
                def term_defs_boilerplate_cont(src, term)
         
     | 
| 
       116 
     | 
    
         
            -
                  sources = sentence_join(src.map { |s| @anchors[s[" 
     | 
| 
      
 116 
     | 
    
         
            +
                  sources = sentence_join(src.map { |s| @anchors[s["bibitemid"]][:xref] })
         
     | 
| 
       117 
117 
     | 
    
         
             
                  if src.empty?
         
     | 
| 
       118 
118 
     | 
    
         
             
                    @internal_terms_boilerplate
         
     | 
| 
       119 
119 
     | 
    
         
             
                  elsif term.nil?
         
     | 
    
        data/lib/isodoc/version.rb
    CHANGED
    
    
| 
         @@ -1,11 +1,3 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            #require "uuidtools"
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            #module IsoDoc
         
     | 
| 
       4 
     | 
    
         
            -
              #class WordConvert
         
     | 
| 
       5 
     | 
    
         
            -
              #module WordConvertModule
         
     | 
| 
       6 
     | 
    
         
            -
                #def self.included base
         
     | 
| 
       7 
     | 
    
         
            -
            #base.class_eval do
         
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
1 
     | 
    
         
             
            def in_comment
         
     | 
| 
       10 
2 
     | 
    
         
             
              @in_comment
         
     | 
| 
       11 
3 
     | 
    
         
             
            end
         
     | 
| 
         @@ -67,7 +59,6 @@ def comment_cleanup(docxml) 
     | 
|
| 
       67 
59 
     | 
    
         
             
              embed_comment_in_comment_list(docxml)
         
     | 
| 
       68 
60 
     | 
    
         
             
            end
         
     | 
| 
       69 
61 
     | 
    
         | 
| 
       70 
     | 
    
         
            -
            #COMMENT_IN_COMMENT_LIST =
         
     | 
| 
       71 
62 
     | 
    
         
             
            COMMENT_IN_COMMENT_LIST1 =
         
     | 
| 
       72 
63 
     | 
    
         
             
              '//div[@style="mso-element:comment-list"]//'\
         
     | 
| 
       73 
64 
     | 
    
         
             
              'span[@style="MsoCommentReference"]'.freeze
         
     | 
| 
         @@ -135,13 +126,11 @@ def get_comments_from_text(docxml, link_order) 
     | 
|
| 
       135 
126 
     | 
    
         
             
              # comments
         
     | 
| 
       136 
127 
     | 
    
         
             
            end
         
     | 
| 
       137 
128 
     | 
    
         | 
| 
       138 
     | 
    
         
            -
            #COMMENT_TARGET_XREFS =
         
     | 
| 
       139 
129 
     | 
    
         
             
            COMMENT_TARGET_XREFS1 =
         
     | 
| 
       140 
130 
     | 
    
         
             
              "//span[@style='mso-special-character:comment']/@target".freeze
         
     | 
| 
       141 
131 
     | 
    
         | 
| 
       142 
132 
     | 
    
         
             
            def reorder_comments_by_comment_link(docxml)
         
     | 
| 
       143 
133 
     | 
    
         
             
              link_order = {}
         
     | 
| 
       144 
     | 
    
         
            -
              #docxml.xpath(COMMENT_TARGET_XREFS).each_with_index do |target, i|
         
     | 
| 
       145 
134 
     | 
    
         
             
              docxml.xpath(COMMENT_TARGET_XREFS1).each_with_index do |target, i|
         
     | 
| 
       146 
135 
     | 
    
         
             
                link_order[target.value] = i
         
     | 
| 
       147 
136 
     | 
    
         
             
              end
         
     | 
| 
         @@ -149,7 +138,3 @@ def reorder_comments_by_comment_link(docxml) 
     | 
|
| 
       149 
138 
     | 
    
         
             
              list = docxml.at("//*[@style='mso-element:comment-list']") || return
         
     | 
| 
       150 
139 
     | 
    
         
             
              list.children = comments.map { |c| c[:text] }.join("\n")
         
     | 
| 
       151 
140 
     | 
    
         
             
            end
         
     | 
| 
       152 
     | 
    
         
            -
                  #end
         
     | 
| 
       153 
     | 
    
         
            -
                #end
         
     | 
| 
       154 
     | 
    
         
            -
              #end
         
     | 
| 
       155 
     | 
    
         
            -
            #end
         
     | 
| 
         @@ -20,6 +20,7 @@ module IsoDoc 
     | 
|
| 
       20 
20 
     | 
    
         
             
                    eval File.open(File.join(File.dirname(__FILE__),"wordconvertmodule.rb")).read
         
     | 
| 
       21 
21 
     | 
    
         
             
                    eval File.open(File.join(File.dirname(__FILE__),"comments.rb")).read
         
     | 
| 
       22 
22 
     | 
    
         
             
                    eval File.open(File.join(File.dirname(__FILE__),"footnotes.rb")).read
         
     | 
| 
      
 23 
     | 
    
         
            +
                    eval File.open(File.join(File.dirname(__FILE__),"postprocess.rb")).read
         
     | 
| 
       23 
24 
     | 
    
         
             
                  end
         
     | 
| 
       24 
25 
     | 
    
         
             
                end
         
     | 
| 
       25 
26 
     | 
    
         
             
              end
         
     | 
| 
         @@ -1,11 +1,3 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            #require "uuidtools"
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            #module IsoDoc
         
     | 
| 
       4 
     | 
    
         
            -
              #class WordConvert
         
     | 
| 
       5 
     | 
    
         
            -
              #module WordConvertModule
         
     | 
| 
       6 
     | 
    
         
            -
                #def self.included base
         
     | 
| 
       7 
     | 
    
         
            -
            #base.class_eval do
         
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
1 
     | 
    
         
             
            def footnotes(div)
         
     | 
| 
       10 
2 
     | 
    
         
             
              return if @footnotes.empty?
         
     | 
| 
       11 
3 
     | 
    
         
             
              @footnotes.each { |fn| div.parent << fn }
         
     | 
| 
         @@ -74,7 +66,3 @@ def footnote_parse(node, out) 
     | 
|
| 
       74 
66 
     | 
    
         
             
              @in_footnote = false
         
     | 
| 
       75 
67 
     | 
    
         
             
              @seen_footnote << fn
         
     | 
| 
       76 
68 
     | 
    
         
             
            end
         
     | 
| 
       77 
     | 
    
         
            -
                  #end
         
     | 
| 
       78 
     | 
    
         
            -
                #end
         
     | 
| 
       79 
     | 
    
         
            -
              #end
         
     | 
| 
       80 
     | 
    
         
            -
            #end
         
     | 
| 
         @@ -0,0 +1,110 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            def postprocess(result, filename, dir)
         
     | 
| 
      
 2 
     | 
    
         
            +
              generate_header(filename, dir)
         
     | 
| 
      
 3 
     | 
    
         
            +
              result = from_xhtml(cleanup(to_xhtml(result)))
         
     | 
| 
      
 4 
     | 
    
         
            +
              toWord(result, filename, dir)
         
     | 
| 
      
 5 
     | 
    
         
            +
              @files_to_delete.each { |f| system "rm #{f}" }
         
     | 
| 
      
 6 
     | 
    
         
            +
            end
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            def toWord(result, filename, dir)
         
     | 
| 
      
 9 
     | 
    
         
            +
              result = populate_template(result, :word)
         
     | 
| 
      
 10 
     | 
    
         
            +
              result = from_xhtml(word_cleanup(to_xhtml(result)))
         
     | 
| 
      
 11 
     | 
    
         
            +
              Html2Doc.process(result, filename: filename, stylesheet: @wordstylesheet,
         
     | 
| 
      
 12 
     | 
    
         
            +
                               header_file: "header.html", dir: dir,
         
     | 
| 
      
 13 
     | 
    
         
            +
                               asciimathdelims: [@openmathdelim, @closemathdelim],
         
     | 
| 
      
 14 
     | 
    
         
            +
                               liststyles: { ul: @ulstyle, ol: @olstyle })
         
     | 
| 
      
 15 
     | 
    
         
            +
            end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            def word_cleanup(docxml)
         
     | 
| 
      
 18 
     | 
    
         
            +
              word_preface(docxml)
         
     | 
| 
      
 19 
     | 
    
         
            +
              word_annex_cleanup(docxml)
         
     | 
| 
      
 20 
     | 
    
         
            +
              docxml
         
     | 
| 
      
 21 
     | 
    
         
            +
            end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            # force Annex h2 to be p.h2Annex, so it is not picked up by ToC
         
     | 
| 
      
 24 
     | 
    
         
            +
            def word_annex_cleanup(docxml)
         
     | 
| 
      
 25 
     | 
    
         
            +
              docxml.xpath("//h2[ancestor::*[@class = 'Section3']]").each do |h2|
         
     | 
| 
      
 26 
     | 
    
         
            +
                h2.name = "p"
         
     | 
| 
      
 27 
     | 
    
         
            +
                h2["class"] = "h2Annex"
         
     | 
| 
      
 28 
     | 
    
         
            +
              end
         
     | 
| 
      
 29 
     | 
    
         
            +
            end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
            def word_preface(docxml)
         
     | 
| 
      
 32 
     | 
    
         
            +
              word_cover(docxml) if @wordcoverpage
         
     | 
| 
      
 33 
     | 
    
         
            +
              word_intro(docxml) if @wordintropage
         
     | 
| 
      
 34 
     | 
    
         
            +
            end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
            def word_cover(docxml)
         
     | 
| 
      
 37 
     | 
    
         
            +
              cover = File.read(@wordcoverpage, encoding: "UTF-8")
         
     | 
| 
      
 38 
     | 
    
         
            +
              cover = populate_template(cover, :word)
         
     | 
| 
      
 39 
     | 
    
         
            +
              coverxml = to_xhtml_fragment(cover)
         
     | 
| 
      
 40 
     | 
    
         
            +
              docxml.at('//div[@class="WordSection1"]').children.first.previous =
         
     | 
| 
      
 41 
     | 
    
         
            +
                coverxml.to_xml(encoding: "US-ASCII")
         
     | 
| 
      
 42 
     | 
    
         
            +
            end
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
            def word_intro(docxml)
         
     | 
| 
      
 45 
     | 
    
         
            +
              intro = File.read(@wordintropage, encoding: "UTF-8").
         
     | 
| 
      
 46 
     | 
    
         
            +
                sub(/WORDTOC/, make_WordToC(docxml))
         
     | 
| 
      
 47 
     | 
    
         
            +
              intro = populate_template(intro, :word)
         
     | 
| 
      
 48 
     | 
    
         
            +
              introxml = to_xhtml_fragment(intro)
         
     | 
| 
      
 49 
     | 
    
         
            +
              docxml.at('//div[@class="WordSection2"]').children.first.previous =
         
     | 
| 
      
 50 
     | 
    
         
            +
                introxml.to_xml(encoding: "US-ASCII")
         
     | 
| 
      
 51 
     | 
    
         
            +
            end
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
            def generate_header(filename, _dir)
         
     | 
| 
      
 54 
     | 
    
         
            +
              return unless @header
         
     | 
| 
      
 55 
     | 
    
         
            +
              template = Liquid::Template.parse(File.read(@header, encoding: "UTF-8"))
         
     | 
| 
      
 56 
     | 
    
         
            +
              meta = get_metadata
         
     | 
| 
      
 57 
     | 
    
         
            +
              meta[:filename] = filename
         
     | 
| 
      
 58 
     | 
    
         
            +
              params = meta.map { |k, v| [k.to_s, v] }.to_h
         
     | 
| 
      
 59 
     | 
    
         
            +
              File.open("header.html", "w") do |f|
         
     | 
| 
      
 60 
     | 
    
         
            +
                f.write(template.render(params))
         
     | 
| 
      
 61 
     | 
    
         
            +
              end
         
     | 
| 
      
 62 
     | 
    
         
            +
              @files_to_delete << "header.html"
         
     | 
| 
      
 63 
     | 
    
         
            +
            end
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
            def word_toc_entry(toclevel, heading)
         
     | 
| 
      
 66 
     | 
    
         
            +
              bookmark = Random.rand(1000000000)
         
     | 
| 
      
 67 
     | 
    
         
            +
              <<~TOC
         
     | 
| 
      
 68 
     | 
    
         
            +
                    <p class="MsoToc#{toclevel}"><span class="MsoHyperlink"><span
         
     | 
| 
      
 69 
     | 
    
         
            +
                    lang="EN-GB" style='mso-no-proof:yes'>
         
     | 
| 
      
 70 
     | 
    
         
            +
                    <a href="#_Toc#{bookmark}">#{heading}<span lang="EN-GB"
         
     | 
| 
      
 71 
     | 
    
         
            +
                    class="MsoTocTextSpan">
         
     | 
| 
      
 72 
     | 
    
         
            +
                    <span style='mso-tab-count:1 dotted'>. </span>
         
     | 
| 
      
 73 
     | 
    
         
            +
                    </span><span lang="EN-GB" class="MsoTocTextSpan">
         
     | 
| 
      
 74 
     | 
    
         
            +
                    <span style='mso-element:field-begin'></span></span>
         
     | 
| 
      
 75 
     | 
    
         
            +
                    <span lang="EN-GB"
         
     | 
| 
      
 76 
     | 
    
         
            +
                    class="MsoTocTextSpan"> PAGEREF _Toc#{bookmark} \\h </span>
         
     | 
| 
      
 77 
     | 
    
         
            +
                      <span lang="EN-GB" class="MsoTocTextSpan"><span
         
     | 
| 
      
 78 
     | 
    
         
            +
                      style='mso-element:field-separator'></span></span><span
         
     | 
| 
      
 79 
     | 
    
         
            +
                      lang="EN-GB" class="MsoTocTextSpan">1</span>
         
     | 
| 
      
 80 
     | 
    
         
            +
                      <span lang="EN-GB"
         
     | 
| 
      
 81 
     | 
    
         
            +
                      class="MsoTocTextSpan"></span><span
         
     | 
| 
      
 82 
     | 
    
         
            +
                      lang="EN-GB" class="MsoTocTextSpan"><span
         
     | 
| 
      
 83 
     | 
    
         
            +
                      style='mso-element:field-end'></span></span></a></span></span></p>
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
              TOC
         
     | 
| 
      
 86 
     | 
    
         
            +
            end
         
     | 
| 
      
 87 
     | 
    
         
            +
             
     | 
| 
      
 88 
     | 
    
         
            +
            WORD_TOC_PREFACE1 = <<~TOC.freeze
         
     | 
| 
      
 89 
     | 
    
         
            +
                  <span lang="EN-GB"><span
         
     | 
| 
      
 90 
     | 
    
         
            +
                    style='mso-element:field-begin'></span><span
         
     | 
| 
      
 91 
     | 
    
         
            +
                    style='mso-spacerun:yes'> </span>TOC
         
     | 
| 
      
 92 
     | 
    
         
            +
                    \\o "1-2" \\h \\z \\u <span
         
     | 
| 
      
 93 
     | 
    
         
            +
                    style='mso-element:field-separator'></span></span>
         
     | 
| 
      
 94 
     | 
    
         
            +
            TOC
         
     | 
| 
      
 95 
     | 
    
         
            +
             
     | 
| 
      
 96 
     | 
    
         
            +
            WORD_TOC_SUFFIX1 = <<~TOC.freeze
         
     | 
| 
      
 97 
     | 
    
         
            +
                  <p class="MsoToc1"><span lang="EN-GB"><span
         
     | 
| 
      
 98 
     | 
    
         
            +
                    style='mso-element:field-end'></span></span><span
         
     | 
| 
      
 99 
     | 
    
         
            +
                    lang="EN-GB"><o:p> </o:p></span></p>
         
     | 
| 
      
 100 
     | 
    
         
            +
            TOC
         
     | 
| 
      
 101 
     | 
    
         
            +
             
     | 
| 
      
 102 
     | 
    
         
            +
            def make_WordToC(docxml)
         
     | 
| 
      
 103 
     | 
    
         
            +
              toc = ""
         
     | 
| 
      
 104 
     | 
    
         
            +
              docxml.xpath("//h1 | //h2[not(ancestor::*[@class = 'Section3'])]").
         
     | 
| 
      
 105 
     | 
    
         
            +
                each do |h|
         
     | 
| 
      
 106 
     | 
    
         
            +
                toc += word_toc_entry(h.name == "h1" ? 1 : 2, header_strip(h))
         
     | 
| 
      
 107 
     | 
    
         
            +
              end
         
     | 
| 
      
 108 
     | 
    
         
            +
              toc.sub(/(<p class="MsoToc1">)/,
         
     | 
| 
      
 109 
     | 
    
         
            +
                      %{\\1#{WORD_TOC_PREFACE1}}) +  WORD_TOC_SUFFIX1
         
     | 
| 
      
 110 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -1,12 +1,21 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            def make_body2(body, docxml)
         
     | 
| 
      
 2 
     | 
    
         
            +
              body.div **{ class: "WordSection2" } do |div2|
         
     | 
| 
      
 3 
     | 
    
         
            +
                info docxml, div2
         
     | 
| 
      
 4 
     | 
    
         
            +
                foreword docxml, div2
         
     | 
| 
      
 5 
     | 
    
         
            +
                introduction docxml, div2
         
     | 
| 
      
 6 
     | 
    
         
            +
                div2.p { |p| p << " " } # placeholder
         
     | 
| 
      
 7 
     | 
    
         
            +
              end
         
     | 
| 
      
 8 
     | 
    
         
            +
              section_break(body)
         
     | 
| 
      
 9 
     | 
    
         
            +
            end
         
     | 
| 
       1 
10 
     | 
    
         | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
      
 11 
     | 
    
         
            +
            def make_body3(body, docxml)
         
     | 
| 
      
 12 
     | 
    
         
            +
              body.div **{ class: "WordSection3" } do |div3|
         
     | 
| 
      
 13 
     | 
    
         
            +
                middle docxml, div3
         
     | 
| 
      
 14 
     | 
    
         
            +
                footnotes div3
         
     | 
| 
      
 15 
     | 
    
         
            +
                comments div3
         
     | 
| 
      
 16 
     | 
    
         
            +
              end
         
     | 
| 
      
 17 
     | 
    
         
            +
            end
         
     | 
| 
       4 
18 
     | 
    
         | 
| 
       5 
     | 
    
         
            -
            #module IsoDoc
         
     | 
| 
       6 
     | 
    
         
            -
            #class WordConvert < Convert
         
     | 
| 
       7 
     | 
    
         
            -
            #module WordConvertModule
         
     | 
| 
       8 
     | 
    
         
            -
            #def self.included base 
         
     | 
| 
       9 
     | 
    
         
            -
            #base.class_eval do
         
     | 
| 
       10 
19 
     | 
    
         
             
            def insert_tab(out, n)
         
     | 
| 
       11 
20 
     | 
    
         
             
              out.span **attr_code(style: "mso-tab-count:#{n}") do |span|
         
     | 
| 
       12 
21 
     | 
    
         
             
                [1..n].each { span << "  " }
         
     | 
| 
         @@ -32,7 +41,6 @@ def remove_bottom_border(td) 
     | 
|
| 
       32 
41 
     | 
    
         
             
                gsub(/mso-border-bottom-alt:[^;]+;/, "mso-border-bottom-alt:0pt;")
         
     | 
| 
       33 
42 
     | 
    
         
             
            end
         
     | 
| 
       34 
43 
     | 
    
         | 
| 
       35 
     | 
    
         
            -
            #SW1 = IsoDoc::SW
         
     | 
| 
       36 
44 
     | 
    
         
             
            SW1 = "solid windowtext".freeze
         
     | 
| 
       37 
45 
     | 
    
         | 
| 
       38 
46 
     | 
    
         
             
            def new_fullcolspan_row(t, tfoot)
         
     | 
| 
         @@ -65,10 +73,8 @@ def section_break(body) 
     | 
|
| 
       65 
73 
     | 
    
         
             
            end
         
     | 
| 
       66 
74 
     | 
    
         | 
| 
       67 
75 
     | 
    
         
             
            def page_break(out)
         
     | 
| 
       68 
     | 
    
         
            -
              out.br **{
         
     | 
| 
       69 
     | 
    
         
            -
             
     | 
| 
       70 
     | 
    
         
            -
                style: "mso-special-character:line-break;page-break-before:always",
         
     | 
| 
       71 
     | 
    
         
            -
              }
         
     | 
| 
      
 76 
     | 
    
         
            +
              out.br **{ clear: "all",
         
     | 
| 
      
 77 
     | 
    
         
            +
                         style: "mso-special-character:line-break;page-break-before:always" }
         
     | 
| 
       72 
78 
     | 
    
         
             
            end
         
     | 
| 
       73 
79 
     | 
    
         | 
| 
       74 
80 
     | 
    
         
             
            WORD_DT_ATTRS = {class: @note ? "Note" : nil, align: "left",
         
     | 
| 
         @@ -131,121 +137,3 @@ def figure_aside_process(f, aside, key) 
     | 
|
| 
       131 
137 
     | 
    
         
             
                a.parent = dd
         
     | 
| 
       132 
138 
     | 
    
         
             
              end
         
     | 
| 
       133 
139 
     | 
    
         
             
            end
         
     | 
| 
       134 
     | 
    
         
            -
             
     | 
| 
       135 
     | 
    
         
            -
            def postprocess(result, filename, dir)
         
     | 
| 
       136 
     | 
    
         
            -
              generate_header(filename, dir)
         
     | 
| 
       137 
     | 
    
         
            -
              result = from_xhtml(cleanup(to_xhtml(result)))
         
     | 
| 
       138 
     | 
    
         
            -
              toWord(result, filename, dir)
         
     | 
| 
       139 
     | 
    
         
            -
              @files_to_delete.each { |f| system "rm #{f}" }
         
     | 
| 
       140 
     | 
    
         
            -
            end
         
     | 
| 
       141 
     | 
    
         
            -
             
     | 
| 
       142 
     | 
    
         
            -
            def toWord(result, filename, dir)
         
     | 
| 
       143 
     | 
    
         
            -
              result = populate_template(result, :word)
         
     | 
| 
       144 
     | 
    
         
            -
              result = from_xhtml(word_cleanup(to_xhtml(result)))
         
     | 
| 
       145 
     | 
    
         
            -
              Html2Doc.process(result, filename: filename, stylesheet: @wordstylesheet,
         
     | 
| 
       146 
     | 
    
         
            -
                               header_file: "header.html", dir: dir,
         
     | 
| 
       147 
     | 
    
         
            -
                               asciimathdelims: [@openmathdelim, @closemathdelim],
         
     | 
| 
       148 
     | 
    
         
            -
                               liststyles: { ul: @ulstyle, ol: @olstyle })
         
     | 
| 
       149 
     | 
    
         
            -
            end
         
     | 
| 
       150 
     | 
    
         
            -
             
     | 
| 
       151 
     | 
    
         
            -
            def word_cleanup(docxml)
         
     | 
| 
       152 
     | 
    
         
            -
              word_preface(docxml)
         
     | 
| 
       153 
     | 
    
         
            -
              word_annex_cleanup(docxml)
         
     | 
| 
       154 
     | 
    
         
            -
              docxml
         
     | 
| 
       155 
     | 
    
         
            -
            end
         
     | 
| 
       156 
     | 
    
         
            -
             
     | 
| 
       157 
     | 
    
         
            -
            # force Annex h2 to be p.h2Annex, so it is not picked up by ToC
         
     | 
| 
       158 
     | 
    
         
            -
            def word_annex_cleanup(docxml)
         
     | 
| 
       159 
     | 
    
         
            -
              docxml.xpath("//h2[ancestor::*[@class = 'Section3']]").each do |h2|
         
     | 
| 
       160 
     | 
    
         
            -
                h2.name = "p"
         
     | 
| 
       161 
     | 
    
         
            -
                h2["class"] = "h2Annex"
         
     | 
| 
       162 
     | 
    
         
            -
              end
         
     | 
| 
       163 
     | 
    
         
            -
            end
         
     | 
| 
       164 
     | 
    
         
            -
             
     | 
| 
       165 
     | 
    
         
            -
            def word_preface(docxml)
         
     | 
| 
       166 
     | 
    
         
            -
              word_cover(docxml) if @wordcoverpage
         
     | 
| 
       167 
     | 
    
         
            -
              word_intro(docxml) if @wordintropage
         
     | 
| 
       168 
     | 
    
         
            -
            end
         
     | 
| 
       169 
     | 
    
         
            -
             
     | 
| 
       170 
     | 
    
         
            -
            def word_cover(docxml)
         
     | 
| 
       171 
     | 
    
         
            -
              cover = File.read(@wordcoverpage, encoding: "UTF-8")
         
     | 
| 
       172 
     | 
    
         
            -
              cover = populate_template(cover, :word)
         
     | 
| 
       173 
     | 
    
         
            -
              coverxml = to_xhtml_fragment(cover)
         
     | 
| 
       174 
     | 
    
         
            -
              docxml.at('//div[@class="WordSection1"]').children.first.previous =
         
     | 
| 
       175 
     | 
    
         
            -
                coverxml.to_xml(encoding: "US-ASCII")
         
     | 
| 
       176 
     | 
    
         
            -
            end
         
     | 
| 
       177 
     | 
    
         
            -
             
     | 
| 
       178 
     | 
    
         
            -
            def word_intro(docxml)
         
     | 
| 
       179 
     | 
    
         
            -
              intro = File.read(@wordintropage, encoding: "UTF-8").
         
     | 
| 
       180 
     | 
    
         
            -
                                        sub(/WORDTOC/, make_WordToC(docxml))
         
     | 
| 
       181 
     | 
    
         
            -
              intro = populate_template(intro, :word)
         
     | 
| 
       182 
     | 
    
         
            -
              introxml = to_xhtml_fragment(intro)
         
     | 
| 
       183 
     | 
    
         
            -
              docxml.at('//div[@class="WordSection2"]').children.first.previous =
         
     | 
| 
       184 
     | 
    
         
            -
                introxml.to_xml(encoding: "US-ASCII")
         
     | 
| 
       185 
     | 
    
         
            -
            end
         
     | 
| 
       186 
     | 
    
         
            -
             
     | 
| 
       187 
     | 
    
         
            -
            def generate_header(filename, _dir)
         
     | 
| 
       188 
     | 
    
         
            -
              return unless @header
         
     | 
| 
       189 
     | 
    
         
            -
              template = Liquid::Template.parse(File.read(@header, encoding: "UTF-8"))
         
     | 
| 
       190 
     | 
    
         
            -
              meta = get_metadata
         
     | 
| 
       191 
     | 
    
         
            -
              meta[:filename] = filename
         
     | 
| 
       192 
     | 
    
         
            -
              params = meta.map { |k, v| [k.to_s, v] }.to_h
         
     | 
| 
       193 
     | 
    
         
            -
              File.open("header.html", "w") do |f|
         
     | 
| 
       194 
     | 
    
         
            -
                f.write(template.render(params))
         
     | 
| 
       195 
     | 
    
         
            -
              end
         
     | 
| 
       196 
     | 
    
         
            -
              @files_to_delete << "header.html"
         
     | 
| 
       197 
     | 
    
         
            -
            end
         
     | 
| 
       198 
     | 
    
         
            -
             
     | 
| 
       199 
     | 
    
         
            -
            def word_toc_entry(toclevel, heading)
         
     | 
| 
       200 
     | 
    
         
            -
              bookmark = Random.rand(1000000000)
         
     | 
| 
       201 
     | 
    
         
            -
              <<~TOC
         
     | 
| 
       202 
     | 
    
         
            -
                    <p class="MsoToc#{toclevel}"><span class="MsoHyperlink"><span
         
     | 
| 
       203 
     | 
    
         
            -
                    lang="EN-GB" style='mso-no-proof:yes'>
         
     | 
| 
       204 
     | 
    
         
            -
                    <a href="#_Toc#{bookmark}">#{heading}<span lang="EN-GB"
         
     | 
| 
       205 
     | 
    
         
            -
                    class="MsoTocTextSpan">
         
     | 
| 
       206 
     | 
    
         
            -
                    <span style='mso-tab-count:1 dotted'>. </span>
         
     | 
| 
       207 
     | 
    
         
            -
                    </span><span lang="EN-GB" class="MsoTocTextSpan">
         
     | 
| 
       208 
     | 
    
         
            -
                    <span style='mso-element:field-begin'></span></span>
         
     | 
| 
       209 
     | 
    
         
            -
                    <span lang="EN-GB"
         
     | 
| 
       210 
     | 
    
         
            -
                    class="MsoTocTextSpan"> PAGEREF _Toc#{bookmark} \\h </span>
         
     | 
| 
       211 
     | 
    
         
            -
                      <span lang="EN-GB" class="MsoTocTextSpan"><span
         
     | 
| 
       212 
     | 
    
         
            -
                      style='mso-element:field-separator'></span></span><span
         
     | 
| 
       213 
     | 
    
         
            -
                      lang="EN-GB" class="MsoTocTextSpan">1</span>
         
     | 
| 
       214 
     | 
    
         
            -
                      <span lang="EN-GB"
         
     | 
| 
       215 
     | 
    
         
            -
                      class="MsoTocTextSpan"></span><span
         
     | 
| 
       216 
     | 
    
         
            -
                      lang="EN-GB" class="MsoTocTextSpan"><span
         
     | 
| 
       217 
     | 
    
         
            -
                      style='mso-element:field-end'></span></span></a></span></span></p>
         
     | 
| 
       218 
     | 
    
         
            -
             
     | 
| 
       219 
     | 
    
         
            -
              TOC
         
     | 
| 
       220 
     | 
    
         
            -
            end
         
     | 
| 
       221 
     | 
    
         
            -
             
     | 
| 
       222 
     | 
    
         
            -
            #WORD_TOC_PREFACE = <<~TOC.freeze
         
     | 
| 
       223 
     | 
    
         
            -
            WORD_TOC_PREFACE1 = <<~TOC.freeze
         
     | 
| 
       224 
     | 
    
         
            -
                  <span lang="EN-GB"><span
         
     | 
| 
       225 
     | 
    
         
            -
                    style='mso-element:field-begin'></span><span
         
     | 
| 
       226 
     | 
    
         
            -
                    style='mso-spacerun:yes'> </span>TOC
         
     | 
| 
       227 
     | 
    
         
            -
                    \\o "1-2" \\h \\z \\u <span
         
     | 
| 
       228 
     | 
    
         
            -
                    style='mso-element:field-separator'></span></span>
         
     | 
| 
       229 
     | 
    
         
            -
            TOC
         
     | 
| 
       230 
     | 
    
         
            -
             
     | 
| 
       231 
     | 
    
         
            -
            #WORD_TOC_SUFFIX = <<~TOC.freeze
         
     | 
| 
       232 
     | 
    
         
            -
            WORD_TOC_SUFFIX1 = <<~TOC.freeze
         
     | 
| 
       233 
     | 
    
         
            -
                  <p class="MsoToc1"><span lang="EN-GB"><span
         
     | 
| 
       234 
     | 
    
         
            -
                    style='mso-element:field-end'></span></span><span
         
     | 
| 
       235 
     | 
    
         
            -
                    lang="EN-GB"><o:p> </o:p></span></p>
         
     | 
| 
       236 
     | 
    
         
            -
            TOC
         
     | 
| 
       237 
     | 
    
         
            -
             
     | 
| 
       238 
     | 
    
         
            -
            def make_WordToC(docxml)
         
     | 
| 
       239 
     | 
    
         
            -
              toc = ""
         
     | 
| 
       240 
     | 
    
         
            -
              docxml.xpath("//h1 | //h2[not(ancestor::*[@class = 'Section3'])]").
         
     | 
| 
       241 
     | 
    
         
            -
                each do |h|
         
     | 
| 
       242 
     | 
    
         
            -
                toc += word_toc_entry(h.name == "h1" ? 1 : 2, header_strip(h))
         
     | 
| 
       243 
     | 
    
         
            -
              end
         
     | 
| 
       244 
     | 
    
         
            -
              toc.sub(/(<p class="MsoToc1">)/,
         
     | 
| 
       245 
     | 
    
         
            -
                      #%{\\1#{WORD_TOC_PREFACE}}) + WORD_TOC_SUFFIX
         
     | 
| 
       246 
     | 
    
         
            -
                      %{\\1#{WORD_TOC_PREFACE1}}) +  WORD_TOC_SUFFIX1
         
     | 
| 
       247 
     | 
    
         
            -
            end
         
     | 
| 
       248 
     | 
    
         
            -
            #end
         
     | 
| 
       249 
     | 
    
         
            -
            #end
         
     | 
| 
       250 
     | 
    
         
            -
            #end
         
     | 
| 
       251 
     | 
    
         
            -
            #end
         
     |