|
1 | 1 | package regexplanet
|
2 | 2 |
|
3 | 3 | import (
|
| 4 | +"bytes" |
4 | 5 | "encoding/json"
|
5 | 6 | "fmt"
|
| 7 | +"html" |
6 | 8 | "net/http"
|
7 | 9 | "os"
|
| 10 | +"regexp" |
8 | 11 | "runtime"
|
| 12 | +"strconv" |
| 13 | +// "strings" |
9 | 14 | "time"
|
10 | 15 | )
|
11 | 16 |
|
@@ -78,16 +83,198 @@ func status_handler(w http.ResponseWriter, r *http.Request) {
|
78 | 83 |
|
79 | 84 | type TestResult struct {
|
80 | 85 | Success bool`json:"success"`
|
81 |
| -Html string`json:"html"` |
| 86 | +Html string`json:"html,omitempty"` |
82 | 87 | Messagestring`json:"message,omitempty"`
|
83 | 88 | }
|
84 | 89 |
|
| 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 | + |
85 | 133 | func test_handler(w http.ResponseWriter, r *http.Request) {
|
86 | 134 |
|
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 | +} |
88 | 275 |
|
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"); |
91 | 278 |
|
92 |
| -write_with_callback(w, r.FormValue("callback"), retVal) |
| 279 | +write_with_callback(w, callback, TestResult{true, buffer.String(), ""}) |
93 | 280 | }
|
0 commit comments