spirit 0.2 → 0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +7 -0
  2. data/lib/spirit.rb +8 -10
  3. data/lib/spirit/constants.rb +17 -7
  4. data/lib/spirit/document.rb +4 -9
  5. data/lib/spirit/errors.rb +0 -1
  6. data/lib/spirit/logger.rb +5 -6
  7. data/lib/spirit/manifest.rb +4 -5
  8. data/lib/spirit/render.rb +0 -2
  9. data/lib/spirit/render/errors.rb +0 -4
  10. data/lib/spirit/render/html.rb +17 -117
  11. data/lib/spirit/render/processable.rb +78 -0
  12. data/lib/spirit/render/processors.rb +15 -0
  13. data/lib/spirit/render/processors/base.rb +40 -0
  14. data/lib/spirit/render/processors/block_image_processor.rb +49 -0
  15. data/lib/spirit/render/processors/headers_processor.rb +41 -0
  16. data/lib/spirit/render/processors/layout_processor.rb +28 -0
  17. data/lib/spirit/render/processors/math_processor.rb +102 -0
  18. data/lib/spirit/render/processors/problems_processor.rb +76 -0
  19. data/lib/spirit/render/processors/pygments_processor.rb +22 -0
  20. data/lib/spirit/render/processors/sanitize_processor.rb +86 -0
  21. data/lib/spirit/render/templates.rb +1 -3
  22. data/lib/spirit/render/templates/header.rb +2 -3
  23. data/lib/spirit/render/templates/image.rb +6 -13
  24. data/lib/spirit/render/templates/multi.rb +9 -10
  25. data/lib/spirit/render/templates/navigation.rb +4 -5
  26. data/lib/spirit/render/templates/problem.rb +24 -28
  27. data/lib/spirit/render/templates/short.rb +2 -3
  28. data/lib/spirit/render/templates/table.rb +2 -2
  29. data/lib/spirit/render/templates/template.rb +12 -8
  30. data/lib/spirit/version.rb +1 -2
  31. data/views/header.haml +1 -1
  32. data/views/img.haml +2 -2
  33. data/views/layout.haml +27 -0
  34. data/views/multi.haml +10 -14
  35. data/views/nav.haml +2 -2
  36. data/views/short.haml +6 -11
  37. data/views/table.haml +20 -26
  38. metadata +36 -57
  39. data/lib/spirit/render/sanitize.rb +0 -90
  40. data/views/exe.haml +0 -5
@@ -6,15 +6,14 @@ module Spirit
6
6
  # Renders multiple choice questions marked up in YAML as HTML.
7
7
  # @example
8
8
  #
9
- # {
10
- # "format": "multi",
11
- # "question": "How tall is Mount Everest?",
12
- # "answer": "A",
13
- # "options": {
14
- # "A": "452 inches",
15
- # "B": "8.85 kilometers"
16
- # }
17
- # }
9
+ # """
10
+ # format: multi
11
+ # question: How tall is Mount Everest?
12
+ # answer: A
13
+ # options:
14
+ # A: 452 inches
15
+ # B: 8.85 kilometers
16
+ # """
18
17
  class Multi < Problem
19
18
 
20
19
  # Required key in YAML markup. Associated value should be a dictionary of
@@ -22,7 +21,7 @@ module Spirit
22
21
  OPTIONS = 'options'
23
22
 
24
23
  # Name of template file for rendering multiple choice questions.
25
- TEMPLATE = 'multi.haml'
24
+ self.template = 'multi.haml'
26
25
 
27
26
  # Checks if the given yaml contains a valid MCQ.
28
27
  # @return [Boolean] true iff the yaml contains a valid MCQ.
@@ -1,4 +1,3 @@
1
- # ~*~ encoding: utf-8 ~*~
2
1
  module Spirit
3
2
 
4
3
  module Render
@@ -6,8 +5,10 @@ module Spirit
6
5
  # Keeps track of document sections and renders a navigation bar.
7
6
  class Navigation < Template
8
7
 
8
+ delegate :size, :count, to: :@sections
9
+
9
10
  # HAML template for navigation bar
10
- TEMPLATE = 'nav.haml'
11
+ self.template = 'nav.haml'
11
12
 
12
13
  # Creates a new navigation bar.
13
14
  def initialize
@@ -24,9 +25,7 @@ module Spirit
24
25
 
