notroff 0.2.11 → 0.2.13
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/notroff/#io.rb# +18 -0
- data/lib/notroff/embedded.rb +70 -19
- data/lib/notroff/formatter.rb +4 -0
- data/lib/notroff/odt_renderer.rb +42 -19
- data/lib/notroff/skel.odt +0 -0
- data/lib/notroff/type_assigner.rb +4 -1
- data/lib/notroff/type_refiner.rb +31 -8
- metadata +2 -1
data/lib/notroff/#io.rb#
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
class FileProcessor
|
2
|
+
def initialize(path)
|
3
|
+
@path = path
|
4
|
+
end
|
5
|
+
end
|
6
|
+
|
7
|
+
class FileReader < FileProcessor
|
8
|
+
def process(ignored)
|
9
|
+
paras = File.readlines(@path)
|
10
|
+
paras.map! {|p| p.rstrip}
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class FileWriter < FileProcessor
|
15
|
+
def process(output)
|
16
|
+
File.open(@path, 'w') {|f| f.write(output)}
|
17
|
+
end
|
18
|
+
end
|
data/lib/notroff/embedded.rb
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
class SkipFilter
|
2
|
+
def initialize(re1)
|
3
|
+
@re = re
|
4
|
+
end
|
5
|
+
|
6
|
+
def process(paras)
|
7
|
+
paras.find_all {|p| p != re}
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
1
11
|
class BetweenFilter
|
2
12
|
def initialize(re1, re2=re1)
|
3
13
|
@re1 = re1
|
@@ -83,41 +93,81 @@ class EmbeddedRubyProcessor
|
|
83
93
|
def process_command(ruby_expression)
|
84
94
|
Logger.log "Ruby expression: #{ruby_expression}"
|
85
95
|
paras = eval(ruby_expression, binding)
|
86
|
-
paras
|
87
|
-
paras.map! {|p| Text.new(p, :type => :code)}
|
96
|
+
paras.keep_if {|p| p[:included]}
|
88
97
|
end
|
89
98
|
|
90
|
-
def embed(
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
99
|
+
def embed(type, inc_all=true, lines)
|
100
|
+
lines.map! do |line|
|
101
|
+
result = Text.new(line.rstrip, :type => type)
|
102
|
+
result[:original_text] = line.rstrip
|
103
|
+
result[:included] = inc_all
|
104
|
+
result
|
96
105
|
end
|
97
|
-
|
106
|
+
lines
|
98
107
|
end
|
99
108
|
|
100
|
-
def
|
101
|
-
|
109
|
+
def skip(re, paras)
|
110
|
+
paras.each do |para|
|
111
|
+
para[:included] = false if (para =~ re)
|
112
|
+
end
|
102
113
|
end
|
103
114
|
|
104
|
-
def
|
105
|
-
embed(
|
115
|
+
def inc(path, inc_all=true, type=:code)
|
116
|
+
embed(type, inc_all, File.readlines(path))
|
106
117
|
end
|
107
118
|
|
108
|
-
def
|
119
|
+
def run(shell_command, type=:code)
|
120
|
+
embed(type, File.popen(shell_command).readlines)
|
121
|
+
end
|
122
|
+
|
123
|
+
def ex(ruby_command, type=:code)
|
109
124
|
puts "ruby_command: #{ruby_command}"
|
110
|
-
embed(
|
125
|
+
embed(type, eval(ruby_command).to_s.split("\n"))
|
111
126
|
end
|
112
127
|
|
113
|
-
def
|
114
|
-
|
128
|
+
def stdinc(path, re1=/##A/, re2=/##Z/, type=:code)
|
129
|
+
skip(/##X/, between(re1, re2, inc(path, false, type)))
|
115
130
|
end
|
116
131
|
|
117
|
-
def
|
118
|
-
|
132
|
+
def between(re1, re2, paras)
|
133
|
+
state = :before_first
|
134
|
+
paras.each do |para|
|
135
|
+
if state == :before_first and re1 =~ para
|
136
|
+
state = :after_first
|
137
|
+
break if para =~ re2
|
138
|
+
elsif state == :after_first
|
139
|
+
break if para =~ re2
|
140
|
+
para[:included] = true
|
141
|
+
end
|
142
|
+
end
|
143
|
+
paras
|
144
|
+
end
|
145
|
+
|
146
|
+
def definition(def_re, include_body, paras)
|
147
|
+
state = :before_def
|
148
|
+
end_re = nil
|
149
|
+
paras.each do |para|
|
150
|
+
Logger.log para, (def_re =~ para)
|
151
|
+
if state == :before_def and def_re =~ para
|
152
|
+
para[:included] = true
|
153
|
+
end_re = Regexp.new( "^#{' ' * para.string.indent_depth}end" )
|
154
|
+
state = :after_def
|
155
|
+
elsif state == :after_def and end_re =~ para.string
|
156
|
+
para[:included] = true
|
157
|
+
break
|
158
|
+
elsif state == :after_def and include_body
|
159
|
+
para[:included] = true
|
160
|
+
end
|
161
|
+
end
|
162
|
+
paras
|
163
|
+
end
|
164
|
+
|
165
|
+
|
166
|
+
def meth(method_name, include_body, paras)
|
167
|
+
definition(/^ *def +#{method_name}(\(|$| )/, include_body, paras)
|
119
168
|
end
|
120
169
|
|
170
|
+
=begin
|
121
171
|
def clazz(name, include_body=true)
|
122
172
|
ClassFilter.new(name, include_body)
|
123
173
|
end
|
@@ -125,6 +175,7 @@ class EmbeddedRubyProcessor
|
|
125
175
|
def mod(name, include_body=true)
|
126
176
|
ModuleFilter.new(name, include_body)
|
127
177
|
end
|
178
|
+
=end
|
128
179
|
|
129
180
|
def indent(delta_indent, paragraphs)
|
130
181
|
paragraphs.map do |p|
|
data/lib/notroff/formatter.rb
CHANGED
@@ -37,9 +37,13 @@ class OdtFormatter < Formatter
|
|
37
37
|
def initialize(input, output)
|
38
38
|
super()
|
39
39
|
prepend_processor FileReader.new(input)
|
40
|
+
add_processor BodyTypeRefiner.new
|
40
41
|
add_processor CodeTypeRefiner.new
|
42
|
+
add_processor CodeTypeRefiner.new(:listing, :first_listing, :middle_listing, :end_listing)
|
41
43
|
add_processor Grouper.new(:bullet)
|
42
44
|
add_processor Grouper.new(:list)
|
45
|
+
add_processor Grouper.new(:quote)
|
46
|
+
add_processor Grouper.new(:attribution)
|
43
47
|
add_processor OdtRenderer.new
|
44
48
|
add_processor TemplateExpander.new
|
45
49
|
add_processor OdtReplacer.new(output)
|
data/lib/notroff/odt_renderer.rb
CHANGED
@@ -9,16 +9,24 @@ class OdtRenderer < Processor
|
|
9
9
|
LONG_DASH_CODE = 0xe1.chr + 0x80.chr + 0x93.chr
|
10
10
|
|
11
11
|
PARAGRAPH_STYLES = {
|
12
|
-
:body => '
|
13
|
-
:
|
12
|
+
:body => 'FT',
|
13
|
+
:body2 => 'IT',
|
14
|
+
:title => 'HA',
|
15
|
+
:subtitle => 'HB',
|
14
16
|
:section => 'HC',
|
15
17
|
:sec => 'HC',
|
18
|
+
:subsec => 'HD',
|
16
19
|
:first_code => 'CDT1',
|
17
20
|
:middle_code => 'CDT',
|
18
21
|
:end_code => 'CDTX',
|
19
22
|
:author => 'AU',
|
20
23
|
:quote => 'Quotation',
|
24
|
+
:attribution => 'Quotation Attribution',
|
21
25
|
:single_code => 'C1',
|
26
|
+
:ltitle => 'LH',
|
27
|
+
:first_listing => 'LC',
|
28
|
+
:middle_listing => 'LC2',
|
29
|
+
:end_listing => 'LX',
|
22
30
|
:pn => 'PN',
|
23
31
|
:pt => 'PT',
|
24
32
|
:cn => 'HA',
|
@@ -45,19 +53,30 @@ class OdtRenderer < Processor
|
|
45
53
|
|
46
54
|
result = nil
|
47
55
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
elsif [:body, :quote].include?(type)
|
56
|
+
|
57
|
+
if [:body, :body2].include?(type)
|
58
|
+
Logger.log("Rendering bodyish para of type ", type )
|
52
59
|
result = new_text_element( type )
|
53
60
|
add_body_text( text, result )
|
61
|
+
|
62
|
+
elsif quote_type?(para)
|
63
|
+
result = new_quote_element(para[:kid_type], para[:kids])
|
64
|
+
|
54
65
|
elsif list_type?(para)
|
55
66
|
result = new_list_element(para[:kids])
|
67
|
+
|
56
68
|
elsif bullet_type?(para)
|
57
69
|
result = new_bullet_element(para[:kids])
|
70
|
+
|
58
71
|
elsif code_type?(type)
|
59
72
|
result = new_text_element( type )
|
60
73
|
add_code_text( text, result )
|
74
|
+
|
75
|
+
elsif PARAGRAPH_STYLES[type]
|
76
|
+
Logger.log("Rendering simple para of type ", type )
|
77
|
+
result = new_text_element( type )
|
78
|
+
result.add_text( text.string )
|
79
|
+
|
61
80
|
else
|
62
81
|
raise "Dont know what to do with type [#{type}]"
|
63
82
|
end
|
@@ -68,6 +87,10 @@ class OdtRenderer < Processor
|
|
68
87
|
para[:type] == :group
|
69
88
|
end
|
70
89
|
|
90
|
+
def quote_type?(para)
|
91
|
+
group?(para) and [:quote, :attribution].include?(para[:kid_type])
|
92
|
+
end
|
93
|
+
|
71
94
|
def list_type?(para)
|
72
95
|
group?(para) and para[:kid_type] == :list
|
73
96
|
end
|
@@ -77,21 +100,21 @@ class OdtRenderer < Processor
|
|
77
100
|
end
|
78
101
|
|
79
102
|
def code_type?( type )
|
80
|
-
[ :first_code, :middle_code, :end_code, :single_code
|
103
|
+
[ :first_code, :middle_code, :end_code, :single_code,
|
104
|
+
:listing, :first_listing, :middle_listing, :end_listing ].include?(type)
|
81
105
|
end
|
82
106
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
107
|
+
def new_quote_element(type, items)
|
108
|
+
p = new_text_element(type)
|
109
|
+
items.each_with_index do |item, i|
|
110
|
+
p.add( Element.new('text:line-break')) unless i == 0
|
111
|
+
el = Element.new('text:span')
|
112
|
+
add_body_text(item.string, el)
|
113
|
+
p.add(el)
|
114
|
+
end
|
115
|
+
puts p.to_s
|
116
|
+
p
|
117
|
+
end
|
95
118
|
|
96
119
|
def new_list_element(items)
|
97
120
|
list = Element.new('text:list')
|
data/lib/notroff/skel.odt
CHANGED
Binary file
|
@@ -6,8 +6,11 @@ class TypeAssigner
|
|
6
6
|
|
7
7
|
paragraphs.each do |paragraph|
|
8
8
|
type = paragraph[:type]
|
9
|
-
if (type == :body) or (type == :code) or (type == :
|
9
|
+
if (type == :body) or (type == :code) or (type == :listing)
|
10
10
|
current_type = type
|
11
|
+
elsif type == :quote
|
12
|
+
paragraph[:type] = :quote
|
13
|
+
processed_paragraphs << paragraph
|
11
14
|
elsif type == :c1 || type == :code1
|
12
15
|
paragraph[:type] = :code
|
13
16
|
processed_paragraphs << paragraph
|
data/lib/notroff/type_refiner.rb
CHANGED
@@ -28,22 +28,45 @@ class TypeRefiner
|
|
28
28
|
end
|
29
29
|
|
30
30
|
class CodeTypeRefiner < TypeRefiner
|
31
|
+
def initialize(base_type=:code, first_type=:first_code, middle_type=:middle_code,
|
32
|
+
end_type=:end_code, single_type=middle_type)
|
33
|
+
@base_type = base_type
|
34
|
+
@first_type = first_type
|
35
|
+
@middle_type = middle_type
|
36
|
+
@end_type = end_type
|
37
|
+
@single_type = single_type
|
38
|
+
end
|
39
|
+
|
31
40
|
def type_for( previous_type, type, next_type )
|
32
41
|
Logger.log "code type for [#{previous_type}] [#{type}] [#{next_type}]"
|
33
|
-
if type !=
|
42
|
+
if type != @base_type
|
34
43
|
new_type = type
|
35
44
|
|
36
|
-
elsif previous_type
|
37
|
-
new_type =
|
45
|
+
elsif previous_type ==@base_type and next_type == @base_type
|
46
|
+
new_type = @middle_type
|
38
47
|
|
39
|
-
elsif previous_type ==
|
40
|
-
new_type =
|
48
|
+
elsif previous_type == @base_type
|
49
|
+
new_type = @end_type
|
41
50
|
|
42
|
-
elsif next_type ==
|
43
|
-
new_type =
|
51
|
+
elsif next_type == @base_type
|
52
|
+
new_type = @first_type
|
44
53
|
|
45
54
|
else
|
46
|
-
new_type =
|
55
|
+
new_type = @single_type
|
56
|
+
end
|
57
|
+
|
58
|
+
Logger.log("new type: #{new_type}")
|
59
|
+
new_type
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
class BodyTypeRefiner < TypeRefiner
|
64
|
+
def type_for( previous_type, type, next_type )
|
65
|
+
Logger.log "body type for [#{previous_type}] [#{type}] [#{next_type}]"
|
66
|
+
|
67
|
+
new_type = type
|
68
|
+
if (type == :body) and (previous_type == :body)
|
69
|
+
new_type = :body2
|
47
70
|
end
|
48
71
|
|
49
72
|
Logger.log("new type: #{new_type}")
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: notroff
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.13
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -32,6 +32,7 @@ files:
|
|
32
32
|
- spec/text_spec.rb
|
33
33
|
- spec/type_assigner_spec.rb
|
34
34
|
- spec/with_commands.nr
|
35
|
+
- lib/notroff/#io.rb#
|
35
36
|
- lib/notroff/code_scrubber.rb
|
36
37
|
- lib/notroff/command_processor.rb
|
37
38
|
- lib/notroff/composite_processor.rb
|