notroff 0.2.11 → 0.2.13
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.
- 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
|