* add csv file render support defaultly * escaping csv column contenttags/v1.21.12.1
| @@ -14,6 +14,7 @@ import ( | |||||
| "code.gitea.io/gitea/modules/log" | "code.gitea.io/gitea/modules/log" | ||||
| "code.gitea.io/gitea/modules/setting" | "code.gitea.io/gitea/modules/setting" | ||||
| // register supported doc types | // register supported doc types | ||||
| _ "code.gitea.io/gitea/modules/markup/csv" | |||||
| _ "code.gitea.io/gitea/modules/markup/markdown" | _ "code.gitea.io/gitea/modules/markup/markdown" | ||||
| _ "code.gitea.io/gitea/modules/markup/orgmode" | _ "code.gitea.io/gitea/modules/markup/orgmode" | ||||
| @@ -0,0 +1,58 @@ | |||||
| // Copyright 2018 The Gitea Authors. All rights reserved. | |||||
| // Use of this source code is governed by a MIT-style | |||||
| // license that can be found in the LICENSE file. | |||||
| package markup | |||||
| import ( | |||||
| "bytes" | |||||
| "encoding/csv" | |||||
| "html" | |||||
| "io" | |||||
| "code.gitea.io/gitea/modules/markup" | |||||
| ) | |||||
| func init() { | |||||
| markup.RegisterParser(Parser{}) | |||||
| } | |||||
| // Parser implements markup.Parser for orgmode | |||||
| type Parser struct { | |||||
| } | |||||
| // Name implements markup.Parser | |||||
| func (Parser) Name() string { | |||||
| return "csv" | |||||
| } | |||||
| // Extensions implements markup.Parser | |||||
| func (Parser) Extensions() []string { | |||||
| return []string{".csv"} | |||||
| } | |||||
| // Render implements markup.Parser | |||||
| func (Parser) Render(rawBytes []byte, urlPrefix string, metas map[string]string, isWiki bool) []byte { | |||||
| rd := csv.NewReader(bytes.NewReader(rawBytes)) | |||||
| var tmpBlock bytes.Buffer | |||||
| tmpBlock.WriteString(`<table class="table">`) | |||||
| for { | |||||
| fields, err := rd.Read() | |||||
| if err == io.EOF { | |||||
| break | |||||
| } | |||||
| if err != nil { | |||||
| continue | |||||
| } | |||||
| tmpBlock.WriteString("<tr>") | |||||
| for _, field := range fields { | |||||
| tmpBlock.WriteString("<td>") | |||||
| tmpBlock.WriteString(html.EscapeString(field)) | |||||
| tmpBlock.WriteString("</td>") | |||||
| } | |||||
| tmpBlock.WriteString("<tr>") | |||||
| } | |||||
| tmpBlock.WriteString("</table>") | |||||
| return tmpBlock.Bytes() | |||||
| } | |||||
| @@ -0,0 +1,25 @@ | |||||
| // Copyright 2018 The Gitea Authors. All rights reserved. | |||||
| // Use of this source code is governed by a MIT-style | |||||
| // license that can be found in the LICENSE file. | |||||
| package markup | |||||
| import ( | |||||
| "testing" | |||||
| "github.com/stretchr/testify/assert" | |||||
| ) | |||||
| func TestRenderCSV(t *testing.T) { | |||||
| var parser Parser | |||||
| var kases = map[string]string{ | |||||
| "a": "<table class=\"table\"><tr><td>a</td><tr></table>", | |||||
| "1,2": "<table class=\"table\"><tr><td>1</td><td>2</td><tr></table>", | |||||
| "<br/>": "<table class=\"table\"><tr><td><br/></td><tr></table>", | |||||
| } | |||||
| for k, v := range kases { | |||||
| res := parser.Render([]byte(k), "", nil, false) | |||||
| assert.EqualValues(t, v, string(res)) | |||||
| } | |||||
| } | |||||