Skip to content

Commit bc814bd

Browse files
committed
first working version
1 parent 71d6849 commit bc814bd

File tree

1 file changed

+192
-5
lines changed

1 file changed

+192
-5
lines changed

src/regexplanet.go

Lines changed: 192 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
package regexplanet
22

33
import (
4+
"bytes"
45
"encoding/json"
56
"fmt"
7+
"html"
68
"net/http"
79
"os"
10+
"regexp"
811
"runtime"
12+
"strconv"
13+
// "strings"
914
"time"
1015
)
1116

@@ -78,16 +83,198 @@ func status_handler(w http.ResponseWriter, r *http.Request) {
7883

7984
type TestResult struct {
8085
Success bool`json:"success"`
81-
Html string`json:"html"`
86+
Html string`json:"html,omitempty"`
8287
Messagestring`json:"message,omitempty"`
8388
}
8489

90+
func write_ints(buffer *bytes.Buffer, data [][]int) {
91+
92+
if data == nil {
93+
buffer.WriteString("<i>nil</i>");
94+
return
95+
}
96+
97+
for loop := 0; loop < len(data); loop++ {
98+
if loop > 0 {
99+
buffer.WriteString("<br/>");
100+
}
101+
buffer.WriteString("[");
102+
buffer.WriteString(html.EscapeString(fmt.Sprintf("%d", loop)));
103+
buffer.WriteString("]: ");
104+
105+
for inner := 0; inner < len(data[loop]); inner++ {
106+
if inner > 0 {
107+
buffer.WriteString(", ");
108+
}
109+
buffer.WriteString(html.EscapeString(fmt.Sprintf("%d", data[loop][inner])));
110+
}
111+
}
112+
}
113+
114+
func write_strings(buffer *bytes.Buffer, data []string) {
115+
116+
if data == nil {
117+
buffer.WriteString("<i>nil</i>");
118+
return
119+
}
120+
121+
buffer.WriteString("[");
122+
for loop := 0; loop < len(data); loop++ {
123+
if loop > 0 {
124+
buffer.WriteString(", ");
125+
}
126+
buffer.WriteString("<code>")
127+
buffer.WriteString(html.EscapeString(data[loop]));
128+
buffer.WriteString("</code>");
129+
}
130+
buffer.WriteString("]");
131+
}
132+
85133
func test_handler(w http.ResponseWriter, r *http.Request) {
86134

87-
retVal := TestResult{}
135+
var strRegex = r.FormValue("regex")
136+
var replacement = r.FormValue("replacement")
137+
var callback = r.FormValue("callback")
138+
139+
if strRegex == "" {
140+
write_with_callback(w, callback, TestResult{ false, "", "No regex to test"})
141+
return
142+
}
143+
144+
var buffer bytes.Buffer
145+
146+
//buffer.WriteString("<div class=\"alert alert-warning\">Actually, it is a lot less than beta: the real code isn't even written yet</div>\n")
147+
148+
buffer.WriteString("<table class=\"table table-bordered table-striped bordered-table zebra-striped\" style=\"width:auto;\">\n");
149+
buffer.WriteString("\t<tbody>\n");
150+
151+
buffer.WriteString("\t\t<tr>\n");
152+
buffer.WriteString("\t\t\t<td>Regular Expression</td>\n");
153+
buffer.WriteString("\t\t\t<td><code>");
154+
buffer.WriteString(html.EscapeString(strRegex));
155+
buffer.WriteString("</code></td>\n");
156+
buffer.WriteString("\t\t</tr>\n");
157+
158+
if replacement > "" {
159+
buffer.WriteString("\t\t<tr>\n");
160+
buffer.WriteString("\t\t\t<td>Replacement</td>\n");
161+
buffer.WriteString("\t\t\t<td><code>");
162+
buffer.WriteString(html.EscapeString(replacement));
163+
buffer.WriteString("</code></td>\n");
164+
buffer.WriteString("\t\t</tr>\n");
165+
}
166+
167+
buffer.WriteString("\t\t<tr>\n");
168+
buffer.WriteString("\t\t\t<td>Escaped (<code>regexp.QuoteMeta(s)</code>)</td>\n");
169+
buffer.WriteString("\t\t\t<td><code>");
170+
buffer.WriteString(html.EscapeString(regexp.QuoteMeta(strRegex)));
171+
buffer.WriteString("</code></td>\n");
172+
buffer.WriteString("\t\t</tr>\n");
173+
174+
var re *regexp.Regexp
175+
var err error;
176+
re, err = regexp.Compile(strRegex)
177+
if err != nil {
178+
buffer.WriteString("\t\t<tr>\n");
179+
buffer.WriteString("\t\t\t<td>Error</td>\n");
180+
buffer.WriteString("\t\t\t<td><code>");
181+
buffer.WriteString(html.EscapeString(err.Error()));
182+
buffer.WriteString("</code></td>\n");
183+
buffer.WriteString("\t\t</tr>\n");
184+
buffer.WriteString("\t</tbody>\n");
185+
buffer.WriteString("</table>\n");
186+
write_with_callback(w, callback, TestResult{ false, buffer.String(), "Error when compiling regex"})
187+
return
188+
}
189+
buffer.WriteString("\t\t<tr>\n");
190+
buffer.WriteString("\t\t\t<td># of groups (<code>re.NumSubexp()</code>)</td>\n");
191+
buffer.WriteString("\t\t\t<td>");
192+
buffer.WriteString(html.EscapeString(fmt.Sprintf("%d", re.NumSubexp())));
193+
buffer.WriteString("</td>\n");
194+
buffer.WriteString("\t\t</tr>\n");
195+
196+
buffer.WriteString("\t</tbody>\n");
197+
buffer.WriteString("</table>\n");
198+
199+
if r.FormValue("input") == "" {
200+
buffer.WriteString("<div class=\"alert alert-warning\">No inputs to test</div>")
201+
write_with_callback(w, callback, TestResult{true, buffer.String(), ""})
202+
return
203+
}
204+
205+
buffer.WriteString("<table class=\"table table-bordered table-striped bordered-table zebra-striped\" style=\"width:auto;\">\n");
206+
buffer.WriteString("\t<thead>\n");
207+
buffer.WriteString("\t\t<tr>\n");
208+
buffer.WriteString("\t\t\t<th>Test</th>\n");
209+
buffer.WriteString("\t\t\t<th>Target String</th>\n");
210+
buffer.WriteString("\t\t\t<th>MatchString()</th>\n");
211+
if replacement > "" {
212+
buffer.WriteString("\t\t\t<th>ReplaceAllString()</th>\n");
213+
}
214+
buffer.WriteString("\t\t\t<th>FindAllString()</th>\n");
215+
buffer.WriteString("\t\t\t<th>FindAllStringIndex()</th>\n");
216+
buffer.WriteString("\t\t\t<th>FindAllStringSubmatch()</th>\n");
217+
buffer.WriteString("\t\t</tr>\n");
218+
buffer.WriteString("\t</thead>\n");
219+
220+
buffer.WriteString("\t<tbody>\n");
221+
222+
var inputs = r.Form["input"]
223+
224+
for loop := 0; loop < len(inputs); loop++ {
225+
var input = inputs[loop]
226+
227+
if len(input) == 0 {
228+
continue
229+
}
230+
231+
buffer.WriteString("\t\t<tr>\n");
232+
233+
buffer.WriteString("\t\t\t<td style=\"text-align:center\">")
234+
buffer.WriteString(html.EscapeString(fmt.Sprintf("%d", loop+1)));
235+
buffer.WriteString("</td>\n");
236+
237+
buffer.WriteString("\t\t\t<td>");
238+
buffer.WriteString(html.EscapeString(input));
239+
buffer.WriteString("</td>\n");
240+
241+
buffer.WriteString("\t\t\t<td>");
242+
buffer.WriteString(strconv.FormatBool(re.MatchString(input)));
243+
buffer.WriteString("</td>\n");
244+
245+
if replacement > "" {
246+
buffer.WriteString("\t\t\t<td>");
247+
buffer.WriteString(html.EscapeString(re.ReplaceAllString(input, replacement)));
248+
buffer.WriteString("</td>\n");
249+
}
250+
251+
buffer.WriteString("\t\t\t<td>");
252+
write_strings(&buffer, re.FindAllString(input, -1))
253+
buffer.WriteString("</td>\n");
254+
255+
buffer.WriteString("\t\t\t<td>");
256+
write_ints(&buffer, re.FindAllStringIndex(input, -1))
257+
buffer.WriteString("</td>\n");
258+
259+
buffer.WriteString("\t\t\t<td>");
260+
var data = re.FindAllStringSubmatch(input, -1)
261+
if data == nil {
262+
buffer.WriteString("<i>nil</i>");
263+
} else {
264+
for dataLoop := 0; dataLoop < len(data); dataLoop++ {
265+
buffer.WriteString("[");
266+
buffer.WriteString(html.EscapeString(fmt.Sprintf("%d", dataLoop)));
267+
buffer.WriteString("]: ");
268+
write_strings(&buffer, data[dataLoop])
269+
buffer.WriteString("<br/>");
270+
}
271+
}
272+
buffer.WriteString("</td>\n");
273+
buffer.WriteString("\t</tr>\n");
274+
}
88275

89-
retVal.Success = true
90-
retVal.Html = "<div class=\"alert alert-warning\">Actually, it is a lot less than beta: the real code isn't even written yet!</div>"
276+
buffer.WriteString("\t</tbody>\n");
277+
buffer.WriteString("<table>\n");
91278

92-
write_with_callback(w, r.FormValue("callback"), retVal)
279+
write_with_callback(w, callback, TestResult{true, buffer.String(), ""})
93280
}

0 commit comments

Comments
 (0)