@@ -38,12 +38,25 @@ open class DocumentParser {
3838 fileprivate var currentContainer : Container
3939
4040 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
4760
4861 /// Initializer
4962 public init ( blockParsers: [ BlockParser . Type ] , input: String ) {
@@ -54,6 +67,7 @@ open class DocumentParser {
5467 self . container = docContainer
5568 self . currentContainer = docContainer
5669 self . prevParagraphLines = nil
70+ self . prevParagraphLinesTight = false
5771 self . line = input [ input. startIndex..< input. startIndex]
5872 self . contentStartIndex = self . line. startIndex
5973 self . contentEndIndex = self . line. endIndex
@@ -71,6 +85,7 @@ open class DocumentParser {
7185 state. container = self . container
7286 state. currentContainer = self . currentContainer
7387 state. prevParagraphLines = self . prevParagraphLines
88+ state. prevParagraphLinesTight = self . prevParagraphLinesTight
7489 state. line = self . line
7590 state. contentStartIndex = self . contentStartIndex
7691 state. contentEndIndex = self . contentEndIndex
@@ -84,6 +99,7 @@ open class DocumentParser {
8499 self . container = state. container
85100 self . currentContainer = state. currentContainer
86101 self . prevParagraphLines = state. prevParagraphLines
102+ self . prevParagraphLinesTight = state. prevParagraphLinesTight
87103 self . line = state. line
88104 self . contentStartIndex = state. contentStartIndex
89105 self . contentEndIndex = state. contentEndIndex
@@ -101,9 +117,10 @@ open class DocumentParser {
101117 return
102118 }
103119 if let lines = self . prevParagraphLines {
104- self . container. content . append ( . paragraph( lines. finalized ( ) ) )
120+ self . container. append ( block : . paragraph( lines. finalized ( ) ) , tight : self . prevParagraphLinesTight )
105121 self . container = self . container. return ( to: self . currentContainer, for: self )
106122 self . prevParagraphLines = nil
123+ self . prevParagraphLinesTight = false
107124 }
108125 guard self . index! < self . input. endIndex else {
109126 self . index = nil
@@ -187,11 +204,12 @@ open class DocumentParser {
187204 self . container = self . container. return ( to: self . currentContainer, for: self )
188205 self . currentContainer = self . container
189206 for blockParser in self . blockParsers {
207+ let tight = !self . prevLineEmpty
190208 switch blockParser. parse ( ) {
191209 case . none:
192210 break
193211 case . block( let block) :
194- self . container. content . append ( block)
212+ self . container. append ( block: block , tight : tight )
195213 continue loop
196214 case . container( let constr) :
197215 self . currentContainer = constr ( self . container)
@@ -200,22 +218,27 @@ open class DocumentParser {
200218 }
201219 }
202220 var lines = Text ( )
221+ let linesTight = !self . prevLineEmpty
203222 lines. append ( line: self . trimLine ( ) , withHardLineBreak: self . hasHardLineBreak ( ) )
204223 self . readNextLine ( )
205224 while !self . finished && !self . lineEmpty {
206225 self . prevParagraphLines = lines
226+ self . prevParagraphLinesTight = linesTight
227+ let tight = !self . prevLineEmpty
207228 for blockParser in self . blockParsers {
208229 if blockParser. mayInterruptParagraph {
209230 switch blockParser. parse ( ) {
210231 case . none:
211232 break
212233 case . block( let block) :
213- self . container. content . append ( block)
234+ self . container. append ( block: block , tight : tight )
214235 self . prevParagraphLines = nil
236+ self . prevParagraphLinesTight = false
215237 continue loop
216238 case . container( let constr) :
217239 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)
219242 self . container = constr (
220243 self . container. return ( to: self . currentContainer, for: self ) )
221244 self . currentContainer = self . container
@@ -224,15 +247,17 @@ open class DocumentParser {
224247 self . container = self . currentContainer
225248 }
226249 self . prevParagraphLines = nil
250+ self . prevParagraphLinesTight = false
227251 continue loop
228252 }
229253 }
230254 }
231255 self . prevParagraphLines = nil
256+ self . prevParagraphLinesTight = false
232257 lines. append ( line: self . trimLine ( ) , withHardLineBreak: self . hasHardLineBreak ( ) )
233258 self . readNextLine ( )
234259 }
235- self . container. content . append ( . paragraph( lines. finalized ( ) ) )
260+ self . container. append ( block : . paragraph( lines. finalized ( ) ) , tight : linesTight )
236261 }
237262 }
238263 self . container = self . container. return ( for: self )
@@ -251,7 +276,7 @@ open class DocumentParser {
251276 if let ltype = listType {
252277 if type. compatible ( with: ltype) {
253278 items. append ( block)
254- if !t || !nested . isSingleton {
279+ if !t. isTight {
255280 tight = false
256281 }
257282 } else {
@@ -264,7 +289,7 @@ open class DocumentParser {
264289 } else {
265290 listType = type
266291 items. append ( block)
267- if !nested . isSingleton {
292+ if !t . isTightInitially {
268293 tight = false
269294 }
270295 }
@@ -314,6 +339,7 @@ internal struct DocumentParserState {
314339 fileprivate var container : Container
315340 fileprivate var currentContainer : Container
316341 fileprivate var prevParagraphLines : Text ?
342+ fileprivate var prevParagraphLinesTight : Bool
317343 fileprivate var line : Substring
318344 fileprivate var contentStartIndex : Substring . Index
319345 fileprivate var contentEndIndex : Substring . Index
@@ -326,6 +352,7 @@ internal struct DocumentParserState {
326352 self . container = docParser. container
327353 self . currentContainer = docParser. currentContainer
328354 self . prevParagraphLines = docParser. prevParagraphLines
355+ self . prevParagraphLinesTight = docParser. prevParagraphLinesTight
329356 self . line = docParser. line
330357 self . contentStartIndex = docParser. contentStartIndex
331358 self . contentEndIndex = docParser. contentEndIndex
0 commit comments