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.
Files changed (37) hide show
  1. data/lib/smartdown/api/date_question.rb +10 -4
  2. data/lib/smartdown/api/node.rb +2 -1
  3. data/lib/smartdown/api/question.rb +2 -1
  4. data/lib/smartdown/engine/interpolator.rb +1 -1
  5. data/lib/smartdown/model/element/{markdown_paragraph.rb → markdown_line.rb} +1 -1
  6. data/lib/smartdown/model/elements.rb +51 -0
  7. data/lib/smartdown/model/node.rb +14 -7
  8. data/lib/smartdown/parser/base.rb +1 -1
  9. data/lib/smartdown/parser/element/conditional.rb +9 -8
  10. data/lib/smartdown/parser/element/front_matter.rb +7 -1
  11. data/lib/smartdown/parser/element/markdown_blank_line.rb +14 -0
  12. data/lib/smartdown/parser/element/markdown_line.rb +14 -0
  13. data/lib/smartdown/parser/node_parser.rb +10 -7
  14. data/lib/smartdown/parser/node_transform.rb +21 -4
  15. data/lib/smartdown/version.rb +1 -1
  16. data/spec/acceptance/parsing_spec.rb +7 -0
  17. data/spec/api/node_spec.rb +4 -4
  18. data/spec/api/question_spec.rb +3 -3
  19. data/spec/engine/conditional_resolver_spec.rb +8 -8
  20. data/spec/engine/interpolator_spec.rb +11 -11
  21. data/spec/engine_spec.rb +12 -12
  22. data/spec/fixtures/acceptance/animal-example-multiple/animal-example-multiple.txt +2 -0
  23. data/spec/fixtures/acceptance/animal-example-simple/animal-example-simple.txt +2 -0
  24. data/spec/fixtures/acceptance/cover-sheet/cover-sheet.txt +5 -0
  25. data/spec/fixtures/acceptance/snippet/snippet.txt +2 -0
  26. data/spec/model/node_spec.rb +1 -1
  27. data/spec/parser/base_spec.rb +2 -2
  28. data/spec/parser/element/conditional_spec.rb +144 -30
  29. data/spec/parser/element/front_matter_spec.rb +3 -3
  30. data/spec/parser/element/markdown_line_spec.rb +28 -0
  31. data/spec/parser/integration/cover_sheet_spec.rb +2 -0
  32. data/spec/parser/node_parser_spec.rb +55 -27
  33. data/spec/support/model_builder.rb +3 -3
  34. data/spec/support_specs/model_builder_spec.rb +12 -12
  35. metadata +25 -23
  36. data/lib/smartdown/parser/element/markdown_paragraph.rb +0 -19
  37. data/spec/parser/element/markdown_paragraph_spec.rb +0 -28
data/spec/engine_spec.rb CHANGED
@@ -12,7 +12,7 @@ describe Smartdown::Engine do
12
12
  build_flow("check-uk-visa") do
13
13
  node("check-uk-visa") do
14
14
  heading("Check uk visa")
15
- paragraph("This is the paragraph")
15
+ line("This is the paragraph")
16
16
  start_button("passport_question")
17
17
  end
18
18
 
@@ -39,16 +39,16 @@ describe Smartdown::Engine do
39
39
  conditional do
40
40
  named_predicate "pred?"
41
41
  true_case do
42
- paragraph("True case")
42
+ line("True case")
43
43
  end
44
44
  false_case do
45
- paragraph("False case")
45
+ line("False case")
46
46
  end
47
47
  end
48
48
  end
49
49
 
50
50
  node("outcome_with_interpolation") do
51
- paragraph("The answer is %{interpolated_variable}")
51
+ line("The answer is %{interpolated_variable}")
52
52
  end
53
53
  end
54
54
  }
@@ -56,7 +56,7 @@ describe Smartdown::Engine do
56
56
  build_flow("check-uk-visa") do
57
57
  node("check-uk-visa") do
58
58
  heading("Check uk visa")
59
- paragraph("This is the paragraph")
59
+ line("This is the paragraph")
60
60
  start_button("passport_question")
61
61
  end
62
62
 
@@ -115,24 +115,24 @@ describe Smartdown::Engine do
115
115
  conditional do
116
116
  named_predicate "pred?"
117
117
  true_case do
118
- paragraph("True case")
118
+ line("True case")
119
119
  end
120
120
  false_case do