25
26
  # Renders the navigation bar in HTML.
26
27
  def render(locals={})
27
- # FIXME disabled for now
28
- ''
29
- # super locals.merge(sections: @sections)
28
+ super locals.merge(sections: @sections)
30
29
  end
31
30
 
32
31
  end
@@ -1,5 +1,6 @@
1
- # ~*~ encoding: utf-8 ~*~
1
+ require 'active_support/core_ext/class/attribute'
2
2
  require 'spirit/constants'
3
+
3
4
  module Spirit
4
5
 
5
6
  module Render
@@ -18,14 +19,15 @@ module Spirit
18
19
  # Required key in YAML markup. Value contains answers.
19
20
  ANSWER = 'answer'
20
21
 
21
- # Optional key in YAML markup. Value contains problem ID.
22
+ # Generated ID.
22
23
  ID = 'id'
23
24
 
24
25
  # Required keys.
25
26
  KEYS = [FORMAT, QUESTION, ANSWER]
26
27
 
27
28
  # Stateless markdown renderer.
28
- MARKDOWN = ::Redcarpet::Markdown.new(::Redcarpet::Render::HTML, MARKDOWN_EXTENSIONS)
29
+ class_attribute :markdown
30
+ self.markdown = ::Redcarpet::Markdown.new(::Redcarpet::Render::HTML, MARKDOWN_EXTENSIONS)
29
31
 
30
32
  class << self
31
33
 
@@ -35,8 +37,9 @@ module Spirit
35
37
  # @param [String] text embedded yaml
36
38
  # @return [Problem] problem
37
39
  def parse(text)
38
- yaml = YAML.load text
39
- get_instance(yaml)
40
+ digest = OpenSSL::Digest::SHA256.digest text
41
+ yaml = YAML.load text
42
+ get_instance(yaml, digest)
40
43
  rescue ::Psych::SyntaxError => e
41
44
  raise RenderError, e.message
42
45
  end
@@ -49,49 +52,42 @@ module Spirit
49
52
  end
50
53
 
51
54
  # @return [Problem] problem
52
- def get_instance(yaml)
53
- raise RenderError, "Missing 'format' key in given YAML" unless instantiable? yaml
54
- klass = Spirit::Render.const_get(yaml[FORMAT].capitalize)
55
+ def get_instance(hash, digest)
56
+ raise RenderError, "Missing 'format' key in given YAML" unless instantiable? hash
57
+ klass = Spirit::Render.const_get(hash[FORMAT].capitalize)
55
58
  raise NameError unless klass < Problem
56
- klass.new(yaml)
59
+ klass.new(hash, digest)
57
60
  rescue NameError
58
- raise RenderError, 'Unrecognized format: %p' % yaml[FORMAT]
61
+ raise RenderError, 'Unrecognized format: %p' % hash[FORMAT]
59
62
  end
60
63
 
61
64
  private
62
65
 
63
- def instantiable?(yaml)
64
- yaml.is_a?(Hash) and yaml.has_key?(FORMAT)
66
+ def instantiable?(hash)
67
+ hash.is_a?(Hash) and hash.has_key?(FORMAT)
65
68
  end
66
69
 
67
70
  end
68
71
 
69
- accessor ID, *KEYS
72
+ accessor *KEYS
73
+ attr_accessor :nesting, :id
74
+ attr_reader :digest
70
75
 
71
76
  # Creates a new problem from the given YAML.
72
77
  # @param [Hash] yaml parsed yaml object
73
- def initialize(yaml)
74
- @yaml = yaml
75
- @yaml[ID] ||= SecureRandom.uuid
78
+ # @param [String] digest SHA-256 hash of yaml text
79
+ # @param [Fixnum] id integer ID of question
80
+ def initialize(yaml, digest)
81
+ @yaml, @digest, @nesting, @id = yaml, digest, [], 0
76
82
  raise RenderError.new('Invalid problem.') unless @yaml[QUESTION].is_a? String
77
- @yaml[QUESTION] = MARKDOWN.render @yaml[QUESTION]
83
+ @yaml[QUESTION] = markdown.render @yaml[QUESTION]
78
84
  end
79
85
 
80
86
  # @todo TODO should probably show some error message in the preview,
81
87
  # so that the author doesn't have to read the logs.
82
88
  def render(locals={})
83
89
  raise RenderError.new('Invalid problem.') unless valid?
