Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

181
LINES

< > TinyBrain | #1008705 - Hyperlink+explain standard functions etc. in JavaX source

JavaX source code [tags: use-pretranspiled] - run with: x30.jar - homepage

Libraryless. Click here for Pure Java version (12044L/84K/256K).

!7

static SS shortFor = litmap(
  "sclass", "static class",
  "svoid", "static void",
  "SS", "Map<String, String>",
  "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)";

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-substance {", "Main program including Substance L&F, started in AWT thread",
  "p-subst {", "Main program including Substance L&F, started in non-AWT thread",
  "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<A> is short for Map<A, Collection<A>>"
);

static SS sc;
static StringTree2<S> 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);
  S code = loadSnippet(snippetID);
  L<S> tok = javaTok(code);
  
  new Map<Int, S> links; // token index -> sf snippet ID
  new Map<Int, S> 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") ||
           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, "f") && isIdentifier(next))
      explanations.put(i, "f <name> references a static function in the main class");
    
    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, "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<String, String> params) ctex {");
      
    if (eq(t, "pcall") && eq(next, "{"))
      explanations.put(i, "protected call - try { ... } catch { print exception }");
      
    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<S> fewTokens = codeTokens(subList(tok, i-1, i+2*5));
    Pair<S, Int> 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();
}

sS dottedSpan(S contents, S title) {
  ret span(contents, +title, style := "border-bottom: dotted 1px");
}

download  show line numbers  debug dex   

Travelled to 3 computer(s): cfunsshuasjs, onxytkatvevr, tvejysmllsmz

No comments. add comment

Snippet ID: #1008705
Snippet name: Hyperlink+explain standard functions etc. in JavaX source
Eternal ID of this version: #1008705/80
Text MD5: 0c0c61a755d5bb92713cf95b7a6a157f
Transpilation MD5: 5c72143f5e00546aaa742ac167f5e92d
Author: stefan
Category: javax
Type: JavaX source code
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2017-09-18 13:40:56
Source code size: 6595 bytes / 181 lines
Pitched / IR pitched: No / No
Views / Downloads: 242 / 468
Version history: 79 change(s)
Referenced in: [show]