Warning: session_start(): open(/var/lib/php/sessions/sess_tvuof82o8vk1c99hn9cig7paeb, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
!7
static SS shortFor = litmap(
"svoid", "static void",
"SS", "Map",
"S", "String",
"ret", "return",
"L", "List",
"O", "Object",
"fS", "final String",
);
static SS tokenExplanations = litmap(
"func", "anonymous function declaration (similar to Java 8 lambdas)",
);
static SS sc;
p {
clearCaches();
serveHttpOpenBrowser(7777);
}
html {
uri = dropPrefix("/", uri);
bool real = uri.startsWith("real/");
if (real) uri = dropPrefix("real/", uri);
S snippetID = #1007528;
if (isSnippetID(uri)) snippetID = fsI(uri);
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 (eq(prev, "f") ||
eq(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, "*") && eq(next, "("))
explanations.put(i, "Short syntax for a constructor declaration");
if (eq(t, "p") && eq(next, "{"))
explanations.put(i, "short for: public static void main(String[] args)");
if (eq(t, "pcall") && eq(next, "{"))
explanations.put(i, "protected call - try { ... } catch { print exception }");
S e = shortFor.get(t);
if (e != null)
mapPut(explanations, i, "short for: " + e);
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);
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 ? span(enc, title := ex, style := "border-bottom: dotted 1px")
: enc);
}
S html = str(out);
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();
}