pandoc_object_filters 0.1.0 → 0.2.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 (39) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +8 -0
  3. data/lib/pandoc_object_filters.rb +51 -4
  4. data/lib/pandoc_object_filters/element_helper.rb +106 -0
  5. data/lib/pandoc_object_filters/v1_16.rb +9 -0
  6. data/lib/pandoc_object_filters/v1_16/element.rb +62 -0
  7. data/lib/pandoc_object_filters/v1_16/element/attr.rb +54 -0
  8. data/lib/pandoc_object_filters/v1_16/element/base.rb +46 -0
  9. data/lib/pandoc_object_filters/v1_16/element/base_element.rb +17 -0
  10. data/lib/pandoc_object_filters/{element → v1_16/element}/block.rb +4 -2
  11. data/lib/pandoc_object_filters/v1_16/element/document.rb +25 -0
  12. data/lib/pandoc_object_filters/v1_16/element/enum.rb +17 -0
  13. data/lib/pandoc_object_filters/{element → v1_16/element}/inline.rb +4 -2
  14. data/lib/pandoc_object_filters/v1_16/element/meta.rb +20 -0
  15. data/lib/pandoc_object_filters/{element → v1_16/element}/meta_value.rb +4 -2
  16. data/lib/pandoc_object_filters/v1_16/element/target.rb +18 -0
  17. data/lib/pandoc_object_filters/v1_17.rb +9 -0
  18. data/lib/pandoc_object_filters/v1_17/element.rb +63 -0
  19. data/lib/pandoc_object_filters/v1_17/element/attr.rb +11 -0
  20. data/lib/pandoc_object_filters/v1_17/element/base.rb +10 -0
  21. data/lib/pandoc_object_filters/v1_17/element/base_element.rb +11 -0
  22. data/lib/pandoc_object_filters/v1_17/element/block.rb +11 -0
  23. data/lib/pandoc_object_filters/v1_17/element/document.rb +28 -0
  24. data/lib/pandoc_object_filters/v1_17/element/enum.rb +11 -0
  25. data/lib/pandoc_object_filters/v1_17/element/inline.rb +11 -0
  26. data/lib/pandoc_object_filters/v1_17/element/leaf.rb +17 -0
  27. data/lib/pandoc_object_filters/v1_17/element/meta.rb +20 -0
  28. data/lib/pandoc_object_filters/v1_17/element/meta_value.rb +11 -0
  29. data/lib/pandoc_object_filters/v1_17/element/target.rb +11 -0
  30. data/lib/pandoc_object_filters/version.rb +1 -1
  31. metadata +29 -14
  32. data/lib/pandoc_object_filters/element.rb +0 -135
  33. data/lib/pandoc_object_filters/element/attr.rb +0 -43
  34. data/lib/pandoc_object_filters/element/base.rb +0 -44
  35. data/lib/pandoc_object_filters/element/base_element.rb +0 -11
  36. data/lib/pandoc_object_filters/element/document.rb +0 -19
  37. data/lib/pandoc_object_filters/element/enum.rb +0 -15
  38. data/lib/pandoc_object_filters/element/meta.rb +0 -18
  39. data/lib/pandoc_object_filters/element/target.rb +0 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ddff0d01d96a620197b61aeb75d689bae00af8e8
4
- data.tar.gz: 19cc75ca102c7ba5322a9218107161c98ea2973a
3
+ metadata.gz: 871c51f8b724882422047a358762bb3159937fcb
4
+ data.tar.gz: 6dfecfb0968982b307bdf49155a20c637b6d9adb
5
5
  SHA512:
6
- metadata.gz: 0490b5ffa632824523e681687d59a570b0c3caa5a20870ebaa07ce3409fbe47ffebf7cf3fcb11466f1d606558abe1e659b3077b96cd58bf974b379b8d72cc86a
7
- data.tar.gz: 053e6714be757739144b3ef773655a42c32a55af536af00433ea7d26194c41902068542869ba5c69174be313aa33c3913f4c4641edbabe10f12a24230f607564
6
+ metadata.gz: 91a98c6c032b8ec9989ad97db908fd576f5560968943998388169759a4212e0fb68677659e9e7debf589a21ea3404a6058a68d510ee6b481bd449a719d352f1b
7
+ data.tar.gz: 662a7d6b9eef279e3d30432798a889b67a92981f8849d350701aaa74acfab9175430f8430fa8459b727a103f2d6d05e33a52d10d859d9ccf4e326c62592c75c2
@@ -7,9 +7,17 @@ AllCops:
7
7
  DisplayCopNames: true
8
8
  TargetRubyVersion: 2.2
9
9
 
10
+ Style/ClassAndModuleCamelCase:
11
+ Exclude:
12
+ - lib/**/v*_*
13
+ - lib/**/v*_*/**/*
14
+
10
15
  Metrics/LineLength:
11
16
  Max: 120
12
17
 
18
+ Style/Documentation:
19
+ Enabled: false
20
+
13
21
  Style/SignalException:
14
22
  EnforcedStyle: only_raise
15
23
 
@@ -4,12 +4,59 @@
4
4
  # See http://pandoc.org/scripting.html
5
5
  # and https://github.com/jgm/pandocfilters
6
6
  # for more information.
7
+ require "open3"
7
8
 
8
9
  module PandocObjectFilters
9
- autoload :Element, "pandoc_object_filters/element"
10
- autoload :Filter, "pandoc_object_filters/filter"
11
- autoload :VERSION, "pandoc_object_filters/version"
12
- autoload :Walker, "pandoc_object_filters/walker"
10
+ # NOTE: The version refers to the pandoc-types version, not the pandoc version
11
+ autoload :V1_16, "pandoc_object_filters/v1_16"
12
+ autoload :V1_17, "pandoc_object_filters/v1_17"
13
+
14
+ autoload :ElementHelper, "pandoc_object_filters/element_helper"
15
+ autoload :Filter, "pandoc_object_filters/filter"
16
+ autoload :VERSION, "pandoc_object_filters/version"
17
+ autoload :Walker, "pandoc_object_filters/walker"
18
+
19
+ def self.current_pandoc_version
20
+ @current_pandoc_version ||=
21
+ begin
22
+ result, status = Open3.capture2(ENV.fetch("PANDOC_EXE", "pandoc"), "-v")
23
+
24
+ unless status.success?
25
+ raise "Cannot determine Pandoc version! " \
26
+ "You may point to a valid Pandoc binary via a PANDOC_EXE environment variable."
27
+ end
28
+
29
+ type_version = result[/pandoc-types (\d+\.\d+)(?:\.\d+)*/, 1]
30
+ type_version = type_version.to_f if type_version
31
+
32
+ unless type_version
33
+ version = result[/pandoc (\d+\.\d+)(?:\.\d+)*/, 1]
34
+ version = version.to_f if version
35
+
36
+ if version < 1.16
37
+ raise "Pandoc is too old for pandoc_object_filters: #{version}"
38
+ elsif version < 1.18
39
+ type_version = 1.16
40
+ elsif version < 1.19
41
+ type_version = 1.17
42
+ else
43
+ raise "Pandoc is too new for this version of pandoc_object_filters: #{version}"
44
+ end
45
+ end
46
+
47
+ if type_version < 1.16
48
+ raise "Pandoc types is too old for pandoc_object_filters: #{version}"
49
+ elsif type_version < 1.17
50
+ PandocObjectFilters::V1_16
51
+ elsif type_version < 1.18
52
+ PandocObjectFilters::V1_17
53
+ else
54
+ raise "Pandoc types is too new for this version of pandoc_object_filters: #{version}"
55
+ end
56
+ end
57
+ end
58
+
59
+ Element = current_pandoc_version::Element
13
60
 
