@@ -38,12 +38,25 @@ open class DocumentParser {
38
38
fileprivate var currentContainer : Container
39
39
40
40
internal var prevParagraphLines : Text ?
41
- internal var line : Substring
42
- internal var contentStartIndex : Substring . Index
43
- internal var contentEndIndex : Substring . Index
44
- internal var lineIndent : Int
45
- internal var lineEmpty : Bool
46
- internal var prevLineEmpty : Bool
41
+ internal var prevParagraphLinesTight : Bool
42
+
43
+ /// Current line being parsed
44
+ internal fileprivate( set) var line : Substring
45
+
46
+ /// Start index on `line` where the content is (indentation was skipped)
47
+ internal fileprivate( set) var contentStartIndex : Substring . Index
48
+
49
+ /// End index on `line` where the content is
50
+ internal fileprivate( set) var contentEndIndex : Substring . Index
51
+
52
+ /// Number of identation characters at beginning of line
53
+ internal fileprivate( set) var lineIndent : Int
54
+
55
+ /// Is the line empty?
56
+ internal fileprivate( set) var lineEmpty : Bool
57
+
58
+ /// Was the previous line empty?
59
+ internal fileprivate( set) var prevLineEmpty : Bool
47
60
48
61
/// Initializer
49
62
public init ( blockParsers: [ BlockParser . Type ] , input: String ) {
@@ -54,6 +67,7 @@ open class DocumentParser {
54
67
self . container = docContainer
55
68
self . currentContainer = docContainer
56
69
self . prevParagraphLines = nil
70
+ self . prevParagraphLinesTight = false
57
71
self . line = input [ input. startIndex..< input. startIndex]
58
72
self . contentStartIndex = self . line. startIndex
59
73
self . contentEndIndex = self . line. endIndex
@@ -71,6 +85,7 @@ open class DocumentParser {
71
85
state. container = self . container
72
86
state. currentContainer = self . currentContainer
73
87
state. prevParagraphLines = self . prevParagraphLines
88
+ state. prevParagraphLinesTight = self . prevParagraphLinesTight
74
89
state. line = self . line
75
90
state. contentStartIndex = self . contentStartIndex
76
91
state. contentEndIndex = self . contentEndIndex
@@ -84,6 +99,7 @@ open class DocumentParser {
84
99
self . container = state. container
85
100
self . currentContainer = state. currentContainer
86
101
self . prevParagraphLines = state. prevParagraphLines
102
+ self . prevParagraphLinesTight = state. prevParagraphLinesTight
87
103
self . line = state. line
88
104
self . contentStartIndex = state. contentStartIndex
89
105
self . contentEndIndex = state. contentEndIndex
@@ -101,9 +117,10 @@ open class DocumentParser {
101
117
return
102
118
}
103
119
if let lines = self . prevParagraphLines {
104
- self . container. content . append ( . paragraph( lines. finalized ( ) ) )
120
+ self . container. append ( block : . paragraph( lines. finalized ( ) ) , tight : self . prevParagraphLinesTight )
105
121
self . container = self . container. return ( to: self . currentContainer, for: self )
106
122
self . prevParagraphLines = nil
123
+ self . prevParagraphLinesTight = false
107
124
}
108
125
guard self . index! < self . input. endIndex else {
109
126
self . index = nil
@@ -187,11 +204,12 @@ open class DocumentParser {
187
204
self . container = self . container. return ( to: self . currentContainer, for: self )
188
205
self . currentContainer = self . container
189
206
for blockParser in self . blockParsers {
207
+ let tight = !self . prevLineEmpty
190
208
switch blockParser. parse ( ) {
191
209
case . none:
192
210
break
193
211
case . block( let block) :
194
- self . container. content . append ( block)
212
+ self . container. append ( block: block , tight : tight )
195
213
continue loop
196
214
case . container( let constr) :
197
215
self . currentContainer = constr ( self . container)
@@ -200,22 +218,27 @@ open class DocumentParser {
200
218
}
201
219
}
202
220
var lines = Text ( )
221
+ let linesTight = !self . prevLineEmpty
203
222
lines. append ( line: self . trimLine ( ) , withHardLineBreak: self . hasHardLineBreak ( ) )
204
223
self . readNextLine ( )
205
224
while !self . finished && !self . lineEmpty {
206
225
self . prevParagraphLines = lines
226
+ self . prevParagraphLinesTight = linesTight
227
+ let tight = !self . prevLineEmpty
207
228
for blockParser in self . blockParsers {
208
229
if blockParser. mayInterruptParagraph {
209
230
switch blockParser. parse ( ) {
210
231
case . none:
211
232
break
212
233
case . block( let block) :
213
- self . container. content . append ( block)
234
+ self . container. append ( block: block , tight : tight )
214
235
self . prevParagraphLines = nil
236
+ self . prevParagraphLinesTight = false
215
237
continue loop
216
238
case . container( let constr) :
217
239
if let plines = self . prevParagraphLines {
218
- self . container. content. append ( . paragraph( plines. finalized ( ) ) )
240
+ self . container. append ( block: . paragraph( plines. finalized ( ) ) ,
241
+ tight: self . prevParagraphLinesTight)
219
242
self . container = constr (
220
243
self . container. return ( to: self . currentContainer, for: self ) )
221
244
self . currentContainer = self . container
@@ -224,15 +247,17 @@ open class DocumentParser {
224
247
self . container = self . currentContainer
225
248
}
226
249
self . prevParagraphLines = nil
250
+ self . prevParagraphLinesTight = false
227
251
continue loop
228
252
}
229
253
}
230
254
}
231
255
self . prevParagraphLines = nil
256
+ self . prevParagraphLinesTight = false
232
257
lines. append ( line: self . trimLine ( ) , withHardLineBreak: self . hasHardLineBreak ( ) )
233
258
self . readNextLine ( )
234
259
}
235
- self . container. content . append ( . paragraph( lines. finalized ( ) ) )
260
+ self . container. append ( block : . paragraph( lines. finalized ( ) ) , tight : linesTight )
236
261
}
237
262
}
238
263
self . container = self . container. return ( for: self )
@@ -251,7 +276,7 @@ open class DocumentParser {
251
276
if let ltype = listType {
252
277
if type. compatible ( with: ltype) {
253
278
items. append ( block)
254
- if !t || !nested . isSingleton {
279
+ if !t. isTight {
255
280
tight = false
256
281
}
257
282
} else {
@@ -264,7 +289,7 @@ open class DocumentParser {
264
289
} else {
265
290
listType = type
266
291
items. append ( block)
267
- if !nested . isSingleton {
292
+ if !t . isTightInitially {
268
293
tight = false
269
294
}
270
295
}
@@ -314,6 +339,7 @@ internal struct DocumentParserState {
314
339
fileprivate var container : Container
315
340
fileprivate var currentContainer : Container
316
341
fileprivate var prevParagraphLines : Text ?
342
+ fileprivate var prevParagraphLinesTight : Bool
317
343
fileprivate var line : Substring
318
344
fileprivate var contentStartIndex : Substring . Index
319
345
fileprivate var contentEndIndex : Substring . Index
@@ -326,6 +352,7 @@ internal struct DocumentParserState {
326
352
self . container = docParser. container
327
353
self . currentContainer = docParser. currentContainer
328
354
self . prevParagraphLines = docParser. prevParagraphLines
355
+ self . prevParagraphLinesTight = docParser. prevParagraphLinesTight
329
356
self . line = docParser. line
330
357
self . contentStartIndex = docParser. contentStartIndex
331
358
self . contentEndIndex = docParser. contentEndIndex
0 commit comments