55package markup
66
77import (
8+ "bufio"
89 "bytes"
910 "html"
1011 "io"
12+ "io/ioutil"
1113 "strconv"
1214
1315 "code.gitea.io/gitea/modules/csv"
@@ -16,55 +18,89 @@ import (
1618)
1719
1820func init () {
19- markup .RegisterParser ( Parser {})
21+ markup .RegisterRenderer ( Renderer {})
2022}
2123
22- // Parser implements markup.Parser for csv files
23- type Parser struct {
24+ // Renderer implements markup.Renderer for csv files
25+ type Renderer struct {
2426}
2527
26- // Name implements markup.Parser
27- func (Parser ) Name () string {
28+ // Name implements markup.Renderer
29+ func (Renderer ) Name () string {
2830 return "csv"
2931}
3032
31- // NeedPostProcess implements markup.Parser
32- func (Parser ) NeedPostProcess () bool { return false }
33+ // NeedPostProcess implements markup.Renderer
34+ func (Renderer ) NeedPostProcess () bool { return false }
3335
34- // Extensions implements markup.Parser
35- func (Parser ) Extensions () []string {
36+ // Extensions implements markup.Renderer
37+ func (Renderer ) Extensions () []string {
3638 return []string {".csv" , ".tsv" }
3739}
3840
39- // Render implements markup.Parser
40- func (Parser ) Render (rawBytes []byte , urlPrefix string , metas map [string ]string , isWiki bool ) []byte {
41- var tmpBlock bytes.Buffer
42-
43- if setting .UI .CSV .MaxFileSize != 0 && setting .UI .CSV .MaxFileSize < int64 (len (rawBytes )) {
44- tmpBlock .WriteString ("<pre>" )
45- tmpBlock .WriteString (html .EscapeString (string (rawBytes )))
46- tmpBlock .WriteString ("</pre>" )
47- return tmpBlock .Bytes ()
41+ func writeField (w io.Writer , element , class , field string ) error {
42+ if _ , err := io .WriteString (w , "<" ); err != nil {
43+ return err
44+ }
45+ if _ , err := io .WriteString (w , element ); err != nil {
46+ return err
47+ }
48+ if len (class ) > 0 {
49+ if _ , err := io .WriteString (w , " class=\" " ); err != nil {
50+ return err
51+ }
52+ if _ , err := io .WriteString (w , class ); err != nil {
53+ return err
54+ }
55+ if _ , err := io .WriteString (w , "\" " ); err != nil {
56+ return err
57+ }
58+ }
59+ if _ , err := io .WriteString (w , ">" ); err != nil {
60+ return err
61+ }
62+ if _ , err := io .WriteString (w , html .EscapeString (field )); err != nil {
63+ return err
4864 }
65+ if _ , err := io .WriteString (w , "</" ); err != nil {
66+ return err
67+ }
68+ if _ , err := io .WriteString (w , element ); err != nil {
69+ return err
70+ }
71+ _ , err := io .WriteString (w , ">" )
72+ return err
73+ }
4974
50- rd := csv .CreateReaderAndGuessDelimiter (rawBytes )
75+ // Render implements markup.Renderer
76+ func (Renderer ) Render (ctx * markup.RenderContext , input io.Reader , output io.Writer ) error {
77+ var tmpBlock = bufio .NewWriter (output )
5178
52- writeField := func (element , class , field string ) {
53- tmpBlock .WriteString ("<" )
54- tmpBlock .WriteString (element )
55- if len (class ) > 0 {
56- tmpBlock .WriteString (" class=\" " )
57- tmpBlock .WriteString (class )
58- tmpBlock .WriteString ("\" " )
79+ // FIXME: don't read all to memory
80+ rawBytes , err := ioutil .ReadAll (input )
81+ if err != nil {
82+ return err
83+ }
84+
85+ if setting .UI .CSV .MaxFileSize != 0 && setting .UI .CSV .MaxFileSize < int64 (len (rawBytes )) {
86+ if _ , err := tmpBlock .WriteString ("<pre>" ); err != nil {
87+ return err
5988 }
60- tmpBlock .WriteString (">" )
61- tmpBlock .WriteString (html .EscapeString (field ))
62- tmpBlock .WriteString ("</" )
63- tmpBlock .WriteString (element )
64- tmpBlock .WriteString (">" )
89+ if _ , err := tmpBlock .WriteString (html .EscapeString (string (rawBytes ))); err != nil {
90+ return err
91+ }
92+ _ , err = tmpBlock .WriteString ("</pre>" )
93+ return err
94+ }
95+
96+ rd , err := csv .CreateReaderAndGuessDelimiter (bytes .NewReader (rawBytes ))
97+ if err != nil {
98+ return err
6599 }
66100
67- tmpBlock .WriteString (`<table class="data-table">` )
101+ if _ , err := tmpBlock .WriteString (`<table class="data-table">` ); err != nil {
102+ return err
103+ }
68104 row := 1
69105 for {
70106 fields , err := rd .Read ()
@@ -74,20 +110,29 @@ func (Parser) Render(rawBytes []byte, urlPrefix string, metas map[string]string,
74110 if err != nil {
75111 continue
76112 }
77- tmpBlock .WriteString ("<tr>" )
113+ if _ , err := tmpBlock .WriteString ("<tr>" ); err != nil {
114+ return err
115+ }
78116 element := "td"
79117 if row == 1 {
80118 element = "th"
81119 }
82- writeField (element , "line-num" , strconv .Itoa (row ))
120+ if err := writeField (tmpBlock , element , "line-num" , strconv .Itoa (row )); err != nil {
121+ return err
122+ }
83123 for _ , field := range fields {
84- writeField (element , "" , field )
124+ if err := writeField (tmpBlock , element , "" , field ); err != nil {
125+ return err
126+ }
127+ }
128+ if _ , err := tmpBlock .WriteString ("</tr>" ); err != nil {
129+ return err
85130 }
86- tmpBlock .WriteString ("</tr>" )
87131
88132 row ++
89133 }
90- tmpBlock .WriteString ("</table>" )
91-
92- return tmpBlock .Bytes ()
134+ if _ , err = tmpBlock .WriteString ("</table>" ); err != nil {
135+ return err
136+ }
137+ return tmpBlock .Flush ()
93138}
0 commit comments