nora_mark 0.2beta3 → 0.2beta4

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.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +5 -0
  3. data/Gemfile +2 -0
  4. data/README.md +17 -12
  5. data/example/nora-simple.css +52 -0
  6. data/example/noramark-reference-ja.nora +246 -0
  7. data/example/noramark-reference-ja_00001.xhtml +187 -0
  8. data/lib/nora_mark/html/{abstract_item_writer.rb → abstract_node_writer.rb} +3 -3
  9. data/lib/nora_mark/html/context.rb +3 -21
  10. data/lib/nora_mark/html/frontmatter_writer.rb +33 -0
  11. data/lib/nora_mark/html/generator.rb +122 -100
  12. data/lib/nora_mark/html/pages.rb +3 -9
  13. data/lib/nora_mark/html/paragraph_writer.rb +27 -23
  14. data/lib/nora_mark/html/tag_writer.rb +33 -34
  15. data/lib/nora_mark/html/writer_selector.rb +3 -3
  16. data/lib/nora_mark/node.rb +31 -0
  17. data/lib/nora_mark/parser.kpeg +133 -79
  18. data/lib/nora_mark/parser.kpeg.rb +1822 -1526
  19. data/lib/nora_mark/parser.rb +4 -23
  20. data/lib/nora_mark/version.rb +1 -1
  21. data/lib/nora_mark.rb +7 -2
  22. data/nora_mark.gemspec +1 -0
  23. data/spec/epub30-schemas/epub-nav-30.nvdl +16 -0
  24. data/spec/epub30-schemas/epub-nav-30.rnc +10 -0
  25. data/spec/epub30-schemas/epub-nav-30.sch +72 -0
  26. data/spec/epub30-schemas/epub-svg-30.nvdl +15 -0
  27. data/spec/epub30-schemas/epub-svg-30.rnc +15 -0
  28. data/spec/epub30-schemas/epub-svg-30.sch +10 -0
  29. data/spec/epub30-schemas/epub-xhtml-30.nvdl +15 -0
  30. data/spec/epub30-schemas/epub-xhtml-30.rnc +37 -0
  31. data/spec/epub30-schemas/epub-xhtml-30.sch +377 -0
  32. data/spec/epub30-schemas/epub30-catalog.xml +335 -0
  33. data/spec/epub30-schemas/media-overlay-30.nvdl +14 -0
  34. data/spec/epub30-schemas/media-overlay-30.rnc +46 -0
  35. data/spec/epub30-schemas/media-overlay-30.sch +9 -0
  36. data/spec/epub30-schemas/mod/datatypes.rnc +143 -0
  37. data/spec/epub30-schemas/mod/epub-mathml3-30.rnc +74 -0
  38. data/spec/epub30-schemas/mod/epub-prefix-attr.rnc +8 -0
  39. data/spec/epub30-schemas/mod/epub-ssml-attrs.rnc +11 -0
  40. data/spec/epub30-schemas/mod/epub-svg11-30.rnc +12 -0
  41. data/spec/epub30-schemas/mod/epub-svg11-re.sch +7 -0
  42. data/spec/epub30-schemas/mod/epub-switch.rnc +32 -0
  43. data/spec/epub30-schemas/mod/epub-trigger.rnc +17 -0
  44. data/spec/epub30-schemas/mod/epub-type-attr.rnc +7 -0
  45. data/spec/epub30-schemas/mod/epub-xhtml-mathml3-30.rnc +5 -0
  46. data/spec/epub30-schemas/mod/epub-xhtml-svg11-30.rnc +6 -0
  47. data/spec/epub30-schemas/mod/html5/LICENSE +23 -0
  48. data/spec/epub30-schemas/mod/html5/README +21 -0
  49. data/spec/epub30-schemas/mod/html5/html5-aria-30.rnc +105 -0
  50. data/spec/epub30-schemas/mod/html5/html5-attrib-30.rnc +44 -0
  51. data/spec/epub30-schemas/mod/html5/html5-document-30.rnc +44 -0
  52. data/spec/epub30-schemas/mod/html5/html5-edit-30.rnc +24 -0
  53. data/spec/epub30-schemas/mod/html5/html5-embed-30.rnc +155 -0
  54. data/spec/epub30-schemas/mod/html5/html5-forms-30.rnc +431 -0
  55. data/spec/epub30-schemas/mod/html5/html5-grouping-30.rnc +115 -0
  56. data/spec/epub30-schemas/mod/html5/html5-interactive-30.rnc +86 -0
  57. data/spec/epub30-schemas/mod/html5/html5-models-30.rnc +10 -0
  58. data/spec/epub30-schemas/mod/html5/html5-phrasing-30.rnc +134 -0
  59. data/spec/epub30-schemas/mod/html5/html5-script-30.rnc +164 -0
  60. data/spec/epub30-schemas/mod/html5/html5-sections-30.rnc +58 -0
  61. data/spec/epub30-schemas/mod/html5/html5-style-30.rnc +18 -0
  62. data/spec/epub30-schemas/mod/id-unique.sch +10 -0
  63. data/spec/epub30-schemas/mod/mathml/LICENSE +3 -0
  64. data/spec/epub30-schemas/mod/mathml/mathml3-common.rnc +84 -0
  65. data/spec/epub30-schemas/mod/mathml/mathml3-content.rnc +373 -0
  66. data/spec/epub30-schemas/mod/mathml/mathml3-presentation.rnc +536 -0
  67. data/spec/epub30-schemas/mod/mathml/mathml3-strict-content.rnc +60 -0
  68. data/spec/epub30-schemas/mod/security/LICENSE +4 -0
  69. data/spec/epub30-schemas/mod/security/Lenient-Encryption11-ghc.rnc +41 -0
  70. data/spec/epub30-schemas/mod/security/Lenient-Encryption11.rnc +39 -0
  71. data/spec/epub30-schemas/mod/security/Lenient-Signature-exclusiveC14N.rnc +25 -0
  72. data/spec/epub30-schemas/mod/security/Lenient-Signature11-properties-exclusiveC14N.rnc +32 -0
  73. data/spec/epub30-schemas/mod/security/Lenient-Signature11-properties.rnc +30 -0
  74. data/spec/epub30-schemas/mod/security/Lenient-Signature11.rnc +28 -0
  75. data/spec/epub30-schemas/mod/security/Strict-Encryption.rnc +27 -0
  76. data/spec/epub30-schemas/mod/security/Strict-Signature.rnc +22 -0
  77. data/spec/epub30-schemas/mod/security/exc-c14n.rnc +39 -0
  78. data/spec/epub30-schemas/mod/security/security_any.rnc +15 -0
  79. data/spec/epub30-schemas/mod/security/xenc-allowAnyForeign.rnc +25 -0
  80. data/spec/epub30-schemas/mod/security/xenc-schema-11.rnc +96 -0
  81. data/spec/epub30-schemas/mod/security/xenc-schema.rnc +145 -0
  82. data/spec/epub30-schemas/mod/security/xenc11-allowAnyForeign.rnc +19 -0
  83. data/spec/epub30-schemas/mod/security/xmldsig-allowAnyForeign.rnc +47 -0
  84. data/spec/epub30-schemas/mod/security/xmldsig-core-schema.rnc +276 -0
  85. data/spec/epub30-schemas/mod/security/xmldsig-filter2.rnc +16 -0
  86. data/spec/epub30-schemas/mod/security/xmldsig-properties-schema.rnc +34 -0
  87. data/spec/epub30-schemas/mod/security/xmldsig11-allowAnyForeign.rnc +18 -0
  88. data/spec/epub30-schemas/mod/security/xmldsig11-schema.rnc +133 -0
  89. data/spec/epub30-schemas/mod/security/xmlsec-ghc-allowAnyForeign.rnc +21 -0
  90. data/spec/epub30-schemas/mod/security/xmlsec-ghc-schema.rnc +42 -0
  91. data/spec/epub30-schemas/mod/svg11/LICENSE +1 -0
  92. data/spec/epub30-schemas/mod/svg11/README.txt +8 -0
  93. data/spec/epub30-schemas/mod/svg11/svg11-flat.rnc +3999 -0
  94. data/spec/epub30-schemas/ocf-container-30.rnc +16 -0
  95. data/spec/epub30-schemas/ocf-encryption-30.rnc +12 -0
  96. data/spec/epub30-schemas/ocf-signatures-30.rnc +8 -0
  97. data/spec/epub30-schemas/package-30.nvdl +14 -0
  98. data/spec/epub30-schemas/package-30.rnc +91 -0
  99. data/spec/epub30-schemas/package-30.sch +137 -0
  100. data/spec/jing-20091111/bin/jing.jar +0 -0
  101. data/spec/nora_mark_spec.rb +229 -68
  102. data/spec/spec_helper.rb +16 -0
  103. metadata +179 -6
  104. data/lib/nora_mark/html/header_writer.rb +0 -35
  105. data/spec/fixture/test_src_ja.nora +0 -50