121
- paragraph("False case")
121
+ line("False case")
122
122
  end
123
123
  end
124
124
  end
125
125
 
126
126
  node("outcome_imaginary_country") do
127
- paragraph("Imaginary country")
127
+ line("Imaginary country")
128
128
  end
129
129
 
130
130
  node("outcome_with_interpolation") do
131
- paragraph("The answer is %{interpolated_variable}")
131
+ line("The answer is %{interpolated_variable}")
132
132
  end
133
133
 
134
134
  node("outcome_passport_colour_specified") do
135
- paragraph("What a pretty passport")
135
+ line("What a pretty passport")
136
136
  end
137
137
  end
138
138
  }
@@ -297,7 +297,7 @@ describe Smartdown::Engine do
297
297
 
298
298
  let(:expected_node_after_conditional_resolution) {
299
299
  model_builder.node("outcome_no_visa_needed") do
300
- paragraph("True case")
300
+ line("True case")
301
301
  end
302
302
  }
303
303
 
@@ -315,7 +315,7 @@ describe Smartdown::Engine do
315
315
 
316
316
  let(:expected_node_after_conditional_resolution) {
317
317
  model_builder.node("outcome_with_interpolation") do
318
- paragraph("The answer is 42")
318
+ line("The answer is 42")
319
319
  end
320
320
  }
321
321
 
@@ -1,6 +1,8 @@
1
+ ---
1
2
  meta_description: Animals eh?
2
3
  satisfies_need: 100982
3
4
  status: draft
5
+ ---
4
6
 
5
7
  # A simple example of smartdown
6
8
 
@@ -1,6 +1,8 @@
1
+ ---
1
2
  meta_description: Animals eh?
2
3
  satisfies_need: 100982
3
4
  status: draft
5
+ ---
4
6
 
5
7
  # A simple example of smartdown
6
8
 
@@ -1,5 +1,7 @@
1
+ ---
1
2
  satisfies_need: 1234
2
3
  meta_description: Blah blah
4
+ ---
3
5
 
4
6
  # My coversheet
5
7
 
@@ -12,3 +14,6 @@ of text.
12
14
  * can
13
15
  * have
14
16
  * lists
17
+
18
+
19
+ And handles multiple new lines
@@ -1,6 +1,8 @@
1
+ ---
1
2
  meta_description: Snippets
2
3
  satisfies_need: 999999
3
4
  status: draft
5
+ ---
4
6
 
5
7
  # A snippet in use
6
8
 
@@ -36,7 +36,7 @@ describe Smartdown::Model::Node do
36
36
  Smartdown::Model::Element::MarkdownHeading.new("A Heading"),
37
37
  Smartdown::Model::Element::Question::Date.new("a_date_question"),
38
38
  Smartdown::Model::Element::Question::MultipleChoice.new("a_multiple_choice_question"),
39
- Smartdown::Model::Element::MarkdownParagraph.new("Some text"),
39
+ Smartdown::Model::Element::MarkdownLine.new("Some text"),
40
40
  ] }
41
41
  specify { expect(node.questions).to eq elements[1..2] }
42
42
  end
@@ -23,11 +23,11 @@ describe Smartdown::Parser::Base do
23
23
 
24
24
  # Only one newline
25
25
  it { should parse("\r") }
26
- it { should parse("\r\n") }
27
- it { should parse("\n\r") }
28
26
  it { should parse("\n") }
29
27
 
30
28
  # Not multiple
29
+ it { should_not parse("\r\n") }
30
+ it { should_not parse("\n\r") }
31
31
  it { should_not parse("\n\n") }
32
32
  end
33
33
 
@@ -23,7 +23,11 @@ SOURCE
23
23
  should parse(source).as(
24
24
  conditional: {
25
25
  predicate: {named_predicate: "pred1?"},
26
- true_case: [{p: "#{true_body}\n"}]
26
+ true_case: [
27
+ {line: "#{true_body}"},
28
+ {blank: "\n"},
29
+ {blank: "\n"},
30
+ ]
27
31
  }
28
32
  )
29
33
  }
@@ -37,7 +41,11 @@ SOURCE
37
41
  should eq(
38
42
  Smartdown::Model::Element::Conditional.new(
39
43
  Smartdown::Model::Predicate::Named.new("pred1?"),
40
- [Smartdown::Model::Element::MarkdownParagraph.new(true_body + "\n")]
44
+ [
45
+ Smartdown::Model::Element::MarkdownLine.new(true_body),
46
+ Smartdown::Model::Element::MarkdownLine.new("\n"),
47
+ Smartdown::Model::Element::MarkdownLine.new("\n"),
48
+ ]
41
49
  )
42
50
  )