14
61
  def self.filter(input = $stdin, output = $stdout, argv = ARGV, &block)
15
62
  PandocObjectFilters::Filter.new(input, output, argv, &block).filter
@@ -0,0 +1,106 @@
1
+ require "pandoc_object_filters"
2
+
3
+ module PandocObjectFilters
4
+ module ElementHelper
5
+ attr_reader :version
6
+
7
+ def version=(value)
8
+ raise "The version is already defined!" if @version
9
+ @version = value
10
+ end
11
+
12
+ def autoload_elements(*elements)
13
+ raise "autoload_elements can only be called once!" if @autoloaded_elements
14
+ @autoloaded_elements = true
15
+ elements.each do |element|
16
+ version_dir = version.name.split("::").last.downcase
17
+ element_path = element.to_s.gsub(/(\w)([A-Z])/, "\\1_\\2").downcase
18
+ autoload element, "pandoc_object_filters/#{version_dir}/element/#{element_path}"
19
+ end
20
+ end
21
+
22
+ def to_ast(object)
23
+ if object.respond_to?(:to_ast)
24
+ object.to_ast
25
+ elsif object.is_a?(Array)
26
+ object.map { |x| to_ast(x) }
27
+ elsif object.is_a?(Hash)
28
+ result = {}
29
+ object.each { |key, value| result[key] = to_ast(value) }
30
+ result
31
+ else
32
+ object
33
+ end
34
+ end
35
+
36
+ def to_object(object)
37
+ if object.is_a?(Array)
38
+ object.map { |x| to_object(x) }
39
+ elsif object.is_a?(Hash) && object.include?("t")
40
+ raise "Unknown type: #{object['t']}" unless PandocObjectFilters::Element.const_defined?(object["t"])
41
+ type = PandocObjectFilters::Element.const_get(object["t"])
42
+ raise "Invalid type: #{object['t']}" unless type < PandocObjectFilters::Element::BaseElement
43
+ type.new(to_object(object["c"]))
44
+ elsif object.is_a?(Hash) && object.include?("unMeta")
45
+ PandocObjectFilters::Element::Meta.new(to_object(object["unMeta"]))
46
+ elsif object.is_a?(Hash)
47
+ result = {}
48
+ object.each { |key, value| result[key] = to_object(value) }
49
+ result
50
+ else
51
+ object
52
+ end
53
+ end
54
+
55
+ def walk(object, &block)
56
+ PandocObjectFilters::Walker.new(object, &block).walk
57
+ end
58
+
59
+ def walk!(object, &block)
60
+ PandocObjectFilters::Walker.new(object, &block).walk!
61
+ end
62
+
63
+ def define_elements(*definitions)
64
+ raise "define_elements can only be called once!" if @defined_elements
65
+ @defined_elements = true
66
+ definitions.each do |name, *params|
67
+ name.freeze
68
+
69
+ options =
70
+ if params.last.is_a?(Hash)
71
+ params.pop
72
+ else
73
+ {}
74
+ end
75
+
76
+ const_set(name, Class.new(version::Element::BaseElement) do
77
+ (options[:include] || []).each { |mod| include mod }
78
+
79
+ if params.size == 1
80
+ contents_attr params.first
81
+ else
82
+ params.each_with_index { |param, index| contents_attr param, index }
83
+ end
84
+
85
+ define_method(:element_name) { name }
86
+
87
+ if options[:conversions]
88
+ private
89
+
90
+ define_method(:convert_contents) do
91
+ @contents = @contents.map.with_index do |x, index|
92
+ convert_to_type = options[:conversions][params[index]]
93
+
94
+ if convert_to_type && !x.is_a?(convert_to_type)
95
+ convert_to_type.new(x)
96
+ else
97
+ x
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end)
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,9 @@
1
+ module PandocObjectFilters
2
+ module V1_16
3
+ autoload :Element, "pandoc_object_filters/v1_16/element"
4
+
5
+ def self.to_s
6
+ "1.16"
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,62 @@
1
+ require "pandoc_object_filters"
2
+
3
+ module PandocObjectFilters
4
+ module V1_16
5
+ module Element
6
+ extend PandocObjectFilters::ElementHelper
7
+ self.version = PandocObjectFilters::V1_16
8
+
9
+ autoload_elements :Attr,
10
+ :Base,
11
+ :BaseElement,
12
+ :Block,
13
+ :Document,
14
+ :Enum,
15
+ :Inline,
16
+ :Meta,
17
+ :MetaValue,
18
+ :Target
19
+
20
+ # rubocop:disable Metrics/LineLength
21
+ define_elements ["MetaMap", :elements, { include: [PandocObjectFilters::V1_16::Element::MetaValue, PandocObjectFilters::V1_16::Element::Enum] }],
22
+ ["MetaList", :elements, { include: [PandocObjectFilters::V1_16::Element::MetaValue, PandocObjectFilters::V1_16::Element::Enum] }],
23
+ ["MetaBool", :value, { include: [PandocObjectFilters::V1_16::Element::MetaValue] }],
24
+ ["MetaString", :value, { include: [PandocObjectFilters::V1_16::Element::MetaValue] }],
25
+ ["MetaInlines", :elements, { include: [PandocObjectFilters::V1_16::Element::MetaValue, PandocObjectFilters::V1_16::Element::Enum] }],
26
+ ["MetaBlocks", :elements, { include: [PandocObjectFilters::V1_16::Element::MetaValue, PandocObjectFilters::V1_16::Element::Enum] }],
27
+ ["Plain", :elements, { include: [PandocObjectFilters::V1_16::Element::Block, PandocObjectFilters::V1_16::Element::Enum] }],
28
+ ["Para", :elements, { include: [PandocObjectFilters::V1_16::Element::Block, PandocObjectFilters::V1_16::Element::Enum] }],
29
+ ["CodeBlock", :attributes, :value, { include: [PandocObjectFilters::V1_16::Element::Block], conversions: { attributes: PandocObjectFilters::V1_16::Element::Attr } }],
30
+ ["RawBlock", :format, :value, { include: [PandocObjectFilters::V1_16::Element::Block] }],
31
+ ["BlockQuote", :elements, { include: [PandocObjectFilters::V1_16::Element::Block, PandocObjectFilters::V1_16::Element::Enum] }],
32
+ ["OrderedList", :attributes, :elements, { include: [PandocObjectFilters::V1_16::Element::Block, PandocObjectFilters::V1_16::Element::Enum] }],
33
+ ["BulletList", :elements, { include: [PandocObjectFilters::V1_16::Element::Block, PandocObjectFilters::V1_16::Element::Enum] }],
34
+ ["DefinitionList", :elements, { include: [PandocObjectFilters::V1_16::Element::Block, PandocObjectFilters::V1_16::Element::Enum] }],
35
+ ["Header", :level, :attributes, :elements, { include: [PandocObjectFilters::V1_16::Element::Block, PandocObjectFilters::V1_16::Element::Enum], conversions: { attributes: PandocObjectFilters::V1_16::Element::Attr } }],
36
+ ["HorizontalRule", { include: [PandocObjectFilters::V1_16::Element::Block] }],
37
+ ["Table", :captions, :alignments, :widths, :headers, :rows, { include: [PandocObjectFilters::V1_16::Element::Block] }],
38
+ ["Div", :attributes, :elements, { include: [PandocObjectFilters::V1_16::Element::Block, PandocObjectFilters::V1_16::Element::Enum], conversions: { attributes: PandocObjectFilters::V1_16::Element::Attr } }],
39
+ ["Null", { include: [PandocObjectFilters::V1_16::Element::Block] }],
40
+ ["Str", :value, { include: [PandocObjectFilters::V1_16::Element::Inline] }],
41
+ ["Emph", :elements, { include: [PandocObjectFilters::V1_16::Element::Inline, PandocObjectFilters::V1_16::Element::Enum] }],
42
+ ["Strong", :elements, { include: [PandocObjectFilters::V1_16::Element::Inline, PandocObjectFilters::V1_16::Element::Enum] }],
43
+ ["Strikeout", :elements, { include: [PandocObjectFilters::V1_16::Element::Inline, PandocObjectFilters::V1_16::Element::Enum] }],
44
+ ["Superscript", :elements, { include: [PandocObjectFilters::V1_16::Element::Inline, PandocObjectFilters::V1_16::Element::Enum] }],
45
+ ["Subscript", :elements, { include: [PandocObjectFilters::V1_16::Element::Inline, PandocObjectFilters::V1_16::Element::Enum] }],
46
+ ["SmallCaps", :elements, { include: [PandocObjectFilters::V1_16::Element::Inline, PandocObjectFilters::V1_16::Element::Enum] }],
47
+ ["Quoted", :type, :elements, { include: [PandocObjectFilters::V1_16::Element::Inline, PandocObjectFilters::V1_16::Element::Enum] }],
48
+ ["Cite", :citations, :elements, { include: [PandocObjectFilters::V1_16::Element::Inline, PandocObjectFilters::V1_16::Element::Enum] }],
49
+ ["Code", :attributes, :value, { include: [PandocObjectFilters::V1_16::Element::Inline], conversions: { attributes: PandocObjectFilters::V1_16::Element::Attr } }],
50
+ ["Space", { include: [PandocObjectFilters::V1_16::Element::Inline] }],
51
+ ["SoftBreak", { include: [PandocObjectFilters::V1_16::Element::Inline] }],
52
+ ["LineBreak", { include: [PandocObjectFilters::V1_16::Element::Inline] }],
53
+ ["Math", :type, :value, { include: [PandocObjectFilters::V1_16::Element::Inline] }],
54
+ ["RawInline", :format, :value, { include: [PandocObjectFilters::V1_16::Element::Inline] }],
55
+ ["Link", :attributes, :elements, :target, { include: [PandocObjectFilters::V1_16::Element::Inline, PandocObjectFilters::V1_16::Element::Enum], conversions: { attributes: PandocObjectFilters::V1_16::Element::Attr, target: PandocObjectFilters::V1_16::Element::Target } }],
56
+ ["Image", :attributes, :elements, :target, { include: [PandocObjectFilters::V1_16::Element::Inline, PandocObjectFilters::V1_16::Element::Enum], conversions: { attributes: PandocObjectFilters::V1_16::Element::Attr, target: PandocObjectFilters::V1_16::Element::Target } }],
57
+ ["Note", :elements, { include: [PandocObjectFilters::V1_16::Element::Inline, PandocObjectFilters::V1_16::Element::Enum] }],
58
+ ["Span", :attributes, :elements, { include: [PandocObjectFilters::V1_16::Element::Inline, PandocObjectFilters::V1_16::Element::Enum], conversions: { attributes: PandocObjectFilters::V1_16::Element::Attr } }]
59
+ # rubocop:enable Metrics/LineLength
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,54 @@
1
+ require "pandoc_object_filters"
2
+
3
+ module PandocObjectFilters
4
+ module V1_16
5
+ module Element
6
+ class Attr < PandocObjectFilters::V1_16::Element::Base
7
+ module Behavior
8
+ def self.included(other)
9
+ other.contents_attr :identifier, 0
10
+ other.contents_attr :classes, 1
11
+ other.contents_attr :key_values, 2
12
+ other.extend ClassMethods
13
+ end
14
+
15
+ module ClassMethods
16
+ def build(options = {})
17
+ id = options.fetch(:identifier, "")
18
+ classes = options.fetch(:classes, [])
19
+ key_values = options.fetch(:key_values, [])
20
+
21
+ key_values = key_values.to_a if key_values.is_a?(Hash)
22
+
23
+ new([id, classes, key_values])
24
+ end
25
+ end
26
+
27
+ def [](key)
28
+ # NOTE: While this pseudo Hash implementations are inefficient, they
29
+ # guarantee any changes to key_values will be honored, which would be
30
+ # difficult if the key_values were cached in a Hash
31
+ result = key_values.find { |pair| pair.first == key } || []
32
+ result[1]
33
+ end
34
+
35
+ def []=(key, value)
36
+ found = key_values.find { |pair| pair.first == key }
37
+
38
+ if found
39
+ found[1] = value
40
+ else
41
+ key_values << [key, value]
42
+ end
43
+ end
44
+
45
+ def include?(key)
46
+ !!key_values.find { |pair| pair.first == key }
47
+ end
48
+ end
49
+
50
+ include Behavior
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,46 @@
1
+ require "pandoc_object_filters"
2
+
3
+ module PandocObjectFilters
4
+ module V1_16
5
+ module Element
6
+ class Base
7
+ attr_accessor :contents
8
+
9
+ def self.contents_attr(name, index = nil)
10
+ if index
11
+ define_method(name) { contents[index] }
12
+ define_method("#{name}=") { |value| contents[index] = value }
13
+ else
14
+ define_method(name) { contents }
15
+ define_method("#{name}=") { |value| @contents = value }
16
+ end
17
+ end
18
+
19
+ def initialize(contents = [])
20
+ @contents = contents
21
+ convert_contents if respond_to?(:convert_contents, true)
22
+ end
23
+
24
+ def to_ast
25
+ PandocObjectFilters::Element.to_ast(contents)
26
+ end
27
+
28
+ def inspect
29
+ to_ast.inspect
30
+ end
31
+
32
+ def ==(other)
33
+ self.class == other.class && contents == other.contents
34
+ end
35
+
36
+ def walk(&block)
37
+ PandocObjectFilters::Element.walk(self, &block)
38
+ end
39
+
40
+ def walk!(&block)
41
+ PandocObjectFilters::Element.walk!(self, &block)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,17 @@
1
+ require "pandoc_object_filters"
2
+
3
+ module PandocObjectFilters
4
+ module V1_16
5
+ module Element
6
+ class BaseElement < PandocObjectFilters::V1_16::Element::Base
7
+ module Behavior
8
+ def to_ast
9
+ { "t" => element_name, "c" => PandocObjectFilters::Element.to_ast(contents) }
10
+ end
11
+ end
12
+
13
+ include Behavior
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,8 +1,10 @@
1
1
  require "pandoc_object_filters"
