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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 53ebb5ef05d8311f13bf03b471607000822e754e
4
- data.tar.gz: e5c206fc7f2de955144b75e58a3a2e6b1041ac01
3
+ metadata.gz: ed2fa44eb537e3b82708eef4e06729a2c926554f
4
+ data.tar.gz: b4873e14f2f4cb457fd223a4ca9f2ac87ff0fae1
5
5
  SHA512:
6
- metadata.gz: 38786b1b92d6f10d09cebc11b9e7b49a97546437c90d1a886e964fbdcee4d3d3867aa781e30b285123921cd9d4380dd0bed7d637c2e228281892a7b14a3538dd
7
- data.tar.gz: 890a3b60a25c13932b11c1642ef24c3021a298a91c95febd74aef744d83a08158079fd1bdc483c27e1c6ccd715ab75b8209a2d8c1b9324e819dea8329f922ec1
6
+ metadata.gz: b2c82d26a75ff0323525279b6c30969e4546e8332d2d31d60a3070b0e30cacc69db0fc6c2c7b9f83e0eab5fc587b3bbbfd6c554aa2440255720582150f5e4886
7
+ data.tar.gz: 8eacf827ff67d6ff598aeebbc9a44fa3e2ea6462d24269322dcdf507a9eee5b49d27182f101defd7e3746576bd159f3d21902d971c416e3ccd6d63db8d2d3adc
@@ -0,0 +1,4 @@
1
+ module Paru
2
+ class Error < RuntimeError
3
+ end
4
+ end
@@ -1,73 +1,82 @@
1
1
  module Paru
2
2
 
3
- require 'json'
3
+ require_relative "./selector"
4
+ require_relative "filter/document"
5
+
6
+ PANDOC_BLOCK = [
7
+ "Plain",
8
+ "Para",
9
+ "CodeBlock",
10
+ "RawBlock",
11
+ "BlockQuote",
12
+ "OrderedList",
13
+ "BulletList",
14
+ "DefinitionList",
15
+ "Header",
16
+ "HorizontalRule",
17
+ "Table",
18
+ "Div",
19
+ "Null"
20
+ ]
21
+ PANDOC_INLINE = [
22
+ "Str",
23
+ "Emph",
24
+ "Strong",
25
+ "Strikeout",
26
+ "Superscript",
27
+ "Subscript",
28
+ "SmallCaps",
29
+ "Quoted",
30
+ "Cite",
31
+ "Space",
32
+ "SoftBreak",
33
+ "LineBreak",
34
+ "Math",
35
+ "RawInline",
36
+ "Link",
37
+ "Image",
38
+ "Note",
39
+ "Span"
40
+ ]
41
+ PANDOC_TYPES = PANDOC_BLOCK + PANDOC_INLINE
42
+
43
+ class Filter
44
+
45
+ def self.run &block
46
+ Filter.new().filter(&block)
47
+ end
48
+
49
+ def document
50
+ meta, contents = JSON.parse $stdin.read
51
+ document = PandocFilter::Document.new meta, contents
52
+ document
53
+ end
54
+
55
+ def filter &block
56
+ @selectors = Hash.new
57
+ @filtered_nodes = []
58
+ @doc = document
59
+
60
+ @doc.each_depth_first do |node|
61
+ @filtered_nodes.push node
62
+ instance_eval(&block)
63
+ end
64
+
65
+ puts @doc.to_json
66
+ end
67
+
68
+ def current_node
69
+ @filtered_nodes.last
70
+ end
71
+
72
+ def with selector
73
+ @selectors[selector] = Selector.new selector unless @selectors.has_key? selector
74
+ yield current_node if @selectors[selector].matches? current_node, @filtered_nodes
75
+ end
76
+
77
+ def metadata
78
+ @doc.meta
79
+ end
4
80
 
5
- class Filter
6
-
7
- def self.ast &filter
8
- ast_hash = JSON.parse $stdin.read
9
- warn ast_hash
10
- ast_tree = yield AST.new ast_hash
11
- $stdout.write JSON.generate ast_tree.to_h
12
- end
13
-
14
- end
15
-
16
- class AST
17
-
18
- def initialize ast_hash
19
- @metadata = Meta.new ast_hash.first
20
- @content = ast_hash.last.map {|n| Node.new n}
21
81
  end