84
- yaml = @yaml.merge(locals)
85
- super yaml
86
- end
87
-
88
- # Saves the answer to a file on disk.
89
- # @todo TODO should probably show some error message in the preview,
90
- # so that the author doesn't have to read the logs.
91
- def save!(name)
92
- raise RenderError.new('Invalid problem.') unless valid?
93
- solution = File.join(Spirit::SOLUTION_DIR, id + Spirit::SOLUTION_EXT)
94
- File.open(solution, 'wb+') { |file| Marshal.dump answer, file }
90
+ super @yaml.merge(locals)
95
91
  end
96
92
 
97
93
  # Retrieves the answer from the given YAML object in a serializable form.
@@ -13,13 +13,12 @@ module Spirit
13
13
  class Short < Problem
14
14
 
15
15
  # Name of template file for rendering short answer questions.
16
- TEMPLATE = 'short.haml'
16
+ self.template = 'short.haml'
17
17
 
18
18
  # Checks if the given yaml contains a valid MCQ.
19
19
  # @return [Boolean] true iff the yaml contains a valid MCQ.
20
20
  def valid?
21
- super and
22
- not @yaml[ANSWER].nil?
21
+ super and not @yaml[ANSWER].nil?
23
22
  end
24
23
 
25
24
  end
@@ -23,7 +23,7 @@ module Spirit
23
23
  class Table < Problem
24
24
 
25
25
  # Name of template file for rendering table problems.
26
- TEMPLATE = 'table.haml'
26
+ self.template = 'table.haml'
27
27
 
28
28
  # Optional headings key.
29
29
  HEADINGS = 'headings'
@@ -37,7 +37,7 @@ module Spirit
37
37
  accessor HEADINGS, GRID
38
38
 
39
39
  # Ensures that the +headings+ key exists.
40
- def initialize(yaml)
40
+ def initialize(yaml, digest)
41
41
  yaml[HEADINGS] ||= nil
42
42
  super
43
43
  end
@@ -1,28 +1,32 @@
1
- # ~*~ encoding: utf-8 ~*~
1
+ require 'active_support/core_ext/class/attribute'
2
+ require 'spirit/constants'
2
3
  module Spirit
3
4
 
4
5
  module Render
5
6
 
6
- # Base class for all templates. Child classes should provide a +TEMPLATE+
7
- # string constant that contains the path to the relevant HAML file.
7
+ # Base class for all templates. Class classes should override the
8
+ # +template+ class attribute.
8
9
  class Template
9
10
 
11
+ class_attribute :template
12
+
10
13
  # Renders the given problem using {#view}.
11
14
  # @param [Hash] locals local variables to pass to the template
12
15
  def render(locals={})
13
- view.render Object.new, locals
16
+ view.render self, locals
14
17
  end
15
18
 
16
19
  private
17
20
 
18
21
  # Retrieves the +view+ singleton. If it is nil, initializes it from
19
- # +self.class.TEMPLATE+. Note that this is reloaded with every refresh so
20
- # I can edit the templates without refreshing.
22
+ # +self.template+. Note that this is reloaded with every refresh so I can
23
+ # edit the templates without restarting.
24
+ # @todo TODO optimize by reusing the HAML engine
21
25
  # @return [Haml::Engine] haml engine
22
26
  def view
23
27
  return @view unless @view.nil?
24
- file = File.join Spirit::VIEWS, self.class::TEMPLATE
25
- @view = Haml::Engine.new(File.read file, escape_html: true, format: :html5)
28
+ file = File.join VIEWS, self.template
29
+ @view = Haml::Engine.new File.read(file), HAML_CONFIG
26
30
  end
27
31
 
28
32
  end
@@ -1,4 +1,3 @@
1
- # ~*~ encoding: utf-8 ~*~
2
1
  module Spirit
3
- VERSION = '0.2'
2
+ VERSION = '0.5'
4
3
  end
@@ -2,4 +2,4 @@
2
2
  -haml_tag ('h%d' % level).to_sym do
3
3
  %a.anchor{name: name, href: '#' + name, 'data-magellan-destination' => name}
4
4
  %i.foundicon-paper-clip
5
- = text
5
+ != text
@@ -1,6 +1,6 @@
1
1
  -# coding: UTF-8
2
2
  .block-image
3
- = img
3
+ != img
4
4
  %p
5
5
  %strong Figure #{index}:
