smartdown 0.11.4 → 0.12.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.
- data/lib/smartdown/api/date_question.rb +10 -4
- data/lib/smartdown/api/node.rb +2 -1
- data/lib/smartdown/api/question.rb +2 -1
- data/lib/smartdown/engine/interpolator.rb +1 -1
- data/lib/smartdown/model/element/{markdown_paragraph.rb → markdown_line.rb} +1 -1
- data/lib/smartdown/model/elements.rb +51 -0
- data/lib/smartdown/model/node.rb +14 -7
- data/lib/smartdown/parser/base.rb +1 -1
- data/lib/smartdown/parser/element/conditional.rb +9 -8
- data/lib/smartdown/parser/element/front_matter.rb +7 -1
- data/lib/smartdown/parser/element/markdown_blank_line.rb +14 -0
- data/lib/smartdown/parser/element/markdown_line.rb +14 -0
- data/lib/smartdown/parser/node_parser.rb +10 -7
- data/lib/smartdown/parser/node_transform.rb +21 -4
- data/lib/smartdown/version.rb +1 -1
- data/spec/acceptance/parsing_spec.rb +7 -0
- data/spec/api/node_spec.rb +4 -4
- data/spec/api/question_spec.rb +3 -3
- data/spec/engine/conditional_resolver_spec.rb +8 -8
- data/spec/engine/interpolator_spec.rb +11 -11
- data/spec/engine_spec.rb +12 -12
- data/spec/fixtures/acceptance/animal-example-multiple/animal-example-multiple.txt +2 -0
- data/spec/fixtures/acceptance/animal-example-simple/animal-example-simple.txt +2 -0
- data/spec/fixtures/acceptance/cover-sheet/cover-sheet.txt +5 -0
- data/spec/fixtures/acceptance/snippet/snippet.txt +2 -0
- data/spec/model/node_spec.rb +1 -1
- data/spec/parser/base_spec.rb +2 -2
- data/spec/parser/element/conditional_spec.rb +144 -30
- data/spec/parser/element/front_matter_spec.rb +3 -3
- data/spec/parser/element/markdown_line_spec.rb +28 -0
- data/spec/parser/integration/cover_sheet_spec.rb +2 -0
- data/spec/parser/node_parser_spec.rb +55 -27
- data/spec/support/model_builder.rb +3 -3
- data/spec/support_specs/model_builder_spec.rb +12 -12
- metadata +25 -23
- data/lib/smartdown/parser/element/markdown_paragraph.rb +0 -19
- data/spec/parser/element/markdown_paragraph_spec.rb +0 -28
@@ -4,21 +4,27 @@ module Smartdown
|
|
4
4
|
module Api
|
5
5
|
class DateQuestion < Question
|
6
6
|
extend Forwardable
|
7
|
-
DEFAULT_START_YEAR = Time.now.year - 1
|
8
|
-
DEFAULT_END_YEAR = Time.now.year + 3
|
9
7
|
|
10
8
|
def start_year
|
11
|
-
parse_date(from) ||
|
9
|
+
parse_date(from) || default_start_year
|
12
10
|
end
|
13
11
|
|
14
12
|
def end_year
|
15
|
-
parse_date(to) ||
|
13
|
+
parse_date(to) || default_end_year
|
16
14
|
end
|
17
15
|
|
18
16
|
private
|
19
17
|
|
20
18
|
delegate [:to, :from] => :question_element
|
21
19
|
|
20
|
+
def default_start_year
|
21
|
+
Time.now.year - 1
|
22
|
+
end
|
23
|
+
|
24
|
+
def default_end_year
|
25
|
+
Time.now.year + 3
|
26
|
+
end
|
27
|
+
|
22
28
|
def question_element
|
23
29
|
@question_element ||= elements.find{|element| element.is_a? Smartdown::Model::Element::Question::Date}
|
24
30
|
end
|
data/lib/smartdown/api/node.rb
CHANGED
@@ -45,7 +45,8 @@ module Smartdown
|
|
45
45
|
private
|
46
46
|
|
47
47
|
def markdown_element?(element)
|
48
|
-
(element.is_a? Smartdown::Model::Element::
|
48
|
+
(element.is_a? Smartdown::Model::Element::MarkdownLine) ||
|
49
|
+
(element.is_a? Smartdown::Model::Element::MarkdownHeading)
|
49
50
|
end
|
50
51
|
|
51
52
|
def next_node_element?(element)
|
@@ -36,7 +36,8 @@ module Smartdown
|
|
36
36
|
attr_reader :elements
|
37
37
|
|
38
38
|
def markdown_element?(element)
|
39
|
-
(element.is_a? Smartdown::Model::Element::
|
39
|
+
(element.is_a? Smartdown::Model::Element::MarkdownLine) ||
|
40
|
+
(element.is_a? Smartdown::Model::Element::MarkdownHeading)
|
40
41
|
end
|
41
42
|
|
42
43
|
def smartdown_element?(element)
|
@@ -63,7 +63,7 @@ module Smartdown
|
|
63
63
|
end
|
64
64
|
|
65
65
|
INTERPOLATOR_CONFIG = {
|
66
|
-
Smartdown::Model::Element::
|
66
|
+
Smartdown::Model::Element::MarkdownLine => ElementContentInterpolator,
|
67
67
|
Smartdown::Model::Element::MarkdownHeading => ElementContentInterpolator
|
68
68
|
}
|
69
69
|
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Smartdown
|
2
|
+
module Model
|
3
|
+
=begin
|
4
|
+
We had to create this Struct for storing multiple Smartdown::Model elements due
|
5
|
+
to the syntax used in parsing.
|
6
|
+
|
7
|
+
In the parsing rule below:
|
8
|
+
```
|
9
|
+
rule(:markdown_elements) {
|
10
|
+
markdown_element.repeat(1, 1) >>
|
11
|
+
(newline.repeat(1).as(:blank_line) >> markdown_element.as(:element)).repeat
|
12
|
+
}
|
13
|
+
```
|
14
|
+
|
15
|
+
the `(newline.repeat(1).as(:blank_line) >> markdown_element.as(:element)).repeat` snippet creates
|
16
|
+
a hash with two key/value pairs to transform.
|
17
|
+
|
18
|
+
In order to avoid too much verbosity in the NodeTransform, using the markup "element" instead
|
19
|
+
of relying on the naming given by the markdown element parsing itself means we can catch all those cases
|
20
|
+
in one generic transform rule:
|
21
|
+
|
22
|
+
```
|
23
|
+
rule(blank_line: simple(:blank_line), element: subtree(:element)) {
|
24
|
+
Smartdown::Model::Elements.new(
|
25
|
+
[
|
26
|
+
Smartdown::Model::Element::MarkdownLine.new(blank_line.to_s),
|
27
|
+
element,
|
28
|
+
]
|
29
|
+
)
|
30
|
+
}
|
31
|
+
```
|
32
|
+
|
33
|
+
The other alternative would have been to have to add a new rule for every specific kind of markdown element.
|
34
|
+
This `Elements` Struct was created to avoid that much verbosity and brittleness in the transform (we would
|
35
|
+
have needed to add another `rule (blank_line...., xxxxx....)` every time we add a new type of markdown element)
|
36
|
+
|
37
|
+
Last but not least, we couldn't just cast newlines as just any markdown element:
|
38
|
+
|
39
|
+
```
|
40
|
+
rule(:markdown_elements) {
|
41
|
+
markdown_element.repeat(1, 1) >>
|
42
|
+
(markdown_element).repeat
|
43
|
+
}
|
44
|
+
```
|
45
|
+
was not an option since we needed to differentiate between newlines that so happened to be inside broader blocks like
|
46
|
+
frontmatter, rules or conditionals, and newlines that separated plain markdown text...
|
47
|
+
|
48
|
+
=end
|
49
|
+
Elements = Struct.new(:elements)
|
50
|
+
end
|
51
|
+
end
|
data/lib/smartdown/model/node.rb
CHANGED
@@ -4,7 +4,14 @@ module Smartdown
|
|
4
4
|
module Model
|
5
5
|
Node = Struct.new(:name, :elements, :front_matter) do
|
6
6
|
def initialize(name, elements, front_matter = nil)
|
7
|
-
|
7
|
+
all_elements = elements.map do |element|
|
8
|
+
if element.is_a?(Smartdown::Model::Elements)
|
9
|
+
element.elements
|
10
|
+
else
|
11
|
+
element
|
12
|
+
end
|
13
|
+
end.flatten
|
14
|
+
super(name, all_elements, front_matter || Smartdown::Model::FrontMatter.new)
|
8
15
|
end
|
9
16
|
|
10
17
|
def title
|
@@ -12,11 +19,11 @@ module Smartdown
|
|
12
19
|
end
|
13
20
|
|
14
21
|
def body
|
15
|
-
markdown_blocks_before_question.map { |block| as_markdown(block) }.compact.join
|
22
|
+
markdown_blocks_before_question.map { |block| as_markdown(block) }.compact.join
|
16
23
|
end
|
17
24
|
|
18
25
|
def post_body
|
19
|
-
markdown_blocks_after_question.map { |block| as_markdown(block) }.compact.join
|
26
|
+
markdown_blocks_after_question.map { |block| as_markdown(block) }.compact.join
|
20
27
|
end
|
21
28
|
|
22
29
|
def questions
|
@@ -50,14 +57,14 @@ module Smartdown
|
|
50
57
|
def markdown_blocks_before_question
|
51
58
|
elements.take_while { |e|
|
52
59
|
e.is_a?(Smartdown::Model::Element::MarkdownHeading) ||
|
53
|
-
e.is_a?(Smartdown::Model::Element::
|
60
|
+
e.is_a?(Smartdown::Model::Element::MarkdownLine)
|
54
61
|
}[1..-1]
|
55
62
|
end
|
56
63
|
|
57
64
|
def markdown_blocks_after_question
|
58
65
|
elements.reverse.take_while { |e|
|
59
66
|
e.is_a?(Smartdown::Model::Element::MarkdownHeading) ||
|
60
|
-
e.is_a?(Smartdown::Model::Element::
|
67
|
+
e.is_a?(Smartdown::Model::Element::MarkdownLine)
|
61
68
|
}.reverse
|
62
69
|
end
|
63
70
|
|
@@ -73,8 +80,8 @@ module Smartdown
|
|
73
80
|
def as_markdown(block)
|
74
81
|
case block
|
75
82
|
when Smartdown::Model::Element::MarkdownHeading
|
76
|
-
"# #{block.content}
|
77
|
-
when Smartdown::Model::Element::
|
83
|
+
"# #{block.content}"
|
84
|
+
when Smartdown::Model::Element::MarkdownLine
|
78
85
|
block.content
|
79
86
|
else
|
80
87
|
raise "Unknown markdown block type '#{block.class.to_s}'"
|
@@ -7,7 +7,7 @@ module Smartdown
|
|
7
7
|
rule(:ws_char) { space_char | str("\t") }
|
8
8
|
rule(:space_char) { str(" ") }
|
9
9
|
rule(:non_ws_char) { match('\S') }
|
10
|
-
rule(:carriage_return) { str("\
|
10
|
+
rule(:carriage_return) { str("\n") | str("\r") }
|
11
11
|
rule(:newline) { optional_space >> carriage_return }
|
12
12
|
rule(:line_ending) { eof | newline }
|
13
13
|
|
@@ -14,7 +14,7 @@ module Smartdown
|
|
14
14
|
|
15
15
|
rule(:markdown_block_inside_conditional) {
|
16
16
|
dollar_keywords = [dollar_if, dollar_else, dollar_elseif, dollar_endif]
|
17
|
-
dollar_keywords.map(&:absent?).reduce(:>>) >> NodeParser.new.
|
17
|
+
dollar_keywords.map(&:absent?).reduce(:>>) >> NodeParser.new.markdown_element
|
18
18
|
}
|
19
19
|
|
20
20
|
rule(:conditional_body_block) {
|
@@ -22,18 +22,19 @@ module Smartdown
|
|
22
22
|
}
|
23
23
|
|
24
24
|
rule(:blocks_inside_conditional) {
|
25
|
-
conditional_body_block.repeat(1,1) >> (
|
25
|
+
conditional_body_block.repeat(1,1) >> (conditional_body_block).repeat
|
26
26
|
}
|
27
27
|
|
28
28
|
rule(:else_clause) {
|
29
|
-
dollar_else >>
|
30
|
-
|
29
|
+
dollar_else >>
|
30
|
+
optional_space >> newline.repeat(1) >>
|
31
|
+
(blocks_inside_conditional.as(:false_case)).maybe
|
31
32
|
}
|
32
33
|
|
33
34
|
rule(:elseif_clause) {
|
34
35
|
dollar_elseif >> (Predicates.new.as(:predicate) >>
|
35
|
-
optional_space >> newline.repeat(
|
36
|
-
(blocks_inside_conditional.as(:true_case)
|
36
|
+
optional_space >> newline.repeat(1) >>
|
37
|
+
(blocks_inside_conditional.as(:true_case)).maybe >>
|
37
38
|
((elseif_clause | else_clause).maybe)).as(:conditional).repeat(1,1).as(:false_case)
|
38
39
|
}
|
39
40
|
|
@@ -41,8 +42,8 @@ module Smartdown
|
|
41
42
|
(
|
42
43
|
dollar_if >>
|
43
44
|
Predicates.new.as(:predicate) >>
|
44
|
-
optional_space >> newline.repeat(
|
45
|
-
(blocks_inside_conditional.as(:true_case)
|
45
|
+
optional_space >> newline.repeat(1) >>
|
46
|
+
(blocks_inside_conditional.as(:true_case)).maybe >>
|
46
47
|
(else_clause | elseif_clause).maybe >>
|
47
48
|
dollar_endif >> optional_space >> line_ending
|
48
49
|
).as(:conditional)
|
@@ -4,11 +4,17 @@ module Smartdown
|
|
4
4
|
module Parser
|
5
5
|
module Element
|
6
6
|
class FrontMatter < Base
|
7
|
+
rule(:front_matter_delimiter) {
|
8
|
+
str("---") >> newline
|
9
|
+
}
|
7
10
|
rule(:front_matter_line) {
|
8
11
|
identifier.as(:name) >> str(":") >> ws >> whitespace_terminated_string.as(:value) >> line_ending
|
9
12
|
}
|
10
13
|
rule(:front_matter) {
|
11
|
-
|
14
|
+
front_matter_delimiter >>
|
15
|
+
front_matter_line.repeat(1).as(:front_matter) >>
|
16
|
+
front_matter_delimiter >>
|
17
|
+
newline.repeat
|
12
18
|
}
|
13
19
|
root(:front_matter)
|
14
20
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'smartdown/parser/base'
|
2
|
+
|
3
|
+
module Smartdown
|
4
|
+
module Parser
|
5
|
+
module Element
|
6
|
+
class MarkdownLine < Base
|
7
|
+
rule(:markdown_line) {
|
8
|
+
(optional_space >> whitespace_terminated_string >> optional_space).as(:line)
|
9
|
+
}
|
10
|
+
root(:markdown_line)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -9,14 +9,15 @@ require 'smartdown/parser/element/text_question'
|
|
9
9
|
require 'smartdown/parser/element/country_question'
|
10
10
|
require 'smartdown/parser/element/postcode_question'
|
11
11
|
require 'smartdown/parser/element/markdown_heading'
|
12
|
-
require 'smartdown/parser/element/
|
12
|
+
require 'smartdown/parser/element/markdown_line'
|
13
|
+
require 'smartdown/parser/element/markdown_blank_line'
|
13
14
|
require 'smartdown/parser/element/conditional'
|
14
15
|
require 'smartdown/parser/element/next_steps'
|
15
16
|
|
16
17
|
module Smartdown
|
17
18
|
module Parser
|
18
19
|
class NodeParser < Base
|
19
|
-
rule(:
|
20
|
+
rule(:markdown_element) {
|
20
21
|
Element::Conditional.new |
|
21
22
|
Element::MarkdownHeading.new |
|
22
23
|
Element::MultipleChoiceQuestion.new |
|
@@ -28,19 +29,21 @@ module Smartdown
|
|
28
29
|
Rules.new |
|
29
30
|
Element::StartButton.new |
|
30
31
|
Element::NextSteps.new |
|
31
|
-
Element::
|
32
|
+
Element::MarkdownLine.new |
|
33
|
+
Element::MarkdownBlankLine.new
|
32
34
|
}
|
33
35
|
|
34
|
-
rule(:
|
35
|
-
|
36
|
+
rule(:markdown_elements) {
|
37
|
+
markdown_element.repeat(1, 1) >>
|
38
|
+
(newline.repeat(1).as(:blank_line) >> markdown_element.as(:element)).repeat
|
36
39
|
}
|
37
40
|
|
38
41
|
rule(:body) {
|
39
|
-
|
42
|
+
markdown_elements.as(:body)
|
40
43
|
}
|
41
44
|
|
42
45
|
rule(:flow) {
|
43
|
-
Element::FrontMatter.new >>
|
46
|
+
Element::FrontMatter.new >> body |
|
44
47
|
Element::FrontMatter.new |
|
45
48
|
ws >> body
|
46
49
|
}
|
@@ -2,6 +2,7 @@ require 'parslet/transform'
|
|
2
2
|
require 'smartdown/parser/option_pairs_transform'
|
3
3
|
require 'smartdown/model/node'
|
4
4
|
require 'smartdown/model/front_matter'
|
5
|
+
require 'smartdown/model/elements'
|
5
6
|
require 'smartdown/model/rule'
|
6
7
|
require 'smartdown/model/nested_rule'
|
7
8
|
require 'smartdown/model/next_node_rules'
|
@@ -13,7 +14,7 @@ require 'smartdown/model/element/question/text'
|
|
13
14
|
require 'smartdown/model/element/question/postcode'
|
14
15
|
require 'smartdown/model/element/start_button'
|
15
16
|
require 'smartdown/model/element/markdown_heading'
|
16
|
-
require 'smartdown/model/element/
|
17
|
+
require 'smartdown/model/element/markdown_line'
|
17
18
|
require 'smartdown/model/element/conditional'
|
18
19
|
require 'smartdown/model/element/next_steps'
|
19
20
|
require 'smartdown/model/predicate/equality'
|
@@ -38,12 +39,29 @@ module Smartdown
|
|
38
39
|
)
|
39
40
|
}
|
40
41
|
|
42
|
+
rule(blank_line: simple(:blank_line), element: subtree(:element)) {
|
43
|
+
Smartdown::Model::Elements.new(
|
44
|
+
[
|
45
|
+
Smartdown::Model::Element::MarkdownLine.new(blank_line.to_s),
|
46
|
+
element,
|
47
|
+
]
|
48
|
+
)
|
49
|
+
}
|
50
|
+
|
41
51
|
rule(h1: simple(:content)) {
|
42
52
|
Smartdown::Model::Element::MarkdownHeading.new(content.to_s)
|
43
53
|
}
|
44
54
|
|
45
|
-
rule(
|
46
|
-
Smartdown::Model::Element::
|
55
|
+
rule(:line => simple(:content)) {
|
56
|
+
Smartdown::Model::Element::MarkdownLine.new(content.to_s)
|
57
|
+
}
|
58
|
+
|
59
|
+
rule(:blank => simple(:content)) {
|
60
|
+
Smartdown::Model::Element::MarkdownLine.new(content.to_s)
|
61
|
+
}
|
62
|
+
|
63
|
+
rule(:blank_line => simple(:content)) {
|
64
|
+
Smartdown::Model::Element::MarkdownLine.new(content.to_s)
|
47
65
|
}
|
48
66
|
|
49
67
|
rule(:start_button => simple(:start_node)) {
|
@@ -70,7 +88,6 @@ module Smartdown
|
|
70
88
|
[url.to_s, label.to_s]
|
71
89
|
}
|
72
90
|
|
73
|
-
|
74
91
|
rule(:multiple_choice => {identifier: simple(:identifier), :option_pairs => subtree(:option_pairs), options: subtree(:choices)}) {
|
75
92
|
Smartdown::Model::Element::Question::MultipleChoice.new(
|
76
93
|
identifier.to_s,
|
data/lib/smartdown/version.rb
CHANGED
@@ -48,6 +48,7 @@ describe "Smartdown.parse" do
|
|
48
48
|
|
49
49
|
it "has a body" do
|
50
50
|
expect(coversheet.body).to eq(<<-EXPECTED)
|
51
|
+
|
51
52
|
This is the body markdown.
|
52
53
|
|
53
54
|
It has many paragraphs
|
@@ -57,6 +58,9 @@ of text.
|
|
57
58
|
* can
|
58
59
|
* have
|
59
60
|
* lists
|
61
|
+
|
62
|
+
|
63
|
+
And handles multiple new lines
|
60
64
|
EXPECTED
|
61
65
|
end
|
62
66
|
end
|
@@ -80,15 +84,18 @@ EXPECTED
|
|
80
84
|
|
81
85
|
it "has two body paras" do
|
82
86
|
expect(question_node.body).to eq(<<-EXPECTED)
|
87
|
+
|
83
88
|
Body text line 1.
|
84
89
|
|
85
90
|
Body text
|
86
91
|
para 2.
|
92
|
+
|
87
93
|
EXPECTED
|
88
94
|
end
|
89
95
|
|
90
96
|
it "has a post body" do
|
91
97
|
expect(question_node.post_body).to eq(<<-EXPECTED)
|
98
|
+
|
92
99
|
Text after the question.
|
93
100
|
EXPECTED
|
94
101
|
end
|
data/spec/api/node_spec.rb
CHANGED
@@ -6,7 +6,7 @@ require 'smartdown/model/front_matter'
|
|
6
6
|
require 'smartdown/model/next_node_rules'
|
7
7
|
require 'smartdown/model/element/question/date'
|
8
8
|
require 'smartdown/model/element/markdown_heading'
|
9
|
-
require 'smartdown/model/element/
|
9
|
+
require 'smartdown/model/element/markdown_line'
|
10
10
|
|
11
11
|
describe Smartdown::Api::Node do
|
12
12
|
|
@@ -44,17 +44,17 @@ describe Smartdown::Api::Node do
|
|
44
44
|
|
45
45
|
let(:body_content) { "I <3 bodyshopping" }
|
46
46
|
let(:body_element) {
|
47
|
-
Smartdown::Model::Element::
|
47
|
+
Smartdown::Model::Element::MarkdownLine.new(body_content)
|
48
48
|
}
|
49
49
|
|
50
50
|
let(:post_body_content) { "hur hur such content" }
|
51
51
|
let(:post_body_element) {
|
52
|
-
Smartdown::Model::Element::
|
52
|
+
Smartdown::Model::Element::MarkdownLine.new(post_body_content)
|
53
53
|
}
|
54
54
|
|
55
55
|
let(:other_post_body_content) { "Postman Pat and his black and white cat" }
|
56
56
|
let(:other_post_body_element) {
|
57
|
-
Smartdown::Model::Element::
|
57
|
+
Smartdown::Model::Element::MarkdownLine.new(other_post_body_content)
|
58
58
|
}
|
59
59
|
|
60
60
|
|
data/spec/api/question_spec.rb
CHANGED
@@ -2,7 +2,7 @@ require 'smartdown/api/question'
|
|
2
2
|
require 'smartdown/api/date_question'
|
3
3
|
require 'smartdown/model/element/question/date'
|
4
4
|
require 'smartdown/model/element/markdown_heading'
|
5
|
-
require 'smartdown/model/element/
|
5
|
+
require 'smartdown/model/element/markdown_line'
|
6
6
|
|
7
7
|
describe Smartdown::Api::Question do
|
8
8
|
|
@@ -22,12 +22,12 @@ describe Smartdown::Api::Question do
|
|
22
22
|
|
23
23
|
let(:body_content) { 'I <3 bodyshopping' }
|
24
24
|
let(:body_element) {
|
25
|
-
Smartdown::Model::Element::
|
25
|
+
Smartdown::Model::Element::MarkdownLine.new(body_content)
|
26
26
|
}
|
27
27
|
|
28
28
|
let(:post_body_content) { 'hur hur such content' }
|
29
29
|
let(:post_body_element) {
|
30
|
-
Smartdown::Model::Element::
|
30
|
+
Smartdown::Model::Element::MarkdownLine.new(post_body_content)
|
31
31
|
}
|
32
32
|
|
33
33
|
|
@@ -10,10 +10,10 @@ describe Smartdown::Engine::ConditionalResolver do
|
|
10
10
|
conditional do
|
11
11
|
named_predicate "pred?"
|
12
12
|
true_case do
|
13
|
-
|
13
|
+
line("True case")
|
14
14
|
end
|
15
15
|
false_case do
|
16
|
-
|
16
|
+
line("False case")
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
@@ -29,7 +29,7 @@ describe Smartdown::Engine::ConditionalResolver do
|
|
29
29
|
|
30
30
|
let(:expected_node_after_presentation) {
|
31
31
|
model_builder.node("outcome_no_visa_needed") do
|
32
|
-
|
32
|
+
line("True case")
|
33
33
|
end
|
34
34
|
}
|
35
35
|
|
@@ -48,7 +48,7 @@ describe Smartdown::Engine::ConditionalResolver do
|
|
48
48
|
|
49
49
|
let(:expected_node_after_presentation) {
|
50
50
|
model_builder.node("outcome_no_visa_needed") do
|
51
|
-
|
51
|
+
line("False case")
|
52
52
|
end
|
53
53
|
}
|
54
54
|
|
@@ -63,13 +63,13 @@ describe Smartdown::Engine::ConditionalResolver do
|
|
63
63
|
conditional do
|
64
64
|
named_predicate "pred1?"
|
65
65
|
true_case do
|
66
|
-
|
66
|
+
line("True case")
|
67
67
|
end
|
68
68
|
false_case do
|
69
69
|
conditional do
|
70
70
|
named_predicate "pred2?"
|
71
71
|
true_case do
|
72
|
-
|
72
|
+
line("False True case")
|
73
73
|
end
|
74
74
|
end
|
75
75
|
end
|
@@ -88,7 +88,7 @@ describe Smartdown::Engine::ConditionalResolver do
|
|
88
88
|
|
89
89
|
let(:expected_node_after_presentation) {
|
90
90
|
model_builder.node("outcome_no_visa_needed") do
|
91
|
-
|
91
|
+
line("True case")
|
92
92
|
end
|
93
93
|
}
|
94
94
|
|
@@ -110,7 +110,7 @@ describe Smartdown::Engine::ConditionalResolver do
|
|
110
110
|
|
111
111
|
let(:expected_node_after_presentation) {
|
112
112
|
model_builder.node("outcome_no_visa_needed") do
|
113
|
-
|
113
|
+
line("False True case")
|
114
114
|
end
|
115
115
|
}
|
116
116
|
|
@@ -37,14 +37,14 @@ describe Smartdown::Engine::Interpolator do
|
|
37
37
|
let(:node) {
|
38
38
|
model_builder.node("example") do
|
39
39
|
heading("a heading")
|
40
|
-
|
40
|
+
line("some_stuff")
|
41
41
|
conditional do
|
42
42
|
named_predicate "pred?"
|
43
43
|
true_case do
|
44
|
-
|
44
|
+
line("True case")
|
45
45
|
end
|
46
46
|
false_case do
|
47
|
-
|
47
|
+
line("False case")
|
48
48
|
end
|
49
49
|
end
|
50
50
|
multiple_choice("example", {})
|
@@ -58,7 +58,7 @@ describe Smartdown::Engine::Interpolator do
|
|
58
58
|
end
|
59
59
|
|
60
60
|
context "a node with a paragraph containing an interpolation" do
|
61
|
-
let(:elements) { [Smartdown::Model::Element::
|
61
|
+
let(:elements) { [Smartdown::Model::Element::MarkdownLine.new('Hello %{name}')] }
|
62
62
|
|
63
63
|
it "interpolates the name into the paragraph content" do
|
64
64
|
expect(interpolated_node.elements.first.content).to eq("Hello #{example_name}")
|
@@ -74,7 +74,7 @@ describe Smartdown::Engine::Interpolator do
|
|
74
74
|
end
|
75
75
|
|
76
76
|
context "a paragraph containing function call" do
|
77
|
-
let(:elements) { [Smartdown::Model::Element::
|
77
|
+
let(:elements) { [Smartdown::Model::Element::MarkdownLine.new('%{double(number)}')] }
|
78
78
|
let(:state) {
|
79
79
|
Smartdown::Engine::State.new(
|
80
80
|
current_node: node.name,
|
@@ -88,7 +88,7 @@ describe Smartdown::Engine::Interpolator do
|
|
88
88
|
end
|
89
89
|
|
90
90
|
context "a paragraph containing function call with two arguments" do
|
91
|
-
let(:elements) { [Smartdown::Model::Element::
|
91
|
+
let(:elements) { [Smartdown::Model::Element::MarkdownLine.new('%{multiply(number other_number)}')] }
|
92
92
|
let(:state) {
|
93
93
|
Smartdown::Engine::State.new(
|
94
94
|
current_node: node.name,
|
@@ -103,7 +103,7 @@ describe Smartdown::Engine::Interpolator do
|
|
103
103
|
end
|
104
104
|
|
105
105
|
context "a paragraph containing a date answer" do
|
106
|
-
let(:elements) { [Smartdown::Model::Element::
|
106
|
+
let(:elements) { [Smartdown::Model::Element::MarkdownLine.new('%{date_answer}')] }
|
107
107
|
let(:state) {
|
108
108
|
Smartdown::Engine::State.new(
|
109
109
|
current_node: node.name,
|
@@ -116,7 +116,7 @@ describe Smartdown::Engine::Interpolator do
|
|
116
116
|
end
|
117
117
|
|
118
118
|
context "a paragraph containing a money answer" do
|
119
|
-
let(:elements) { [Smartdown::Model::Element::
|
119
|
+
let(:elements) { [Smartdown::Model::Element::MarkdownLine.new('%{money_answer}')] }
|
120
120
|
let(:state) {
|
121
121
|
Smartdown::Engine::State.new(
|
122
122
|
current_node: node.name,
|
@@ -129,7 +129,7 @@ describe Smartdown::Engine::Interpolator do
|
|
129
129
|
end
|
130
130
|
|
131
131
|
context "a paragraph containing a text answer" do
|
132
|
-
let(:elements) { [Smartdown::Model::Element::
|
132
|
+
let(:elements) { [Smartdown::Model::Element::MarkdownLine.new('%{text_answer}')] }
|
133
133
|
let(:state) {
|
134
134
|
Smartdown::Engine::State.new(
|
135
135
|
current_node: node.name,
|
@@ -142,7 +142,7 @@ describe Smartdown::Engine::Interpolator do
|
|
142
142
|
end
|
143
143
|
|
144
144
|
context "a paragraph containing a multuple-choice answer" do
|
145
|
-
let(:elements) { [Smartdown::Model::Element::
|
145
|
+
let(:elements) { [Smartdown::Model::Element::MarkdownLine.new('%{multiple_choice_answer}')] }
|
146
146
|
let(:choices) { { 'dog' => 'Dog', 'growlithe' => 'Growlithe', 'arcanine' => 'Arcanine' } }
|
147
147
|
let(:question) { Smartdown::Model::Element::Question::MultipleChoice.new('arcanine', choices) }
|
148
148
|
let(:state) {
|
@@ -157,7 +157,7 @@ describe Smartdown::Engine::Interpolator do
|
|
157
157
|
end
|
158
158
|
|
159
159
|
context "a paragraph containing a country answer" do
|
160
|
-
let(:elements) { [Smartdown::Model::Element::
|
160
|
+
let(:elements) { [Smartdown::Model::Element::MarkdownLine.new('%{country_answer}')] }
|
161
161
|
let(:country_hash) { { 'united-kingdom' => 'United Kingdom' } }
|
162
162
|
let(:question) { Smartdown::Model::Element::Question::Country.new('united-kingdom', country_hash) }
|
163
163
|
let(:state) {
|