nora_mark 0.2beta7 → 0.2beta8

Sign up to get free protection for your applications and to get access to all the features.
@@ -36,9 +36,9 @@ module NoraMark
36
36
  ParagraphGroup =>
37
37
  TagWriter.create("p", @generator,
38
38
  node_preprocessor: proc do |node|
39
- node.children = node.children.inject([]) do |memo, node|
40
- memo << Breakline.new(memo.last.line_no) if !memo.last.nil? && memo.last.kind_of?(Paragraph) && node.kind_of?(Paragraph)
41
- memo << node
39
+ node.children = node.children.inject([]) do |memo, n|
40
+ memo << inline('br', body_empty: true, line_no: memo.last.line_no) if !memo.last.nil? && memo.last.kind_of?(Paragraph) && n.kind_of?(Paragraph)
41
+ memo << n
42
42
  end
43
43
  node
44
44
  end
@@ -48,7 +48,7 @@ module NoraMark
48
48
  end
49
49
  def write(node)
50
50
  writer_set = @writer_set[@context.paragraph_style]
51
- writer_set = @writer_set['default'] if writer_set.nil?
51
+ writer_set = @writer_set[:default] if writer_set.nil?
52
52
  writer_set[node.class].write(node)
53
53
  end
54
54
  end
@@ -2,6 +2,7 @@ module NoraMark
2
2
  module Html
3
3
  class TagWriter
4
4
  include Util
5
+ include NodeUtil
5
6
  attr_accessor :trailer, :node_preprocessors, :write_body_preprocessors
6
7
 
7
8
  def self.create(tag_name, generator, node_preprocessor: nil, write_body_preprocessor: nil, trailer: "\n", chop_last_space: false)
@@ -27,7 +28,11 @@ module NoraMark
27
28
  return '' if attrs.nil?
28
29
  attrs.map do
29
30
  |name, vals|
30
- if vals.nil? || vals.size == 0
31
+ if vals.nil?
32
+ ''
33
+ elsif !vals.is_a? Array
34
+ " #{name}='#{name}'"
35
+ elsif vals.size == 0
31
36
  ''
32
37
  else
33
38
  " #{name}='#{vals.join(' ')}'"
@@ -47,10 +52,6 @@ module NoraMark
47
52
  (node.classes ||= []) << cls
48
53
  end
49
54
 
50
- def add_class_if_empty(node, cls)
51
- add_class(node, cls) if node.classes.nil? || node.classes.size == 0
52
- end
53
-
54
55
  def tag_start(node)
55
56
  return if node.no_tag
56
57
  ids = node.ids || []
@@ -77,7 +78,7 @@ module NoraMark
77
78
 
78
79
  def write(node)
79
80
  @node_preprocessors.each { |x| node = instance_exec node.dup, &x }
80
- @context.enable_pgroup, saved_ep = !((node.parameters || []).include?('wo-pgroup') || !@context.enable_pgroup), @context.enable_pgroup
81
+ @context.enable_pgroup, saved_ep = !(node.params.map(&:text).include?('wo-pgroup') || !@context.enable_pgroup), @context.enable_pgroup
81
82
  tag_start node
82
83
  write_body node unless node.body_empty
83
84
  tag_end node unless node.body_empty
@@ -90,10 +91,15 @@ module NoraMark
90
91
  return if instance_exec(node, &x) == :done
91
92
  }
92
93
  write_children node
94
+ @generator.context.chop_last_space if node.n[:chop_last_space]
93
95
  end
94
96
 
95
97
  def write_children(node)
96
- write_nodeset(node.children)
98
+ if node.raw_text?
99
+ output escape_html(node.content.join "\n")
100
+ else
101
+ write_nodeset(node.children)
102
+ end
97
103
  end
98
104
 
99
105
  def write_nodeset(nodeset)
@@ -102,9 +108,6 @@ module NoraMark
102
108
  @generator.context.chop_last_space if (@param[:chop_last_space])
103
109
  end
104
110
 
105
- def children_not_empty(node)
106
- !node.children.nil? && node.children.size > 0 && node.children.reject { |x| x.nil? }.size > 0
107
- end
108
111
  end
109
112
  end
110
113
  end