43
51
  }
@@ -53,7 +61,14 @@ SOURCE
53
61
  should parse(source).as(
54
62
  conditional: {
55
63
  predicate: {named_predicate: "pred1?"},
56
- true_case: [{p: "#{one_line}\n"}, {p: "#{one_line}\n"}]
64
+ true_case: [
65
+ {line: "#{one_line}"},
66
+ {blank: "\n"},
67
+ {blank: "\n"},
68
+ {line: "#{one_line}"},
69
+ {blank: "\n"},
70
+ {blank: "\n"},
71
+ ]
57
72
  }
58
73
  )
59
74
  }
@@ -68,8 +83,12 @@ SOURCE
68
83
  Smartdown::Model::Element::Conditional.new(
69
84
  Smartdown::Model::Predicate::Named.new("pred1?"),
70
85
  [
71
- Smartdown::Model::Element::MarkdownParagraph.new(one_line + "\n"),
72
- Smartdown::Model::Element::MarkdownParagraph.new(one_line + "\n")
86
+ Smartdown::Model::Element::MarkdownLine.new(one_line),
87
+ Smartdown::Model::Element::MarkdownLine.new("\n"),
88
+ Smartdown::Model::Element::MarkdownLine.new("\n"),
89
+ Smartdown::Model::Element::MarkdownLine.new(one_line),
90
+ Smartdown::Model::Element::MarkdownLine.new("\n"),
91
+ Smartdown::Model::Element::MarkdownLine.new("\n"),
73
92
  ]
74
93
  )
75
94
  )
@@ -125,8 +144,16 @@ SOURCE
125
144
  should parse(source).as(
126
145
  conditional: {
127
146
  predicate: {named_predicate: "pred1?"},
128
- true_case: [{p: "#{true_body}\n"}],
129
- false_case: [{p: "#{false_body}\n"}]
147
+ true_case: [
148
+ {line: "#{true_body}"},
149
+ {blank: "\n"},
150
+ {blank: "\n"},
151
+ ],
152
+ false_case: [
153
+ {line: "#{false_body}"},
154
+ {blank: "\n"},
155
+ {blank: "\n"},
156
+ ]
130
157
  }
131
158
  )
132
159
  }
@@ -140,8 +167,16 @@ SOURCE
140
167
  should eq(
141
168
  Smartdown::Model::Element::Conditional.new(
142
169
  Smartdown::Model::Predicate::Named.new("pred1?"),
143
- [Smartdown::Model::Element::MarkdownParagraph.new(true_body + "\n")],
144
- [Smartdown::Model::Element::MarkdownParagraph.new(false_body + "\n")]
170
+ [
171
+ Smartdown::Model::Element::MarkdownLine.new(true_body),
172
+ Smartdown::Model::Element::MarkdownLine.new("\n"),
173
+ Smartdown::Model::Element::MarkdownLine.new("\n"),
174
+ ],
175
+ [
176
+ Smartdown::Model::Element::MarkdownLine.new(false_body),
177
+ Smartdown::Model::Element::MarkdownLine.new("\n"),
178
+ Smartdown::Model::Element::MarkdownLine.new("\n"),
179
+ ]
145
180
  )
146
181
  )
147
182
  }
@@ -172,10 +207,18 @@ SOURCE
172
207
  should parse(source).as(
173
208
  conditional: {
174
209
  predicate: {named_predicate: "pred1?"},
175
- true_case: [{p: "#{true1_body}\n"}],
210
+ true_case: [
211
+ {line: "#{true1_body}"},
212
+ {blank: "\n"},
213
+ {blank: "\n"},
214
+ ],
176
215
  false_case: [{conditional: {
177
216
  predicate: {named_predicate: "pred2?"},
178
- true_case: [{p: "#{true2_body}\n"}],
217
+ true_case: [
218
+ {line: "#{true2_body}"},
219
+ {blank: "\n"},
220
+ {blank: "\n"},
221
+ ],
179
222
  }}]
180
223
  }
181
224
  )
