@@ -10,7 +10,8 @@ public class MarkdownFencedCodeBuilder: CodeNodeBuilder {
1010 isStartOfLine ( context) else { return false }
1111 context. consuming += 1
1212 let code = trimFence ( token. text)
13- let node = CodeBlockNode ( source: code, language: nil )
13+ let language = extractLanguage ( token. text)
14+ let node = CodeBlockNode ( source: code, language: language)
1415 context. current. append ( node)
1516 if context. consuming < context. tokens. count,
1617 let nl = context. tokens [ context. consuming] as? MarkdownToken ,
@@ -30,6 +31,18 @@ public class MarkdownFencedCodeBuilder: CodeNodeBuilder {
3031 return lines. joined ( separator: " \n " )
3132 }
3233
34+ private func extractLanguage( _ text: String ) -> String ? {
35+ guard let firstLine = text. split ( separator: " \n " , maxSplits: 1 ) . first else {
36+ return nil
37+ }
38+ var cleaned = firstLine. trimmingCharacters ( in: . whitespaces)
39+ while cleaned. starts ( with: " ` " ) {
40+ cleaned. removeFirst ( )
41+ }
42+ let lang = cleaned. trimmingCharacters ( in: . whitespaces)
43+ return lang. isEmpty ? nil : lang
44+ }
45+
3346 private func isStartOfLine( _ context: CodeContext < MarkdownNodeElement , MarkdownTokenElement > ) -> Bool {
3447 if context. consuming == 0 { return true }
3548 if let prev = context. tokens [ context. consuming - 1 ] as? MarkdownToken {
0 commit comments