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.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/lib/paru/error.rb +4 -0
  3. data/lib/paru/filter.rb +77 -68
  4. data/lib/paru/filter/alignment.rb +12 -0
  5. data/lib/paru/filter/ast_manipulation.rb +43 -0
  6. data/lib/paru/filter/attr.rb +40 -0
  7. data/lib/paru/filter/block.rb +11 -0
  8. data/lib/paru/filter/block_quote.rb +11 -0
  9. data/lib/paru/filter/bullet_list.rb +8 -0
  10. data/lib/paru/filter/citation.rb +29 -0
  11. data/lib/paru/filter/cite.rb +25 -0
  12. data/lib/paru/filter/code.rb +30 -0
  13. data/lib/paru/filter/code_block.rb +26 -0
  14. data/lib/paru/filter/definition_list.rb +19 -0
  15. data/lib/paru/filter/definition_list_item.rb +22 -0
  16. data/lib/paru/filter/div.rb +25 -0
  17. data/lib/paru/filter/document.rb +47 -0
  18. data/lib/paru/filter/emph.rb +8 -0
  19. data/lib/paru/filter/header.rb +28 -0
  20. data/lib/paru/filter/horizontal_rule.rb +11 -0
  21. data/lib/paru/filter/image.rb +9 -0
  22. data/lib/paru/filter/inline.rb +19 -0
  23. data/lib/paru/filter/line_break.rb +16 -0
  24. data/lib/paru/filter/link.rb +27 -0
  25. data/lib/paru/filter/list.rb +22 -0
  26. data/lib/paru/filter/list_attributes.rb +24 -0
  27. data/lib/paru/filter/markdown.rb +52 -0
  28. data/lib/paru/filter/math.rb +51 -0
  29. data/lib/paru/filter/meta.rb +24 -0
  30. data/lib/paru/filter/meta_blocks.rb +13 -0
  31. data/lib/paru/filter/meta_bool.rb +9 -0
  32. data/lib/paru/filter/meta_inlines.rb +13 -0
  33. data/lib/paru/filter/meta_list.rb +9 -0
  34. data/lib/paru/filter/meta_map.rb +37 -0
  35. data/lib/paru/filter/meta_string.rb +9 -0
  36. data/lib/paru/filter/meta_value.rb +20 -0
  37. data/lib/paru/filter/node.rb +149 -0
  38. data/lib/paru/filter/note.rb +17 -0
  39. data/lib/paru/filter/null.rb +11 -0
  40. data/lib/paru/filter/ordered_list.rb +23 -0
  41. data/lib/paru/filter/para.rb +16 -0
  42. data/lib/paru/filter/plain.rb +15 -0
  43. data/lib/paru/filter/quoted.rb +23 -0
  44. data/lib/paru/filter/raw_block.rb +25 -0
  45. data/lib/paru/filter/raw_inline.rb +30 -0
  46. data/lib/paru/filter/small_caps.rb +9 -0
  47. data/lib/paru/filter/soft_break.rb +16 -0
  48. data/lib/paru/filter/space.rb +15 -0
  49. data/lib/paru/filter/span.rb +23 -0
  50. data/lib/paru/filter/str.rb +23 -0
  51. data/lib/paru/filter/strikeout.rb +9 -0
  52. data/lib/paru/filter/string.rb +9 -0
  53. data/lib/paru/filter/subscript.rb +9 -0
  54. data/lib/paru/filter/superscript.rb +9 -0
  55. data/lib/paru/filter/table.rb +34 -0
  56. data/lib/paru/filter/table_row.rb +18 -0
  57. data/lib/paru/filter/target.rb +19 -0
  58. data/lib/paru/pandoc_options.yaml +4 -2
  59. data/lib/paru/selector.rb +151 -0
  60. metadata +60 -4
@@ -0,0 +1,9 @@
1
+ module Paru
2
+ module PandocFilter
3
+ require_relative "./inline"
4
+
5
+ class Strikeout < Inline
6
+ end
7
+ end
8
+ end
9
+
@@ -0,0 +1,9 @@
1
+ module Paru
2
+ module PandocFilter
3
+ require_relative "./inline"
4
+
5
+ class Strong < Inline
6
+ end
7
+ end
8
+ end
9
+
@@ -0,0 +1,9 @@
1
+ module Paru
2
+ module PandocFilter
3
+ require_relative "./inline"
4
+
5
+ class Subscript < Inline
6
+ end
7
+ end
8
+ end
9
+
@@ -0,0 +1,9 @@
1
+ module Paru
2
+ module PandocFilter
3
+ require_relative "./inline"
4
+
5
+ class Superscript < Inline
6
+ end
7
+ end
8
+ end
9
+
@@ -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
@@ -0,0 +1,19 @@
1
+ module Paru
2
+ module PandocFilter
3
+
4
+ class Target
5
+ attr_accessor :url, :title
6
+ def initialize contents
7
+ @url = contents[0]
8
+ @title = contents[1]
9
+ end
10
+
11
+ def to_ast
12
+ [
13
+ @url,
14
+ @title
15
+ ]
16
+ end
17
+ end
18
+ end
19
+ 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.1
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: 2015-03-05 00:00:00.000000000 Z
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
- homepage: https://github.com/htdebeer/paru
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.2.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