@@ -190,10 +233,18 @@ SOURCE
190
233
  should eq(
191
234
  Smartdown::Model::Element::Conditional.new(
192
235
  Smartdown::Model::Predicate::Named.new("pred1?"),
193
- [Smartdown::Model::Element::MarkdownParagraph.new(true1_body + "\n")],
236
+ [
237
+ Smartdown::Model::Element::MarkdownLine.new(true1_body),
238
+ Smartdown::Model::Element::MarkdownLine.new("\n"),
239
+ Smartdown::Model::Element::MarkdownLine.new("\n"),
240
+ ],
194
241
  [Smartdown::Model::Element::Conditional.new(
195
242
  Smartdown::Model::Predicate::Named.new("pred2?"),
196
- [Smartdown::Model::Element::MarkdownParagraph.new(true2_body + "\n")]
243
+ [
244
+ Smartdown::Model::Element::MarkdownLine.new(true2_body),
245
+ Smartdown::Model::Element::MarkdownLine.new("\n"),
246
+ Smartdown::Model::Element::MarkdownLine.new("\n"),
247
+ ]
197
248
  )]
198
249
  )
199
250
  )
@@ -230,13 +281,25 @@ SOURCE
230
281
  should parse(source).as(
231
282
  conditional: {
232
283
  predicate: {named_predicate: "pred1?"},
233
- true_case: [{p: "#{true1_body}\n"}],
284
+ true_case: [
285
+ {line: "#{true1_body}"},
286
+ {blank: "\n"},
287
+ {blank: "\n"},
288
+ ],
234
289
  false_case: [{conditional: {
235
290
  predicate: {named_predicate: "pred2?"},
236
- true_case: [{p: "#{true2_body}\n"}],
291
+ true_case: [
292
+ {line: "#{true2_body}"},
293
+ {blank: "\n"},
294
+ {blank: "\n"},
295
+ ],
237
296
  false_case: [{conditional: {
238
297
  predicate: {named_predicate: "pred3?"},
239
- true_case: [{p: "#{true3_body}\n"}],
298
+ true_case: [
299
+ {line: "#{true3_body}"},
300
+ {blank: "\n"},
301
+ {blank: "\n"},
302
+ ],
240
303
  }}]
241
304
  }}]
242
305
  }
@@ -252,13 +315,25 @@ SOURCE
252
315
  should eq(
253
316
  Smartdown::Model::Element::Conditional.new(
254
317
  Smartdown::Model::Predicate::Named.new("pred1?"),
255
- [Smartdown::Model::Element::MarkdownParagraph.new(true1_body + "\n")],
318
+ [
319
+ Smartdown::Model::Element::MarkdownLine.new(true1_body),
320
+ Smartdown::Model::Element::MarkdownLine.new("\n"),
321
+ Smartdown::Model::Element::MarkdownLine.new("\n"),
322
+ ],
256
323
  [Smartdown::Model::Element::Conditional.new(
257
324
  Smartdown::Model::Predicate::Named.new("pred2?"),
258
- [Smartdown::Model::Element::MarkdownParagraph.new(true2_body + "\n")],
325
+ [
326
+ Smartdown::Model::Element::MarkdownLine.new(true2_body),
327
+ Smartdown::Model::Element::MarkdownLine.new("\n"),
328
+ Smartdown::Model::Element::MarkdownLine.new("\n"),
329
+ ],
259
330
  [Smartdown::Model::Element::Conditional.new(
260
331
  Smartdown::Model::Predicate::Named.new("pred3?"),
261
- [Smartdown::Model::Element::MarkdownParagraph.new(true3_body + "\n")]
332
+ [
333
+ Smartdown::Model::Element::MarkdownLine.new(true3_body),
334
+ Smartdown::Model::Element::MarkdownLine.new("\n"),
335
+ Smartdown::Model::Element::MarkdownLine.new("\n"),
336
+ ]
262
337
  )]
263
338
  )]
264
339
  )
@@ -296,11 +371,23 @@ SOURCE
296
371
  should parse(source).as(
297
372
  conditional: {
298
373
  predicate: {named_predicate: "pred1?"},
299
- true_case: [{p: "#{true1_body}\n"}],
374
+ true_case: [
375
+ {line: "#{true1_body}"},
376
+ {blank: "\n"},
377
+ {blank: "\n"},
378
+ ],
300
379
  false_case: [{conditional: {
301
380
  predicate: {named_predicate: "pred2?"},
302
- true_case: [{p: "#{true2_body}\n"}],
303
- false_case: [{p: "#{false_body}\n"}]
381
+ true_case: [
382
+ {line: "#{true2_body}"},
383
+ {blank: "\n"},
384
+ {blank: "\n"},
385
+ ],
386
+ false_case: [
387
+ {line: "#{false_body}"},
388
+ {blank: "\n"},
389
+ {blank: "\n"},
390
+ ]
304
391
  }}]
305
392
  }
306
393
  )
@@ -316,11 +403,23 @@ SOURCE
316
403
  should eq(
317
404
  Smartdown::Model::Element::Conditional.new(
318
405
  Smartdown::Model::Predicate::Named.new("pred1?"),
319
- [Smartdown::Model::Element::MarkdownParagraph.new(true1_body + "\n")],
406
+ [
407
+ Smartdown::Model::Element::MarkdownLine.new(true1_body),
408
+ Smartdown::Model::Element::MarkdownLine.new("\n"),
409
+ Smartdown::Model::Element::MarkdownLine.new("\n"),
410
+ ],
320
411
  [Smartdown::Model::Element::Conditional.new(
321
412
  Smartdown::Model::Predicate::Named.new("pred2?"),
322
- [Smartdown::Model::Element::MarkdownParagraph.new(true2_body + "\n")],
323
- [Smartdown::Model::Element::MarkdownParagraph.new(false_body + "\n")]
413
+ [
414
+ Smartdown::Model::Element::MarkdownLine.new(true2_body),
415
+ Smartdown::Model::Element::MarkdownLine.new("\n"),
416
+ Smartdown::Model::Element::MarkdownLine.new("\n"),
417
+ ],
418
+ [
419
+ Smartdown::Model::Element::MarkdownLine.new(false_body),
420
+ Smartdown::Model::Element::MarkdownLine.new("\n"),
421
+ Smartdown::Model::Element::MarkdownLine.new("\n"),
422
+ ]
324
423
  )]
325
424
  )
326
425
  )
@@ -354,12 +453,21 @@ SOURCE
354
453
  conditional: {
355
454
  predicate: {named_predicate: "pred1?"},
356
455
  true_case: [
357
- {p: "#{first_true_body}\n"},
456
+ {line: "#{first_true_body}"},
457
+ {blank: "\n"},
458
+ {blank: "\n"},
358
459
  {conditional: {
359
- predicate: {named_predicate: "pred2?"},
360
- true_case: [{p: "#{both_true_body}\n"}],
460
+ predicate: {named_predicate: "pred2?"},
461
+ true_case: [
462
+ {line: "#{both_true_body}"},
463
+ {blank: "\n"},
464
+ {blank: "\n"},
465
+ ],
361
466
  }},
362
- {p: "#{first_true_body}\n"}
467
+ {blank: "\n"},
468
+ {line: "#{first_true_body}"},
469
+ {blank: "\n"},
470
+ {blank: "\n"},
363
471
  ]
364
472
  }
365
473
  )
@@ -388,7 +496,13 @@ TAG
388
496
  conditional: {
389
497
  predicate: {named_predicate: "pred?"},
390
498
  true_case: [
391
- {p: "#{true_body}"}
499
+ {line: "$E"},
500
+ {blank: "\n"},
501
+ {line: "Bit of content in lovely custom tag"},
502
+ {blank: "\n"},
503
+ {line: "$E"},
504
+ {blank: "\n"},
505
+ {blank: "\n"},
392
506
  ]},
393
507
  )
