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.
- checksums.yaml +4 -4
- data/.travis.yml +5 -0
- data/Gemfile +2 -0
- data/README.md +17 -12
- data/example/nora-simple.css +52 -0
- data/example/noramark-reference-ja.nora +246 -0
- data/example/noramark-reference-ja_00001.xhtml +187 -0
- data/lib/nora_mark/html/{abstract_item_writer.rb → abstract_node_writer.rb} +3 -3
- data/lib/nora_mark/html/context.rb +3 -21
- data/lib/nora_mark/html/frontmatter_writer.rb +33 -0
- data/lib/nora_mark/html/generator.rb +122 -100
- data/lib/nora_mark/html/pages.rb +3 -9
- data/lib/nora_mark/html/paragraph_writer.rb +27 -23
- data/lib/nora_mark/html/tag_writer.rb +33 -34
- data/lib/nora_mark/html/writer_selector.rb +3 -3
- data/lib/nora_mark/node.rb +31 -0
- data/lib/nora_mark/parser.kpeg +133 -79
- data/lib/nora_mark/parser.kpeg.rb +1822 -1526
- data/lib/nora_mark/parser.rb +4 -23
- data/lib/nora_mark/version.rb +1 -1
- data/lib/nora_mark.rb +7 -2
- data/nora_mark.gemspec +1 -0
- data/spec/epub30-schemas/epub-nav-30.nvdl +16 -0
- data/spec/epub30-schemas/epub-nav-30.rnc +10 -0
- data/spec/epub30-schemas/epub-nav-30.sch +72 -0
- data/spec/epub30-schemas/epub-svg-30.nvdl +15 -0
- data/spec/epub30-schemas/epub-svg-30.rnc +15 -0
- data/spec/epub30-schemas/epub-svg-30.sch +10 -0
- data/spec/epub30-schemas/epub-xhtml-30.nvdl +15 -0
- data/spec/epub30-schemas/epub-xhtml-30.rnc +37 -0
- data/spec/epub30-schemas/epub-xhtml-30.sch +377 -0
- data/spec/epub30-schemas/epub30-catalog.xml +335 -0
- data/spec/epub30-schemas/media-overlay-30.nvdl +14 -0
- data/spec/epub30-schemas/media-overlay-30.rnc +46 -0
- data/spec/epub30-schemas/media-overlay-30.sch +9 -0
- data/spec/epub30-schemas/mod/datatypes.rnc +143 -0
- data/spec/epub30-schemas/mod/epub-mathml3-30.rnc +74 -0
- data/spec/epub30-schemas/mod/epub-prefix-attr.rnc +8 -0
- data/spec/epub30-schemas/mod/epub-ssml-attrs.rnc +11 -0
- data/spec/epub30-schemas/mod/epub-svg11-30.rnc +12 -0
- data/spec/epub30-schemas/mod/epub-svg11-re.sch +7 -0
- data/spec/epub30-schemas/mod/epub-switch.rnc +32 -0
- data/spec/epub30-schemas/mod/epub-trigger.rnc +17 -0
- data/spec/epub30-schemas/mod/epub-type-attr.rnc +7 -0
- data/spec/epub30-schemas/mod/epub-xhtml-mathml3-30.rnc +5 -0
- data/spec/epub30-schemas/mod/epub-xhtml-svg11-30.rnc +6 -0
- data/spec/epub30-schemas/mod/html5/LICENSE +23 -0
- data/spec/epub30-schemas/mod/html5/README +21 -0
- data/spec/epub30-schemas/mod/html5/html5-aria-30.rnc +105 -0
- data/spec/epub30-schemas/mod/html5/html5-attrib-30.rnc +44 -0
- data/spec/epub30-schemas/mod/html5/html5-document-30.rnc +44 -0
- data/spec/epub30-schemas/mod/html5/html5-edit-30.rnc +24 -0
- data/spec/epub30-schemas/mod/html5/html5-embed-30.rnc +155 -0
- data/spec/epub30-schemas/mod/html5/html5-forms-30.rnc +431 -0
- data/spec/epub30-schemas/mod/html5/html5-grouping-30.rnc +115 -0
- data/spec/epub30-schemas/mod/html5/html5-interactive-30.rnc +86 -0
- data/spec/epub30-schemas/mod/html5/html5-models-30.rnc +10 -0
- data/spec/epub30-schemas/mod/html5/html5-phrasing-30.rnc +134 -0
- data/spec/epub30-schemas/mod/html5/html5-script-30.rnc +164 -0
- data/spec/epub30-schemas/mod/html5/html5-sections-30.rnc +58 -0
- data/spec/epub30-schemas/mod/html5/html5-style-30.rnc +18 -0
- data/spec/epub30-schemas/mod/id-unique.sch +10 -0
- data/spec/epub30-schemas/mod/mathml/LICENSE +3 -0
- data/spec/epub30-schemas/mod/mathml/mathml3-common.rnc +84 -0
- data/spec/epub30-schemas/mod/mathml/mathml3-content.rnc +373 -0
- data/spec/epub30-schemas/mod/mathml/mathml3-presentation.rnc +536 -0
- data/spec/epub30-schemas/mod/mathml/mathml3-strict-content.rnc +60 -0
- data/spec/epub30-schemas/mod/security/LICENSE +4 -0
- data/spec/epub30-schemas/mod/security/Lenient-Encryption11-ghc.rnc +41 -0
- data/spec/epub30-schemas/mod/security/Lenient-Encryption11.rnc +39 -0
- data/spec/epub30-schemas/mod/security/Lenient-Signature-exclusiveC14N.rnc +25 -0
- data/spec/epub30-schemas/mod/security/Lenient-Signature11-properties-exclusiveC14N.rnc +32 -0
- data/spec/epub30-schemas/mod/security/Lenient-Signature11-properties.rnc +30 -0
- data/spec/epub30-schemas/mod/security/Lenient-Signature11.rnc +28 -0
- data/spec/epub30-schemas/mod/security/Strict-Encryption.rnc +27 -0
- data/spec/epub30-schemas/mod/security/Strict-Signature.rnc +22 -0
- data/spec/epub30-schemas/mod/security/exc-c14n.rnc +39 -0
- data/spec/epub30-schemas/mod/security/security_any.rnc +15 -0
- data/spec/epub30-schemas/mod/security/xenc-allowAnyForeign.rnc +25 -0
- data/spec/epub30-schemas/mod/security/xenc-schema-11.rnc +96 -0
- data/spec/epub30-schemas/mod/security/xenc-schema.rnc +145 -0
- data/spec/epub30-schemas/mod/security/xenc11-allowAnyForeign.rnc +19 -0
- data/spec/epub30-schemas/mod/security/xmldsig-allowAnyForeign.rnc +47 -0
- data/spec/epub30-schemas/mod/security/xmldsig-core-schema.rnc +276 -0
- data/spec/epub30-schemas/mod/security/xmldsig-filter2.rnc +16 -0
- data/spec/epub30-schemas/mod/security/xmldsig-properties-schema.rnc +34 -0
- data/spec/epub30-schemas/mod/security/xmldsig11-allowAnyForeign.rnc +18 -0
- data/spec/epub30-schemas/mod/security/xmldsig11-schema.rnc +133 -0
- data/spec/epub30-schemas/mod/security/xmlsec-ghc-allowAnyForeign.rnc +21 -0
- data/spec/epub30-schemas/mod/security/xmlsec-ghc-schema.rnc +42 -0
- data/spec/epub30-schemas/mod/svg11/LICENSE +1 -0
- data/spec/epub30-schemas/mod/svg11/README.txt +8 -0
- data/spec/epub30-schemas/mod/svg11/svg11-flat.rnc +3999 -0
- data/spec/epub30-schemas/ocf-container-30.rnc +16 -0
- data/spec/epub30-schemas/ocf-encryption-30.rnc +12 -0
- data/spec/epub30-schemas/ocf-signatures-30.rnc +8 -0
- data/spec/epub30-schemas/package-30.nvdl +14 -0
- data/spec/epub30-schemas/package-30.rnc +91 -0
- data/spec/epub30-schemas/package-30.sch +137 -0
- data/spec/jing-20091111/bin/jing.jar +0 -0
- data/spec/nora_mark_spec.rb +229 -68
- data/spec/spec_helper.rb +16 -0
- metadata +179 -6
- data/lib/nora_mark/html/header_writer.rb +0 -35
- 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/
|
|
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/
|
|
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
|
-
|
|
21
|
-
(
|
|
22
|
-
|
|
20
|
+
node_preprocessor: proc do |node|
|
|
21
|
+
(node.attrs ||= {}).merge!({href: [node.parameters[0]]})
|
|
22
|
+
node
|
|
23
23
|
end)
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
frontmatter_writer = FrontmatterWriter.new self
|
|
26
26
|
paragraph_writer = ParagraphWriter.new self
|
|
27
|
-
|
|
27
|
+
abstract_node_writer = AbstractNodeWriter.new self
|
|
28
28
|
@writers = {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
:
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
50
|
-
add_class_if_empty
|
|
51
|
-
|
|
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 |
|
|
54
|
-
src =
|
|
55
|
-
alt = (
|
|
56
|
-
caption_before =
|
|
57
|
-
if caption_before && children_not_empty(
|
|
58
|
-
output "<p>"; write_children
|
|
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(
|
|
62
|
-
output "<p>"; write_children
|
|
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
|
-
|
|
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
|
-
|
|
78
|
-
|
|
79
|
-
(
|
|
80
|
-
|
|
81
|
-
|
|
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
|
-
|
|
86
|
-
add_class
|
|
87
|
-
|
|
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 |
|
|
92
|
-
write_children
|
|
93
|
-
output "<rp>(</rp><rt>#{escape_html
|
|
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
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
output "<
|
|
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
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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
|
-
|
|
129
|
-
TagWriter.create('section', self, write_body_preprocessor: proc do |
|
|
130
|
-
output "<h#{
|
|
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
|
-
#
|
|
134
|
-
|
|
135
|
-
:title => header_writer,
|
|
136
|
-
:lang => header_writer,
|
|
137
|
-
:paragraph_style => header_writer,
|
|
144
|
+
# frontmatter
|
|
145
|
+
Frontmatter => frontmatter_writer,
|
|
138
146
|
# pre-formatted
|
|
139
|
-
|
|
140
|
-
TagWriter.create('pre', self,
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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.
|
|
157
|
-
|
|
158
|
-
|
|
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
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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[
|
|
189
|
+
writer = @writers[node.class]
|
|
167
190
|
if writer.nil?
|
|
168
|
-
warn "can't find html generator for \"#{
|
|
169
|
-
@context << escape_html(item[:raw_text])
|
|
191
|
+
warn "can't find html generator for \"#{node.class}\""
|
|
170
192
|
else
|
|
171
|
-
writer.write(
|
|
193
|
+
writer.write(node)
|
|
172
194
|
end
|
|
173
195
|
end
|
|
174
196
|
end
|
data/lib/nora_mark/html/pages.rb
CHANGED
|
@@ -4,8 +4,8 @@ module NoraMark
|
|
|
4
4
|
class Context
|
|
5
5
|
class Pages
|
|
6
6
|
attr_reader :created_files
|
|
7
|
-
|
|
8
|
-
|
|
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: "#{@
|
|
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
|
-
|
|
10
|
-
TagWriter.create('p', @generator, chop_last_space: true,
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
20
|
+
ParagraphGroup =>
|
|
17
21
|
TagWriter.create("div", @generator,
|
|
18
|
-
|
|
19
|
-
add_class
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
30
|
+
Paragraph =>
|
|
27
31
|
TagWriter.create(nil, @generator, chop_last_space: true,
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
32
|
+
node_preprocessor: proc do |node|
|
|
33
|
+
node.no_tag = true
|
|
34
|
+
node
|
|
31
35
|
end),
|
|
32
|
-
|
|
36
|
+
ParagraphGroup =>
|
|
33
37
|
TagWriter.create("p", @generator,
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
memo <<
|
|
37
|
-
memo <<
|
|
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
|
-
|
|
43
|
+
node
|
|
40
44
|
end
|
|
41
45
|
)
|
|
42
46
|
}
|
|
43
47
|
}
|
|
44
48
|
end
|
|
45
|
-
def write(
|
|
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[
|
|
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, :
|
|
5
|
+
attr_accessor :trailer, :node_preprocessors, :write_body_preprocessors
|
|
6
6
|
|
|
7
|
-
def self.create(tag_name, generator,
|
|
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.
|
|
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
|
-
@
|
|
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({
|
|
38
|
+
attr_string({class: cls_array})
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
def ids_string(ids_array)
|
|
42
|
-
attr_string({
|
|
42
|
+
attr_string({id: ids_array})
|
|
43
43
|
end
|
|
44
44
|
|
|
45
|
-
def add_class(
|
|
46
|
-
(
|
|
45
|
+
def add_class(node, cls)
|
|
46
|
+
(node.classes ||= []) << cls
|
|
47
47
|
end
|
|
48
48
|
|
|
49
|
-
def add_class_if_empty(
|
|
50
|
-
add_class(
|
|
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(
|
|
54
|
-
return if
|
|
55
|
-
ids =
|
|
56
|
-
classes =
|
|
57
|
-
attr =
|
|
58
|
-
tag_name = @tag_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
|
|
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(
|
|
72
|
-
return if
|
|
73
|
-
tag_name = @tag_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(
|
|
78
|
-
@
|
|
79
|
-
@context.enable_pgroup, saved_ep = !(
|
|
80
|
-
tag_start
|
|
81
|
-
write_body
|
|
82
|
-
tag_end
|
|
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(
|
|
86
|
+
def write_body(node)
|
|
87
87
|
@write_body_preprocessors.each {
|
|
88
88
|
|x|
|
|
89
|
-
return if instance_exec(
|
|
89
|
+
return if instance_exec(node, &x) == :done
|
|
90
90
|
}
|
|
91
|
-
write_children
|
|
91
|
+
write_children node
|
|
92
92
|
end
|
|
93
93
|
|
|
94
|
-
def write_children(
|
|
95
|
-
write_array(
|
|
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(
|
|
105
|
-
!
|
|
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
|
|
@@ -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
|