@@ -3,25 +3,36 @@ require 'yaml'
3
3
  module NoraMark
4
4
  class Node
5
5
  include Enumerable
6
- attr_accessor :content, :ids, :classes, :no_tag, :attrs, :name, :body_empty, :line_no
6
+ attr_accessor :raw_content, :content, :ids, :classes, :no_tag, :attrs, :name, :body_empty, :line_no, :raw_text
7
7
  attr_accessor :parent, :first_child, :last_child, :prev, :next, :holders
8
8
 
9
- def named_parameters=(named_parameters)
10
- @named_parameters = named_parameters
9
+ def raw_text?
10
+ @raw_text
11
+ end
12
+
13
+ def named_params=(named_params)
14
+ @named_params = named_params
11
15
  end
12
16
 
13
- def named_parameters
14
- @named_parameters ||= {}
17
+ def named_params
18
+ @named_params ||= {}
15
19
  end
16
20
 
17
- def parameters=(parameters)
18
- @parameters = parameters
21
+ def params=(params)
22
+ @params = params.map { |param| NodeSet.new param }
19
23
  end
20
24
 
21
- def parameters
22
- @parameters ||= []
25
+ def params
26
+ @params
23
27
  end
24
28
 
29
+ alias p params
30
+ alias n named_params
31
+
32
+ def add_attr attr
33
+ (@attrs ||= {}).merge! attr
34
+ end
35
+
25
36
  def each
26
37
  node = self
27
38
  while !node.nil?
@@ -31,10 +42,13 @@ module NoraMark
31
42
  end
32
43
 
33
44
  def match?(selector)