22
-
23
- def to_h
24
- [@metadata.to_h].push @content.map {|n| n.to_h }
25
- end
26
-
27
- end
28
-
29
- # see
30
- # http://hackage.haskell.org/package/pandoc-types-1.12.4.1/docs/Text-Pandoc-Definition.html
31
- # for spec of different kinds of nodes
32
-
33
- class Meta
34
-
35
- def initialize(hash)
36
- hash = hash["unMeta"]
37
- @content = {}
38
- hash.keys.each {|key| @content[key] = Node.new hash[key]}
39
- end
40
-
41
- def [](key)
42
- @content[key]
43
- end
44
-
45
- def to_h
46
- hash = {}
47
- @content.keys.each {|key| hash[key] = @content[key].to_h}
48
- {"unMeta" => hash}
49
- end
50
- end
51
-
52
- class Node
53
-
54
- attr_reader :type, :contents
55
-
56
- def initialize(ast_hash)
57
- @type = ast_hash["t"]
58
- @contents = ast_hash["c"]
59
- end
60
-
61
- def to_h
62
- {
63
- "t" => @type,
64
- "c" => @contents
65
- }
66
- end
67
-
68
- end
69
-
70
-
71
-
72
-
73
82
  end
@@ -0,0 +1,12 @@
1
+ module Paru
2
+ module PandocFilter
3
+
4
+ class Alignment
5
+ ALIGNMENTS = ["AlignLeft", "AlignRight", "AlignCenter", "AlignDefault"]
6
+
7
+ def initialize config
8
+ @config = config
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,43 @@
1
+ module Paru
2
+ module PandocFilter
3
+ module ASTManipulation
4
+
5
+ def insert index, child
6
+ @children.insert index, child
7
+ end
8
+
9
+ def delete child
10
+ @children.delete child
11
+ end
12
+
13
+ def remove_at index
14
+ @children.delete_at index
15
+ end
16
+
17
+ def append child
18
+ @children.push child
19
+ end
20
+ alias << append
21
+
22
+ def prepend child
23
+ insert 0, child
24
+ end
25
+
26
+ def replace old_child, new_child
27
+ @children.find_index old_child do |index|
28
+ replace_at index, new_child
29
+ end
30
+ end
31
+
32
+ def replace_at index, new_child
33
+ @children[index] = new_child
34
+ end
35
+
36
+ def each_depth_first &block
37
+ yield self
38
+ each {|child| child.each_depth_first(&block)} if has_children?
39
+ end
40
+
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,40 @@
1
+ module Paru
2
+ module PandocFilter
3
+ class Attr
4
+ include Enumerable
5
+
6
+ attr_accessor :id, :classes
7
+ def initialize(attributes)
8
+ @id = attributes[0]
9
+ @classes = attributes[1]
10
+ @data = attributes[2]
11
+ end
12
+
13
+ def each
14
+ @data.each
15
+ end
16
+
17
+ def [](key)
18
+ if @data.key_exists? key
19
+ @data[key]
20
+ end
21
+ end
22
+
23
+ def has_key? name
24
+ @data.key_exists? name
25
+ end
26
+
27
+ def has_class? name
28
+ @classes.include? name
29
+ end
30
+
31
+ def to_ast
32
+ [
33
+ @id,
34
+ @classes,
35
+ @data
36
+ ]
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,11 @@
1
+ module Paru
2
+ module PandocFilter
3
+ require_relative "./node"
4
+
5
+ class Block < Node
6
+ def is_block?
7
+ true
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Paru
2
+ module PandocFilter
3
+ require_relative "./block"
4
+
5
+ class BlockQuote < Block
6
+ def has_block?
7
+ true
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,8 @@
1
+ module Paru
2
+ module PandocFilter
3
+ require_relative "./list"
4
+
5
+ class BulletList < List
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,29 @@
1
+ module Paru
2
+ module PandocFilter
3
+ require_relative "./inline"
4
+
5
+ class Citation
6
+ attr_accessor :id, :prefix, :suffix, :mode, :note_num, :hash
7
+
8
+ def initialize spec
9
+ @id = spec["citationId"] if spec.has_key? "citationId"
10
+ @prefix = Inline.new spec["citationPrefix"] if spec.has_key? "citationPrefix"
11
+ @suffix = Inline.new spec["citationSuffix"] if spec.has_key? "citationSuffix"
12
+ @mode = spec["citationMode"] if spec.has_key? "citationMode"
13
+ @note_num = spec["citationNoteNum"] if spec.has_key? "citationNoteNum"
14
+ @hash = spec["citationHash"] if spec.has_key? "citationHash"
15
+ end
16
+
17
+ def to_ast
18
+ citation = Hash.new
19
+ citation["citationId"] = @id if not @id.nil?
20
+ citation["citationPrefix"] = @prefix.ast_contents if not @prefix.nil?
21
+ citation["citationSuffix"] = @suffix.ast_contents if not @suffix.nil?
22
+ citation["citationMode"] = @mode if not @mode.nil?
23
+ citation["citationNoteNum"] = @note_num if not @note_num.nil?
24
+ citation["citationHash"] = @hash if not @hash.nil?
25
+ citation
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,25 @@
1
+ module Paru
2
+ module PandocFilter
3
+ require_relative "./inline"
4
+
5
+ class Cite < Inline
6
+ attr_accessor :citations
7
+
8
+ def initialize contents
9
+ @citations = []
10
+ contents[0].each do |citation|
11
+ @citations.push Citation.new(citation)
12
+ end
13
+ super contents[1]
14
+ end
15
+
16
+ def ast_contents
17
+ [
18
+ @citations.map {|citation| citation.to_ast},
19
+ super
20
+ ]
21
+ end
22
+ end
23
+ end
24
+ end
25
+
@@ -0,0 +1,30 @@
1
+ module Paru
2
+ module PandocFilter
3
+ require_relative "./inline"
4
+ require_relative "./attr"
5
+
6
+ class Code < Inline
7
+ attr_accessor :attr, :string
8
+
9
+ def initialize contents
10
+ @attr = Attr.new contents[0]
11
+ @string = contents[1]
12
+ end
13
+
14
+ def ast_contents
15
+ [
16
+ @attr.to_ast,
17
+ @string
18
+ ]
19
+ end
20
+
21
+ def has_string?
22
+ true
23
+ end
24
+
25
+ def has_inline?
26
+ false
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,26 @@
1
+ module Paru
2
+ module PandocFilter
3
+ require_relative "./block"
4
+ require_relative "./attr"
5
+
6
+ class CodeBlock < Block
7
+ attr_accessor :attr, :string
8
+
9
+ def initialize(contents)
10
+ @attr = Attr.new contents[0]
11
+ @string = contents[1]
12
+ end
13
+
14
+ def ast_contents
15
+ [
16
+ @attr.to_ast,
17
+ @string
18
+ ]
19
+ end
20
+
21
+ def has_string?
22
+ true
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,19 @@
1
+ module Paru
2
+ module PandocFilter
3
+ require_relative "./block"
4
+
5
+ class DefinitionList < Block
6
+ def initialize contents
7
+ super []
8
+ contents.each do |item|
9
+ @children.push DefinitionListItem.new item
10
+ end
11
+ end
12
+
13
+ def ast_contents
14
+ @children.map {|child| child.to_ast}
15
+ end
16
+
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,22 @@
1
+ module Paru
2
+ module PandocFilter
3
+ require_relative "./block"
4
+ require_relative "./list"
5
+ require_relative "./inline"
6
+
7
+ class DefinitionListItem < Block
8
+ attr_accessor :term, :definition
9
+ def initialize item
10
+ @term = Block.new item[0]
11
+ @definition = List.new item[1]
12
+ end
13
+
14
+ def to_ast
15
+ [
16
+ @term.ast_contents,
17
+ @definition.ast_contents
18
+ ]
19
+ end
20
+ end
21
+ end
22
+ end