loading up the forgejo repo on tangled to test page performance
at forgejo 89 lines 2.3 kB view raw
1// Copyright 2022 The Gitea Authors. All rights reserved. 2// SPDX-License-Identifier: MIT 3 4package console 5 6import ( 7 "bytes" 8 "io" 9 "path/filepath" 10 "regexp" 11 "strings" 12 13 "forgejo.org/modules/markup" 14 "forgejo.org/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 21var MarkupName = "console" 22 23func init() { 24 markup.RegisterRenderer(Renderer{}) 25} 26 27// Renderer implements markup.Renderer 28type Renderer struct{} 29 30// Name implements markup.Renderer 31func (Renderer) Name() string { 32 return MarkupName 33} 34 35// Extensions implements markup.Renderer 36func (Renderer) Extensions() []string { 37 return []string{".sh-session"} 38} 39 40// SanitizerRules implements markup.Renderer 41func (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 48func (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. 60func (Renderer) Render(ctx *markup.RenderContext, input io.Reader, output io.Writer) error { 61 screen, err := trend.NewScreen() 62 if err != nil { 63 return err 64 } 65 if _, err := io.Copy(screen, input); err != nil { 66 return err 67 } 68 buf := screen.AsHTML() 69 buf = strings.ReplaceAll(buf, "\n", `<br>`) 70 _, err = output.Write([]byte(buf)) 71 return err 72} 73 74// Render renders terminal colors to HTML with all specific handling stuff. 75func Render(ctx *markup.RenderContext, input io.Reader, output io.Writer) error { 76 if ctx.Type == "" { 77 ctx.Type = MarkupName 78 } 79 return markup.Render(ctx, input, output) 80} 81 82// RenderString renders terminal colors in string to HTML with all specific handling stuff and return string 83func RenderString(ctx *markup.RenderContext, content string) (string, error) { 84 var buf strings.Builder 85 if err := Render(ctx, strings.NewReader(content), &buf); err != nil { 86 return "", err 87 } 88 return buf.String(), nil 89}