!7 static Set tooComplicatedSnippets = lithashset(#1006654); static SS shortFor = litmap( "sclass", "static class", "svoid", "static void", "SS", "Map", "S", "String", "ret", "return", "L", "List", "O", "Object", "sO", "static Object", "sS", "static String", "fO", "final Object", "fS", "final String", "sS", "static String", "sbool", "static boolean", "bool", "boolean", "Int", "Integer", "cast", "casting to the type required on the left-hand side", "°", "()", ); sS explFunc = "anonymous function declaration (similar to Java 8 lambdas)"; sS explPNoconsole = "Main program including Substance L&F, started in non-AWT thread, hiding the console"; static SS tokenExplanations = litmap( "func(", explFunc, "func{", explFunc, "f(", explFunc, "f{", explFunc, "voidfunc", "anonymous function declaration without return value (similar to Java 8 lambdas)", "ctex", "ctex rethrows exceptions as RuntimeExceptions so you don't have to declare them", "p {", "short for: public static void main(String[] args)", "p-experiment {", "Main program with a nice big console & auto-restart", "p-substance {", "Main program including Substance L&F, started in AWT thread", "p-subst {", "Main program including Substance L&F, started in non-AWT thread", "p-noconsole {", explPNoconsole, "pn {", explPNoconsole, "answer {", "Answer function - static S answer(S s) { new Matches m; ...; null; }", "time {", "Run the code block and print how long it took", "semiauto {", "In a semiauto block, JavaX automatically adds a ; to (almost) every line", "autosemi {", "In an autosemi block, JavaX automatically adds a ; to (almost) every line", "Clusters", "Clusters is short for Map>", "temp", "temp is like try (...) extending to the end of the current block", "pcall {", "protected call - try { ... } catch { print exception }", "pcall-short {", "protected call, shorter output - try { ... } catch { printShortException }", ); static SS sc; static StringTree2 tokenExplanationsTree; p { clearCaches(); serveHttpOpenBrowser(7777); tokenExplanationsTree = stringTree2_javaTok(tokenExplanations); printStruct(tokenExplanationsTree); } html { uri = dropPrefix("/", uri); bool real = uri.startsWith("real/"); if (real) uri = dropPrefix("real/", uri); S snippetID = #1007528; if (isSnippetID(uri)) snippetID = fsI(uri); if (contains(tooComplicatedSnippets, snippetID)) ret ""; //fail("too complicated"); S code = loadSnippet(snippetID); L tok = javaTok(code); new Map links; // token index -> sf snippet ID new Map explanations; // token index -> explanation text SS sf = stdFunctions_cached(); for (int i = 1; i < l(tok); i += 2) { S t = tok.get(i); S prev = get(tok, i-2); S next = get(tok, i+2); S id = sf.get(t); if (id != null) { if (eqOneOf(prev, "f", "r") || eqOneOf(next, "(", "°") && (neq(prev, ".") || eq(get(tok, i-4), "main") && neq(get(tok, i-6), "."))) links.put(i, id); } if (eq(t, "concept") && isIdentifier(next)) explanations.put(i, "A concept is like a Java class, but persistable"); if (eq(t, "!") && isIdentifier(prev) && neq(next, "=")) explanations.put(i, "! is short for .get()"); /*if (eq(t, "!") && containsNewLine(get(tok, i-1)) && isInteger(next)) explanations.put(i, "Translator invocation");*/ if (eq(t, "#") && isIdentifier(next)) explanations.put(i, "# makes an identifier local to the scope"); if (eq(t, "f") && isIdentifier(next)) explanations.put(i, "f references a static function in the main class"); if (eq(t, "r") && isIdentifier(next)) explanations.put(i, "short for: r { " + next + "() }"); if (eq(t, "*") && eq(next, "(")) explanations.put(i, "Short syntax for a constructor declaration"); if (eq(t, "thread") && eq(next, "{")) explanations.put(i, "Start a new thread with the following code"); if (eq(t, "thread") && isQuoted(next)) explanations.put(i, "Dtart a new thread with the following name & code"); if (eq(t, "html") && eq(next, "{")) explanations.put(i, "short for: static Object html(String uri, final Map params) ctex {"); if (eq(t, 'try) && eq(next, 'answer)) doublePut(explanations, i, i+2, "\"try answer\" returns the expression if it isn't null or empty"); if (isSingleQuoteIdentifier(t)) explanations.put(i, "string constant, " + quote(fromSingleQuoteIdentifier(t))); if (eqOneOf(t, 'null, 'false, 'true, 'this) && eq(next, ";") && tok_tokenBeforeLonelyReturnValue(prev)) doublePut(explanations, i, i+2, "short for: return " + t + ";"); S e = shortFor.get(t); if (e != null) mapPut(explanations, i, "short for: " + e); L fewTokens = codeTokens(subList(tok, i-1, i+2*5)); Pair p = stringTreeLeafValue2(tokenExplanationsTree, fewTokens); if (p != null) { //print(struct(p)); int lastCodeToken = i+p.b*2-2; if (eq(get(tok, lastCodeToken), "{")) lastCodeToken -= 2; mapPutInRange(explanations, i, lastCodeToken+1, p.a); } //mapPut(explanations, i, tokenExplanations.get(t)); id = sc.get(t); if (id != null) links.put(i, id); } new StringBuilder out; SS titles = getSnippetTitles(values(links)); for i over tok: { S t = tok.get(i), id = links.get(i), ex = explanations.get(i); if (empty(t)) continue; if (t.startsWith("[[") && t.endsWith("]]")) { S explanation = "[[...]] denotes a multi-line string constant (as in Lua)"; out.append(dottedSpan("[[", explanation); S inner = htmlencode(dropPrefix("[[", dropSuffix("]]", t))); out.append(span(inner, style := "background-color: #77FF77")); out.append(dottedSpan("]]", explanation); continue; } if (t.startsWith("[=[") && t.endsWith("]=]")) { S explanation = "[=[...]=] denotes a multi-line string constant (as in Lua)"; out.append(dottedSpan("[=[", explanation); S inner = htmlencode(dropPrefix("[=[", dropSuffix("]=]", t))); out.append(span(inner, style := "background-color: #77FF77")); out.append(dottedSpan("]=]", explanation); continue; } S enc = htmlencode(t); out.append(id != null ? ahref(makeLink(real, id), enc, title := titles.get(fsI(id)), style := "text-decoration: none; color: black; border-bottom: dotted 1px") : ex != null ? dottedSpan(enc, ex) : enc); } S html = str(out); html = dynamize_noEncode(html); if (real) ret html; ret h3_title("Snippet " + snippetID) + hpre(html); } sS makeLink(bool real, S id) { if (real) ret longSnippetLink(id); ret "/" + psI(id); } svoid clearCaches { stdFunctions_clearCache(); sc = standardClassesMap(); }