コンパイルし、"escaper.cgi" としてウェブサーバーに置いてください。
今まで記事にコードを載せる際、HTMLの特殊文字を手作業でHTMLエンティティに置き換えていて、それが面倒だったので自動化するべく書いてみました。import std.xml : encode; import std.uri : decodeComponent; import std.stdio : stdin, stdout; import std.string : tr; void main () { string[string] form; string line = stdin.readln(); uint offset; string name; foreach (uint pos; 0 .. line.length) if (line.length < pos + 2) form[name] = line[offset .. pos + 1]; else if (line[pos] == ';' || line[pos] == '&') { form[name] = line[offset .. pos]; offset = pos + 1; } else if (line[pos] == '=') { name = line[offset .. pos]; offset = pos + 1; } string text = encode(decodeComponent( tr("text" in form ? form["text"] : "", "+", " ") )); if (text != null && text[$ - 1] == '\n') { if (text[$ - 2] == '\r') { text = text[0 .. $ - 2]; form["text"] = form["text"][0 .. $ - 6]; } else { text = text[0 .. $ - 1]; form["text"] = form["text"][0 .. $ - 3]; } } stdout.writeln("Content-Type: text/html; charset=utf8\n"); stdout.writeln("<!doctype html>"); stdout.writeln("<html>\n"); stdout.writeln("<head>"); stdout.writeln("<title>Data Escaper</title>"); stdout.writeln("</head>\n"); stdout.writeln("<body>\n"); stdout.writeln(`<form action="escaper.cgi" method="post">`); stdout.writeln(`<div style="margin-top: 0.5em; margin-bottom: 0.5em">`); stdout.writeln(`<textarea rows="8" cols="60" name="text">`); if ("text" in form) stdout.writeln(text); stdout.writeln("</textarea>"); stdout.writeln("</div>\n"); stdout.writeln(`<div style="margin-top: 0.5em; margin-bottom: 0.5em">`); stdout.writeln(`<input type="submit" name="percent" value="Percent">`); stdout.writeln(`<input type="submit" name="entity" value="Entity">`); stdout.writeln("</div>"); stdout.writeln("</form>\n"); stdout.writeln(`<div style="margin-top: 1em; margin-bottom: 1em">`); stdout.writeln(`<textarea rows="8" cols="60">`); if ("text" in form) { if ("percent" in form) stdout.writeln(form["text"]); else if ("entity" in form) stdout.writeln(encode(text)); } stdout.writeln("</textarea>"); stdout.writeln("</div>\n"); stdout.writeln("</body>"); stdout.writeln("</html>"); }
前々から気付いてはいたけど、Dは配列のスライスがややこしいことになってる。
use 5.10.0; my @array = (0, 1, 2, 3, 4, 5); say @array[0 .. 5]; # 012345 say @array[0 .. $#array]; # 012345 say $array[$#array]; # 5
バグと言えなくもない。import std.stdio : writeln; void main () { ubyte[] array = [0, 1, 2, 3, 4, 5]; writeln(array[0 .. 5]); // 01234 writeln(array[0 .. 6]); // 012345 writeln(array[0 .. $]); // 012345 // writeln(array[$]); // Range Error writeln(array[$ - 1]); // 5 }
0 件のコメント:
コメントを投稿