diff options
author | Feuerfuchs <git@feuerfuchs.dev> | 2020-05-18 16:12:43 +0200 |
---|---|---|
committer | Feuerfuchs <git@feuerfuchs.dev> | 2020-05-18 16:12:43 +0200 |
commit | ac770231436f8a17d348a6a0ab934429df3c57d0 (patch) | |
tree | 50e14597a6b20a464882b123275f76b906616af7 /internal/port/gopher.go | |
parent | WIP: Refactoring (diff) | |
download | gopherproxy-ac770231436f8a17d348a6a0ab934429df3c57d0.tar.gz gopherproxy-ac770231436f8a17d348a6a0ab934429df3c57d0.tar.bz2 gopherproxy-ac770231436f8a17d348a6a0ab934429df3c57d0.zip |
WIP: Refactoring
Diffstat (limited to 'internal/port/gopher.go')
-rw-r--r-- | internal/port/gopher.go | 138 |
1 files changed, 102 insertions, 36 deletions
diff --git a/internal/port/gopher.go b/internal/port/gopher.go index abbc4d9..d2283c6 100644 --- a/internal/port/gopher.go +++ b/internal/port/gopher.go | |||
@@ -17,16 +17,73 @@ import ( | |||
17 | "github.com/temoto/robotstxt" | 17 | "github.com/temoto/robotstxt" |
18 | ) | 18 | ) |
19 | 19 | ||
20 | type Item struct { | 20 | type gopherTemplateVariables struct { |
21 | Title string | ||
22 | URL string | ||
23 | Assets AssetList | ||
24 | Lines []GopherItem | ||
25 | Nav []GopherNavItem | ||
26 | IsPlain bool | ||
27 | } | ||
28 | |||
29 | type GopherNavItem struct { | ||
30 | Label string | ||
31 | URL string | ||
32 | Current bool | ||
33 | } | ||
34 | |||
35 | type GopherItem struct { | ||
21 | Link template.URL | 36 | Link template.URL |
22 | Type string | 37 | Type string |
23 | Text string | 38 | Text string |
24 | } | 39 | } |
25 | 40 | ||
41 | func trimLeftChars(s string, n int) string { | ||
42 | m := 0 | ||
43 | for i := range s { | ||
44 | if m >= n { | ||
45 | return s[i:] | ||
46 | } | ||
47 | m++ | ||
48 | } | ||
49 | return s[:0] | ||
50 | } | ||
51 | |||
52 | func urlToNav(url string) (items []GopherNavItem) { | ||
53 | partialURL := "/gopher" | ||
54 | parts := strings.Split(url, "/") | ||
55 | |||
56 | for i, part := range parts { | ||
57 | if i == 1 { | ||
58 | partialURL = partialURL + "/1" | ||
59 | part = trimLeftChars(part, 1) | ||
60 | |||
61 | if part == "" { | ||
62 | continue | ||
63 | } | ||
64 | } else { | ||
65 | partialURL = partialURL + "/" + part | ||
66 | } | ||
67 | |||
68 | current := false | ||
69 | if i == len(parts)-1 || (len(parts) == 2 && i == 0) { | ||
70 | current = true | ||
71 | } | ||
72 | |||
73 | items = append(items, GopherNavItem{ | ||
74 | Label: part, | ||
75 | URL: partialURL, | ||
76 | Current: current, | ||
77 | }) | ||
78 | } | ||
79 | |||
80 | return | ||
81 | } | ||
82 | |||
26 | func renderGopherDirectory(w http.ResponseWriter, tpl *template.Template, assetList AssetList, uri string, hostport string, d libgopher.Directory) error { | 83 | func renderGopherDirectory(w http.ResponseWriter, tpl *template.Template, assetList AssetList, uri string, hostport string, d libgopher.Directory) error { |
27 | var title string | 84 | var title string |
28 | 85 | ||
29 | out := make([]Item, len(d.Items)) | 86 | out := make([]GopherItem, len(d.Items)) |
30 | 87 | ||
31 | for i, x := range d.Items { | 88 | for i, x := range d.Items { |
32 | if x.Type == libgopher.INFO && x.Selector == "TITLE" { | 89 | if x.Type == libgopher.INFO && x.Selector == "TITLE" { |
@@ -34,7 +91,7 @@ func renderGopherDirectory(w http.ResponseWriter, tpl *template.Template, assetL | |||
34 | continue | 91 | continue |
35 | } | 92 | } |
36 | 93 | ||
37 | tr := Item{ | 94 | tr := GopherItem{ |
38 | Text: x.Description, | 95 | Text: x.Description, |
39 | Type: x.Type.String(), | 96 | Type: x.Type.String(), |
40 | } | 97 | } |
@@ -89,12 +146,12 @@ func renderGopherDirectory(w http.ResponseWriter, tpl *template.Template, assetL | |||
89 | } | 146 | } |
90 | } | 147 | } |
91 | 148 | ||
92 | return tpl.Execute(w, TemplateVariables{ | 149 | return tpl.Execute(w, gopherTemplateVariables{ |
93 | Title: title, | 150 | Title: title, |
94 | URI: fmt.Sprintf("%s/%s", hostport, uri), | 151 | URL: fmt.Sprintf("%s/%s", hostport, uri), |
95 | Assets: assetList, | 152 | Assets: assetList, |
96 | Lines: out, | 153 | Lines: out, |
97 | Protocol: "gopher", | 154 | Nav: urlToNav(fmt.Sprintf("%s/%s", hostport, uri)), |
98 | }) | 155 | }) |
99 | } | 156 | } |
100 | 157 | ||
@@ -130,13 +187,15 @@ func GopherHandler(tpl *template.Template, robotsdata *robotstxt.RobotsData, ass | |||
130 | 187 | ||
131 | uri, err := url.QueryUnescape(strings.Join(parts[1:], "/")) | 188 | uri, err := url.QueryUnescape(strings.Join(parts[1:], "/")) |
132 | if err != nil { | 189 | if err != nil { |
133 | if e := tpl.Execute(w, TemplateVariables{ | 190 | if e := tpl.Execute(w, gopherTemplateVariables{ |
134 | Title: title, | 191 | Title: title, |
135 | URI: hostport, | 192 | URL: hostport, |
136 | Assets: assetList, | 193 | Assets: assetList, |
137 | RawText: fmt.Sprintf("Error: %s", err), | 194 | Lines: []GopherItem{{ |
138 | Error: true, | 195 | Text: fmt.Sprintf("Error: %s", err), |
139 | Protocol: "gopher", | 196 | }}, |
197 | Nav: urlToNav(hostport), | ||
198 | IsPlain: true, | ||
140 | }); e != nil { | 199 | }); e != nil { |
141 | log.Println("Template error: " + e.Error()) | 200 | log.Println("Template error: " + e.Error()) |
142 | log.Println(err.Error()) | 201 | log.Println(err.Error()) |
@@ -158,13 +217,15 @@ func GopherHandler(tpl *template.Template, robotsdata *robotstxt.RobotsData, ass | |||
158 | ) | 217 | ) |
159 | 218 | ||
160 | if err != nil { | 219 | if err != nil { |
161 | if e := tpl.Execute(w, TemplateVariables{ | 220 | if e := tpl.Execute(w, gopherTemplateVariables{ |
162 | Title: title, | 221 | Title: title, |
163 | URI: fmt.Sprintf("%s/%s", hostport, uri), | 222 | URL: fmt.Sprintf("%s/%s", hostport, uri), |
164 | Assets: assetList, | 223 | Assets: assetList, |
165 | RawText: fmt.Sprintf("Error: %s", err), | 224 | Lines: []GopherItem{{ |
166 | Error: true, | 225 | Text: fmt.Sprintf("Error: %s", err), |
167 | Protocol: "gopher", | 226 | }}, |
227 | Nav: urlToNav(fmt.Sprintf("%s/%s", hostport, uri)), | ||
228 | IsPlain: true, | ||
168 | }); e != nil { | 229 | }); e != nil { |
169 | log.Println("Template error: " + e.Error()) | 230 | log.Println("Template error: " + e.Error()) |
170 | } | 231 | } |
@@ -178,12 +239,15 @@ func GopherHandler(tpl *template.Template, robotsdata *robotstxt.RobotsData, ass | |||
178 | buf := new(bytes.Buffer) | 239 | buf := new(bytes.Buffer) |
179 | buf.ReadFrom(res.Body) | 240 | buf.ReadFrom(res.Body) |
180 | 241 | ||
181 | if err := tpl.Execute(w, TemplateVariables{ | 242 | if err := tpl.Execute(w, gopherTemplateVariables{ |
182 | Title: title, | 243 | Title: title, |
183 | URI: fmt.Sprintf("%s/%s", hostport, uri), | 244 | URL: fmt.Sprintf("%s/%s", hostport, uri), |
184 | Assets: assetList, | 245 | Assets: assetList, |
185 | RawText: buf.String(), | 246 | Lines: []GopherItem{{ |
186 | Protocol: "gopher", | 247 | Text: buf.String(), |
248 | }}, | ||
249 | Nav: urlToNav(fmt.Sprintf("%s/%s", hostport, uri)), | ||
250 | IsPlain: true, | ||
187 | }); err != nil { | 251 | }); err != nil { |
188 | log.Println("Template error: " + err.Error()) | 252 | log.Println("Template error: " + err.Error()) |
189 | } | 253 | } |
@@ -200,13 +264,15 @@ func GopherHandler(tpl *template.Template, robotsdata *robotstxt.RobotsData, ass | |||
200 | } | 264 | } |
201 | } else { | 265 | } else { |
202 | if err := renderGopherDirectory(w, tpl, assetList, uri, hostport, res.Dir); err != nil { | 266 | if err := renderGopherDirectory(w, tpl, assetList, uri, hostport, res.Dir); err != nil { |
203 | if e := tpl.Execute(w, TemplateVariables{ | 267 | if e := tpl.Execute(w, gopherTemplateVariables{ |
204 | Title: title, | 268 | Title: title, |
205 | URI: fmt.Sprintf("%s/%s", hostport, uri), | 269 | URL: fmt.Sprintf("%s/%s", hostport, uri), |
206 | Assets: assetList, | 270 | Assets: assetList, |
207 | RawText: fmt.Sprintf("Error: %s", err), | 271 | Lines: []GopherItem{{ |
208 | Error: true, | 272 | Text: fmt.Sprintf("Error: %s", err), |
209 | Protocol: "gopher", | 273 | }}, |
274 | Nav: urlToNav(fmt.Sprintf("%s/%s", hostport, uri)), | ||
275 | IsPlain: false, | ||
210 | }); e != nil { | 276 | }); e != nil { |
211 | log.Println("Template error: " + e.Error()) | 277 | log.Println("Template error: " + e.Error()) |
212 | log.Println(e.Error()) | 278 | log.Println(e.Error()) |