|
| 1 | +// Copyright 2023 The Gitea Authors. All rights reserved. |
| 2 | +// SPDX-License-Identifier: MIT |
| 3 | + |
| 4 | +package asciicast |
| 5 | + |
| 6 | +import ( |
| 7 | + "fmt" |
| 8 | + "io" |
| 9 | + "net/url" |
| 10 | + "regexp" |
| 11 | + |
| 12 | + "code.gitea.io/gitea/modules/markup" |
| 13 | + "code.gitea.io/gitea/modules/setting" |
| 14 | +) |
| 15 | + |
| 16 | +func init() { |
| 17 | + markup.RegisterRenderer(Renderer{}) |
| 18 | +} |
| 19 | + |
| 20 | +// Renderer implements markup.Renderer for asciicast files. |
| 21 | +// See https://github.com/asciinema/asciinema/blob/develop/doc/asciicast-v2.md |
| 22 | +type Renderer struct{} |
| 23 | + |
| 24 | +// Name implements markup.Renderer |
| 25 | +func (Renderer) Name() string { |
| 26 | + return "asciicast" |
| 27 | +} |
| 28 | + |
| 29 | +// Extensions implements markup.Renderer |
| 30 | +func (Renderer) Extensions() []string { |
| 31 | + return []string{".cast"} |
| 32 | +} |
| 33 | + |
| 34 | +const ( |
| 35 | + playerClassName = "asciinema-player-container" |
| 36 | + playerSrcAttr = "data-asciinema-player-src" |
| 37 | +) |
| 38 | + |
| 39 | +// SanitizerRules implements markup.Renderer |
| 40 | +func (Renderer) SanitizerRules() []setting.MarkupSanitizerRule { |
| 41 | + return []setting.MarkupSanitizerRule{ |
| 42 | + {Element: "div", AllowAttr: "class", Regexp: regexp.MustCompile(playerClassName)}, |
| 43 | + {Element: "div", AllowAttr: playerSrcAttr}, |
| 44 | + } |
| 45 | +} |
| 46 | + |
| 47 | +// Render implements markup.Renderer |
| 48 | +func (Renderer) Render(ctx *markup.RenderContext, _ io.Reader, output io.Writer) error { |
| 49 | + rawURL := fmt.Sprintf("%s/%s/%s/raw/%s/%s", |
| 50 | + setting.AppSubURL, |
| 51 | + url.PathEscape(ctx.Metas["user"]), |
| 52 | + url.PathEscape(ctx.Metas["repo"]), |
| 53 | + ctx.Metas["BranchNameSubURL"], |
| 54 | + url.PathEscape(ctx.RelativePath), |
| 55 | + ) |
| 56 | + |
| 57 | + _, err := io.WriteString(output, fmt.Sprintf( |
| 58 | + `<div class="%s" %s="%s"></div>`, |
| 59 | + playerClassName, |
| 60 | + playerSrcAttr, |
| 61 | + rawURL, |
| 62 | + )) |
| 63 | + return err |
| 64 | +} |
0 commit comments