2
2
 
3
3
  module PandocObjectFilters
4
- module Element
5
- module Block
4
+ module V1_16
5
+ module Element
6
+ module Block
7
+ end
6
8
  end
7
9
  end
8
10
  end
@@ -0,0 +1,25 @@
1
+ require "pandoc_object_filters"
2
+
3
+ module PandocObjectFilters
4
+ module V1_16
5
+ module Element
6
+ class Document < PandocObjectFilters::V1_16::Element::Base
7
+ module Behavior
8
+ attr_reader :meta
9
+
10
+ def initialize(ast)
11
+ object = PandocObjectFilters::Element.to_object(ast)
12
+ @meta = object[0]
13
+ @contents = object[1]
14
+ end
15
+
16
+ def to_ast
17
+ [meta.to_ast, PandocObjectFilters::Element.to_ast(contents)]
18
+ end
19
+ end
20
+
21
+ include Behavior
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,17 @@
1
+ require "pandoc_object_filters"
2
+
3
+ module PandocObjectFilters
4
+ module V1_16
5
+ module Element
6
+ module Enum
7
+ def [](key)
8
+ elements[key]
9
+ end
10
+
11
+ def []=(key, value)
12
+ elements[key] = value
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,8 +1,10 @@
1
1
  require "pandoc_object_filters"