@@ -3,10 +3,10 @@ require 'nora_mark/html/util'
3
3
  require 'nora_mark/html/pages'
4
4
  require 'nora_mark/html/context'
5
5
  require 'nora_mark/html/tag_writer'
6
- require 'nora_mark/html/header_writer'
6
+ require 'nora_mark/html/frontmatter_writer'
7
7
  require 'nora_mark/html/paragraph_writer'
8
8
  require 'nora_mark/html/writer_selector'
9
- require 'nora_mark/html/abstract_item_writer'
9
+ require 'nora_mark/html/abstract_node_writer'
10
10
  module NoraMark
11
11
  module Html
12
12
  class Generator
@@ -17,56 +17,75 @@ module NoraMark
17
17
  article_writer = TagWriter.create('article', self)
18
18
  section_writer = TagWriter.create('section', self)
19
19
  link_writer = TagWriter.create('a', self, trailer: '',
20
- item_preprocessor: proc do |item|
21
- (item[:attrs] ||= {}).merge!({:href => [ item[:args][0] ]})
22
- item
20
+ node_preprocessor: proc do |node|
21
+ (node.attrs ||= {}).merge!({href: [node.parameters[0]]})
22
+ node
23
23
  end)
24
24
 
25
- header_writer = HeaderWriter.new self
25
+ frontmatter_writer = FrontmatterWriter.new self
26
26
  paragraph_writer = ParagraphWriter.new self
