nora_mark 0.2beta7 → 0.2beta8
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/.travis.yml +1 -1
 - data/README.md +149 -73
 - data/Rakefile +1 -3
 - data/bin/nora2html +1 -1
 - data/emacs-mode/noramark-mode.el +497 -0
 - data/example/koujin.nora +13 -0
 - data/example/nora-simple.css +27 -2
 - data/example/noramark-reference-ja.nora +446 -64
 - data/example/noramark-reference-ja_00001.xhtml +485 -85
 - data/lib/nora_mark.rb +5 -67
 - data/lib/nora_mark/document.rb +89 -0
 - data/lib/nora_mark/extensions.rb +26 -0
 - data/lib/nora_mark/html/context.rb +2 -3
 - data/lib/nora_mark/html/default_transformer.rb +151 -0
 - data/lib/nora_mark/html/generator.rb +25 -149
 - data/lib/nora_mark/html/paragraph_writer.rb +4 -4
 - data/lib/nora_mark/html/tag_writer.rb +13 -10
 - data/lib/nora_mark/node.rb +196 -72
 - data/lib/nora_mark/node_set.rb +13 -0
 - data/lib/nora_mark/node_util.rb +29 -16
 - data/lib/nora_mark/parser.kpeg +210 -74
 - data/lib/nora_mark/parser.kpeg.rb +1353 -401
 - data/lib/nora_mark/parser.rb +1 -1
 - data/lib/nora_mark/transformer.rb +35 -10
 - data/lib/nora_mark/version.rb +1 -1
 - data/nora_mark.gemspec +3 -2
 - data/spec/node_spec.rb +280 -0
 - data/spec/nora_mark_spec.rb +1189 -1025
 - data/spec/spec_helper.rb +2 -0
 - data/spec/transformer_spec.rb +37 -0
 - metadata +27 -6
 - data/lib/nora_mark/html/writer_selector.rb +0 -24
 - data/lib/nora_mark/node_builder.rb +0 -18
 
    
        data/lib/nora_mark/node_set.rb
    CHANGED
    
    | 
         @@ -2,6 +2,7 @@ module NoraMark 
     | 
|
| 
       2 
2 
     | 
    
         
             
              class NodeSet
         
     | 
| 
       3 
3 
     | 
    
         
             
                include Enumerable
         
     | 
| 
       4 
4 
     | 
    
         
             
                def initialize(list = [])
         
     | 
| 
      
 5 
     | 
    
         
            +
                  list = list.to_ary if list.is_a? NodeSet
         
     | 
| 
       5 
6 
     | 
    
         
             
                  @list = list
         
     | 
| 
       6 
7 
     | 
    
         
             
                end
         
     | 
| 
       7 
8 
     | 
    
         | 
| 
         @@ -20,5 +21,17 @@ module NoraMark 
     | 
|
| 
       20 
21 
     | 
    
         
             
                def to_ary
         
     | 
| 
       21 
22 
     | 
    
         
             
                  @list.dup
         
     | 
| 
       22 
23 
     | 
    
         
             
                end
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                def first
         
     | 
| 
      
 26 
     | 
    
         
            +
                  @list.first
         
     | 
| 
      
 27 
     | 
    
         
            +
                end
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                def last
         
     | 
| 
      
 30 
     | 
    
         
            +
                  @list.last
         
     | 
| 
      
 31 
     | 
    
         
            +
                end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                def text
         
     | 
| 
      
 34 
     | 
    
         
            +
                  @list.inject('') {|r,n| r << n.text }
         
     | 
| 
      
 35 
     | 
    
         
            +
                end
         
     | 
| 
       23 
36 
     | 
    
         
             
              end
         
     | 
| 
       24 
37 
     | 
    
         
             
            end
         
     | 
    
        data/lib/nora_mark/node_util.rb
    CHANGED
    
    | 
         @@ -1,6 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module NoraMark
         
     | 
| 
       2 
2 
     | 
    
         
             
              module NodeUtil
         
     | 