2
2
 
3
3
  module PandocObjectFilters
4
- module Element
5
- module Inline
4
+ module V1_16
5
+ module Element
6
+ module Inline
7
+ end
6
8
  end
7
9
  end
8
10
  end
@@ -0,0 +1,20 @@
1
+ require "pandoc_object_filters"
2
+
3
+ module PandocObjectFilters
4
+ module V1_16
5
+ module Element
6
+ class Meta < PandocObjectFilters::V1_16::Element::Base
7
+ include PandocObjectFilters::V1_16::Element::Enum
8
+ alias elements contents
9
+
10
+ def initialize(contents = {})
11
+ super
12
+ end
13
+
14
+ def to_ast
15
+ { "unMeta" => PandocObjectFilters::Element.to_ast(contents) }
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,8 +1,10 @@
1
1
  require "pandoc_object_filters"
2
2
 
3
3
  module PandocObjectFilters
4
- module Element
5
- module MetaValue
4
+ module V1_16
5
+ module Element
6
+ module MetaValue
7
+ end
6
8
  end
7
9
  end
8
10
  end
@@ -0,0 +1,18 @@
1
+ require "pandoc_object_filters"
2
+
3
+ module PandocObjectFilters
4
+ module V1_16
5
+ module Element
6
+ class Target < PandocObjectFilters::V1_16::Element::Base
7
+ module Behavior
8
+ def self.included(other)
9
+ other.contents_attr :url, 0
10
+ other.contents_attr :title, 1
11
+ end
12
+ end
13
+
14
+ include Behavior
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,9 @@
1
+ module PandocObjectFilters
2
+ module V1_17
3
+ autoload :Element, "pandoc_object_filters/v1_17/element"
4
+
5
+ def self.to_s
6
+ "1.17"
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,63 @@
1
+ require "pandoc_object_filters"
2
+
3
+ module PandocObjectFilters
4
+ module V1_17
5
+ module Element
6
+ extend PandocObjectFilters::ElementHelper
7
+ self.version = PandocObjectFilters::V1_17
8
+
9
+ autoload_elements :Attr,
10
+ :Base,
11
+ :BaseElement,
12
+ :Block,
13
+ :Document,
14
+ :Enum,
15
+ :Inline,
16
+ :Leaf,
17
+ :Meta,
18
+ :MetaValue,
19
+ :Target
20
+
21
+ # rubocop:disable Metrics/LineLength
22
+ define_elements ["MetaMap", :elements, { include: [PandocObjectFilters::V1_17::Element::MetaValue, PandocObjectFilters::V1_17::Element::Enum] }],
23
+ ["MetaList", :elements, { include: [PandocObjectFilters::V1_17::Element::MetaValue, PandocObjectFilters::V1_17::Element::Enum] }],
24
+ ["MetaBool", :value, { include: [PandocObjectFilters::V1_17::Element::MetaValue] }],
25
+ ["MetaString", :value, { include: [PandocObjectFilters::V1_17::Element::MetaValue] }],
26
+ ["MetaInlines", :elements, { include: [PandocObjectFilters::V1_17::Element::MetaValue, PandocObjectFilters::V1_17::Element::Enum] }],
27
+ ["MetaBlocks", :elements, { include: [PandocObjectFilters::V1_17::Element::MetaValue, PandocObjectFilters::V1_17::Element::Enum] }],
28
+ ["Plain", :elements, { include: [PandocObjectFilters::V1_17::Element::Block, PandocObjectFilters::V1_17::Element::Enum] }],
29
+ ["Para", :elements, { include: [PandocObjectFilters::V1_17::Element::Block, PandocObjectFilters::V1_17::Element::Enum] }],
30
+ ["CodeBlock", :attributes, :value, { include: [PandocObjectFilters::V1_17::Element::Block], conversions: { attributes: PandocObjectFilters::V1_17::Element::Attr } }],
31
+ ["RawBlock", :format, :value, { include: [PandocObjectFilters::V1_17::Element::Block] }],
32
+ ["BlockQuote", :elements, { include: [PandocObjectFilters::V1_17::Element::Block, PandocObjectFilters::V1_17::Element::Enum] }],
33
+ ["OrderedList", :attributes, :elements, { include: [PandocObjectFilters::V1_17::Element::Block, PandocObjectFilters::V1_17::Element::Enum] }],
34
+ ["BulletList", :elements, { include: [PandocObjectFilters::V1_17::Element::Block, PandocObjectFilters::V1_17::Element::Enum] }],
35
+ ["DefinitionList", :elements, { include: [PandocObjectFilters::V1_17::Element::Block, PandocObjectFilters::V1_17::Element::Enum] }],
36
+ ["Header", :level, :attributes, :elements, { include: [PandocObjectFilters::V1_17::Element::Block, PandocObjectFilters::V1_17::Element::Enum], conversions: { attributes: PandocObjectFilters::V1_17::Element::Attr } }],
37
+ ["HorizontalRule", { include: [PandocObjectFilters::V1_17::Element::Block, PandocObjectFilters::V1_17::Element::Leaf] }],
38
+ ["Table", :captions, :alignments, :widths, :headers, :rows, { include: [PandocObjectFilters::V1_17::Element::Block] }],
39
+ ["Div", :attributes, :elements, { include: [PandocObjectFilters::V1_17::Element::Block, PandocObjectFilters::V1_17::Element::Enum], conversions: { attributes: PandocObjectFilters::V1_17::Element::Attr } }],
40
+ ["Null", { include: [PandocObjectFilters::V1_17::Element::Block, PandocObjectFilters::V1_17::Element::Leaf] }],
41
+ ["Str", :value, { include: [PandocObjectFilters::V1_17::Element::Inline] }],
42
+ ["Emph", :elements, { include: [PandocObjectFilters::V1_17::Element::Inline, PandocObjectFilters::V1_17::Element::Enum] }],
43
+ ["Strong", :elements, { include: [PandocObjectFilters::V1_17::Element::Inline, PandocObjectFilters::V1_17::Element::Enum] }],
44
+ ["Strikeout", :elements, { include: [PandocObjectFilters::V1_17::Element::Inline, PandocObjectFilters::V1_17::Element::Enum] }],
45
+ ["Superscript", :elements, { include: [PandocObjectFilters::V1_17::Element::Inline, PandocObjectFilters::V1_17::Element::Enum] }],
46
+ ["Subscript", :elements, { include: [PandocObjectFilters::V1_17::Element::Inline, PandocObjectFilters::V1_17::Element::Enum] }],
47
+ ["SmallCaps", :elements, { include: [PandocObjectFilters::V1_17::Element::Inline, PandocObjectFilters::V1_17::Element::Enum] }],
48
+ ["Quoted", :type, :elements, { include: [PandocObjectFilters::V1_17::Element::Inline, PandocObjectFilters::V1_17::Element::Enum] }],
49
+ ["Cite", :citations, :elements, { include: [PandocObjectFilters::V1_17::Element::Inline, PandocObjectFilters::V1_17::Element::Enum] }],
50
+ ["Code", :attributes, :value, { include: [PandocObjectFilters::V1_17::Element::Inline], conversions: { attributes: PandocObjectFilters::V1_17::Element::Attr } }],
51
+ ["Space", { include: [PandocObjectFilters::V1_17::Element::Inline, PandocObjectFilters::V1_17::Element::Leaf] }],
52
+ ["SoftBreak", { include: [PandocObjectFilters::V1_17::Element::Inline, PandocObjectFilters::V1_17::Element::Leaf] }],
53
+ ["LineBreak", { include: [PandocObjectFilters::V1_17::Element::Inline, PandocObjectFilters::V1_17::Element::Leaf] }],
54
+ ["Math", :type, :value, { include: [PandocObjectFilters::V1_17::Element::Inline] }],
55
+ ["RawInline", :format, :value, { include: [PandocObjectFilters::V1_17::Element::Inline] }],
56
+ ["Link", :attributes, :elements, :target, { include: [PandocObjectFilters::V1_17::Element::Inline, PandocObjectFilters::V1_17::Element::Enum], conversions: { attributes: PandocObjectFilters::V1_17::Element::Attr, target: PandocObjectFilters::V1_17::Element::Target } }],
57
+ ["Image", :attributes, :elements, :target, { include: [PandocObjectFilters::V1_17::Element::Inline, PandocObjectFilters::V1_17::Element::Enum], conversions: { attributes: PandocObjectFilters::V1_17::Element::Attr, target: PandocObjectFilters::V1_17::Element::Target } }],
58
+ ["Note", :elements, { include: [PandocObjectFilters::V1_17::Element::Inline, PandocObjectFilters::V1_17::Element::Enum] }],
59
+ ["Span", :attributes, :elements, { include: [PandocObjectFilters::V1_17::Element::Inline, PandocObjectFilters::V1_17::Element::Enum], conversions: { attributes: PandocObjectFilters::V1_17::Element::Attr } }]
60
+ # rubocop:enable Metrics/LineLength
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,11 @@
1
+ require "pandoc_object_filters"
2
+
3
+ module PandocObjectFilters
4
+ module V1_17
5
+ module Element
6
+ class Attr < PandocObjectFilters::V1_17::Element::Base
7
+ include PandocObjectFilters::V1_16::Element::Attr::Behavior
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ require "pandoc_object_filters"
2
+
3
+ module PandocObjectFilters
4
+ module V1_17
5
+ module Element
6
+ class Base < PandocObjectFilters::V1_16::Element::Base
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ require "pandoc_object_filters"
2
+
3
+ module PandocObjectFilters
4
+ module V1_17
5
+ module Element
6
+ class BaseElement < PandocObjectFilters::V1_17::Element::Base
7
+ include PandocObjectFilters::V1_16::Element::BaseElement::Behavior
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ require "pandoc_object_filters"
2
+
3
+ module PandocObjectFilters
4
+ module V1_17
5
+ module Element
6
+ module Block
7
+ include PandocObjectFilters::V1_16::Element::Block
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,28 @@
1
+ require "pandoc_object_filters"
2
+
3
+ module PandocObjectFilters
4
+ module V1_17
5
+ module Element
6
+ class Document < PandocObjectFilters::V1_17::Element::Base
7
+ include PandocObjectFilters::V1_16::Element::Document::Behavior
8
+ attr_reader :pandoc_api_version
9
+
10
+ def initialize(ast)
11
+ object = PandocObjectFilters::Element.to_object(ast)
12
+ meta_object = PandocObjectFilters::Element.to_object(object["meta"])
13
+ @meta = PandocObjectFilters::Element::Meta.new(meta_object)
14
+ @contents = object["blocks"]
15
+ @pandoc_api_version = object["pandoc-api-version"]
16
+ end
17
+
18
+ def to_ast
19
+ {
20
+ "blocks" => PandocObjectFilters::Element.to_ast(contents),
21
+ "meta" => PandocObjectFilters::Element.to_ast(meta),
22
+ "pandoc-api-version" => pandoc_api_version
23
+ }
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,11 @@
1
+ require "pandoc_object_filters"
2
+
3
+ module PandocObjectFilters
4
+ module V1_17
5
+ module Element
6
+ module Enum
7
+ include PandocObjectFilters::V1_16::Element::Enum
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ require "pandoc_object_filters"
2
+
3
+ module PandocObjectFilters
4
+ module V1_17
5
+ module Element
6
+ module Inline
7
+ include PandocObjectFilters::V1_16::Element::Inline
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,17 @@
1
+ require "pandoc_object_filters"
2
+
3
+ module PandocObjectFilters
4
+ module V1_17
5
+ module Element
6
+ module Leaf
7
+ def ==(other)
8
+ self.class == other.class
9
+ end
10
+
11
+ def to_ast
12
+ { "t" => element_name }
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,20 @@
1
+ require "pandoc_object_filters"
2
+
3
+ module PandocObjectFilters
4
+ module V1_17
5
+ module Element
6
+ class Meta < PandocObjectFilters::V1_17::Element::Base
7
+ include PandocObjectFilters::V1_17::Element::Enum
8
+ alias elements contents
9
+
10
+ def initialize(contents = {})
11
+ super
12
+ end
13
+
14
+ def to_ast
15
+ PandocObjectFilters::Element.to_ast(contents)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,11 @@
1
+ require "pandoc_object_filters"
2
+
3
+ module PandocObjectFilters
4
+ module V1_17
5
+ module Element
6
+ module MetaValue
7
+ include PandocObjectFilters::V1_16::Element::MetaValue
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ require "pandoc_object_filters"
2
+
3
+ module PandocObjectFilters
4
+ module V1_17
5
+ module Element
6
+ class Target < PandocObjectFilters::V1_17::Element::Base
7
+ include PandocObjectFilters::V1_16::Element::Target::Behavior
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,3 +1,3 @@
1
1
  module PandocObjectFilters