6
- = caption
6
+ != caption
@@ -0,0 +1,27 @@
1
+ -# coding: UTF-8
2
+ != navigation.render
3
+ .row
4
+ .large-6.columns
5
+ != preserve content
6
+ .large-6.columns
7
+ .lesson-problems.panel
8
+ .row
9
+ .large-6.large-centered.columns
10
+ .jqpagination
11
+ %a.first{href: '#', 'data-action' => 'first'} &laquo;
12
+ %a.previous{href: '#', 'data-action' => 'previous'} &lsaquo;
13
+ %input{type: 'text', readonly: 'readonly', 'data-max-page' => problems.count}
14
+ %a.next{href: '#', 'data-action' => 'next'} &rsaquo;
15
+ %a.last{href: '#', 'data-action' => 'last'} &raquo;
16
+ - problems.each_with_index do |problem, i|
17
+ %div.problem-wrapper{class: i != 0 ? 'hide' : ''}
18
+ %form.custom.problem{action: '/answers', 'accept-charset' => 'UTF-8', id: "problem_#{problem.id}", method: 'post'}
19
+ %input{type: 'hidden', name: 'position', value: problem.id}
20
+ %fieldset
21
+ %legend Problem #{problem.id + 1}
22
+ - if problem.nesting.any?
23
+ %ul.breadcrumbs
24
+ - problem.nesting.each do |header|
25
+ %li
26
+ %a{href: '#' + header.name}!= header.text
27
+ != problem.render
@@ -1,16 +1,12 @@
1
1
  -# coding: UTF-8
2
- %form.problem{action: 'verify/problem/' + id, 'accept-charset' => 'UTF-8', id: "problem_#{id}", method: 'post'}
3
- %fieldset
4
-
5
- %legend Problem #{index}
6
- %p= question
7
-
8
- .row.collapse
9
- .large-10.small-3.columns
10
- -options.each do |value, label|
11
- %label{for: 'answer'}
12
- %input{name: 'answer', type: 'radio', value: value}
13
- = label
14
- .large-2.small-1.columns
15
- %a.button.submit.small.expand.postfix.radius{href: '#'} Submit
2
+ != question
3
+ .row.collapse
4
+ .large-10.columns
5
+ -options.each do |value, label|
6
+ %label{for: 'answer'}
7
+ %input.hide{name: 'answer', type: 'radio', value: value}
8
+ %span.custom.radio
9
+ != label
10
+ .large-2.columns
11
+ %input.small.button.expand.radius{type: 'submit', value: 'Submit'}
16
12
 
@@ -1,5 +1,5 @@
1
1
  -# coding: UTF-8
2
- %dl#sections.sub-nav{'data-magellan-expedition' => 'fixed'}
2
+ %dl.lesson-nav.sub-nav{'data-magellan-expedition' => ''}
3
3
  -sections.each do |name, heading|
4
4
  %dd{'data-magellan-arrival' => name}
5
- %a{href: '#' + name}= heading
5
+ %a{href: '#' + name}!= heading
@@ -1,12 +1,7 @@
1
1
  -# coding: UTF-8
2
- %form.problem{action: 'verify/problem/' + id, 'accept-charset' => 'UTF-8', id: "problem_#{id}", method: 'post'}
3
- %fieldset
4
-
5
- %legend Problem #{index}
6
- %p= question
7
-
8
- .row.collapse
9
- .large-10.small-3.columns
10
- %input{name: 'answer', type: 'text'}
11
- .large-2.small-1.columns
12
- %a.button.small.submit.expand.postfix.radius{href: '#'} Submit
2
+ != question
3
+ .row.collapse
4
+ .large-10.columns
5
+ %input{name: 'answer', type: 'text'}
6
+ .large-2.columns
7
+ %input.button.postfix.radius{type: 'submit', value: 'Submit'}
@@ -1,28 +1,22 @@
1
1
  -# coding: UTF-8
2
- %form.problem{action: 'verify/problem/' + id, 'accept-charset' => 'UTF-8', id: "problem_#{id}", method: 'post'}
3
- %fieldset
2
+ .row
3
+ .large-12.columns
4
+ %table
5
+ %thead
6
+ -if headings
7
+ %tr
8
+ -headings.each do |heading|
9
+ %th= heading
4
10
 
