@@ -11,6 +11,7 @@ import (
11
11
"io"
12
12
"path/filepath"
13
13
"strings"
14
+ "sync"
14
15
15
16
"code.gitea.io/gitea/modules/setting"
16
17
)
@@ -94,33 +95,76 @@ func RenderString(ctx *RenderContext, content string) (string, error) {
94
95
}
95
96
96
97
func render (ctx * RenderContext , parser Renderer , input io.Reader , output io.Writer ) error {
97
- var buf1 strings.Builder
98
- if err := parser .Render (ctx , input , & buf1 ); err != nil {
99
- return err
98
+ var wg sync.WaitGroup
99
+ var err error
100
+ pr , pw := io .Pipe ()
101
+ defer func () {
102
+ _ = pr .Close ()
103
+ _ = pw .Close ()
104
+ }()
105
+
106
+ pr2 , pw2 := io .Pipe ()
107
+ defer func () {
108
+ _ = pr2 .Close ()
109
+ _ = pw2 .Close ()
110
+ }()
111
+
112
+ wg .Add (1 )
113
+ go func () {
114
+ buf := SanitizeReader (pr2 )
115
+ _ , err = io .Copy (output , buf )
116
+ _ = pr2 .Close ()
117
+ wg .Done ()
118
+ }()
119
+
120
+ wg .Add (1 )
121
+ go func () {
122
+ err = PostProcess (ctx , pr , pw2 )
123
+ _ = pr .Close ()
124
+ _ = pw2 .Close ()
125
+ wg .Done ()
126
+ }()
127
+
128
+ if err1 := parser .Render (ctx , input , pw ); err1 != nil {
129
+ return err1
100
130
}
131
+ _ = pw .Close ()
101
132
102
- var buf2 strings.Builder
103
- if err := PostProcess (ctx , strings .NewReader (buf1 .String ()), & buf2 ); err != nil {
104
- return fmt .Errorf ("PostProcess: %v" , err )
105
- }
106
- buf := SanitizeReader (strings .NewReader (buf2 .String ()))
107
- _ , err := io .Copy (output , buf )
133
+ wg .Wait ()
108
134
return err
109
135
}
110
136
137
+ // ErrUnsupportedRenderType represents
138
+ type ErrUnsupportedRenderType struct {
139
+ Type string
140
+ }
141
+
142
+ func (err ErrUnsupportedRenderType ) Error () string {
143
+ return fmt .Sprintf ("Unsupported render type: %s" , err .Type )
144
+ }
145
+
111
146
func renderByType (ctx * RenderContext , input io.Reader , output io.Writer ) error {
112
- if parser , ok := renderers [ctx .Type ]; ok {
113
- return render (ctx , parser , input , output )
147
+ if renderer , ok := renderers [ctx .Type ]; ok {
148
+ return render (ctx , renderer , input , output )
114
149
}
115
- return nil
150
+ return ErrUnsupportedRenderType {ctx .Type }
151
+ }
152
+
153
+ // ErrUnsupportedRenderExtension represents the error when extension doesn't supported to render
154
+ type ErrUnsupportedRenderExtension struct {
155
+ Extension string
156
+ }
157
+
158
+ func (err ErrUnsupportedRenderExtension ) Error () string {
159
+ return fmt .Sprintf ("Unsupported render extension: %s" , err .Extension )
116
160
}
117
161
118
162
func renderFile (ctx * RenderContext , input io.Reader , output io.Writer ) error {
119
163
extension := strings .ToLower (filepath .Ext (ctx .Filename ))
120
- if parser , ok := extRenderers [extension ]; ok {
121
- return render (ctx , parser , input , output )
164
+ if renderer , ok := extRenderers [extension ]; ok {
165
+ return render (ctx , renderer , input , output )
122
166
}
123
- return nil
167
+ return ErrUnsupportedRenderExtension { extension }
124
168
}
125
169
126
170
// Type returns if markup format via the filename
0 commit comments