2
- VERSION = "0.1.0".freeze
2
+ VERSION = "0.2.0".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pandoc_object_filters
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Virata-Stone
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-10-10 00:00:00.000000000 Z
11
+ date: 2016-11-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -96,18 +96,33 @@ files:
96
96
  - examples/metavars-sample.md
97
97
  - examples/metavars.rb
98
98
  - lib/pandoc_object_filters.rb
99
- - lib/pandoc_object_filters/element.rb
100
- - lib/pandoc_object_filters/element/attr.rb
101
- - lib/pandoc_object_filters/element/base.rb
102
- - lib/pandoc_object_filters/element/base_element.rb
103
- - lib/pandoc_object_filters/element/block.rb
104
- - lib/pandoc_object_filters/element/document.rb
105
- - lib/pandoc_object_filters/element/enum.rb
106
- - lib/pandoc_object_filters/element/inline.rb
107
- - lib/pandoc_object_filters/element/meta.rb
108
- - lib/pandoc_object_filters/element/meta_value.rb
109
- - lib/pandoc_object_filters/element/target.rb
99
+ - lib/pandoc_object_filters/element_helper.rb
110
100
  - lib/pandoc_object_filters/filter.rb
101
+ - lib/pandoc_object_filters/v1_16.rb
102
+ - lib/pandoc_object_filters/v1_16/element.rb
103
+ - lib/pandoc_object_filters/v1_16/element/attr.rb
104
+ - lib/pandoc_object_filters/v1_16/element/base.rb
105
+ - lib/pandoc_object_filters/v1_16/element/base_element.rb
106
+ - lib/pandoc_object_filters/v1_16/element/block.rb
107
+ - lib/pandoc_object_filters/v1_16/element/document.rb
108
+ - lib/pandoc_object_filters/v1_16/element/enum.rb
109
+ - lib/pandoc_object_filters/v1_16/element/inline.rb
110
+ - lib/pandoc_object_filters/v1_16/element/meta.rb
111
+ - lib/pandoc_object_filters/v1_16/element/meta_value.rb
112
+ - lib/pandoc_object_filters/v1_16/element/target.rb
113
+ - lib/pandoc_object_filters/v1_17.rb
114
+ - lib/pandoc_object_filters/v1_17/element.rb
115
+ - lib/pandoc_object_filters/v1_17/element/attr.rb
116
+ - lib/pandoc_object_filters/v1_17/element/base.rb
117
+ - lib/pandoc_object_filters/v1_17/element/base_element.rb
118
+ - lib/pandoc_object_filters/v1_17/element/block.rb
119
+ - lib/pandoc_object_filters/v1_17/element/document.rb
120
+ - lib/pandoc_object_filters/v1_17/element/enum.rb
121
+ - lib/pandoc_object_filters/v1_17/element/inline.rb
122
+ - lib/pandoc_object_filters/v1_17/element/leaf.rb
123
+ - lib/pandoc_object_filters/v1_17/element/meta.rb
124
+ - lib/pandoc_object_filters/v1_17/element/meta_value.rb
125
+ - lib/pandoc_object_filters/v1_17/element/target.rb
111
126
  - lib/pandoc_object_filters/version.rb
