nora_mark 0.2beta3 → 0.2beta4

Sign up to get free protection for your applications and to get access to all the features.
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