34
- selector = build_selector(selector)
35
- selector.inject(true) {
36
- |result, selector|
37
- result && selector.call(self)
45
+ _match? build_selector(selector)
46
+ end
47
+
48
+ def _match?(raw_selector)
49
+ raw_selector.inject(true) {
50
+ |result, s|
51
+ result && s.call(self)
38
52
  }
39
53
  end
40
54
 
@@ -56,52 +70,80 @@ module NoraMark
56
70
  end
57
71
 
58
72
  def build_selector(selector)
59
- if selector.is_a? String
60
- selector = { name: selector }
73
+ original_selector = selector
74
+ case selector
75
+ when String
76
+ selector = { name: original_selector }
77
+ when Regexp
78
+ selector = { proc: proc { |node| original_selector =~ node.name }}
61
79
  end
62
80
  selector.map { |k,v| modify_selector(k,v) }
63
81
  end
64
82
 
65
83
  def ancestors(selector = {})
66
84
  result = []
85
+ raw_selector = build_selector selector
67
86
  node = parent
68
87
  while !node.nil?
69
- result << node if node.match?(selector)
88
+ result << node if node._match? raw_selector
70
89
  node = node.parent
71
90
  end
72
91
  result
73
92
  end
74
93
 
94
+ def children_empty?
95
+ children.nil? || children.size == 0 || children.reject { |x| x.nil? }.size == 0
96
+ end
97
+
75
98
  def reparent
76
- return if @content.nil?
99
+ @params ||= []
100
+ @params = @params.map do
101
+ |node_array|
102
+ node_array.inject(nil) do
103
+ |prev, child_node|
104
+ child_node.prev = prev
105
+ prev.next = child_node if !prev.nil?
106
+ child_node.parent = self
107
+ child_node.reparent
108
+ child_node
109
+ end
110
+ NodeSet.new node_array
111
+ end
77
112
 
78
- @content.each {|node| node.remove }
113
+ return if @raw_content.nil? || raw_text
79
114
 
80
- @first_child = @content.first
81
- @last_child = @content.last
82
- @content.inject(nil) do |prev, child_node|
115
+ @raw_content.each { |node| node.remove }
116
+ @first_child = @raw_content.first
117
+ @last_child = @raw_content.last
118
+ @raw_content.inject(nil) do |prev, child_node|
83
119
  child_node.prev = prev
84
120
  prev.next = child_node if !prev.nil?
85
121
  child_node.parent = self
86
122
  child_node.reparent
87
123
  child_node
88
124
  end
89
- @content = nil
125
+ @raw_content = nil
90
126
  @children = nil
127
+ rebuild_children
128
+ end
129
+
130
+ def rebuild_children
131
+ @children = @first_child.nil? ? [] : NodeSet.new(@first_child.collect { |node| node })
132
+ @children
91
133
  end
92
134
 
93
135
  def children
94
136
  return [] if @first_child.nil?
95
- return @children ||= NodeSet.new(@first_child.collect { |node| node })
137
+ @children ||= rebuild_children
96
138
  end
97
139
 
98
140
  def children=(x)
99
- @content = x.to_ary
141
+ @raw_content = x.to_ary
100
142
  reparent
101
143
  end
102
144
 
103
145
  def children_replaced
104
- @children = nil
146
+ rebuild_children
105
147
  end
106
148
 
107
149
  def unlink
@@ -117,30 +159,80 @@ module NoraMark
117
159
  @prev.next = @next unless @prev.nil?
118
160
  @parent.children_replaced unless @parent.nil?
119
161
  unlink
162
+ self
120
163
  end
121
-
122
- def replace(node)
123
- node.parent = @parent
124
- @parent.first_child = node if (@parent.first_child == self)
125
- @parent.last_child = node if (@parent.last_child == self)
126
164
 
127
- node.prev = @prev
165
+ def after(node)
166
+ node.remove
167
+ node.parent = @parent
168
+ node.prev = self
128
169
  node.next = @next
129
-
130
- @prev.next = node unless @prev.nil?
131
170
  @next.prev = node unless @next.nil?
171
+ @next = node
172
+ if !@parent.nil? && @parent.last_child == self
173
+ @parent.last_child = node
174
+ end
175
+ node.reparent
176
+ @parent.children_replaced unless @parent.nil?
177
+ end
132
178
 
179
+ def before(node)
180
+ node.remove
181
+ node.parent = @parent
182
+ node.next = self
183
+ node.prev = @prev
184
+ @prev.next = node unless @prev.nil?
185
+ @prev = node
186
+ if !@parent.nil? && @parent.first_child == self
187
+ @parent.first_child = node
188
+ end
133
189
  node.reparent
134
- node.parent.children_replaced
190
+ @parent.children_replaced unless @parent.nil?
191
+ end
192
+
193
+ def replace(node)
194
+ node = [node] if !node.is_a? Array
195
+
196
+ first_node = node.shift
197
+ rest_nodes = node
198
+
199
+ first_node.parent = @parent
200
+ if !@parent.nil?
201
+ @parent.first_child = first_node if (@parent.first_child == self)
202
+ @parent.last_child = first_node if (@parent.last_child == self)
203
+ end
204
+
205
+ first_node.prev = @prev
206
+ first_node.next = @next
207
+
208
+ @prev.next = first_node unless @prev.nil?
209
+ @next.prev = first_node unless @next.nil?
135
210
 
211
+ first_node.reparent
212
+ first_node.parent.children_replaced unless first_node.parent.nil?
136
213
  unlink
214
+ rest_nodes.inject(first_node) do
215
+ |prev, rest_node|
216
+ prev.after rest_node
217
+ rest_node
218
+ end
219
+ end
220
+
221
+ def wrap(node, method = :prepend)
222
+ replace(node)
223
+ if (method == :prepend)
224
+ node.prepend_child(self)
225
+ else
226
+ node.append_child(self)
227
+ end
228
+ node
137
229
  end
138
230
 
139
231
  def prepend_child(node)
140
232
  node.remove
141
233
  node.reparent
142
234
  if self.children.size == 0
143
- @content = [ node ]
235
+ @raw_content = [ node ]
144
236
  reparent
145
237
  else
146
238
  @first_child.prev = node
@@ -155,7 +247,7 @@ module NoraMark
155
247
  node.remove
156
248
  node.reparent
157
249
  if self.children.size == 0
158
- @content = [ node ]
250
+ @raw_content = [ node ]
159
251
  reparent
160
252
  else
161
253
  @last_child.next = node
@@ -167,26 +259,53 @@ module NoraMark
167
259
  end
168
260
 
169
261
  def all_nodes
170
- return [] if @first_child.nil?
171
- @first_child.inject([]) do
172
- |result, node|
173
- result << node
174
- result + node.all_nodes
262
+ r = []
263
+ if !@params.nil?
264
+ @params.each do
265
+ |node_array|
266
+ r = node_array[0].inject([]) do
267
+ |result, node|
268
+ result << node
269
+ result + node.all_nodes
270
+ end
271
+ end
175
272
  end
273
+ if !@first_child.nil?
274
+ r = @first_child.inject(r) do
275
+ |result, node|
276
+ result << node
277
+ result + node.all_nodes
278
+ end
279
+ end
280
+ r
281
+ end
282
+
283
+ def find_node selector
284
+ _find_node(build_selector selector)
285
+ end
286
+
287
+ def _find_node raw_selector
288
+ return self if _match? raw_selector
289
+ return nil unless @first_child
290
+ return (@first_child.find { |n| n._match? raw_selector } ||
291
+ @first_child.inject(nil) do
292
+ |r, n| r or n._find_node raw_selector
293
+ end)
176
294
  end
177
295
 
178
296
  def clone
179
- @content = nil
180
- all_nodes.each { |node| @content = nil }
297
+ @raw_content = nil
298
+ all_nodes.each { |node| node.instance_eval { @raw_content = nil } }
181
299
  Marshal.restore Marshal.dump self
182
300
  end
183
301
 
184
- def get_text
302
+ def text
185
303
  children.inject("") do
186
304
  |result, node|
187
- result << node.get_text
305
+ result << node.text
188
306
  end
189
307
  end
308
+
190
309
  end
191
310
 
192
311
  class Root < Node
@@ -198,21 +317,10 @@ module NoraMark
198
317
  end
199
318
 
200
319
  class DLItem < Node
201
- def reparent
202
- super
203
- @parameters[0].inject(nil) do
204
- |prev, child_node|
205
- child_node.prev = prev
206
- prev.next = child_node if !prev.nil?
207
- child_node.parent = self
208
- child_node.reparent
209
- child_node
210
- end
211
- end
212
- def get_text
213
- @parameters[0].inject('') do
320
+ def text
321
+ @params[0].inject('') do
214
322
  |result, node|
215
- result << node.get_text
323
+ result << node.text
216
324
  end << super
217
325
  end
218
326
  end
@@ -221,14 +329,12 @@ module NoraMark
221
329
  def heading_info
222
330
  @name =~ /h([1-6])/
223
331
  return {} if $1.nil?
224
- {level: $1.to_i, id: @ids[0], text: get_text }
332
+ {level: $1.to_i, id: @ids[0], text: text }
225
333
  end
226
334
  end
227
335
 
228
336
  class HeadedSection < Node
229
- def heading_info
230
- {level: @level, id: (named_parameters[:heading_id] || [])[0], text: @heading.map(&:get_text).join('')}
231
- end
337
+ attr_accessor :level
232
338
 
233
339
  def reparent
234
340
  super
@@ -242,40 +348,58 @@ module NoraMark
242
348
  end
243
349
  end
244
350
 
245
- def get_text
351
+ def text
246
352
  @heading[0].inject('') do
247
353
  |result, node|
248
- result << node.get_text
354
+ result << node.text
249
355
  end << super
250
356
  end
251
357
 
252
358
  end
253
359
  class Text < Node
254
360
  def reparent
255
- # do nothing.
361
+ # do nothing
256
362
  end
257
363
 
258
- def get_text
364
+ def text
259
365
  @content
260
366
  end
261
367
  end
262
368
 
369
+ class CodeInline < Node
370
+ def raw_text
371
+ true
372
+ end
373
+
374
+ def raw_text?
375
+ true
376
+ end
377
+
378
+ def text
379
+ @content
380
+ end
381
+ end
263
382
 
264
383
  class PreformattedBlock < Node
265
- def reparent
266
- # do nothing.
384
+ def raw_text
385
+ true
386
+ end
387
+
388
+ def raw_text?
389
+ true
267
390
  end
268
- def get_text
391
+
392
+ def text
269
393
  @content.join "\n"
270
394
  end
271
395
  end
272
396
 
273
397
  class Frontmatter < Node
274
398
  def reparent
275
- # do nothing.
399
+ # do nothing
276
400
  end
277
401
 
278
- def get_text
402
+ def text
279
403
  @content.join "\n"
280
404
  end
281
405