From dbe124108b7a3529feeeba91339928c4ac737072 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Tue, 23 Jun 2015 14:02:12 -0700 Subject: 1631 - update html versions Html is a little more readable thanks to feedback from J David Eisenberg (https://news.ycombinator.com/item?id=9766330), in particular the suggestion to use https://addons.mozilla.org/En-us/firefox/addon/wcag-contrast-checker. --- html/013literal_string.cc.html | 146 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 129 insertions(+), 17 deletions(-) (limited to 'html/013literal_string.cc.html') diff --git a/html/013literal_string.cc.html b/html/013literal_string.cc.html index c81057d7..fae6a0f2 100644 --- a/html/013literal_string.cc.html +++ b/html/013literal_string.cc.html @@ -12,15 +12,15 @@ @@ -44,13 +44,13 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } recipe main [ 1:address:array:character <- copy [abc def] # copy can't really take a string ] -+parse: ingredient: {name: "abc def", properties: ["abc def": "literal-string"]} ++parse: ingredient: {name: "abc def", properties: [_: "literal-string"]} :(scenario string_literal_with_colons) recipe main [ 1:address:array:character <- copy [abc:def/ghi] ] -+parse: ingredient: {name: "abc:def/ghi", properties: ["abc:def/ghi": "literal-string"]} ++parse: ingredient: {name: "abc:def/ghi", properties: [_: "literal-string"]} :(before "End Mu Types Initialization") Type_number["literal-string"] = 0; @@ -60,20 +60,51 @@ Type_number["literal-string"] = (in); skip_whitespace(in); skip_comment(in); +//? cerr << '^' << result << "$\n"; //? 1 return result; } :(code) string slurp_quoted(istream& in) { - assert(!in.eof()); - assert(in.peek() == '['); ostringstream out; - int brace_depth = 0; + assert(!in.eof()); assert(in.peek() == '['); out << static_cast<char>(in.get()); // slurp the '[' + if (code_string(in, out)) + slurp_quoted_comment_aware(in, out); + else + slurp_quoted_comment_oblivious(in, out); + return out.str(); +} + +// A string is a code string if it contains a newline before any non-whitespace +// todo: support comments before the newline. But that gets messy. +bool code_string(istream& in, ostringstream& out) { + while (!in.eof()) { + char c = in.get(); + if (!isspace(c)) { + in.putback(c); +//? cerr << "code_string: " << out.str() << '\n'; //? 1 + return false; + } + out << c; + if (c == '\n') { +//? cerr << "code_string: " << out.str() << '\n'; //? 1 + return true; + } + } + return false; +} + +// Read a regular string. Regular strings can only contain other regular +// strings. +void slurp_quoted_comment_oblivious(istream& in, ostringstream& out) { +//? cerr << "comment oblivious\n"; //? 1 + int brace_depth = 1; while (!in.eof()) { char c = in.get(); +//? cerr << '%' << (int)c << ' ' << brace_depth << ": " << out.str() << "%$\n"; //? 1 //? cout << (int)c << ": " << brace_depth << '\n'; //? 2 if (c == '\\') { - out << (char)in.get(); + out << static_cast<char>(in.get()); continue; } out << c; @@ -84,9 +115,36 @@ string slurp_quoted(istream& in} if (in.eof() && brace_depth > 0) { raise << "unbalanced '['\n"; - return ""; + out.clear(); } - return out.str(); +} + +// Read a code string. Code strings can contain either code or regular strings. +void slurp_quoted_comment_aware(istream& in, ostringstream& out) { +//? cerr << "comment aware\n"; //? 1 + char c; + while (in >> c) { +//? cerr << '^' << (int)c << ": " << out.str() << "$\n"; //? 1 + if (c == '\\') { + out << static_cast<char>(in.get()); + continue; + } + if (c == '#') { + out << c; + while (!in.eof() && in.peek() != '\n') out << static_cast<char>(in.get()); + continue; + } + if (c == '[') { + in.putback(c); + // recurse + out << slurp_quoted(in); + continue; + } + out << c; + if (c == ']') return; + } + raise << "unbalanced '['\n"; + out.clear(); } :(after "reagent::reagent(string s)") @@ -95,7 +153,7 @@ string slurp_quoted(istream& in(*s.rbegin() == ']'); // delete [] delimiters s.erase(0, 1); - s.erase(SIZE(s)-1, SIZE(s)); + s.erase(SIZE(s)-1); name = s; types.push_back(0); properties.push_back(pair<string, vector<string> >(name, vector<string>())); @@ -103,27 +161,81 @@ string slurp_quoted(istream& inreturn; } +//: Two tweaks to printing literal strings compared to other reagents: +//: a) Don't print the string twice in the representation, just put '_' in +//: the property list. +//: b) Escape newlines in the string to make it more friendly to trace(). + +:(after "string reagent::to_string()") + if (!properties.at(0).second.empty() && properties.at(0).second.at(0) == "literal-string") { + return emit_literal_string(name); + } + +:(code) +string emit_literal_string(string name) { + size_t pos = 0; + while (pos != string::npos) + pos = replace(name, "\n", "\\n", pos); + return "{name: \""+name+"\", properties: [_: \"literal-string\"]}"; +} + +size_t replace(string& str, const string& from, const string& to, size_t n) { + size_t result = str.find(from, n); + if (result != string::npos) + str.replace(result, from.length(), to); + return result; +} + :(scenario string_literal_nested) recipe main [ 1:address:array:character <- copy [abc [def]] ] -+parse: ingredient: {name: "abc [def]", properties: ["abc [def]": "literal-string"]} ++parse: ingredient: {name: "abc [def]", properties: [_: "literal-string"]} :(scenario string_literal_escaped) recipe main [ 1:address:array:character <- copy [abc \[def] ] -+parse: ingredient: {name: "abc [def", properties: ["abc [def": "literal-string"]} ++parse: ingredient: {name: "abc [def", properties: [_: "literal-string"]} + +:(scenario string_literal_escaped_comment_aware) +recipe main [ + 1:address:array:character <- copy [ +abc \\\[def] +] ++parse: ingredient: {name: "\nabc \[def", properties: [_: "literal-string"]} :(scenario string_literal_and_comment) recipe main [ 1:address:array:character <- copy [abc] # comment ] +parse: instruction: copy -+parse: ingredient: {name: "abc", properties: ["abc": "literal-string"]} ++parse: ingredient: {name: "abc", properties: [_: "literal-string"]} +parse: product: {name: "1", properties: ["1": "address":"array":"character"]} # no other ingredients $parse: 3 + +:(scenario string_literal_escapes_newlines_in_trace) +recipe main [ + copy [abc +def] +] ++parse: ingredient: {name: "abc\ndef", properties: [_: "literal-string"]} + +:(scenario string_literal_can_skip_past_comments) +recipe main [ + copy [ + # ']' inside comment + bar + ] +] ++parse: ingredient: {name: "\n # ']' inside comment\n bar\n ", properties: [_: "literal-string"]} + +:(scenario string_literal_empty) +recipe main [ + copy [] +] ++parse: ingredient: {name: "", properties: [_: "literal-string"]} -- cgit 1.4.1-2-gfad0