paru 0.0.1 → 0.1.0
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/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
|