MCPcopy
hub / github.com/ayn2op/discordo / renderFencedCodeBlock

Method renderFencedCodeBlock

internal/markdown/renderer.go:141–209  ·  view source on GitHub ↗
(builder *tview.LineBuilder, source []byte, node *ast.FencedCodeBlock, base tcell.Style)

Source from the content-addressed store, hash-verified

139}
140
141func (r *Renderer) renderFencedCodeBlock(builder *tview.LineBuilder, source []byte, node *ast.FencedCodeBlock, base tcell.Style) {
142 var code strings.Builder
143 lines := node.Lines()
144 for i := range lines.Len() {
145 line := lines.At(i)
146 code.Write(line.Value(source))
147 }
148
149 language := strings.TrimSpace(string(node.Language(source)))
150 lexer := lexers.Get(language)
151 declaredLanguageSupported := lexer != nil
152
153 // Detect the language from its content.
154 var analyzed bool
155 if lexer == nil {
156 lexer = lexers.Analyse(code.String())
157 analyzed = lexer != nil
158 }
159 if lexer == nil {
160 lexer = lexers.Fallback
161 }
162
163 // Some lexers emit many tiny tokens; coalesce runs of the same type.
164 lexer = chroma.Coalesce(lexer)
165
166 var header string
167 switch {
168 case analyzed:
169 header = "code: analyzed"
170 case language == "":
171 header = "code"
172 case !declaredLanguageSupported:
173 header = "code: " + language
174 }
175 if header != "" {
176 builder.Write(codeBlockIndent+header, base.Dim(true))
177 builder.NewLine()
178 }
179
180 iterator, err := lexer.Tokenise(nil, code.String())
181 if err != nil {
182 for i := range lines.Len() {
183 line := lines.At(i)
184 builder.Write(codeBlockIndent+string(line.Value(source)), base)
185 }
186 return
187 }
188
189 theme := styles.Get(r.cfg.Markdown.Theme)
190 if theme == nil {
191 theme = styles.Fallback
192 }
193
194 builder.Write(codeBlockIndent, base)
195 for token := iterator(); token != chroma.EOF; token = iterator() {
196 style := applyChromaStyle(base, theme.Get(token.Type))
197 // Chroma tokens may include embedded newlines, so split and re-emit with indentation on each visual line.
198 parts := strings.Split(token.Value, "\n")

Callers 1

RenderLinesMethod · 0.95

Calls 4

applyChromaStyleFunction · 0.85
GetMethod · 0.80
LenMethod · 0.45
StringMethod · 0.45

Tested by

no test coverage detected