paru 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/paru/error.rb +4 -0
- data/lib/paru/filter.rb +77 -68
- data/lib/paru/filter/alignment.rb +12 -0
- data/lib/paru/filter/ast_manipulation.rb +43 -0
- data/lib/paru/filter/attr.rb +40 -0
- data/lib/paru/filter/block.rb +11 -0
- data/lib/paru/filter/block_quote.rb +11 -0
- data/lib/paru/filter/bullet_list.rb +8 -0
- data/lib/paru/filter/citation.rb +29 -0
- data/lib/paru/filter/cite.rb +25 -0
- data/lib/paru/filter/code.rb +30 -0
- data/lib/paru/filter/code_block.rb +26 -0
- data/lib/paru/filter/definition_list.rb +19 -0
- data/lib/paru/filter/definition_list_item.rb +22 -0
- data/lib/paru/filter/div.rb +25 -0
- data/lib/paru/filter/document.rb +47 -0
- data/lib/paru/filter/emph.rb +8 -0
- data/lib/paru/filter/header.rb +28 -0
- data/lib/paru/filter/horizontal_rule.rb +11 -0
- data/lib/paru/filter/image.rb +9 -0
- data/lib/paru/filter/inline.rb +19 -0
- data/lib/paru/filter/line_break.rb +16 -0
- data/lib/paru/filter/link.rb +27 -0
- data/lib/paru/filter/list.rb +22 -0
- data/lib/paru/filter/list_attributes.rb +24 -0
- data/lib/paru/filter/markdown.rb +52 -0
- data/lib/paru/filter/math.rb +51 -0
- data/lib/paru/filter/meta.rb +24 -0
- data/lib/paru/filter/meta_blocks.rb +13 -0
- data/lib/paru/filter/meta_bool.rb +9 -0
- data/lib/paru/filter/meta_inlines.rb +13 -0
- data/lib/paru/filter/meta_list.rb +9 -0
- data/lib/paru/filter/meta_map.rb +37 -0
- data/lib/paru/filter/meta_string.rb +9 -0
- data/lib/paru/filter/meta_value.rb +20 -0
- data/lib/paru/filter/node.rb +149 -0
- data/lib/paru/filter/note.rb +17 -0
- data/lib/paru/filter/null.rb +11 -0
- data/lib/paru/filter/ordered_list.rb +23 -0
- data/lib/paru/filter/para.rb +16 -0
- data/lib/paru/filter/plain.rb +15 -0
- data/lib/paru/filter/quoted.rb +23 -0
- data/lib/paru/filter/raw_block.rb +25 -0
- data/lib/paru/filter/raw_inline.rb +30 -0
- data/lib/paru/filter/small_caps.rb +9 -0
- data/lib/paru/filter/soft_break.rb +16 -0
- data/lib/paru/filter/space.rb +15 -0
- data/lib/paru/filter/span.rb +23 -0
- data/lib/paru/filter/str.rb +23 -0
- data/lib/paru/filter/strikeout.rb +9 -0
- data/lib/paru/filter/string.rb +9 -0
- data/lib/paru/filter/subscript.rb +9 -0
- data/lib/paru/filter/superscript.rb +9 -0
- data/lib/paru/filter/table.rb +34 -0
- data/lib/paru/filter/table_row.rb +18 -0
- data/lib/paru/filter/target.rb +19 -0
- data/lib/paru/pandoc_options.yaml +4 -2
- data/lib/paru/selector.rb +151 -0
- metadata +60 -4
@@ -0,0 +1,34 @@
|
|
1
|
+
module Paru
|
2
|
+
module PandocFilter
|
3
|
+
require_relative "./block"
|
4
|
+
require_relative "./inline"
|
5
|
+
require_relative "./alignment"
|
6
|
+
|
7
|
+
ALIGNMENTS = ["AlignLeft", "AlignRight", "AlignCenter", "AlignDefault"]
|
8
|
+
|
9
|
+
class Table < Block
|
10
|
+
attr_accessor :caption, :alignment, :column_widths, :headers, :rows
|
11
|
+
|
12
|
+
def initialize contents
|
13
|
+
@caption = Inline.new contents[0]
|
14
|
+
@alignment = contents[1]
|
15
|
+
@column_widths = contents[2]
|
16
|
+
@headers = TableRow.new contents[3]
|
17
|
+
@rows = []
|
18
|
+
contents[4].each do |row_data|
|
19
|
+
@rows.push TableRow.new row_data
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def ast_contents
|
24
|
+
[
|
25
|
+
@caption.ast_contents,
|
26
|
+
@alignment,
|
27
|
+
@column_widths,
|
28
|
+
@headers.ast_contents,
|
29
|
+
@rows.map {|row| row.ast_contents}
|
30
|
+
]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Paru
|
2
|
+
module PandocFilter
|
3
|
+
require_relative "./block"
|
4
|
+
|
5
|
+
class TableRow < Block
|
6
|
+
def initialize row_data
|
7
|
+
super []
|
8
|
+
row_data.each do |cell|
|
9
|
+
@children.push Block.new cell
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def ast_contents
|
14
|
+
@children.map {|child| child.ast_contents}
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -23,6 +23,8 @@ extract_media: true
|
|
23
23
|
standalone: true
|
24
24
|
template: ""
|
25
25
|
variable: [""]
|
26
|
+
dpi: 96
|
27
|
+
wrap: "auto"
|
26
28
|
no_wrap: true
|
27
29
|
columns: 78
|
28
30
|
toc: true
|
@@ -35,8 +37,6 @@ include_before_body: [""]
|
|
35
37
|
include_after_body: [""]
|
36
38
|
# Options affecting specific writers
|
37
39
|
self_contained: true
|
38
|
-
offline: true
|
39
|
-
html5: true
|
40
40
|
html_q_tags: true
|
41
41
|
ascii: true
|
42
42
|
reference_links: true
|
@@ -56,10 +56,12 @@ css: [""]
|
|
56
56
|
reference_odt: ""
|
57
57
|
reference_docx: ""
|
58
58
|
epub_stylesheet: "epub.css"
|
59
|
+
epub_cover_image: ""
|
59
60
|
epub_metadata: ""
|
60
61
|
epub_embed_font: ""
|
61
62
|
epub_chapter_level: 1
|
62
63
|
latex_engine: "pdflatex"
|
64
|
+
latex_engine_opt: [""]
|
63
65
|
# Citation rendering
|
64
66
|
bibliography: ""
|
65
67
|
csl: ""
|
@@ -0,0 +1,151 @@
|
|
1
|
+
module Paru
|
2
|
+
|
3
|
+
require_relative "./filter"
|
4
|
+
require_relative "./error"
|
5
|
+
|
6
|
+
class SelectorParseError < Error
|
7
|
+
end
|
8
|
+
|
9
|
+
class Selector
|
10
|
+
|
11
|
+
def initialize selector
|
12
|
+
@type = "Unknown"
|
13
|
+
@relations = []
|
14
|
+
parse selector
|
15
|
+
end
|
16
|
+
|
17
|
+
def matches? node, filtered_nodes
|
18
|
+
node.type == @type and
|
19
|
+
@classes.all? {|c| node.has_class? c } and
|
20
|
+
@relations.all? {|r| r.matches? node, filtered_nodes}
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
S = /\s*/
|
26
|
+
TYPE = /(?<type>(?<name>[A-Z][a-zA-Z]*)(?<classes>(\.[a-zA-Z-]+)*))/
|
27
|
+
OTHER_TYPE = /(?<other_type>(?<other_name>[A-Z][a-zA-Z]*)(?<other_classes>(\.[a-zA-Z-]+)*))/
|
28
|
+
OPERATOR = /(?<operator>\+|-|>)/
|
29
|
+
DISTANCE = /(?<distance>[1-9][0-9]*)/
|
30
|
+
RELATION = /(?<relation>#{S}#{OTHER_TYPE}#{S}#{OPERATOR}#{S}#{DISTANCE}?#{S})/
|
31
|
+
RELATIONS = /(?<relations>#{RELATION}+)/
|
32
|
+
SELECTOR = /\A#{S}(?<selector>#{RELATIONS}?#{S}#{TYPE})#{S}\Z/
|
33
|
+
|
34
|
+
def parse selector_string
|
35
|
+
partial_match = expect_match SELECTOR, selector_string
|
36
|
+
@type, @classes = expect_pandoc_type partial_match
|
37
|
+
|
38
|
+
while continue_parsing? partial_match
|
39
|
+
operator = expect partial_match, :operator
|
40
|
+
distance = expect_integer partial_match, :distance
|
41
|
+
type, classes = expect_pandoc_other_type partial_match
|
42
|
+
|
43
|
+
@relations.push Relation.new(operator, distance, type, classes)
|
44
|
+
|
45
|
+
partial_match = rest partial_match
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def is_pandoc_type type
|
50
|
+
Paru::PANDOC_TYPES.include? type
|
51
|
+
end
|
52
|
+
|
53
|
+
def expect parts, part
|
54
|
+
raise SelectorParseError.new "Expected #{part}" if parts[part].nil?
|
55
|
+
parts[part]
|
56
|
+
end
|
57
|
+
|
58
|
+
def expect_match regexp, string
|
59
|
+
match = regexp.match string
|
60
|
+
raise SelectorParseError.new "Unable to parse '#{string}'" if match.nil?
|
61
|
+
match
|
62
|
+
end
|
63
|
+
|
64
|
+
def expect_pandoc_type parts
|
65
|
+
type = expect parts, :name
|
66
|
+
classes = parts[:classes].split(".").select {|c| not c.empty?} if not parts[:classes].nil?
|
67
|
+
raise SelectorParseError.new "Expected a Pandoc type, got '#{type}' instead" if not is_pandoc_type type
|
68
|
+
[type, classes]
|
69
|
+
end
|
70
|
+
|
71
|
+
def expect_pandoc_other_type parts
|
72
|
+
type = expect parts, :other_name
|
73
|
+
classes = parts[:other_classes].split(".").select {|c| not c.empty?} if not parts[:other_classes].nil?
|
74
|
+
raise SelectorParseError.new "Expected a Pandoc type, got '#{type}' instead" if not is_pandoc_type type
|
75
|
+
[type, classes]
|
76
|
+
end
|
77
|
+
|
78
|
+
def expect_integer parts, part
|
79
|
+
if parts[part].nil?
|
80
|
+
number = 0
|
81
|
+
else
|
82
|
+
number = parts[part].to_i
|
83
|
+
raise SelectorParseError.new "Expected a positive #{part}, got '#{parts[part]}' instead" if number <= 0
|
84
|
+
end
|
85
|
+
number
|
86
|
+
end
|
87
|
+
|
88
|
+
def continue_parsing? parts
|
89
|
+
not parts.nil? and not parts[:relations].nil?
|
90
|
+
end
|
91
|
+
|
92
|
+
def rest parts
|
93
|
+
rest_string = parts[:relations].slice 0, parts[:relations].size - parts[:relation].size
|
94
|
+
RELATIONS.match rest_string
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
class Relation
|
99
|
+
def initialize selector, distance, type, classes
|
100
|
+
@selector = selector
|
101
|
+
@distance = distance
|
102
|
+
@type = type
|
103
|
+
@classes = classes
|
104
|
+
end
|
105
|
+
|
106
|
+
def matches? node, filtered_nodes
|
107
|
+
previous_nodes = previous filtered_nodes, @distance
|
108
|
+
case @selector
|
109
|
+
when "+"
|
110
|
+
in_sequence? node, previous_nodes
|
111
|
+
when "-"
|
112
|
+
not_in_sequence? node, previous_nodes
|
113
|
+
when ">"
|
114
|
+
is_descendant? node
|
115
|
+
else
|
116
|
+
false
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def in_sequence? node, previous_nodes
|
121
|
+
previous_nodes.any? do |other|
|
122
|
+
other.type == @type and @classes.all? {|c| other.has_class? c}
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def not_in_sequence? node, previous_nodes
|
127
|
+
previous_nodes.all? do |other|
|
128
|
+
other.type != @type or not @classes.all? {|c| other.has_class? c}
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def is_descendant? node
|
133
|
+
distance = 0
|
134
|
+
begin
|
135
|
+
distance += 1 if @distance > 0
|
136
|
+
parent = node.parent
|
137
|
+
ancestry = parent.type == @type and @classes.all? {|c| parent.has_class? c}
|
138
|
+
end while not ancestry and not parent.is_root? and distance <= @distance
|
139
|
+
ancestry
|
140
|
+
end
|
141
|
+
|
142
|
+
def previous filtered_nodes, distance
|
143
|
+
if distance <= 0
|
144
|
+
filtered_nodes.slice(0, filtered_nodes.size - 1)
|
145
|
+
else
|
146
|
+
filtered_nodes.slice(-1 * distance - 1, distance)
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: paru
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Huub de Beer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-03-27 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Use Pandoc (http://www.pandoc.org) with ruby
|
14
14
|
email: Huub@heerdebeer.org
|
@@ -17,10 +17,66 @@ extensions: []
|
|
17
17
|
extra_rdoc_files: []
|
18
18
|
files:
|
19
19
|
- lib/paru.rb
|
20
|
+
- lib/paru/error.rb
|
20
21
|
- lib/paru/filter.rb
|
22
|
+
- lib/paru/filter/alignment.rb
|
23
|
+
- lib/paru/filter/ast_manipulation.rb
|
24
|
+
- lib/paru/filter/attr.rb
|
25
|
+
- lib/paru/filter/block.rb
|
26
|
+
- lib/paru/filter/block_quote.rb
|
27
|
+
- lib/paru/filter/bullet_list.rb
|
28
|
+
- lib/paru/filter/citation.rb
|
29
|
+
- lib/paru/filter/cite.rb
|
30
|
+
- lib/paru/filter/code.rb
|
31
|
+
- lib/paru/filter/code_block.rb
|
32
|
+
- lib/paru/filter/definition_list.rb
|
33
|
+
- lib/paru/filter/definition_list_item.rb
|
34
|
+
- lib/paru/filter/div.rb
|
35
|
+
- lib/paru/filter/document.rb
|
36
|
+
- lib/paru/filter/emph.rb
|
37
|
+
- lib/paru/filter/header.rb
|
38
|
+
- lib/paru/filter/horizontal_rule.rb
|
39
|
+
- lib/paru/filter/image.rb
|
40
|
+
- lib/paru/filter/inline.rb
|
41
|
+
- lib/paru/filter/line_break.rb
|
42
|
+
- lib/paru/filter/link.rb
|
43
|
+
- lib/paru/filter/list.rb
|
44
|
+
- lib/paru/filter/list_attributes.rb
|
45
|
+
- lib/paru/filter/markdown.rb
|
46
|
+
- lib/paru/filter/math.rb
|
47
|
+
- lib/paru/filter/meta.rb
|
48
|
+
- lib/paru/filter/meta_blocks.rb
|
49
|
+
- lib/paru/filter/meta_bool.rb
|
50
|
+
- lib/paru/filter/meta_inlines.rb
|
51
|
+
- lib/paru/filter/meta_list.rb
|
52
|
+
- lib/paru/filter/meta_map.rb
|
53
|
+
- lib/paru/filter/meta_string.rb
|
54
|
+
- lib/paru/filter/meta_value.rb
|
55
|
+
- lib/paru/filter/node.rb
|
56
|
+
- lib/paru/filter/note.rb
|
57
|
+
- lib/paru/filter/null.rb
|
58
|
+
- lib/paru/filter/ordered_list.rb
|
59
|
+
- lib/paru/filter/para.rb
|
60
|
+
- lib/paru/filter/plain.rb
|
61
|
+
- lib/paru/filter/quoted.rb
|
62
|
+
- lib/paru/filter/raw_block.rb
|
63
|
+
- lib/paru/filter/raw_inline.rb
|
64
|
+
- lib/paru/filter/small_caps.rb
|
65
|
+
- lib/paru/filter/soft_break.rb
|
66
|
+
- lib/paru/filter/space.rb
|
67
|
+
- lib/paru/filter/span.rb
|
68
|
+
- lib/paru/filter/str.rb
|
69
|
+
- lib/paru/filter/strikeout.rb
|
70
|
+
- lib/paru/filter/string.rb
|
71
|
+
- lib/paru/filter/subscript.rb
|
72
|
+
- lib/paru/filter/superscript.rb
|
73
|
+
- lib/paru/filter/table.rb
|
74
|
+
- lib/paru/filter/table_row.rb
|
75
|
+
- lib/paru/filter/target.rb
|
21
76
|
- lib/paru/pandoc.rb
|
22
77
|
- lib/paru/pandoc_options.yaml
|
23
|
-
|
78
|
+
- lib/paru/selector.rb
|
79
|
+
homepage: https://heerdebeer.org/Software/markdown/paru/
|
24
80
|
licenses:
|
25
81
|
- GPL3
|
26
82
|
metadata: {}
|
@@ -40,7 +96,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
40
96
|
version: '0'
|
41
97
|
requirements: []
|
42
98
|
rubyforge_project:
|
43
|
-
rubygems_version: 2.
|
99
|
+
rubygems_version: 2.4.5.1
|
44
100
|
signing_key:
|
45
101
|
specification_version: 4
|
46
102
|
summary: Paru is a ruby wrapper around pandoc
|