5
- %legend Problem #{index}
6
- %p= question
7
-
8
- .row
9
- .twelve.columns
10
- %table
11
- %thead
12
- -if headings
13
- %tr
14
- -headings.each do |heading|
15
- %th= heading
16
-
17
- %tbody
18
- -grid.each_with_index do |row, i|
19
- %tr
20
- -row.each_with_index do |cell, j|
21
- %td
22
- - if Spirit::Render::Table.input? cell
23
- %input{name: "answer[#{i}][#{j}]", type: 'text'}
24
- - else
25
- = cell
26
- .row
27
- .two.columns.mobile-one
28
- %a.button.small.submit.radius{href: '#'} Submit
11
+ %tbody
12
+ -grid.each_with_index do |row, i|
13
+ %tr
14
+ -row.each_with_index do |cell, j|
15
+ %td
16
+ - if Spirit::Render::Table.input? cell
17
+ %input{name: "answer[#{i}][#{j}]", type: 'text'}
18
+ - else
19
+ != cell
20
+ .row
21
+ .large-2.small-1.columns
22
+ %input.small.button.radius{type: 'submit', value: 'Submit'}
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spirit
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.2'
5
- prerelease:
4
+ version: '0.5'
6
5
  platform: ruby
7
6
  authors:
8
7
  - Jiunn Haur Lim
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-03-16 00:00:00.000000000 Z
11
+ date: 2013-06-12 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: haml
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ~>
20
18
  - !ruby/object:Gem::Version
@@ -22,7 +20,6 @@ dependencies:
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ~>
28
25
  - !ruby/object:Gem::Version
@@ -30,39 +27,34 @@ dependencies:
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: redcarpet
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ~>
36
32
  - !ruby/object:Gem::Version
37
- version: '2.2'
33
+ version: '2.3'
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ~>
44
39
  - !ruby/object:Gem::Version
45
- version: '2.2'
40
+ version: '2.3'
46
41
  - !ruby/object:Gem::Dependency
47
- name: albino
42
+ name: pygments.rb
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - ~>
52
46
  - !ruby/object:Gem::Version
53
- version: '1.3'
47
+ version: '0.5'
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
52
  - - ~>
60
53
  - !ruby/object:Gem::Version
61
- version: '1.3'
54
+ version: '0.5'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: sanitize
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
59
  - - ~>
68
60
  - !ruby/object:Gem::Version
@@ -70,7 +62,6 @@ dependencies:
70
62
  type: :runtime
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
66
  - - ~>
76
67
  - !ruby/object:Gem::Version
@@ -78,7 +69,6 @@ dependencies:
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: activesupport
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
73
  - - ~>
84
74
  - !ruby/object:Gem::Version
@@ -86,7 +76,6 @@ dependencies:
86
76
  type: :runtime
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
80
  - - ~>
92
81
  - !ruby/object:Gem::Version
@@ -94,99 +83,87 @@ dependencies:
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: yard
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
87
  - - ~>
100
88
  - !ruby/object:Gem::Version
101
- version: 0.8.3
89
+ version: '0.8'
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
94
  - - ~>
108
95
  - !ruby/object:Gem::Version
109
- version: 0.8.3
96
+ version: '0.8'
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: debugger-pry
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
101
  - - ~>
116
102
  - !ruby/object:Gem::Version
117
- version: 0.1.1
103
+ version: '0.1'
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
108
  - - ~>
124
109
  - !ruby/object:Gem::Version
125
- version: 0.1.1
110
+ version: '0.1'
126
111
  - !ruby/object:Gem::Dependency
127
112
  name: rspec
128
113
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
114
  requirements:
131
115
  - - ~>
132
116
  - !ruby/object:Gem::Version
133
- version: 2.13.0
117
+ version: '2.13'
134
118
  type: :development
135
119
  prerelease: false
136
120
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
121
  requirements:
139
122
  - - ~>
140
123
  - !ruby/object:Gem::Version
141
- version: 2.13.0
124
+ version: '2.13'
142
125
  - !ruby/object:Gem::Dependency
143
126
  name: rake
144
127
  requirement: !ruby/object:Gem::Requirement
145
- none: false
146
128
  requirements:
147
129
  - - ~>
148
130
  - !ruby/object:Gem::Version
149
- version: 10.0.0
131
+ version: '10.0'
150
132
  type: :development
151
133
  prerelease: false
152
134
  version_requirements: !ruby/object:Gem::Requirement
