paru 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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