* add csv file render support defaultly * escaping csv column contentmaster
@@ -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)) | |||||
} | |||||
} |