@@ -139,10 +139,36 @@ public enum RenderBlockContent: Equatable {
139
139
public struct CodeBlockOptions : Equatable {
140
140
public var language : String ?
141
141
public var copyToClipboard : Bool
142
- public var wrap : Int
143
- public var highlight : [ Int ]
144
142
public var showLineNumbers : Bool
145
- public var strikeout : [ Int ]
143
+ public var wrap : Int
144
+ public var lineAnnotations : [ LineAnnotation ]
145
+
146
+ public struct Position : Equatable , Comparable , Codable {
147
+ public static func < ( lhs: RenderBlockContent . CodeBlockOptions . Position , rhs: RenderBlockContent . CodeBlockOptions . Position ) -> Bool {
148
+ if lhs. line == rhs. line, let lhsCharacter = lhs. character, let rhsCharacter = rhs. character {
149
+ return lhsCharacter < rhsCharacter
150
+ }
151
+ return lhs. line < rhs. line
152
+ }
153
+
154
+ public init ( line: Int , character: Int ? = nil ) {
155
+ self . line = line
156
+ self . character = character
157
+ }
158
+
159
+ var line : Int
160
+ var character : Int ?
161
+ }
162
+
163
+ //public struct Range: Equatable, Codable {
164
+ // var start: Position
165
+ // var end: Position
166
+ //}
167
+
168
+ public struct LineAnnotation : Equatable , Codable {
169
+ var style : String
170
+ var range : Range < Position >
171
+ }
146
172
147
173
public enum OptionName : String , CaseIterable {
148
174
case _nonFrozenEnum_useDefaultCase
@@ -166,10 +192,9 @@ public enum RenderBlockContent: Equatable {
166
192
public init ( ) {
167
193
self . language = " "
168
194
self . copyToClipboard = true
169
- self . wrap = 0
170
- self . highlight = [ ]
171
195
self . showLineNumbers = false
172
- self . strikeout = [ ]
196
+ self . wrap = 0
197
+ self . lineAnnotations = [ ]
173
198
}
174
199
175
200
public init ( parsingLanguageString language: String ? ) {
@@ -186,27 +211,53 @@ public enum RenderBlockContent: Equatable {
186
211
self . wrap = 0
187
212
}
188
213
189
- if let highlightString = tokens. first ( where: { $0. name == . highlight } ) ? . value,
190
- let highlightValue = Self . parseCodeBlockOptionsArray ( highlightString) {
191
- self . highlight = highlightValue
192
- } else {
193
- self . highlight = [ ]
214
+ var annotations : [ LineAnnotation ] = [ ]
215
+
216
+ if let highlightString = tokens. first ( where: { $0. name == . highlight } ) ? . value {
217
+ let highlightValue = Self . parseCodeBlockOptionsArray ( highlightString)
218
+ for line in highlightValue {
219
+ let pos = Position ( line: line, character: nil )
220
+ let range = pos..< pos
221
+ annotations. append ( LineAnnotation ( style: " highlight " , range: range) )
222
+ }
194
223
}
195
224
196
- if let strikeoutString = tokens. first ( where: { $0. name == . strikeout } ) ? . value,
197
- let strikeoutValue = Self . parseCodeBlockOptionsArray ( strikeoutString) {
198
- self . strikeout = strikeoutValue
199
- } else {
200
- self . strikeout = [ ]
225
+ if let strikeoutString = tokens. first ( where: { $0. name == . strikeout } ) ? . value {
226
+ let strikeoutValue = Self . parseCodeBlockOptionsArray ( strikeoutString)
227
+ for line in strikeoutValue {
228
+ let pos = Position ( line: line, character: nil )
229
+ let range = pos..< pos
230
+ annotations. append ( LineAnnotation ( style: " strikeout " , range: range) )
231
+ }
201
232
}
233
+
234
+ self . lineAnnotations = annotations
202
235
}
203
236
204
- public init ( copyToClipboard: Bool , wrap: Int , highlight: [ Int ] , strikeout: [ Int ] , showLineNumbers : Bool ) {
237
+ public init ( copyToClipboard: Bool , showLineNumbers : Bool , wrap: Int , highlight: [ Int ] , strikeout: [ Int ] ) {
205
238
self . copyToClipboard = copyToClipboard
239
+ self . showLineNumbers = showLineNumbers
206
240
self . wrap = wrap
207
- self . highlight = highlight
241
+
242
+ var annotations : [ LineAnnotation ] = [ ]
243
+ for line in highlight {
244
+ let pos = Position ( line: line, character: nil )
245
+ let range = pos..< pos
246
+ annotations. append ( LineAnnotation ( style: " highlight " , range: range) )
247
+ }
248
+ for line in strikeout {
249
+ let pos = Position ( line: line, character: nil )
250
+ let range = pos..< pos
251
+ annotations. append ( LineAnnotation ( style: " strikeout " , range: range) )
252
+ }
253
+ self . lineAnnotations = annotations
254
+ }
255
+
256
+ public init ( copyToClipboard: Bool , showLineNumbers: Bool , wrap: Int , lineAnnotations: [ LineAnnotation ] ) {
257
+ self . copyToClipboard = copyToClipboard
208
258
self . showLineNumbers = showLineNumbers
209
- self . strikeout = strikeout
259
+ self . wrap = wrap
260
+ self . lineAnnotations = lineAnnotations
210
261
}
211
262
212
263
/// A function that parses array values on code block options from the language line string
@@ -863,7 +914,7 @@ extension RenderBlockContent.Table: Codable {
863
914
extension RenderBlockContent : Codable {
864
915
private enum CodingKeys : CodingKey {
865
916
case type
866
- case inlineContent, content, caption, style, name, syntax, code, level, text, items, media, runtimePreview, anchor, summary, example, metadata, start, copyToClipboard, wrap , highlight , strikeout , showLineNumbers
917
+ case inlineContent, content, caption, style, name, syntax, code, level, text, items, media, runtimePreview, anchor, summary, example, metadata, start, copyToClipboard, showLineNumbers , wrap , lineAnnotations
867
918
case request, response
868
919
case header, rows
869
920
case numberOfColumns, columns
@@ -887,13 +938,12 @@ extension RenderBlockContent: Codable {
887
938
case . codeListing:
888
939
let copy = FeatureFlags . current. isExperimentalCodeBlockAnnotationsEnabled
889
940
let options : CodeBlockOptions ?
890
- if !Set( container. allKeys) . isDisjoint ( with: [ . copyToClipboard, . wrap , . highlight , . strikeout , . showLineNumbers ] ) {
941
+ if !Set( container. allKeys) . isDisjoint ( with: [ . copyToClipboard, . showLineNumbers , . wrap , . lineAnnotations ] ) {
891
942
options = try CodeBlockOptions (
892
943
copyToClipboard: container. decodeIfPresent ( Bool . self, forKey: . copyToClipboard) ?? copy,
944
+ showLineNumbers: container. decodeIfPresent ( Bool . self, forKey: . showLineNumbers) ?? false ,
893
945
wrap: container. decodeIfPresent ( Int . self, forKey: . wrap) ?? 0 ,
894
- highlight: container. decodeIfPresent ( [ Int ] . self, forKey: . highlight) ?? [ ] ,
895
- strikeout: container. decodeIfPresent ( [ Int ] . self, forKey: . strikeout) ?? [ ] ,
896
- showLineNumbers: container. decodeIfPresent ( Bool . self, forKey: . showLineNumbers) ?? false
946
+ lineAnnotations: container. decodeIfPresent ( [ CodeBlockOptions . LineAnnotation ] . self, forKey: . lineAnnotations) ?? [ ]
897
947
)
898
948
} else {
899
949
options = nil
@@ -1007,10 +1057,9 @@ extension RenderBlockContent: Codable {
1007
1057
try container. encode ( l. code, forKey: . code)
1008
1058
try container. encodeIfPresent ( l. metadata, forKey: . metadata)
1009
1059
try container. encodeIfPresent ( l. options? . copyToClipboard, forKey: . copyToClipboard)
1010
- try container. encodeIfPresent ( l. options? . wrap, forKey: . wrap)
1011
- try container. encodeIfPresent ( l. options? . highlight, forKey: . highlight)
1012
- try container. encodeIfPresent ( l. options? . strikeout, forKey: . strikeout)
1013
1060
try container. encodeIfPresent ( l. options? . showLineNumbers, forKey: . showLineNumbers)
1061
+ try container. encodeIfPresent ( l. options? . wrap, forKey: . wrap)
1062
+ try container. encodeIfPresent ( l. options? . lineAnnotations, forKey: . lineAnnotations)
1014
1063
case . heading( let h) :
1015
1064
try container. encode ( h. level, forKey: . level)
1016
1065
try container. encode ( h. text, forKey: . text)
0 commit comments