27
- abstract_item_writer = AbstractItemWriter.new self
27
+ abstract_node_writer = AbstractNodeWriter.new self
28
28
  @writers = {
29
- :page => abstract_item_writer,
30
- :headers => abstract_item_writer,
31
- :paragraph => paragraph_writer,
32
- :paragraph_group => paragraph_writer,
33
- :block =>
34
- WriterSelector.new(self,
35
- {
36
- 'd' => TagWriter.create('div', self),
37
- 'art' => article_writer,
38
- 'arti' => article_writer,
39
- 'article' => article_writer,
40
- 'sec' => section_writer,
41
- 'sect' => section_writer,
42
- 'section' => section_writer,
43
- }),
44
- :line_command =>
29
+ Paragraph => paragraph_writer,
30
+ ParagraphGroup => paragraph_writer,
31
+ Breakline =>
32
+ TagWriter.create('br', self, node_preprocessor: proc do |node|
33
+ node.body_empty = true
34
+ node
35
+ end),
36
+ LineCommand =>
45
37
  WriterSelector.new(self,
46
38
  {
47
39
  'image' =>
48
40
  TagWriter.create('div', self,
49
- item_preprocessor: proc do |item|
50
- add_class_if_empty item, 'img-wrap'
51
- item
41
+ node_preprocessor: proc do |node|
42
+ add_class_if_empty node, 'img-wrap'
43
+ node
52
44
  end,
53
- write_body_preprocessor: proc do |item|
54
- src = item[:args][0].strip
55
- alt = (item[:args][1] || '').strip
56
- caption_before = item[:named_args][:caption_before]
57
- if caption_before && children_not_empty(item)
58
- output "<p>"; write_children item; output "</p>"
45
+ write_body_preprocessor: proc do |node|
46
+ src = node.parameters[0].strip
47
+ alt = (node.parameters[1] || '').strip
48
+ caption_before = node.named_parameters[:caption_before]
49
+ if caption_before && children_not_empty(node)
50
+ output "<p>"; write_children node; output "</p>"
59
51
  end
60
52
  output "<img src='#{src}' alt='#{escape_html alt}' />"
61
- if !caption_before && children_not_empty(item)
62
- output "<p>"; write_children item; output "</p>"
53
+ if !caption_before && children_not_empty(node)
54
+ output "<p>"; write_children node; output "</p>"
63
55
  end
64
56
  :done
65
57
  end
66
58
  ),
67
59
 
68
60
  }),
69
- :inline =>
61
+ Block =>
62
+ WriterSelector.new(self,
63
+ {
64
+ 'd' => TagWriter.create('div', self),
65
+ 'art' => article_writer,
66
+ 'arti' => article_writer,
67
+ 'article' => article_writer,
68
+ 'sec' => section_writer,
69
+ 'sect' => section_writer,
70
+ 'section' => section_writer,
71
+ }),
72
+ Newpage =>
73
+ TagWriter.create('div', self,
74
+ node_preprocessor: proc do |node|
75
+ node.no_tag = true
76
+ node
77
+ end,
78
+ write_body_preprocessor: proc do |node|
79
+ title = nil
80
+ if node.parameters.size > 0 && node.parameters[0].size > 0
81
+ title = escape_html node.parameters.first
82
+ end
83
+ @context.title = title unless title.nil?
84
+ @context.end_html
85
+ :done
86
+ end
87
+ ),
88
+ Inline =>
70
89
  WriterSelector.new(self,
71
90
  {
72
91
  'link' => link_writer,
@@ -74,101 +93,104 @@ module NoraMark
74
93
  's' => TagWriter.create('span', self),
75
94
  'img' =>
76
95
  TagWriter.create('img', self,
77
- item_preprocessor: proc do |item|
78
- item[:no_body] = true #TODO : it is not just an item's attribute, 'img_inline' has no body. maybe should specify in parser.{rb|kpeg}
79
- (item[:attrs] ||= {}).merge!({:src => [item[:args][0] ]})
80
- item[:attrs].merge!({:alt => [ escape_html(item[:args][1].strip)]}) if (item[:args].size > 1 && item[:args][1].size > 0)
81
- item
96
+ node_preprocessor: proc do |node|
97
+ node.body_empty = true #TODO : it is not just an item's attribute, 'img_inline' has no body. maybe should specify in parser.{rb|kpeg}
98
+ (node.attrs ||= {}).merge!({src: [node.parameters[0] ]})
99
+ node.attrs.merge!({alt: [ escape_html(node.parameters[1].strip)]}) if (node.parameters.size > 1 && node.parameters[1].size > 0)
100
+ node
82
101
  end) ,
83
102
  'tcy' =>
84
103
  TagWriter.create('span', self,
85
- item_preprocessor: proc do |item|
86
- add_class item, 'tcy'
87
- item
104
+ node_preprocessor: proc do |node|
105
+ add_class node, 'tcy'
106
+ node
88
107
  end),
89
108
  'ruby' =>
90
109
  TagWriter.create('ruby', self,
91
- write_body_preprocessor: proc do |item|
92
- write_children item
93
- output "<rp>(</rp><rt>#{escape_html item[:args][0].strip}</rt><rp>)</rp>"
110
+ write_body_preprocessor: proc do |node|
111
+ write_children node
112
+ output "<rp>(</rp><rt>#{escape_html node.parameters[0].strip}</rt><rp>)</rp>"
94
113
  :done
95
114
  end),
96
115
 
97
116
  },
98
117
  trailer_default:''
99
118
  ),
100
- :ol => TagWriter.create('ol', self),
101
- :ul => TagWriter.create('ul', self),
102
- :li => TagWriter.create('li', self),
103
- :dl => TagWriter.create('dl', self),
104
- :dtdd =>
105
- TagWriter.create('', self, chop_last_space: true, item_preprocessor: proc do |item| item[:no_tag] = true; item end,
106
- write_body_preprocessor: proc do |item|
107
- output "<dt>"; write_array item[:args][0]; output "</dt>"
108
- output "<dd>"; write_array item[:args][1]; output "</dd>"
119
+ OrderedList => TagWriter.create('ol', self),
120
+ UnorderedList => TagWriter.create('ul', self),
121
+ UlItem => TagWriter.create('li', self),
122
+ OlItem => TagWriter.create('li', self),
123
+ DefinitionList => TagWriter.create('dl', self),
124
+ DLItem =>
125
+ TagWriter.create('', self, chop_last_space: true, node_preprocessor: proc do |node| node.no_tag = true; node end,
126
+ write_body_preprocessor: proc do |node|
127
+ output "<dt>"; write_array node.parameters[0]; output "</dt>\n"
128
+ output "<dd>"; write_children node; output "</dd>\n"
109
129
  :done
110
130
  end),
111
- :newpage =>
112
- TagWriter.create('div', self,
113
- item_preprocessor: proc do |item|
114
- item[:no_tag] = true
115
- item
116
- end,
117
- write_body_preprocessor: proc do |item|
118
- title = nil
119
- if item[:args].size > 0 && item[:args][0].size > 0
120
- title = escape_html item[:args].first
121
- end
122
- @context.title = title unless title.nil?
123
- @context.end_html
124
- :done
125
- end
126
- ),
131
+
132
+ Document => abstract_node_writer,
133
+ Page => abstract_node_writer,
134
+
127
135
  #headed-section
128
- :h_section =>
129
- TagWriter.create('section', self, write_body_preprocessor: proc do |item|
130
- output "<h#{item[:level]}>#{item[:heading].strip}</h#{item[:level]}>\n"
136
+ HeadedSection =>
137
+ TagWriter.create('section', self, write_body_preprocessor: proc do |node|
138
+ output "<h#{node.level}>"
139
+ write_array node.heading
140
+ @generator.context.chop_last_space
141
+ output "</h#{node.level}>\n"
131
142
  :continue
132
143
  end),
133
- # headers
134
- :stylesheets => header_writer,
135
- :title => header_writer,
136
- :lang => header_writer,
137
- :paragraph_style => header_writer,
144
+ # frontmatter
145
+ Frontmatter => frontmatter_writer,
138
146
  # pre-formatted
139
- :preformatted =>
140
- TagWriter.create('pre', self,write_body_preprocessor: proc do |item|
141
- output "<code>" if item[:name] == 'precode'
142
- output item[:children].join "\n"
143
- output "</code>" if item[:name] == 'precode'
147
+ PreformattedBlock =>
148
+ TagWriter.create('pre', self,
149
+ node_preprocessor: proc do |node|
150
+ if node.codelanguage
151
+ (node.attrs ||= {}).merge!({'data-code-language' => [node.codelanguage]})
152
+ add_class node, "code-#{node.codelanguage}"
153
+ end
154
+ node
155
+ end,
156
+ write_body_preprocessor: proc do |node|
157
+ output "<code>" if node.name == 'code'
158
+ output escape_html(node.content.join "\n")
159
+ output "</code>" if node.name == 'code'
144
160
  :done
145
161
  end),
146
- #break
147
- :br =>
148
- TagWriter.create('br', self, item_preprocessor: proc do |item|
149
- item[:no_body] = true
150
- item
151
- end),
152
162
  }
153
163
  end
154
164
 
155
165
  def convert(parsed_result)
156
- parsed_result.each {
157
- |item|
158
- to_html(item)
166
+ children = parsed_result.content
167
+ @context.file_basename = parsed_result.document_name
168
+ children.each {
169
+ |node|
170
+ to_html(node)
159
171
  }
160
172
  @context.result
161
173
  end
162
- def to_html(item)
163
- if item.is_a? String
164
- @context << escape_html(item)
174
+
175
+ def to_html(node)
176
+ if node.is_a? String
177
+ @context << escape_html(node)
178
+ elsif node.is_a? Hash
179
+ writer = @writers[node[:type]]
180
+ if writer.nil?
181
+ warn "can't find html generator for \"#{node}\""
182
+ @context << escape_html(node[:raw_text])
183
+ else
184
+ writer.write(node)
185
+ end
186
+ elsif node.kind_of? Text
187
+ @context << escape_html(node.content)
165
188
  else
166
- writer = @writers[item[:type]]
189
+ writer = @writers[node.class]
167
190
  if writer.nil?
168
- warn "can't find html generator for \"#{item}\""
169
- @context << escape_html(item[:raw_text])
191
+ warn "can't find html generator for \"#{node.class}\""
170
192
  else
171
- writer.write(item)
193
+ writer.write(node)
172
194
  end
173
195
  end
174
196
  end
@@ -4,8 +4,8 @@ module NoraMark
4
4
  class Context
5
5
  class Pages
6
6
  attr_reader :created_files
7
- def initialize(filename_base = nil, sequence_format='%05d')
8
- @filename_base = filename_base || "noramark_#{SecureRandom.uuid}"
7
+ attr_accessor :file_basename
8
+ def initialize(sequence_format='%05d')
9
9
  @sequence_format = sequence_format || '%05d'
10
10
  @result = []
11
11
  end
@@ -20,7 +20,7 @@ module NoraMark
20
20
 
21
21
  def <<(page)
22
22
  seq = @result.size + 1
23
- @result << { content: page, filename: "#{@filename_base}_#{@sequence_format%(seq)}.xhtml" }
23
+ @result << { content: page, filename: "#{@file_basename}_#{@sequence_format%(seq)}.xhtml" }
24
24
  end
25
25
 
26
26
  def [](num)
@@ -44,12 +44,6 @@ module NoraMark
44
44
  end
45
45
  end
46
46
  end
47
- def write_as_single_file(filename)
48
- File.open(filename, 'w+') {
49
- |file|
50
- file << @result[0][:content]
51
- }
52
- end
53
47
  end
54
48
  end
55
49
  end
@@ -6,46 +6,50 @@ module NoraMark
6
6
  @generator = generator
7
7
  @context = generator.context
8
8
  @writer_set = { use_paragraph_group: {
9
- :paragraph =>
10
- TagWriter.create('p', @generator, chop_last_space: true,
11
- item_preprocessor: proc do |item|
12
- add_class(item, 'noindent') if item[:children][0] =~/^(「|『|()/ # TODO: should be plaggable}
13
- item
9
+ Paragraph =>
10
+ TagWriter.create('p', @generator, chop_last_space: true,
11
+ node_preprocessor: proc do |node|
12
+ first = node.content[0]
13
+ if first.kind_of? Text
14
+ first.content.sub!(/^[[:space:]]+/, '')
15
+ add_class(node, 'noindent') if first.content =~/^(「|『|()/ # TODO: should be plaggable
16
+ end
17
+ node
14
18
  end
15
19
  ),
16
- :paragraph_group =>
20
+ ParagraphGroup =>
17
21
  TagWriter.create("div", @generator,
18
- item_preprocessor: proc do |item|
19
- add_class item, 'pgroup'
20
- item[:no_tag] = true unless @context.enable_pgroup
21
- item
22
+ node_preprocessor: proc do |node|
23
+ add_class node, 'pgroup'
24
+ node.no_tag = true unless @context.enable_pgroup
25
+ node
22
26
  end
23
27
  )
24
28
  },
25
29
  default: {
26
- :paragraph =>
30
+ Paragraph =>
27
31
  TagWriter.create(nil, @generator, chop_last_space: true,
28
- item_preprocessor: proc do |item|
29
- item[:no_tag] = true
30
- item
32
+ node_preprocessor: proc do |node|
33
+ node.no_tag = true
34
+ node
31
35
  end),
32
- :paragraph_group =>
36
+ ParagraphGroup =>
33
37
  TagWriter.create("p", @generator,
34
- item_preprocessor: proc do |item|
35
- item[:children] = item[:children].inject([]) do |memo, item|
36
- memo << { :type => :br, :args => [] } if !memo.last.nil? && memo.last[:type] == :paragraph && item[:type] == :paragraph
37
- memo << item
38
+ node_preprocessor: proc do |node|
39
+ node.content = node.content.inject([]) do |memo, node|
40
+ memo << Breakline.new if !memo.last.nil? && memo.last.kind_of?(Paragraph) && node.kind_of?(Paragraph)
41
+ memo << node
38
42
  end
39
- item
43
+ node
40
44
  end
41
45
  )
42
46
  }
43
47
  }
44
48
  end
45
- def write(item)
46
- writer_set = @writer_set[@context.paragraph_style]
49
+ def write(node)
50
+ writer_set = @writer_set[@context.paragraph_style]
47
51
  writer_set = @writer_set['default'] if writer_set.nil?
48
- writer_set[item[:type]].write(item)
52
+ writer_set[node.class].write(node)
49
53
  end
50
54
  end
51
55
  end
@@ -2,11 +2,11 @@ module NoraMark
2
2
  module Html
3
3
  class TagWriter
4
4
  include Util
5
- attr_accessor :trailer, :item_preprocessors, :write_body_preprocessors
5
+ attr_accessor :trailer, :node_preprocessors, :write_body_preprocessors
6
6
 
7
- def self.create(tag_name, generator, item_preprocessor: nil, write_body_preprocessor: nil, trailer: "\n", chop_last_space: false)
7
+ def self.create(tag_name, generator, node_preprocessor: nil, write_body_preprocessor: nil, trailer: "\n", chop_last_space: false)
8
8
  instance = TagWriter.new(tag_name, generator, chop_last_space: chop_last_space)
9
- instance.item_preprocessors << item_preprocessor unless item_preprocessor.nil?
9
+ instance.node_preprocessors << node_preprocessor unless node_preprocessor.nil?
10
10
  instance.write_body_preprocessors << write_body_preprocessor unless write_body_preprocessor.nil?
11
11
  instance.trailer = trailer
12
12
  yield instance if block_given?
@@ -18,7 +18,7 @@ module NoraMark
18
18
  @generator = generator
19
19
  @context = generator.context
20
20
  @trailer = trailer
21
- @item_preprocessors = []
21
+ @node_preprocessors = []
22
22
  @write_body_preprocessors = []
23
23
  @param = param
24
24
  end
@@ -35,29 +35,29 @@ module NoraMark
35
35
  end
36
36
 
37
37
  def class_string(cls_array)
38
- attr_string({'class' => cls_array})
38
+ attr_string({class: cls_array})
39
39
  end
40
40
 
41
41
  def ids_string(ids_array)
42
- attr_string({'id' => ids_array})
42
+ attr_string({id: ids_array})
43
43
  end
44
44
 
45
- def add_class(item, cls)
46
- (item[:classes] ||= []) << cls
45
+ def add_class(node, cls)
46
+ (node.classes ||= []) << cls
47
47
  end
48
48
 
49
- def add_class_if_empty(item, cls)
50
- add_class(item, cls) if item[:classes].nil? || item[:classes].size == 0
49
+ def add_class_if_empty(node, cls)
50
+ add_class(node, cls) if node.classes.nil? || node.classes.size == 0
51
51
  end
52
52
 
53
- def tag_start(item)
54
- return if item[:no_tag]
55
- ids = item[:ids] || []
56
- classes = item[:classes] || []
57
- attr = item[:attrs] || {}
58
- tag_name = @tag_name || item[:name]
53
+ def tag_start(node)
54
+ return if node.no_tag
55
+ ids = node.ids || []
56
+ classes = node.classes || []
57
+ attr = node.attrs || {}
58
+ tag_name = @tag_name || node.name
59
59
  @context << "<#{tag_name}#{ids_string(ids)}#{class_string(classes)}#{attr_string(attr)}"
60
- if item[:no_body]
60
+ if node.body_empty
61
61
  @context << " />"
62
62
  else
63
63
  @context << ">"
@@ -68,31 +68,31 @@ module NoraMark
68
68
  @context << string
69
69
  end
70
70
 
71
- def tag_end(item)
72
- return if item[:no_tag]
73
- tag_name = @tag_name || item[:name]
71
+ def tag_end(node)
72
+ return if node.no_tag
73
+ tag_name = @tag_name || node.name
74
74
  @context << "</#{tag_name}>#{@trailer}"
75
75
  end
76
76
 
77
- def write(item)
78
- @item_preprocessors.each { |x| item = instance_exec item.dup, &x }
79
- @context.enable_pgroup, saved_ep = !(item[:args].include?('wo-pgroup') || !@context.enable_pgroup), @context.enable_pgroup
80
- tag_start item
81
- write_body item if !item[:no_body]
82
- tag_end item if !item[:no_body]
77
+ def write(node)
78
+ @node_preprocessors.each { |x| node = instance_exec node.dup, &x }
79
+ @context.enable_pgroup, saved_ep = !(node.parameters.include?('wo-pgroup') || !@context.enable_pgroup), @context.enable_pgroup
80
+ tag_start node
81
+ write_body node unless node.body_empty
82
+ tag_end node unless node.body_empty
83
83
  @context.enable_pgroup = saved_ep
84
84
  end
85
85
 
86
- def write_body(item)
86
+ def write_body(node)
87
87
  @write_body_preprocessors.each {
88
88
  |x|
89
- return if instance_exec(item, &x) == :done
89
+ return if instance_exec(node, &x) == :done
90
90
  }
91
- write_children item
91
+ write_children node
92
92
  end
93
93
 
94
- def write_children(item)
95
- write_array(item[:children])
94
+ def write_children(node)
95
+ write_array(node.content)
96
96
  end
97
97
 
98
98
  def write_array(array)
@@ -101,10 +101,9 @@ module NoraMark
101
101
  @generator.context.chop_last_space if (@param[:chop_last_space])
102
102
  end
103
103
 
104
- def children_not_empty(item)
105
- !item[:children].nil? && item[:children].size > 0 && item[:children].select { |x| (x.is_a? String) ? x.size >0 : !x.nil? }.size > 0
104
+ def children_not_empty(node)
105
+ !node.content.nil? && node.content.size > 0 && node.content.reject { |x| x.nil? }.size > 0
106
106
  end
107
-
108
107
  end
109
108
  end
110
109
  end
@@ -15,9 +15,9 @@ module NoraMark
15
15
 
16
16
  end
17
17
 
18
- def write(item)
19
- writer = @tag_writers[item[:name]] || @common_tag_writer
20
- writer.write(item)
18
+ def write(node)
19
+ writer = @tag_writers[node.name] || @common_tag_writer
20
+ writer.write(node)
21
21
  end
22
22
  end
23
23
  end
@@ -0,0 +1,31 @@
1
+ require 'yaml'
2
+
3
+ module NoraMark
4
+ class Node
5
+ attr_accessor :content, :ids, :classes, :no_tag, :attrs, :name, :body_empty
6
+
7
+ def named_parameters=(named_parameters)
8
+ @named_parameters = named_parameters
9
+ end
10
+
11
+ def named_parameters
12
+ @named_parameters = Hash[*(parameters.select { |x| x.include?(':') }.map { |x| v = x.split(':', 2); [v[0].strip.to_sym, v[1]]}.flatten)] if !@parameters.nil?
13
+ @named_parameters ||= {}
14
+ end
15
+
16
+ def parameters=(parameters)
17
+ @parameters = parameters
18
+ end
19
+
20
+ def parameters
21
+ @parameters ||= []
22
+ end
23
+ end
24
+
25
+ class Frontmatter < Node
26
+ def yaml
27
+ @yaml ||= YAML.load(@content.join("\n"))
28
+ @yaml
29
+ end
30
+ end
31
+ end