394
508
  }
@@ -5,12 +5,12 @@ describe Smartdown::Parser::Element::FrontMatter do
5
5
 
6
6
  subject(:parser) { described_class.new }
7
7
 
8
- it { should parse("a: 1\n").as(front_matter: [{name: "a", value: "1"}]) }
9
- it { should parse("a: 1\nb: 2\n").as(front_matter: [{name: "a", value: "1"}, {name: "b", value: "2"}]) }
8
+ it { should parse("---\na: 1\n---\n").as(front_matter: [{name: "a", value: "1"}]) }
9
+ it { should parse("---\na: 1\nb: 2\n---\n").as(front_matter: [{name: "a", value: "1"}, {name: "b", value: "2"}]) }
10
10
 
11
11
  describe "transformed" do
12
12
  let(:node_name) { "my_node" }
13
- let(:source) { "a: 1\n" }
13
+ let(:source) { "---\na: 1\n---\n" }
14
14
  subject(:transformed) {
15
15
  Smartdown::Parser::NodeInterpreter.new(node_name, source, parser: parser).interpret
16
16
  }
@@ -0,0 +1,28 @@
1
+ require 'smartdown/parser/element/markdown_line'
2
+ require 'smartdown/parser/node_interpreter'
3
+
4
+ describe Smartdown::Parser::Element::MarkdownLine do
5
+
6
+ subject(:parser) { described_class.new }
7
+ let(:node_name) { "my_node" }
8
+
9
+ it { should parse("My para").as(line: "My para") }
10
+ it { should_not parse("My para\n").as(line: "My para\n") }
11
+ it { should parse(" My para").as(line: " My para") }
12
+ it { should_not parse(" My para\nsecond line") }
13
+ it { should_not parse(" My para\nsecond line\n") }
14
+ it { should_not parse(" My para\nsecond line \n") }
15
+ it { should_not parse("Para1\n\nPara2") }
16
+
17
+ it { should parse("a b") }
18
+
19
+ describe "transformed" do
20
+ let(:content) { "My para" }
21
+ subject(:transformed) {
22
+ Smartdown::Parser::NodeInterpreter.new(node_name, content, parser: parser).interpret
23
+ }
24
+
25
+ it { should eq(Smartdown::Model::Element::MarkdownLine.new(content)) }
26
+ end
27
+ end
28
+
@@ -3,7 +3,9 @@ require 'smartdown/model/element/start_button'
3
3
 