112
127
  - lib/pandoc_object_filters/walker.rb
113
128
  - pandoc_object_filters.gemspec
@@ -131,7 +146,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
131
146
  version: '0'
132
147
  requirements: []
133
148
  rubyforge_project:
134
- rubygems_version: 2.4.8
149
+ rubygems_version: 2.5.1
135
150
  signing_key:
136
151
  specification_version: 4
137
152
  summary: A library for object based pandoc filters.
@@ -1,135 +0,0 @@
1
- require "pandoc_object_filters"
2
-
3
- module PandocObjectFilters
4
- module Element
5
- autoload :Attr, "pandoc_object_filters/element/attr"
6
- autoload :Base, "pandoc_object_filters/element/base"
7
- autoload :BaseElement, "pandoc_object_filters/element/base_element"
8
- autoload :Block, "pandoc_object_filters/element/block"
9
- autoload :Document, "pandoc_object_filters/element/document"
10
- autoload :Enum, "pandoc_object_filters/element/enum"
11
- autoload :Inline, "pandoc_object_filters/element/inline"
12
- autoload :Meta, "pandoc_object_filters/element/meta"
13
- autoload :MetaValue, "pandoc_object_filters/element/meta_value"
14
- autoload :Target, "pandoc_object_filters/element/target"
15
-
16
- def self.to_ast(object)
17
- if object.respond_to?(:to_ast)
18
- object.to_ast
19
- elsif object.is_a?(Array)
20
- object.map { |x| to_ast(x) }
21
- elsif object.is_a?(Hash)
22
- result = {}
23
- object.each { |key, value| result[key] = to_ast(value) }
24
- result
25
- else
26
- object
27
- end
28
- end
29
-
30
- def self.to_object(object)
31
- if object.is_a?(Array)
32
- object.map { |x| to_object(x) }
33
- elsif object.is_a?(Hash) && object.include?("t") && object.include?("c")
34
- raise "Unknown type: #{object['t']}" unless PandocObjectFilters::Element.const_defined?(object["t"])
35
- type = PandocObjectFilters::Element.const_get(object["t"])
36
- raise "Invalid type: #{object['t']}" unless type < PandocObjectFilters::Element::BaseElement
37
- type.new(to_object(object["c"]))
38
- elsif object.is_a?(Hash) && object.include?("unMeta")
39
- PandocObjectFilters::Element::Meta.new(to_object(object["unMeta"]))
40
- elsif object.is_a?(Hash)
41
- result = {}
42
- object.each { |key, value| result[key] = to_object(value) }
43
- result
44
- else
45
- object
46
- end
47
- end
48
-
49
- def self.walk(object, &block)
50
- PandocObjectFilters::Walker.new(object, &block).walk
51
- end
52
-
53
- def self.walk!(object, &block)
54
- PandocObjectFilters::Walker.new(object, &block).walk!
55
- end
56
-
57
- # rubocop:disable Metrics/LineLength
58
- [["MetaMap", :elements, { include: [PandocObjectFilters::Element::MetaValue, PandocObjectFilters::Element::Enum] }],
59
- ["MetaList", :elements, { include: [PandocObjectFilters::Element::MetaValue, PandocObjectFilters::Element::Enum] }],
60
- ["MetaBool", :value, { include: [PandocObjectFilters::Element::MetaValue] }],
61
- ["MetaString", :value, { include: [PandocObjectFilters::Element::MetaValue] }],
62
- ["MetaInlines", :elements, { include: [PandocObjectFilters::Element::MetaValue, PandocObjectFilters::Element::Enum] }],
63
- ["MetaBlocks", :elements, { include: [PandocObjectFilters::Element::MetaValue, PandocObjectFilters::Element::Enum] }],
64
- ["Plain", :elements, { include: [PandocObjectFilters::Element::Block, PandocObjectFilters::Element::Enum] }],
65
- ["Para", :elements, { include: [PandocObjectFilters::Element::Block, PandocObjectFilters::Element::Enum] }],
66
- ["CodeBlock", :attributes, :value, { include: [PandocObjectFilters::Element::Block], conversions: { attributes: PandocObjectFilters::Element::Attr } }],
67
- ["RawBlock", :format, :value, { include: [PandocObjectFilters::Element::Block] }],
68
- ["BlockQuote", :elements, { include: [PandocObjectFilters::Element::Block, PandocObjectFilters::Element::Enum] }],
69
- ["OrderedList", :attributes, :elements, { include: [PandocObjectFilters::Element::Block, PandocObjectFilters::Element::Enum] }],
70
- ["BulletList", :elements, { include: [PandocObjectFilters::Element::Block, PandocObjectFilters::Element::Enum] }],
71
- ["DefinitionList", :elements, { include: [PandocObjectFilters::Element::Block, PandocObjectFilters::Element::Enum] }],
72
- ["Header", :level, :attributes, :elements, { include: [PandocObjectFilters::Element::Block, PandocObjectFilters::Element::Enum], conversions: { attributes: PandocObjectFilters::Element::Attr } }],
73
- ["HorizontalRule", { include: [PandocObjectFilters::Element::Block] }],
74
- ["Table", :captions, :alignments, :widths, :headers, :rows, { include: [PandocObjectFilters::Element::Block] }],
75
- ["Div", :attributes, :elements, { include: [PandocObjectFilters::Element::Block, PandocObjectFilters::Element::Enum], conversions: { attributes: PandocObjectFilters::Element::Attr } }],
76
- ["Null", { include: [PandocObjectFilters::Element::Block] }],
77
- ["Str", :value, { include: [PandocObjectFilters::Element::Inline] }],
78
- ["Emph", :elements, { include: [PandocObjectFilters::Element::Inline, PandocObjectFilters::Element::Enum] }],
79
- ["Strong", :elements, { include: [PandocObjectFilters::Element::Inline, PandocObjectFilters::Element::Enum] }],
80
- ["Strikeout", :elements, { include: [PandocObjectFilters::Element::Inline, PandocObjectFilters::Element::Enum] }],
81
- ["Superscript", :elements, { include: [PandocObjectFilters::Element::Inline, PandocObjectFilters::Element::Enum] }],
82
- ["Subscript", :elements, { include: [PandocObjectFilters::Element::Inline, PandocObjectFilters::Element::Enum] }],
83
- ["SmallCaps", :elements, { include: [PandocObjectFilters::Element::Inline, PandocObjectFilters::Element::Enum] }],
84
- ["Quoted", :type, :elements, { include: [PandocObjectFilters::Element::Inline, PandocObjectFilters::Element::Enum] }],
85
- ["Cite", :citations, :elements, { include: [PandocObjectFilters::Element::Inline, PandocObjectFilters::Element::Enum] }],
86
- ["Code", :attributes, :value, { include: [PandocObjectFilters::Element::Inline], conversions: { attributes: PandocObjectFilters::Element::Attr } }],
87
- ["Space", { include: [PandocObjectFilters::Element::Inline] }],
88
- ["SoftBreak", { include: [PandocObjectFilters::Element::Inline] }],
89
- ["LineBreak", { include: [PandocObjectFilters::Element::Inline] }],
90
- ["Math", :type, :value, { include: [PandocObjectFilters::Element::Inline] }],
91
- ["RawInline", :format, :value, { include: [PandocObjectFilters::Element::Inline] }],
92
- ["Link", :attributes, :elements, :target, { include: [PandocObjectFilters::Element::Inline, PandocObjectFilters::Element::Enum], conversions: { attributes: PandocObjectFilters::Element::Attr, target: PandocObjectFilters::Element::Target } }],
93
- ["Image", :attributes, :elements, :target, { include: [PandocObjectFilters::Element::Inline, PandocObjectFilters::Element::Enum], conversions: { attributes: PandocObjectFilters::Element::Attr, target: PandocObjectFilters::Element::Target } }],
94
- ["Note", :elements, { include: [PandocObjectFilters::Element::Inline, PandocObjectFilters::Element::Enum] }],
95
- ["Span", :attributes, :elements, { include: [PandocObjectFilters::Element::Inline, PandocObjectFilters::Element::Enum], conversions: { attributes: PandocObjectFilters::Element::Attr } }]].each do |name, *params|
96
- # rubocop:enable Metrics/LineLength
97
- name.freeze
98
-
99
- options =
100
- if params.last.is_a?(Hash)
101
- params.pop
102
- else
103
- {}
104
- end
105
-
106
- const_set(name, Class.new(PandocObjectFilters::Element::BaseElement) do
107
- (options[:include] || []).each { |mod| include mod }
108
-
109
- if params.size == 1
110
- contents_attr params.first
111
- else
112
- params.each_with_index { |param, index| contents_attr param, index }
113
- end
114
-
115
- define_method(:element_name) { name }
116
-
117
- if options[:conversions]
118
- private
119
-
120
- define_method(:convert_contents) do
121
- @contents = @contents.map.with_index do |x, index|
122
- convert_to_type = options[:conversions][params[index]]
123
-
124
- if convert_to_type && !x.is_a?(convert_to_type)
125
- convert_to_type.new(x)
126
- else
127
- x
128
- end
129
- end
130
- end
131
- end
132
- end)
133
- end
134
- end
135
- end
@@ -1,43 +0,0 @@
1
- require "pandoc_object_filters"
2
-
3
- module PandocObjectFilters
4
- module Element
5
- class Attr < PandocObjectFilters::Element::Base
6
- contents_attr :identifier, 0
7
- contents_attr :classes, 1
8
- contents_attr :key_values, 2
9
-
10
- def self.build(options = {})
11
- id = options.fetch(:identifier, "")
12
- classes = options.fetch(:classes, [])
13
- key_values = options.fetch(:key_values, [])
14
-
15
- key_values = key_values.to_a if key_values.is_a?(Hash)
16
-
17
- new([id, classes, key_values])
18
- end
19
-
20
- def [](key)
21
- # NOTE: While this pseudo Hash implementations are inefficient, they
22
- # guarantee any changes to key_values will be honored, which would be
23
- # difficult if the key_values were cached in a Hash
24
- result = key_values.find { |pair| pair.first == key } || []
25
- result[1]
26
- end
27
-
28
- def []=(key, value)
29
- found = key_values.find { |pair| pair.first == key }
30
-
31
- if found
32
- found[1] = value
33
- else
34
- key_values << [key, value]
35
- end
36
- end
37
-
38
- def include?(key)
39
- !!key_values.find { |pair| pair.first == key }
40
- end
41
- end
42
- end
43
- end
@@ -1,44 +0,0 @@
1
- require "pandoc_object_filters"
2
-
3
- module PandocObjectFilters
4
- module Element
5
- class Base
6
- attr_accessor :contents
7
-
8
- def self.contents_attr(name, index = nil)
9
- if index
10
- define_method(name) { contents[index] }
11
- define_method("#{name}=") { |value| contents[index] = value }
12
- else
13
- define_method(name) { contents }
14
- define_method("#{name}=") { |value| @contents = value }
15
- end
16
- end
17
-
18
- def initialize(contents = [])
19
- @contents = contents
20
- convert_contents if respond_to?(:convert_contents, true)
21
- end
22
-
23
- def to_ast
24
- PandocObjectFilters::Element.to_ast(contents)
25
- end
26
-
27
- def inspect
28
- to_ast.inspect
29
- end
30
-
31
- def ==(other)
32
- self.class == other.class && contents == other.contents
33
- end
34
-
35
- def walk(&block)
36
- PandocObjectFilters::Element.walk(self, &block)
37
- end
38
-
39
- def walk!(&block)
40
- PandocObjectFilters::Element.walk!(self, &block)
41
- end
42
- end
43
- end
44
- end
@@ -1,11 +0,0 @@
1
- require "pandoc_object_filters"
2
-
3
- module PandocObjectFilters
4
- module Element
5
- class BaseElement < PandocObjectFilters::Element::Base
6
- def to_ast
7
- { "t" => element_name, "c" => PandocObjectFilters::Element.to_ast(contents) }
8
- end
9
- end
10
- end
11
- end
@@ -1,19 +0,0 @@
1
- require "pandoc_object_filters"
2
-
3
- module PandocObjectFilters
4
- module Element
5
- class Document < PandocObjectFilters::Element::Base
6
- attr_reader :meta
7
-
8
- def initialize(ast)
9
- object = PandocObjectFilters::Element.to_object(ast)
10
- @meta = object[0]
11
- @contents = object[1]
12
- end
13
-
14
- def to_ast
15
- [meta.to_ast, PandocObjectFilters::Element.to_ast(contents)]
16
- end
17
- end
18
- end
19
- end
@@ -1,15 +0,0 @@
1
- require "pandoc_object_filters"
2
-
3
- module PandocObjectFilters
4
- module Element
5
- module Enum
6
- def [](key)
7
- elements[key]
8
- end
9
-
10
- def []=(key, value)
11
- elements[key] = value
12
- end
13
- end
14
- end
15
- end
@@ -1,18 +0,0 @@
1
- require "pandoc_object_filters"
2
-
3
- module PandocObjectFilters
4
- module Element
5
- class Meta < PandocObjectFilters::Element::Base
6
- include PandocObjectFilters::Element::Enum
7
- alias elements contents
8
-
9
- def initialize(contents = {})
10
- super
11
- end
12
-
13
- def to_ast
14
- { "unMeta" => PandocObjectFilters::Element.to_ast(contents) }
15
- end
16
- end
17
- end
18
- end
@@ -1,10 +0,0 @@
1
- require "pandoc_object_filters"
2
-
3
- module PandocObjectFilters
4
- module Element
5
- class Target < PandocObjectFilters::Element::Base
6
- contents_attr :url, 0
7
- contents_attr :title, 1
8
- end
9
- end
10
- end