loading up the forgejo repo on tangled to test page performance
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}