4
4
  describe "interpreting a cover sheet containing a start button" do
5
5
  let(:source) { <<-SOURCE
6
+ ---
6
7
  meta_description: My coversheet
8
+ ---
7
9
 
8
10
  # Cover sheet
9
11
 
@@ -20,8 +20,10 @@ SOURCE
20
20
  should parse(source).as({
21
21
  body: [
22
22
  {h1: "This is my title"},
23
- {p: "This is a paragraph of text with stuff\nthat flows along\n"},
24
- {p: "Another paragraph of text\n"}
23
+ {blank_line: "\n", element: {line: "This is a paragraph of text with stuff"}},
24
+ {blank_line: "\n", element: {line: "that flows along"}},
25
+ {blank_line: "\n\n", element: {line: "Another paragraph of text"}},
26
+ {blank_line: "\n", element: {blank: nil}},
25
27
  ]
26
28
  })
27
29
  }
@@ -34,7 +36,9 @@ SOURCE
34
36
  describe "front matter and body" do
35
37
  let(:source) {
36
38
  <<SOURCE
39
+ ---
37
40
  name: My node
41
+ ---
38
42
 
39
43
  # This is my title
40
44
 
@@ -49,7 +53,8 @@ SOURCE
49
53
  ],
50
54
  body: [
51
55
  {h1: "This is my title"},
52
- {p: "A paragraph\n"}
56
+ {blank_line: "\n", element: {line: "A paragraph"}},
57
+ {blank_line: "\n", element: {blank: nil}},
53
58
  ]
54
59
  })
55
60
  end