153
- none: false
154
135
  requirements:
155
136
  - - ~>
156
137
  - !ruby/object:Gem::Version
157
- version: 10.0.0
138
+ version: '10.0'
158
139
  - !ruby/object:Gem::Dependency
159
140
  name: factory_girl
160
141
  requirement: !ruby/object:Gem::Requirement
161
- none: false
162
142
  requirements:
163
143
  - - ~>
164
144
  - !ruby/object:Gem::Version
165
- version: 4.2.0
145
+ version: '4.2'
166
146
  type: :development
167
147
  prerelease: false
168
148
  version_requirements: !ruby/object:Gem::Requirement
169
- none: false
170
149
  requirements:
171
150
  - - ~>
172
151
  - !ruby/object:Gem::Version
173
- version: 4.2.0
152
+ version: '4.2'
174
153
  - !ruby/object:Gem::Dependency
175
154
  name: faker
176
155
  requirement: !ruby/object:Gem::Requirement
177
- none: false
178
156
  requirements:
179
157
  - - ~>
180
158
  - !ruby/object:Gem::Version
181
- version: 1.1.2
159
+ version: '1.1'
182
160
  type: :development
183
161
  prerelease: false
184
162
  version_requirements: !ruby/object:Gem::Requirement
185
- none: false
186
163
  requirements:
187
164
  - - ~>
188
165
  - !ruby/object:Gem::Version
189
- version: 1.1.2
166
+ version: '1.1'
190
167
  description: Parses Genie Markup Language
191
168
  email:
192
169
  - codex.is.poetry@gmail.com
@@ -203,7 +180,16 @@ files:
203
180
  - lib/spirit/manifest.rb
204
181
  - lib/spirit/render/errors.rb
205
182
  - lib/spirit/render/html.rb
206
- - lib/spirit/render/sanitize.rb
183
+ - lib/spirit/render/processable.rb
184
+ - lib/spirit/render/processors/base.rb
185
+ - lib/spirit/render/processors/block_image_processor.rb
186
+ - lib/spirit/render/processors/headers_processor.rb
187
+ - lib/spirit/render/processors/layout_processor.rb
188
+ - lib/spirit/render/processors/math_processor.rb
189
+ - lib/spirit/render/processors/problems_processor.rb
190
+ - lib/spirit/render/processors/pygments_processor.rb
191
+ - lib/spirit/render/processors/sanitize_processor.rb
192
+ - lib/spirit/render/processors.rb
207
193
  - lib/spirit/render/templates/header.rb
208
194
  - lib/spirit/render/templates/image.rb
209
195
  - lib/spirit/render/templates/multi.rb
@@ -217,9 +203,9 @@ files:
217
203
  - lib/spirit/tilt/template.rb
218
204
  - lib/spirit/version.rb
219
205
  - lib/spirit.rb
220
- - views/exe.haml
221
206
  - views/header.haml
222
207
  - views/img.haml
208
+ - views/layout.haml
223
209
  - views/multi.haml
224
210
  - views/nav.haml
225
211
  - views/short.haml
@@ -227,33 +213,26 @@ files:
227
213
  homepage: https://github.com/jimjh/genie-parser
228
214
  licenses:
229
215
  - MIT
216
+ metadata: {}
230
217
  post_install_message:
231
218
  rdoc_options: []
232
219
  require_paths:
233
220
  - lib
234
221
  required_ruby_version: !ruby/object:Gem::Requirement
235
- none: false
236
222
  requirements:
237
- - - ! '>='
223
+ - - '>='
238
224
  - !ruby/object:Gem::Version
239
- version: '0'
240
- segments:
241
- - 0
242
- hash: 96703733558518260
225
+ version: '2.0'
243
226
  required_rubygems_version: !ruby/object:Gem::Requirement
244
- none: false
245
227
  requirements:
246
- - - ! '>='
228
+ - - '>='
247
229
  - !ruby/object:Gem::Version
248
230
  version: '0'
249
- segments:
250
- - 0
251
- hash: 96703733558518260
252
231
  requirements: []
253
232
  rubyforge_project:
254
- rubygems_version: 1.8.24
233
+ rubygems_version: 2.0.2
255
234
  signing_key:
256
- specification_version: 3
235
+ specification_version: 4
257
236
  summary: Parses Genie Markup Language
258
237
  test_files: []
259
238
  has_rdoc: