Add NeedPostProcess for Parser interface to improve performance of csv render (#15153)

This commit is contained in:
Lunny Xiao 2021-04-13 15:06:31 +08:00 committed by GitHub
parent bf3e584de2
commit 66f0fd0959
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 38 additions and 14 deletions

View file

@ -831,12 +831,14 @@ Gitea can support Markup using external tools. The example below will add a mark
```ini ```ini
[markup.asciidoc] [markup.asciidoc]
ENABLED = true ENABLED = true
NEED_POSTPROCESS = true
FILE_EXTENSIONS = .adoc,.asciidoc FILE_EXTENSIONS = .adoc,.asciidoc
RENDER_COMMAND = "asciidoc --out-file=- -" RENDER_COMMAND = "asciidoc --out-file=- -"
IS_INPUT_FILE = false IS_INPUT_FILE = false
``` ```
- ENABLED: **false** Enable markup support; set to **true** to enable this renderer. - ENABLED: **false** Enable markup support; set to **true** to enable this renderer.
- NEED\_POSTPROCESS: **true** set to **true** to replace links / sha1 and etc.
- FILE\_EXTENSIONS: **\<empty\>** List of file extensions that should be rendered by an external - FILE\_EXTENSIONS: **\<empty\>** List of file extensions that should be rendered by an external
command. Multiple extentions needs a comma as splitter. command. Multiple extentions needs a comma as splitter.
- RENDER\_COMMAND: External command to render all matching extensions. - RENDER\_COMMAND: External command to render all matching extensions.

View file

@ -297,12 +297,14 @@ test01.xls: application/vnd.ms-excel; charset=binary
```ini ```ini
[markup.asciidoc] [markup.asciidoc]
ENABLED = false ENABLED = false
NEED_POSTPROCESS = true
FILE_EXTENSIONS = .adoc,.asciidoc FILE_EXTENSIONS = .adoc,.asciidoc
RENDER_COMMAND = "asciidoc --out-file=- -" RENDER_COMMAND = "asciidoc --out-file=- -"
IS_INPUT_FILE = false IS_INPUT_FILE = false
``` ```
- ENABLED: 是否启用默认为false。 - ENABLED: 是否启用默认为false。
- NEED\_POSTPROCESS: **true** 设置为 true 则会替换渲染文件中的内部链接和Commit ID 等。
- FILE_EXTENSIONS: 关联的文档的扩展名,多个扩展名用都好分隔。 - FILE_EXTENSIONS: 关联的文档的扩展名,多个扩展名用都好分隔。
- RENDER_COMMAND: 工具的命令行命令及参数。 - RENDER_COMMAND: 工具的命令行命令及参数。
- IS_INPUT_FILE: 输入方式是最后一个参数为文件路径还是从标准输入读取。 - IS_INPUT_FILE: 输入方式是最后一个参数为文件路径还是从标准输入读取。

View file

@ -28,6 +28,9 @@ func (Parser) Name() string {
return "csv" return "csv"
} }
// NeedPostProcess implements markup.Parser
func (Parser) NeedPostProcess() bool { return false }
// Extensions implements markup.Parser // Extensions implements markup.Parser
func (Parser) Extensions() []string { func (Parser) Extensions() []string {
return []string{".csv", ".tsv"} return []string{".csv", ".tsv"}

View file

@ -38,6 +38,11 @@ func (p *Parser) Name() string {
return p.MarkupName return p.MarkupName
} }
// NeedPostProcess implements markup.Parser
func (p *Parser) NeedPostProcess() bool {
return p.MarkupParser.NeedPostProcess
}
// Extensions returns the supported extensions of the tool // Extensions returns the supported extensions of the tool
func (p *Parser) Extensions() []string { func (p *Parser) Extensions() []string {
return p.FileExtensions return p.FileExtensions

View file

@ -228,6 +228,9 @@ func (Parser) Name() string {
return MarkupName return MarkupName
} }
// NeedPostProcess implements markup.Parser
func (Parser) NeedPostProcess() bool { return true }
// Extensions implements markup.Parser // Extensions implements markup.Parser
func (Parser) Extensions() []string { func (Parser) Extensions() []string {
return setting.Markdown.FileExtensions return setting.Markdown.FileExtensions

View file

@ -33,6 +33,7 @@ func Init() {
type Parser interface { type Parser interface {
Name() string // markup format name Name() string // markup format name
Extensions() []string Extensions() []string
NeedPostProcess() bool
Render(rawBytes []byte, urlPrefix string, metas map[string]string, isWiki bool) []byte Render(rawBytes []byte, urlPrefix string, metas map[string]string, isWiki bool) []byte
} }
@ -82,10 +83,13 @@ func RenderWiki(filename string, rawBytes []byte, urlPrefix string, metas map[st
func render(parser Parser, rawBytes []byte, urlPrefix string, metas map[string]string, isWiki bool) []byte { func render(parser Parser, rawBytes []byte, urlPrefix string, metas map[string]string, isWiki bool) []byte {
result := parser.Render(rawBytes, urlPrefix, metas, isWiki) result := parser.Render(rawBytes, urlPrefix, metas, isWiki)
// TODO: one day the error should be returned. if parser.NeedPostProcess() {
result, err := PostProcess(result, urlPrefix, metas, isWiki) var err error
if err != nil { // TODO: one day the error should be returned.
log.Error("PostProcess: %v", err) result, err = PostProcess(result, urlPrefix, metas, isWiki)
if err != nil {
log.Error("PostProcess: %v", err)
}
} }
return SanitizeBytes(result) return SanitizeBytes(result)
} }

View file

@ -30,6 +30,9 @@ func (Parser) Name() string {
return "orgmode" return "orgmode"
} }
// NeedPostProcess implements markup.Parser
func (Parser) NeedPostProcess() bool { return true }
// Extensions implements markup.Parser // Extensions implements markup.Parser
func (Parser) Extensions() []string { func (Parser) Extensions() []string {
return []string{".org"} return []string{".org"}

View file

@ -21,11 +21,12 @@ var (
// MarkupParser defines the external parser configured in ini // MarkupParser defines the external parser configured in ini
type MarkupParser struct { type MarkupParser struct {
Enabled bool Enabled bool
MarkupName string MarkupName string
Command string Command string
FileExtensions []string FileExtensions []string
IsInputFile bool IsInputFile bool
NeedPostProcess bool
} }
// MarkupSanitizerRule defines the policy for whitelisting attributes on // MarkupSanitizerRule defines the policy for whitelisting attributes on
@ -124,10 +125,11 @@ func newMarkupRenderer(name string, sec *ini.Section) {
} }
ExternalMarkupParsers = append(ExternalMarkupParsers, MarkupParser{ ExternalMarkupParsers = append(ExternalMarkupParsers, MarkupParser{
Enabled: sec.Key("ENABLED").MustBool(false), Enabled: sec.Key("ENABLED").MustBool(false),
MarkupName: name, MarkupName: name,
FileExtensions: exts, FileExtensions: exts,
Command: command, Command: command,
IsInputFile: sec.Key("IS_INPUT_FILE").MustBool(false), IsInputFile: sec.Key("IS_INPUT_FILE").MustBool(false),
NeedPostProcess: sec.Key("NEED_POSTPROCESS").MustBool(true),
}) })
} }