code.gitea.io/gitea@v1.19.3/modules/markup/console/console.go (about) 1 // Copyright 2022 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package console 5 6 import ( 7 "bytes" 8 "io" 9 "path/filepath" 10 "regexp" 11 "strings" 12 13 "code.gitea.io/gitea/modules/markup" 14 "code.gitea.io/gitea/modules/setting" 15 16 trend "github.com/buildkite/terminal-to-html/v3" 17 "github.com/go-enry/go-enry/v2" 18 ) 19 20 // MarkupName describes markup's name 21 var MarkupName = "console" 22 23 func init() { 24 markup.RegisterRenderer(Renderer{}) 25 } 26 27 // Renderer implements markup.Renderer 28 type Renderer struct{} 29 30 // Name implements markup.Renderer 31 func (Renderer) Name() string { 32 return MarkupName 33 } 34 35 // Extensions implements markup.Renderer 36 func (Renderer) Extensions() []string { 37 return []string{".sh-session"} 38 } 39 40 // SanitizerRules implements markup.Renderer 41 func (Renderer) SanitizerRules() []setting.MarkupSanitizerRule { 42 return []setting.MarkupSanitizerRule{ 43 {Element: "span", AllowAttr: "class", Regexp: regexp.MustCompile(`^term-((fg[ix]?|bg)\d+|container)$`)}, 44 } 45 } 46 47 // CanRender implements markup.RendererContentDetector 48 func (Renderer) CanRender(filename string, input io.Reader) bool { 49 buf, err := io.ReadAll(input) 50 if err != nil { 51 return false 52 } 53 if enry.GetLanguage(filepath.Base(filename), buf) != enry.OtherLanguage { 54 return false 55 } 56 return bytes.ContainsRune(buf, '\x1b') 57 } 58 59 // Render renders terminal colors to HTML with all specific handling stuff. 60 func (Renderer) Render(ctx *markup.RenderContext, input io.Reader, output io.Writer) error { 61 buf, err := io.ReadAll(input) 62 if err != nil { 63 return err 64 } 65 buf = trend.Render(buf) 66 buf = bytes.ReplaceAll(buf, []byte("\n"), []byte(`<br>`)) 67 _, err = output.Write(buf) 68 return err 69 } 70 71 // Render renders terminal colors to HTML with all specific handling stuff. 72 func Render(ctx *markup.RenderContext, input io.Reader, output io.Writer) error { 73 if ctx.Type == "" { 74 ctx.Type = MarkupName 75 } 76 return markup.Render(ctx, input, output) 77 } 78 79 // RenderString renders terminal colors in string to HTML with all specific handling stuff and return string 80 func RenderString(ctx *markup.RenderContext, content string) (string, error) { 81 var buf strings.Builder 82 if err := Render(ctx, strings.NewReader(content), &buf); err != nil { 83 return "", err 84 } 85 return buf.String(), nil 86 }