| 
       3 
     | 
    
         
            -
                def _node(klass, name,  
     | 
| 
      
 3 
     | 
    
         
            +
                def _node(klass, name, children_ = nil, ids: [], children: nil, classes: [], params: [], n: {}, attrs: [], template: nil, class_if_empty: nil, line_no: nil, body_empty: nil, raw_text: nil)
         
     | 
| 
       4 
4 
     | 
    
         
             
                  children_arg = children || children_
         
     | 
| 
       5 
5 
     | 
    
         
             
                  if !children_arg.nil?
         
     | 
| 
       6 
6 
     | 
    
         
             
                    children_arg = children_arg.to_ary if children_arg.kind_of? NodeSet
         
     | 
| 
         @@ -8,31 +8,44 @@ module NoraMark 
     | 
|
| 
       8 
8 
     | 
    
         
             
                    children_arg = children_arg.map { |node| (node.is_a? String) ? Text.new(node, 0) : node }
         
     | 
| 
       9 
9 
     | 
    
         
             
                  end
         
     | 
| 
       10 
10 
     | 
    
         
             
                  if !template.nil?
         
     | 
| 
       11 
     | 
    
         
            -
                    node = klass.new(name, template.ids, template.classes, template. 
     | 
| 
       12 
     | 
    
         
            -
                    node.ids = (node.ids ||[] + ids) if  
     | 
| 
       13 
     | 
    
         
            -
                    node.classes = (node.classes || []) 
     | 
| 
       14 
     | 
    
         
            -
                    node. 
     | 
| 
       15 
     | 
    
         
            -
                    node. 
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
      
 11 
     | 
    
         
            +
                    node = klass.new(name, template.ids, template.classes, template.params, template.n, template.children, template.line_no)
         
     | 
| 
      
 12 
     | 
    
         
            +
                    node.ids = (node.ids ||[] + ids) if ids.size > 0
         
     | 
| 
      
 13 
     | 
    
         
            +
                    node.classes = (node.classes || [])
         
     | 
| 
      
 14 
     | 
    
         
            +
                    node.classes = node.classes +  classes
         
     | 
| 
      
 15 
     | 
    
         
            +
                    if node.classes.size == 0 && class_if_empty
         
     | 
| 
      
 16 
     | 
    
         
            +
                      node.classes << class_if_empty
         
     | 
| 
      
 17 
     | 
    
         
            +
                    end
         
     | 
| 
      
 18 
     | 
    
         
            +
                    node.params = params if params.size > 0
         
     | 
| 
      
 19 
     | 
    
         
            +
                    node.n = n if n.size > 0
         
     | 
| 
      
 20 
     | 
    
         
            +
                    node.children = children_arg if !children_arg.nil?
         
     | 
| 
      
 21 
     | 
    
         
            +
                    node.attrs = template.attrs || attrs || {}
         
     | 
| 
       17 
22 
     | 
    
         
             
                  else
         
     | 
| 
       18 
     | 
    
         
            -
                    node = klass.new(name, ids, classes,  
     | 
| 
       19 
     | 
    
         
            -
                    node. 
     | 
| 
      
 23 
     | 
    
         
            +
                    node = klass.new(name, ids, classes || [], params, n, children_arg, 0)
         
     | 
| 
      
 24 
     | 
    
         
            +
                    node.attrs = attrs || {}
         
     | 
| 
      
 25 
     | 
    
         
            +
                    if node.classes.size == 0 && class_if_empty
         
     | 
| 
      
 26 
     | 
    
         
            +
                      node.classes << class_if_empty
         
     | 
| 
      
 27 
     | 
    
         
            +
                    end
         
     | 
| 
       20 
28 
     | 
    
         
             
                  end
         
     | 
| 
      
 29 
     | 
    
         
            +
                  node.line_no = line_no
         
     | 
| 
      
 30 
     | 
    
         
            +
                  node.body_empty = body_empty
         
     | 
| 
      
 31 
     | 
    
         
            +
                  node.raw_text = raw_text
         
     | 
| 
      
 32 
     | 
    
         
            +
                  node.reparent
         
     | 
| 
       21 
33 
     | 
    
         
             
                  node
         
     | 
| 
       22 
34 
     | 
    
         
             
                end
         
     | 
| 
       23 
35 
     | 
    
         | 
| 
       24 
     | 
    
         
            -
                def block( 
     | 
| 
       25 
     | 
    
         
            -
                  _node(Block,  
     | 
| 
      
 36 
     | 
    
         
            +
                def block(*args)
         
     | 
| 
      
 37 
     | 
    
         
            +
                  _node(Block, *args)
         
     | 
| 
       26 
38 
     | 
    
         
             
                end
         
     | 
| 
       27 
39 
     | 
    
         | 
| 
       28 
     | 
    
         
            -
                def  
     | 
| 
       29 
     | 
    
         
            -
                   
     | 
| 
      
 40 
     | 
    
         
            +
                def inline(*args)
         
     | 
| 
      
 41 
     | 
    
         
            +
                  _node(Inline, *args)
         
     | 
| 
       30 
42 
     | 
    
         
             
                end
         
     | 
| 
       31 
43 
     | 
    
         | 
| 
       32 
     | 
    
         
            -
                def  
     | 
| 
       33 
     | 
    
         
            -
                   
     | 
| 
      
 44 
     | 
    
         
            +
                def text value, raw_text: nil
         
     | 
| 
      
 45 
     | 
    
         
            +
                  text = Text.new(value, 0)
         
     | 
| 
      
 46 
     | 
    
         
            +
                  text.raw_text = raw_text
         
     | 
| 
      
 47 
     | 
    
         
            +
                  text
         
     | 
| 
       34 
48 
     | 
    
         
             
                end
         
     | 
| 
       35 
49 
     | 
    
         | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
50 
     | 
    
         
             
              end
         
     | 
| 
       38 
51 
     | 
    
         
             
            end
         
     | 
    
        data/lib/nora_mark/parser.kpeg
    CHANGED
    
    | 
         @@ -1,24 +1,28 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            %% name = NoraMark::Parser
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
      
 2 
     | 
    
         
            +
            %%  {
         
     | 
| 
      
 3 
     | 
    
         
            +
               PARAMETER_END = /[,)]/
         
     | 
| 
      
 4 
     | 
    
         
            +
            }
         
     | 
| 
       3 
5 
     | 
    
         
             
            %% ast-location = ::NoraMark
         
     | 
| 
       4 
6 
     | 
    
         
             
            %% text = ast Text(content, line_no)
         
     | 
| 
       5 
     | 
    
         
            -
            %%  
     | 
| 
       6 
     | 
    
         
            -
            %%  
     | 
| 
      
 7 
     | 
    
         
            +
            %% code_inline = ast CodeInline(ids, classes, params, named_params, content, line_no)
         
     | 
| 
      
 8 
     | 
    
         
            +
            %% paragraph = ast Paragraph(ids, classes, params, named_params, raw_content, line_no)
         
     | 
| 
      
 9 
     | 
    
         
            +
            %% paragraph_group = ast ParagraphGroup(ids, classes, params,named_params,  raw_content, line_no)
         
     | 
| 
       7 
10 
     | 
    
         
             
            %% br = ast Breakline(line_no)
         
     | 
| 
       8 
     | 
    
         
            -
            %% block = ast Block(name, ids, classes,  
     | 
| 
       9 
     | 
    
         
            -
            %% newpage = ast Newpage(ids, classes,  
     | 
| 
       10 
     | 
    
         
            -
            %% inline = ast Inline(name, ids, classes,  
     | 
| 
       11 
     | 
    
         
            -
            %% ul_item = ast UlItem(ids, classes,  
     | 
| 
       12 
     | 
    
         
            -
            %% unordered_list = ast UnorderedList(ids, classes,  
     | 
| 
       13 
     | 
    
         
            -
            %% ol_item = ast OlItem(ids, classes,  
     | 
| 
       14 
     | 
    
         
            -
            %% ordered_list = ast OrderedList(ids, classes,  
     | 
| 
       15 
     | 
    
         
            -
            %% dl_item = ast DLItem(ids, classes,  
     | 
| 
       16 
     | 
    
         
            -
            %% definition_list = ast DefinitionList(ids, classes,  
     | 
| 
       17 
     | 
    
         
            -
            %% preformatted_block = ast PreformattedBlock(name, ids, classes,  
     | 
| 
      
 11 
     | 
    
         
            +
            %% block = ast Block(name, ids, classes, params, named_params,  raw_content, line_no)
         
     | 
| 
      
 12 
     | 
    
         
            +
            %% newpage = ast Newpage(ids, classes, params, named_params,  raw_content, line_no)
         
     | 
| 
      
 13 
     | 
    
         
            +
            %% inline = ast Inline(name, ids, classes, params, named_params,  raw_content, line_no)
         
     | 
| 
      
 14 
     | 
    
         
            +
            %% ul_item = ast UlItem(ids, classes, params, named_params,  raw_content, line_no)
         
     | 
| 
      
 15 
     | 
    
         
            +
            %% unordered_list = ast UnorderedList(ids, classes, params, named_params,  raw_content, line_no)
         
     | 
| 
      
 16 
     | 
    
         
            +
            %% ol_item = ast OlItem(ids, classes, params, named_params,  raw_content, line_no)
         
     | 
| 
      
 17 
     | 
    
         
            +
            %% ordered_list = ast OrderedList(ids, classes, params,named_params,  raw_content, line_no)
         
     | 
| 
      
 18 
     | 
    
         
            +
            %% dl_item = ast DLItem(ids, classes, params, named_params, raw_content, line_no)
         
     | 
| 
      
 19 
     | 
    
         
            +
            %% definition_list = ast DefinitionList(ids, classes, params, named_params, raw_content, line_no)
         
     | 
| 
      
 20 
     | 
    
         
            +
            %% preformatted_block = ast PreformattedBlock(name, ids, classes, params, named_params, codelanguage, content, line_no)
         
     | 
| 
       18 
21 
     | 
    
         
             
            %% frontmatter = ast Frontmatter(content, line_no)
         
     | 
| 
       19 
     | 
    
         
            -
            %% h_section = ast HeadedSection(level, heading,  
     | 
| 
       20 
     | 
    
         
            -
            %% page = ast Page( 
     | 
| 
       21 
     | 
    
         
            -
            %% root = ast Root( 
     | 
| 
      
 22 
     | 
    
         
            +
            %% h_section = ast HeadedSection(level, heading, params, named_params, raw_content, line_no)
         
     | 
| 
      
 23 
     | 
    
         
            +
            %% page = ast Page(raw_content, line_no)
         
     | 
| 
      
 24 
     | 
    
         
            +
            %% root = ast Root(raw_content)
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
       22 
26 
     | 
    
         | 
| 
       23 
27 
     | 
    
         
             
            # line number 
         
     | 
| 
       24 
28 
     | 
    
         
             
            ln = { current_line }
         
     | 
| 
         @@ -27,14 +31,14 @@ ln = { current_line } 
     | 
|
| 
       27 
31 
     | 
    
         
             
            BOM = /\uFEFF/
         
     | 
| 
       28 
32 
     | 
    
         
             
            Eof = !. 
         
     | 
| 
       29 
33 
     | 
    
         
             
            Space = ' ' | '\t' 
         
     | 
| 
       30 
     | 
    
         
            -
            EofComment = Space* "#" (!Eof .)* 
         
     | 
| 
       31 
     | 
    
         
            -
            Comment =   Space* "#" (!Nl .)* Nl EmptyLine*
         
     | 
| 
       32 
34 
     | 
    
         
             
            - =  Space* 
         
     | 
| 
      
 35 
     | 
    
         
            +
            EofComment = - "//" (!Eof .)* 
         
     | 
| 
      
 36 
     | 
    
         
            +
            Comment =   - "//" (!Nl .)* Nl EmptyLine*
         
     | 
| 
       33 
37 
     | 
    
         
             
            EmptyLine = /^/ - (Nl | Comment | EofComment)
         
     | 
| 
       34 
38 
     | 
    
         | 
| 
       35 
39 
     | 
    
         
             
            Nl = /\r?\n/
         
     | 
| 
       36 
40 
     | 
    
         
             
            Le = Nl | Eof
         
     | 
| 
       37 
     | 
    
         
            -
            Word  = < /[\ 
     | 
| 
      
 41 
     | 
    
         
            +
            Word  = < /[\w]/ ( '-' | /[\w]/ )* >  { text }
         
     | 
| 
       38 
42 
     | 
    
         
             
            Num = < [0-9]+ > { text.to_i }
         
     | 
| 
       39 
43 
     | 
    
         | 
| 
       40 
44 
     | 
    
         
             
            #common syntax
         
     | 
| 
         @@ -43,10 +47,11 @@ ClassNames = (ClassName)*:classnames { classnames } 
     | 
|
| 
       43 
47 
     | 
    
         
             
            IdName = '#' Word:idname { idname }
         
     | 
| 
       44 
48 
     | 
    
         
             
            IdNames = (IdName)*:idnames { idnames }
         
     | 
| 
       45 
49 
     | 
    
         | 
| 
       46 
     | 
    
         
            -
            CommandName = Word:name IdNames?:idnames ClassNames?:classes ln:ln 
     | 
| 
       47 
     | 
    
         
            -
             
     | 
| 
       48 
     | 
    
         
            -
             
     | 
| 
       49 
     | 
    
         
            -
             
     | 
| 
      
 50 
     | 
    
         
            +
            CommandName = Word:name IdNames?:idnames ClassNames?:classes ln:ln
         
     | 
| 
      
 51 
     | 
    
         
            +
                        { {name: name, ids: idnames, classes: classes, ln:ln } }
         
     | 
| 
      
 52 
     | 
    
         
            +
            ParameterNormal = DocumentContentExcept(PARAMETER_END):content { content }
         
     | 
| 
      
 53 
     | 
    
         
            +
            ParameterQuoted = '"' DocumentContentExcept('"'):content '"' - &/[,)]/  { content }
         
     | 
| 
      
 54 
     | 
    
         
            +
            ParameterSingleQuoted = "'" DocumentContentExcept("'"):content "'" - &/[,)]/ { content }
         
     | 
| 
       50 
55 
     | 
    
         
             
            Parameter = (ParameterQuoted
         
     | 
| 
       51 
56 
     | 
    
         
             
                       | ParameterSingleQuoted
         
     | 
| 
       52 
57 
     | 
    
         
             
                       | ParameterNormal ):value { value }
         
     | 
| 
         @@ -65,79 +70,163 @@ NamedParameter = Word:key - ':' - NParameter:parameter { { key.to_sym => paramet 
     | 
|
| 
       65 
70 
     | 
    
         
             
            NamedParameters = NamedParameter:parameter - ',' - NamedParameters:parameters { parameter.merge parameters }
         
     | 
| 
       66 
71 
     | 
    
         
             
                            | NamedParameter:parameter { parameter }
         
     | 
| 
       67 
72 
     | 
    
         | 
| 
       68 
     | 
    
         
            -
            Command = CommandName:cn 
     | 
| 
      
 73 
     | 
    
         
            +
            Command = CommandName:cn
         
     | 
| 
      
 74 
     | 
    
         
            +
                      ('(' - Parameters:args - ')')?
         
     | 
| 
      
 75 
     | 
    
         
            +
                      ('[' - NamedParameters:named_args - ']')?
         
     | 
| 
      
 76 
     | 
    
         
            +
                      { cn.merge({ args: args || [] , named_args: named_args || {}}) }
         
     | 
| 
       69 
77 
     | 
    
         | 
| 
       70 
78 
     | 
    
         
             
            # paragraph
         
     | 
| 
       71 
     | 
    
         
            -
            ImplicitParagraph = 
     | 
| 
      
 79 
     | 
    
         
            +
            ImplicitParagraph = - !ParagraphDelimiter
         
     | 
| 
      
 80 
     | 
    
         
            +
                                  Comment*
         
     | 
| 
      
 81 
     | 
    
         
            +
                                  DocumentLine:content ln:ln
         
     | 
| 
      
 82 
     | 
    
         
            +
                                  Comment* EofComment?
         
     | 
| 
      
 83 
     | 
    
         
            +
                                  ~paragraph([],[], [], {}, content, ln)
         
     | 
| 
       72 
84 
     | 
    
         | 
| 
       73 
85 
     | 
    
         
             
            # explicit paragraph
         
     | 
| 
       74 
86 
     | 
    
         
             
            ExplicitParagraphCommand = Command:c &{ c[:name] == 'p' }
         
     | 
| 
       75 
     | 
    
         
            -
            ExplicitParagraph = - ExplicitParagraphCommand:c ':' - 
     | 
| 
      
 87 
     | 
    
         
            +
            ExplicitParagraph = - ExplicitParagraphCommand:c ':' -
         
     | 
| 
      
 88 
     | 
    
         
            +
                                DocumentContent?:content Le EmptyLine*
         
     | 
| 
      
 89 
     | 
    
         
            +
                                ~paragraph(c[:ids], c[:classes], c[:args], c[:named_args], content, c[:ln])
         
     | 
| 
       76 
90 
     | 
    
         | 
| 
       77 
91 
     | 
    
         
             
            Paragraph = ExplicitParagraph | ImplicitParagraph 
         
     | 
| 
       78 
92 
     | 
    
         | 
| 
       79 
93 
     | 
    
         
             
            # paragraph_group
         
     | 
| 
       80 
     | 
    
         
            -
            ParagraphGroup = ln:ln 
     | 
| 
      
 94 
     | 
    
         
            +
            ParagraphGroup = ln:ln
         
     | 
| 
      
 95 
     | 
    
         
            +
                             Paragraph+:p
         
     | 
| 
      
 96 
     | 
    
         
            +
                             EmptyLine*
         
     | 
| 
      
 97 
     | 
    
         
            +
                             ~paragraph_group([],[],[],{},p, ln)
         
     | 
| 
       81 
98 
     | 
    
         | 
| 
       82 
99 
     | 
    
         
             
            # explicit block 
         
     | 
| 
       83 
100 
     | 
    
         
             
            BlockHead = Command:command - '{' - Nl EmptyLine* { command }
         
     | 
| 
       84 
101 
     | 
    
         
             
            BlockEnd =  - '}' - Le EmptyLine*
         
     | 
| 
       85 
102 
     | 
    
         
             
            BlockBody = (!BlockEnd Block)+:body { body } 
         
     | 
| 
       86 
     | 
    
         
            -
            ExplicitBlock = - 
     | 
| 
      
 103 
     | 
    
         
            +
            ExplicitBlock = - BlockHead:c -
         
     | 
| 
      
 104 
     | 
    
         
            +
                              BlockBody:content -
         
     | 
| 
      
 105 
     | 
    
         
            +
                              BlockEnd
         
     | 
| 
      
 106 
     | 
    
         
            +
                              ~block(c[:name], c[:ids], c[:classes], c[:args], c[:named_args], content,  c[:ln])
         
     | 
| 
       87 
107 
     | 
    
         | 
| 
       88 
108 
     | 
    
         
             
            # preformatted block
         
     | 
| 
       89 
109 
     | 
    
         
             
            PreformattedCommand = Command:command &{ ['pre', 'code'].include? command[:name] }
         
     | 
| 
       90 
     | 
    
         
            -
            PreformattedCommandHeadSimple = 
     | 
| 
       91 
     | 
    
         
            -
             
     | 
| 
       92 
     | 
    
         
            -
             
     | 
| 
      
 110 
     | 
    
         
            +
            PreformattedCommandHeadSimple =
         
     | 
| 
      
 111 
     | 
    
         
            +
                                          PreformattedCommand:command -
         
     | 
| 
      
 112 
     | 
    
         
            +
                                          '{' - Nl
         
     | 
| 
      
 113 
     | 
    
         
            +
                                          { command }
         
     | 
| 
      
 114 
     | 
    
         
            +
            PreformattedCommandHeadComplex =
         
     | 
| 
      
 115 
     | 
    
         
            +
                                           PreformattedCommand:command -
         
     | 
| 
      
 116 
     | 
    
         
            +
                                           '{//' Word?:codelanguage - Nl
         
     | 
| 
      
 117 
     | 
    
         
            +
                                           { command.merge({codelanguage: codelanguage}) }
         
     | 
| 
      
 118 
     | 
    
         
            +
            PreformattedFence = - "```" Word?:codelanguage
         
     | 
| 
      
 119 
     | 
    
         
            +
                              ('(' - Parameters:args - ')')?
         
     | 
| 
      
 120 
     | 
    
         
            +
                              ('[' - NamedParameters:named_args - ']')?  - Nl
         
     | 
| 
      
 121 
     | 
    
         
            +
                              { {codelanguage: codelanguage,
         
     | 
| 
      
 122 
     | 
    
         
            +
                                 args: args || [],
         
     | 
| 
      
 123 
     | 
    
         
            +
                                 named_args: named_args || {} } }
         
     | 
| 
      
 124 
     | 
    
         
            +
             
     | 
| 
      
 125 
     | 
    
         
            +
            PreformattedCommandHead = PreformattedCommandHeadComplex |
         
     | 
| 
      
 126 
     | 
    
         
            +
                                      PreformattedCommandHeadSimple |
         
     | 
| 
      
 127 
     | 
    
         
            +
                                      PreformattedFence
         
     | 
| 
       93 
128 
     | 
    
         
             
            PreformatEndSimple = - '}' - Le EmptyLine*
         
     | 
| 
       94 
129 
     | 
    
         
             
            PreformatEndComplex = - '//}' - Le EmptyLine*
         
     | 
| 
       95 
130 
     | 
    
         | 
| 
       96 
     | 
    
         
            -
            PreformattedBlockSimple = - 
     | 
| 
       97 
     | 
    
         
            -
             
     | 
| 
      
 131 
     | 
    
         
            +
            PreformattedBlockSimple = - PreformattedCommandHeadSimple:c
         
     | 
| 
      
 132 
     | 
    
         
            +
                                        (!PreformatEndSimple (CharString Nl))+:content
         
     | 
| 
      
 133 
     | 
    
         
            +
                                        PreformatEndSimple
         
     | 
| 
      
 134 
     | 
    
         
            +
                                        ~preformatted_block(c[:name], c[:ids], c[:classes], c[:args],  c[:named_args], c[:codelanguage], content,  c[:ln])
         
     | 
| 
       98 
135 
     | 
    
         | 
| 
       99 
     | 
    
         
            -
            PreformattedBlockComplex = - PreformattedCommandHeadComplex:c 
     | 
| 
       100 
     | 
    
         
            -
             
     | 
| 
      
 136 
     | 
    
         
            +
            PreformattedBlockComplex = - PreformattedCommandHeadComplex:c
         
     | 
| 
      
 137 
     | 
    
         
            +
                                         (!PreformatEndComplex (CharString Nl))+:content
         
     | 
| 
      
 138 
     | 
    
         
            +
                                         PreformatEndComplex
         
     | 
| 
      
 139 
     | 
    
         
            +
                                         ~preformatted_block(c[:name], c[:ids], c[:classes], c[:args], c[:named_args],  c[:codelanguage], content,  c[:ln])
         
     | 
| 
       101 
140 
     | 
    
         | 
| 
       102 
     | 
    
         
            -
             
     | 
| 
      
 141 
     | 
    
         
            +
            PreformattedBlockFence = - ln:ln PreformattedFence:c  
         
     | 
| 
      
 142 
     | 
    
         
            +
                                   (!"```" CharString Nl)+:content
         
     | 
| 
      
 143 
     | 
    
         
            +
                                   - "```" - Le EmptyLine*
         
     | 
| 
      
 144 
     | 
    
         
            +
                                   ~preformatted_block('code', [], [], c[:args], c[:named_args], c[:codelanguage], content, ln)
         
     | 
| 
      
 145 
     | 
    
         
            +
             
     | 
| 
      
 146 
     | 
    
         
            +
            PreformattedBlock = PreformattedBlockComplex |
         
     | 
| 
      
 147 
     | 
    
         
            +
                                PreformattedBlockSimple |
         
     | 
| 
      
 148 
     | 
    
         
            +
                                PreformattedBlockFence
         
     | 
| 
       103 
149 
     | 
    
         | 
| 
       104 
150 
     | 
    
         
             
            # inline command
         
     | 
| 
       105 
     | 
    
         
            -
            Inline = ImgInline | CommonInline
         
     | 
| 
       106 
     | 
    
         
            -
            CommonInline =  '[' Command:c 
     | 
| 
      
 151 
     | 
    
         
            +
            Inline = EscapedChar | ImgInline | MediaInline | CodeInline | CommonInline | FenceInline
         
     | 
| 
      
 152 
     | 
    
         
            +
            CommonInline =  '[' Command:c
         
     | 
| 
      
 153 
     | 
    
         
            +
                              '{' - DocumentContentExcept('}'):content '}'
         
     | 
| 
      
 154 
     | 
    
         
            +
                            ']'
         
     | 
| 
      
 155 
     | 
    
         
            +
                            ~inline(c[:name], c[:ids], c[:classes], c[:args], c[:named_args],  content,  c[:ln])
         
     | 
| 
      
 156 
     | 
    
         
            +
             
     | 
| 
       107 
157 
     | 
    
         
             
            ImgCommand = Command:c &{ c[:name] == 'img' && c[:args].size == 2}
         
     | 
| 
       108 
     | 
    
         
            -
            ImgInline =  '[' ImgCommand:c  ']' 
     | 
| 
      
 158 
     | 
    
         
            +
            ImgInline =  '[' ImgCommand:c  ']'
         
     | 
| 
      
 159 
     | 
    
         
            +
                         ~inline(c[:name], c[:ids], c[:classes], c[:args], c[:named_args],  nil,  c[:ln])
         
     | 
| 
      
 160 
     | 
    
         
            +
             
     | 
| 
      
 161 
     | 
    
         
            +
            MediaCommand
         
     | 
| 
      
 162 
     | 
    
         
            +
              = Command:c &{ (c[:name] == 'video' || c[:name] == 'audio') && c[:args].size > 0}
         
     | 
| 
      
 163 
     | 
    
         
            +
            MediaInline
         
     | 
| 
      
 164 
     | 
    
         
            +
              = '[' MediaCommand:c
         
     | 
| 
      
 165 
     | 
    
         
            +
                  ('{' - DocumentContentExcept('}'):content '}')?
         
     | 
| 
      
 166 
     | 
    
         
            +
                 ']'
         
     | 
| 
      
 167 
     | 
    
         
            +
                  ~inline(c[:name], c[:ids], c[:classes], c[:args], c[:named_args],  content,  c[:ln])
         
     | 
| 
      
 168 
     | 
    
         
            +
             
     | 
| 
      
 169 
     | 
    
         
            +
            FenceInline =  '`' ln:ln CharStringExcept('`'):content '`' ~code_inline([], [], [], {}, content, ln)
         
     | 
| 
      
 170 
     | 
    
         
            +
            CodeCommand = Command:c &{ c[:name] == 'code' }
         
     | 
| 
      
 171 
     | 
    
         
            +
            CodeInline =  '[' CodeCommand:c
         
     | 
| 
      
 172 
     | 
    
         
            +
                          '{' - CharStringExcept('}'):content '}'
         
     | 
| 
      
 173 
     | 
    
         
            +
                          ']'
         
     | 
| 
      
 174 
     | 
    
         
            +
                          ~code_inline(c[:ids], c[:classes], c[:args], c[:named_args], content, c[:ln])
         
     | 
| 
      
 175 
     | 
    
         
            +
             
     | 
| 
      
 176 
     | 
    
         
            +
             
     | 
| 
      
 177 
     | 
    
         
            +
            EscapedChar = "\\" < /[`]/ > ln:ln ~text(text, ln)
         
     | 
| 
      
 178 
     | 
    
         
            +
             
     | 
| 
       109 
179 
     | 
    
         | 
| 
       110 
180 
     | 
    
         
             
            # special line commands
         
     | 
| 
       111 
181 
     | 
    
         
             
            CommandNameForSpecialLineCommand = NewpageCommand | ExplicitParagraphCommand
         
     | 
| 
       112 
182 
     | 
    
         | 
| 
       113 
183 
     | 
    
         
             
            # newpage
         
     | 
| 
       114 
184 
     | 
    
         
             
            NewpageCommand = Command:command &{ command[:name] == 'newpage' }
         
     | 
| 
       115 
     | 
    
         
            -
            Newpage = - 
     | 
| 
      
 185 
     | 
    
         
            +
            Newpage = - NewpageCommand:c ':' -
         
     | 
| 
      
 186 
     | 
    
         
            +
                       DocumentContent?:content - Nl
         
     | 
| 
      
 187 
     | 
    
         
            +
                       ~newpage(c[:ids],c[:classes],c[:args], c[:named_args],  content,  c[:ln])
         
     | 
| 
       116 
188 
     | 
    
         | 
| 
       117 
189 
     | 
    
         | 
| 
       118 
190 
     | 
    
         
             
            # unordered list
         
     | 
| 
       119 
     | 
    
         
            -
             
     | 
| 
       120 
     | 
    
         
            -
             
     | 
| 
       121 
     | 
    
         
            -
             
     | 
| 
      
 191 
     | 
    
         
            +
            UnorderedStart(n) = /^/ - < (/\*+/) > &{ text.length == n && text.size < 5 }
         
     | 
| 
      
 192 
     | 
    
         
            +
            UnorderedList(n) = ln:ln UnorderedItem(n)+:items ~unordered_list([],[],[],{}, items, ln)
         
     | 
| 
      
 193 
     | 
    
         
            +
            UnorderedItem(n) = UnorderedStart(n) ln:ln -
         
     | 
| 
      
 194 
     | 
    
         
            +
                               UnorderedItemBody(n):content
         
     | 
| 
      
 195 
     | 
    
         
            +
                               ~ul_item([], [], [], {}, content, ln)
         
     | 
| 
      
 196 
     | 
    
         
            +
             
     | 
| 
      
 197 
     | 
    
         
            +
            UnorderedItemBody(n) = DocumentContent:content Nl
         
     | 
| 
      
 198 
     | 
    
         
            +
                                   - &UnorderedStart(n + 1) ln:ln UnorderedList(n + 1):sub_ul
         
     | 
| 
      
 199 
     | 
    
         
            +
                                 { content << sub_ul }
         
     | 
| 
      
 200 
     | 
    
         
            +
                                 | DocumentContent:content Le { content }
         
     | 
| 
       122 
201 
     | 
    
         
             
            # ordered list
         
     | 
| 
       123 
     | 
    
         
            -
            OrderedList = ln:ln OrderedItem+:items ~ordered_list([],[],[],  
     | 
| 
       124 
     | 
    
         
            -
            OrderedItem = ln:ln Num ' 
     | 
| 
      
 202 
     | 
    
         
            +
            OrderedList = ln:ln OrderedItem+:items ~ordered_list([],[],[], {}, items, ln)
         
     | 
| 
      
 203 
     | 
    
         
            +
            OrderedItem = - ln:ln Num '.' - DocumentContent:content Le ~ol_item([], [], [], {}, content, ln)
         
     | 
| 
       125 
204 
     | 
    
         | 
| 
       126 
205 
     | 
    
         
             
            # definition list
         
     | 
| 
       127 
     | 
    
         
            -
            DefinitionList = ln:ln DefinitionItem+:items ~definition_list([], [], [],  
     | 
| 
       128 
     | 
    
         
            -
            DefinitionItem = -  ln:ln  
     | 
| 
      
 206 
     | 
    
         
            +
            DefinitionList = ln:ln DefinitionItem+:items ~definition_list([], [], [], {}, items, ln)
         
     | 
| 
      
 207 
     | 
    
         
            +
            DefinitionItem = -  ln:ln - ';:' -
         
     | 
| 
      
 208 
     | 
    
         
            +
                                DocumentContentExcept(':'):term ':' -
         
     | 
| 
      
 209 
     | 
    
         
            +
                                DocumentContent:definition Le
         
     | 
| 
      
 210 
     | 
    
         
            +
                                ~dl_item([], [], [term], {}, definition, ln)
         
     | 
| 
       129 
211 
     | 
    
         | 
| 
       130 
212 
     | 
    
         
             
            # long definition list
         
     | 
| 
       131 
     | 
    
         
            -
            LongDefinitionList = ln:ln LongDefinitionItem+:items 
     | 
| 
       132 
     | 
    
         
            -
             
     | 
| 
       133 
     | 
    
         
            -
             
     | 
| 
       134 
     | 
    
         
            -
             
     | 
| 
      
 213 
     | 
    
         
            +
            LongDefinitionList = ln:ln LongDefinitionItem+:items
         
     | 
| 
      
 214 
     | 
    
         
            +
                                 ~definition_list([], [], [], {}, items, ln)
         
     | 
| 
      
 215 
     | 
    
         
            +
            LongDefinitionItem = -  ln:ln ';:' -
         
     | 
| 
      
 216 
     | 
    
         
            +
                                   DocumentContentExcept('{'):term '{' - Nl
         
     | 
| 
      
 217 
     | 
    
         
            +
                                     - BlockBody:definition -
         
     | 
| 
      
 218 
     | 
    
         
            +
                                   BlockEnd
         
     | 
| 
      
 219 
     | 
    
         
            +
                                   ~dl_item([], [], [term], {}, definition, ln)
         
     | 
| 
      
 220 
     | 
    
         
            +
             
     | 
| 
      
 221 
     | 
    
         
            +
            ItemsList = (UnorderedList(1)
         
     | 
| 
       135 
222 
     | 
    
         
             
                      | OrderedList
         
     | 
| 
       136 
223 
     | 
    
         
             
                      | DefinitionList
         
     | 
| 
       137 
224 
     | 
    
         
             
                      | LongDefinitionList) 
         
     | 
| 
       138 
225 
     | 
    
         | 
| 
       139 
226 
     | 
    
         
             
            # generic line command
         
     | 
| 
       140 
     | 
    
         
            -
            LineCommand =  - !CommandNameForSpecialLineCommand Command:c ':' - 
     | 
| 
      
 227 
     | 
    
         
            +
            LineCommand =  - !CommandNameForSpecialLineCommand Command:c ':' -
         
     | 
| 
      
 228 
     | 
    
         
            +
                             DocumentContent?:content - Le EmptyLine*
         
     | 
| 
      
 229 
     | 
    
         
            +
                             ~block(c[:name], c[:ids], c[:classes], c[:args], c[:named_args],  content,  c[:ln])
         
     | 
| 
       141 
230 
     | 
    
         | 
| 
       142 
231 
     | 
    
         
             
            # blocks
         
     | 
| 
       143 
232 
     | 
    
         
             
            LineBlock =  ItemsList | LineCommand 
         
     | 
| 
         @@ -151,37 +240,80 @@ Block = 
     | 
|
| 
       151 
240 
     | 
    
         
             
                   {block} 
         
     | 
| 
       152 
241 
     | 
    
         | 
| 
       153 
242 
     | 
    
         
             
            BlockDelimiter = BlockHead | BlockEnd 
         
     | 
| 
       154 
     | 
    
         
            -
            ParagraphDelimiter = BlockDelimiter | 
     | 
| 
      
 243 
     | 
    
         
            +
            ParagraphDelimiter = BlockDelimiter |
         
     | 
| 
      
 244 
     | 
    
         
            +
                                 PreformattedCommandHead |
         
     | 
| 
      
 245 
     | 
    
         
            +
                                 LineBlock |
         
     | 
| 
      
 246 
     | 
    
         
            +
                                 Newpage |
         
     | 
| 
      
 247 
     | 
    
         
            +
                                 HeadedStart
         
     | 
| 
       155 
248 
     | 
    
         | 
| 
       156 
249 
     | 
    
         
             
            # markdown-style headings
         
     | 
| 
       157 
     | 
    
         
            -
            HStartMark(n) = < ' 
     | 
| 
       158 
     | 
    
         
            -
            HMarkupTerminator(n) = - < ' 
     | 
| 
       159 
     | 
    
         
            -
             
     | 
| 
       160 
     | 
    
         
            -
             
     | 
| 
       161 
     | 
    
         
            -
             
     | 
| 
       162 
     | 
    
         
            -
             
     | 
| 
       163 
     | 
    
         
            -
             
     | 
| 
       164 
     | 
    
         
            -
             
     | 
| 
       165 
     | 
    
         
            -
             
     | 
| 
       166 
     | 
    
         
            -
             
     | 
| 
      
 250 
     | 
    
         
            +
            HStartMark(n) = - < '#'+ > &{ text.length == n }
         
     | 
| 
      
 251 
     | 
    
         
            +
            HMarkupTerminator(n) = - < '#'+ > - CharString:cs Le
         
     | 
| 
      
 252 
     | 
    
         
            +
                                     &{ text.length <= n && !cs.strip.end_with?('{') } |
         
     | 
| 
      
 253 
     | 
    
         
            +
                                   - Eof
         
     | 
| 
      
 254 
     | 
    
         
            +
            HStartCommand(n)
         
     | 
| 
      
 255 
     | 
    
         
            +
                      = - HStartMark(n)
         
     | 
| 
      
 256 
     | 
    
         
            +
                      ('(' - Parameters:args - ')')?
         
     | 
| 
      
 257 
     | 
    
         
            +
                      ('[' - NamedParameters:named_args - ']')?
         
     | 
| 
      
 258 
     | 
    
         
            +
                      { { args: args || [] , named_args: named_args || {}} }
         
     | 
| 
      
 259 
     | 
    
         
            +
             
     | 
| 
      
 260 
     | 
    
         
            +
            HStart(n) =
         
     | 
| 
      
 261 
     | 
    
         
            +
                      - HStartCommand(n):hsc
         
     | 
| 
      
 262 
     | 
    
         
            +
                      ln:ln - DocumentContent:s Le { hsc.merge({ level: n, heading: s, ln: ln}) }
         
     | 
| 
      
 263 
     | 
    
         
            +
             
     | 
| 
      
 264 
     | 
    
         
            +
            HSection(n) = HStart(n):h
         
     | 
| 
      
 265 
     | 
    
         
            +
                          EmptyLine*
         
     | 
| 
      
 266 
     | 
    
         
            +
                          (!HMarkupTerminator(n) Block)*:content
         
     | 
| 
      
 267 
     | 
    
         
            +
                          EmptyLine*
         
     | 
| 
      
 268 
     | 
    
         
            +
                          ~h_section(h[:level], h[:heading], h[:args], h[:named_args], content, h[:ln])
         
     | 
| 
      
 269 
     | 
    
         
            +
             
     | 
| 
      
 270 
     | 
    
         
            +
            BlockHStart(n) = - HStartCommand(n):hsc ln:ln -
         
     | 
| 
      
 271 
     | 
    
         
            +
                                DocumentContentExcept('{'):s - '{' - Nl
         
     | 
| 
      
 272 
     | 
    
         
            +
                                { hsc.merge({ level: n, heading: s, ln: ln}) }
         
     | 
| 
      
 273 
     | 
    
         
            +
            ExplicitHSection(n) = BlockHStart(n):h
         
     | 
| 
      
 274 
     | 
    
         
            +
                                  EmptyLine* -
         
     | 
| 
      
 275 
     | 
    
         
            +
                                  BlockBody:content -
         
     | 
| 
      
 276 
     | 
    
         
            +
                                  BlockEnd
         
     | 
| 
      
 277 
     | 
    
         
            +
                                  ~h_section(h[:level], h[:heading], h[:args], h[:named_args], content, h[:ln])
         
     | 
| 
      
 278 
     | 
    
         
            +
             
     | 
| 
      
 279 
     | 
    
         
            +
            HeadedStart = HStart(6)
         
     | 
| 
       167 
280 
     | 
    
         
             
                        | HStart(5)
         
     | 
| 
       168 
     | 
    
         
            -
                        | HStart( 
     | 
| 
       169 
     | 
    
         
            -
             
     | 
| 
       170 
     | 
    
         
            -
             
     | 
| 
       171 
     | 
    
         
            -
             
     | 
| 
       172 
     | 
    
         
            -
             
     | 
| 
       173 
     | 
    
         
            -
             
     | 
| 
       174 
     | 
    
         
            -
             
     | 
| 
      
 281 
     | 
    
         
            +
                        | HStart(4)
         
     | 
| 
      
 282 
     | 
    
         
            +
                        | HStart(3)
         
     | 
| 
      
 283 
     | 
    
         
            +
                        | HStart(2)
         
     | 
| 
      
 284 
     | 
    
         
            +
                        | HStart(1)
         
     | 
| 
      
 285 
     | 
    
         
            +
                        | BlockHStart(6)
         
     | 
| 
      
 286 
     | 
    
         
            +
                        | BlockHStart(5)
         
     | 
| 
      
 287 
     | 
    
         
            +
                        | BlockHStart(4)
         
     | 
| 
      
 288 
     | 
    
         
            +
                        | BlockHStart(3)
         
     | 
| 
      
 289 
     | 
    
         
            +
                        | BlockHStart(2)
         
     | 
| 
      
 290 
     | 
    
         
            +
                        | BlockHStart(1)
         
     | 
| 
      
 291 
     | 
    
         
            +
             
     | 
| 
      
 292 
     | 
    
         
            +
            HeadedSection = ExplicitHSection(6)
         
     | 
| 
      
 293 
     | 
    
         
            +
                          | ExplicitHSection(5)
         
     | 
| 
      
 294 
     | 
    
         
            +
                          | ExplicitHSection(4)
         
     | 
| 
      
 295 
     | 
    
         
            +
                          | ExplicitHSection(3)
         
     | 
| 
      
 296 
     | 
    
         
            +
                          | ExplicitHSection(2)
         
     | 
| 
      
 297 
     | 
    
         
            +
                          | ExplicitHSection(1)
         
     | 
| 
       175 
298 
     | 
    
         
             
                          | HSection(6)
         
     | 
| 
      
 299 
     | 
    
         
            +
                          | HSection(5)
         
     | 
| 
      
 300 
     | 
    
         
            +
                          | HSection(4)
         
     | 
| 
      
 301 
     | 
    
         
            +
                          | HSection(3)
         
     | 
| 
      
 302 
     | 
    
         
            +
                          | HSection(2)
         
     | 
| 
      
 303 
     | 
    
         
            +
                          | HSection(1)
         
     | 
| 
       176 
304 
     | 
    
         | 
| 
       177 
305 
     | 
    
         
             
            # frontmatter
         
     | 
| 
       178 
306 
     | 
    
         
             
            FrontmatterSeparator =  - '---' - Nl
         
     | 
| 
       179 
     | 
    
         
            -
            Frontmatter = FrontmatterSeparator ln:ln 
     | 
| 
      
 307 
     | 
    
         
            +
            Frontmatter = FrontmatterSeparator ln:ln
         
     | 
| 
      
 308 
     | 
    
         
            +
                          (!FrontmatterSeparator ( CharString Nl))+:yaml
         
     | 
| 
      
 309 
     | 
    
         
            +
                          FrontmatterSeparator EmptyLine*
         
     | 
| 
      
 310 
     | 
    
         
            +
                          ~frontmatter(yaml, ln)
         
     | 
| 
       180 
311 
     | 
    
         | 
| 
       181 
312 
     | 
    
         
             
            # texts
         
     | 
| 
       182 
313 
     | 
    
         
             
            Char = < /[[:print:]]/ > { text }
         
     | 
| 
       183 
314 
     | 
    
         
             
            CharString = < Char* > { text }
         
     | 
| 
       184 
     | 
    
         
            -
            CharExcept(e) = Char:c &{ c  
     | 
| 
      
 315 
     | 
    
         
            +
            CharExcept(e) = Char:c &{ e.is_a?(Regexp) ? e !~ c : e != c }
         
     | 
| 
      
 316 
     | 
    
         
            +
            CharStringExcept(e) = < CharExcept(e)+ > { text }
         
     | 
| 
       185 
317 
     | 
    
         
             
            DocumentTextExcept(e) = < (!Inline CharExcept(e))+ > ln:ln ~text(text, ln)
         
     | 
| 
       186 
318 
     | 
    
         
             
            DocumentContentExcept(e) = (Inline | DocumentTextExcept(e))+:content { content } 
         
     | 
| 
       187 
319 
     | 
    
         
             
            DocumentText = < (!Inline Char)+ > ln:ln ~text(text, ln)
         
     | 
| 
         @@ -189,8 +321,12 @@ DocumentContent = (Inline | DocumentText)+:content  { content } 
     | 
|
| 
       189 
321 
     | 
    
         
             
            DocumentLine = DocumentContent:content Le { content }
         
     | 
| 
       190 
322 
     | 
    
         | 
| 
       191 
323 
     | 
    
         
             
            #page
         
     | 
| 
       192 
     | 
    
         
            -
            Page = Frontmatter?:frontmatter - 
     | 
| 
       193 
     | 
    
         
            -
             
     | 
| 
      
 324 
     | 
    
         
            +
            Page = Frontmatter?:frontmatter -
         
     | 
| 
      
 325 
     | 
    
         
            +
                   (!Newpage Block)*:blocks
         
     | 
| 
      
 326 
     | 
    
         
            +
                   EmptyLine*
         
     | 
| 
      
 327 
     | 
    
         
            +
                   ~page(([frontmatter] +  blocks).select{ |x| !x.nil?}, 1)
         
     | 
| 
      
 328 
     | 
    
         
            +
             
     | 
| 
      
 329 
     | 
    
         
            +
            Pages = Page:page Newpage:newpage Pages:pages { pages.unshift(page) }
         
     | 
| 
       194 
330 
     | 
    
         
             
                  | Page:page { [ page ] }  
         
     | 
| 
       195 
331 
     | 
    
         | 
| 
       196 
332 
     | 
    
         
             
            #root
         
     |