@@ -70,13 +75,16 @@ SOURCE
70
75
  should parse(source).as({
71
76
  body: [
72
77
  {h1: "This is my title"},
73
- {multiple_choice: {
74
- identifier: "my_question",
75
- options: [
76
- {value: "yes", label: "Yes"},
77
- {value: "no", label: "No"}
78
- ],
79
- option_pairs: []}
78
+ {blank_line: "\n",
79
+ element: {
80
+ multiple_choice: {
81
+ identifier: "my_question",
82
+ options: [
83
+ {value: "yes", label: "Yes"},
84
+ {value: "no", label: "No"}
85
+ ],
86
+ option_pairs: []}
87
+ }
80
88
  }
81
89
  ]
82
90
  })
@@ -102,16 +110,22 @@ SOURCE
102
110
  should parse(source).as({
103
111
  body: [
104
112
  {h1: "This is my title"},
105
- {multiple_choice: {
106
- identifier: "my_question",
107
- options: [
108
- {value: "yes", label: "Yes"},
109
- {value: "no", label: "No"}
110
- ],
111
- option_pairs: []}
113
+ {blank_line: "\n",
114
+ element: {
115
+ multiple_choice: {
116
+ identifier: "my_question",
117
+ options: [
118
+ {value: "yes", label: "Yes"},
119
+ {value: "no", label: "No"}
120
+ ],
121
+ option_pairs: []
122
+ }
123
+ }
112
124
  },
113
- {h1: "Next node rules"},
114
- {next_node_rules: [{rule: {predicate: {named_predicate: "pred1?"}, outcome: "outcome"}}]}
125
+ {blank_line: "\n", element: {h1: "Next node rules"}},
126
+ {blank_line: "\n", element:
127
+ {next_node_rules: [{rule: {predicate: {named_predicate: "pred1?"}, outcome: "outcome"}}]}
128
+ }
115
129
  ]
116
130
  })
117
131
  }
@@ -125,8 +139,11 @@ SOURCE
125
139
  let(:expected_elements) {
126
140
  [
127
141
  Smartdown::Model::Element::MarkdownHeading.new("This is my title"),
142
+ Smartdown::Model::Element::MarkdownLine.new("\n"),
128
143
  Smartdown::Model::Element::Question::MultipleChoice.new("my_question", "yes"=>"Yes", "no"=>"No"),
144
+ Smartdown::Model::Element::MarkdownLine.new("\n"),
129
145
  Smartdown::Model::Element::MarkdownHeading.new("Next node rules"),
146
+ Smartdown::Model::Element::MarkdownLine.new("\n"),
130
147
  Smartdown::Model::NextNodeRules.new([
131
148
  Smartdown::Model::Rule.new(Smartdown::Model::Predicate::Named.new("pred1?"), "outcome")
132
149
  ])
@@ -159,10 +176,18 @@ SOURCE
159
176
  it {
160
177
  should parse(source).as({
161
178
  body: [
162
- {conditional: {
179
+ { conditional: {
163
180
  predicate: {named_predicate: "pred1?"},
164
- true_case: [{p: "Text when true\n"}],
165
- false_case: [{p: "Text when false\n"}]
181
+ true_case: [
182
+ {line: "Text when true"},
183
+ {blank: "\n"},
184
+ {blank: "\n"},
185
+ ],
186
+ false_case: [
187
+ {line: "Text when false"},
188
+ {blank: "\n"},
189
+ {blank: "\n"},
190
+ ]
166
191
  }}
167
192
  ]
168
193
  })
@@ -187,8 +212,10 @@ SOURCE
187
212
  should parse(source).as({
188
213
  body: [
189
214
  {h1: "This is my title"},
190
- {p: "This is a paragraph of text with stuff\nthat flows along\n"},
191
- {p: "Another paragraph of text\n"}
215
+ {blank_line: "\n", element: {line: "This is a paragraph of text with stuff"}},
216
+ {blank_line: "\n", element: {line: "that flows along"}},
217
+ {blank_line: "\n\n", element: {line: "Another paragraph of text"}},
218
+ {blank_line: "\n\n\n", element: {blank: nil}},
192
219
  ]
193
220
  })
194
221
  }
@@ -199,7 +226,7 @@ SOURCE
199
226
  let(:source) {
200
227
  <<SOURCE
201
228
  # Lovely title
202
-
229
+
203
230
  line of content
204
231
  SOURCE
205
232
  }
@@ -207,8 +234,9 @@ SOURCE
207
234
  it "doesn't blow up" do
208
235
  should parse(source).as({
209
236
  body: [
210
- { h1: "Lovely title" },
211
- { p: "line of content\n" },
237
+ {h1: "Lovely title" },
238
+ {blank_line: "\n", element: {line: "line of content" }},
239
+ {blank_line: "\n", element: {blank: nil }},
212
240
  ]
213
241
  })
214
242
  end
@@ -1,7 +1,7 @@
1
1
  require 'smartdown/model/flow'
2
2
  require 'smartdown/model/node'
3
3
  require 'smartdown/model/element/markdown_heading'
4
- require 'smartdown/model/element/markdown_paragraph'
4
+ require 'smartdown/model/element/markdown_line'
5
5
  require 'smartdown/model/element/start_button'
6
6
  require 'smartdown/model/element/question/multiple_choice'
7
7
  require 'smartdown/model/element/question/date'
@@ -41,9 +41,9 @@ class ModelBuilder
41
41
  @elements.last
42
42
  end
43
43
 
44
- def paragraph(content)
44
+ def line(content)
45
45
  @elements ||= []
46
- @elements << Smartdown::Model::Element::MarkdownParagraph.new(content)
46
+ @elements << Smartdown::Model::Element::MarkdownLine.new(content)
47
47
  @elements.last
48
48
  end
49
49