diff --git a/main.go b/main.go
index 179132f58..e73f1d60a 100644
--- a/main.go
+++ b/main.go
@@ -14,6 +14,7 @@ import (
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
// register supported doc types
+ _ "code.gitea.io/gitea/modules/markup/csv"
_ "code.gitea.io/gitea/modules/markup/markdown"
_ "code.gitea.io/gitea/modules/markup/orgmode"
diff --git a/modules/markup/csv/csv.go b/modules/markup/csv/csv.go
new file mode 100644
index 000000000..077947e77
--- /dev/null
+++ b/modules/markup/csv/csv.go
@@ -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(`
`)
+ for {
+ fields, err := rd.Read()
+ if err == io.EOF {
+ break
+ }
+ if err != nil {
+ continue
+ }
+ tmpBlock.WriteString("")
+ for _, field := range fields {
+ tmpBlock.WriteString("")
+ tmpBlock.WriteString(html.EscapeString(field))
+ tmpBlock.WriteString(" | ")
+ }
+ tmpBlock.WriteString("
")
+ }
+ tmpBlock.WriteString("
")
+
+ return tmpBlock.Bytes()
+}
diff --git a/modules/markup/csv/csv_test.go b/modules/markup/csv/csv_test.go
new file mode 100644
index 000000000..f050296ce
--- /dev/null
+++ b/modules/markup/csv/csv_test.go
@@ -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": "",
+ "1,2": "",
+ "
": "",
+ }
+
+ for k, v := range kases {
+ res := parser.Render([]byte(k), "", nil, false)
+ assert.EqualValues(t, v, string(res))
+ }
+}