Libraryless. Click here for Pure Java version (2093L/14K/47K).
1 | !752 |
2 | |
3 | static class Thing { |
4 | S name, type, file; |
5 | } |
6 | |
7 | static S masterURL = "https://github.com/mcheese/cheesebase/archive/master.zip"; |
8 | static File zipFile; |
9 | |
10 | static new MultiMap<S, Thing> map; |
11 | static new MultiMap<S, S> definitions; |
12 | |
13 | p { |
14 | zipFile = getProgramFile("master.zip"); |
15 | if (!zipFile.exists()) |
16 | loadMaster(); |
17 | analyze(); |
18 | makeBot("Cheesebase Bot."); |
19 | } |
20 | |
21 | static void loadMaster() ctex { |
22 | saveBinaryFile(zipFile, loadBinaryPage(masterURL)); |
23 | print("master.zip loaded from github."); |
24 | } |
25 | |
26 | static void analyze() { |
27 | findStuff("namespace", "class", "using", "template", "struct", "union", "auto"); |
28 | } |
29 | |
30 | synchronized answer { |
31 | if (match("what is *", s, m)) { |
32 | S name = m.unq(0); |
33 | L<Thing> things = lookupPossiblyIgnoreCase(map, name); |
34 | L<S> defs = lookupPossiblyIgnoreCase(definitions, name); |
35 | if (!things.isEmpty() || !empty(defs)) { |
36 | L<S> types = list(getSortedSet(things, "type")); |
37 | L<S> files = list(getSortedSet(things, "file")); |
38 | |
39 | types = replace(types, "using", "alias"); |
40 | types = replace(types, "auto", "variable"); |
41 | |
42 | S theTypes = isEmpty(types) ? "unknown something" : join("/", types); |
43 | S a = (empty(things) ? name : things.get(0).name) + " is " + a(theTypes) + " in cheesebase. It is defined "; |
44 | if (!empty(defs)) |
45 | a += "as " + join("/", quoteAll(defs)) + " "; |
46 | if (!empty(files)) { |
47 | a += "in "; |
48 | if (l(files) == 1) |
49 | a += "file " + quote(files.get(0)); |
50 | else if (l(files) == 2) |
51 | a += "files " + quote(files.get(0)) + " and " + quote(files .get(1)); |
52 | else |
53 | a += quote(files.get(0)) + " and " + n(l(files)-1, " other file"); |
54 | } |
55 | ret a + "."; |
56 | } |
57 | } |
58 | if (match("all things", s)) |
59 | ret structure(map); |
60 | if (match("cheesebase reload", s)) { |
61 | loadMaster(); |
62 | analyze(); |
63 | ret "OK, reloaded from GitHub."; |
64 | } |
65 | } |
66 | |
67 | static void findStuff(S... keywords) { |
68 | map.clear(); |
69 | definitions.clear(); |
70 | |
71 | for (S file : listZip(zipFile)) { |
72 | if (endsWithOneOf(file, ".h", ".cc")) pcall { |
73 | S text = loadTextFileFromZip(zipFile, file); |
74 | |
75 | print("Scanning " + file); |
76 | L<S> tok = javaTok(text); |
77 | for (S keyword : keywords) { |
78 | int i = 0; |
79 | while ((i = findCodeTokens(tok, i+1, keyword, "<id>")) >= 0) { |
80 | new Thing t; |
81 | t.name = tok.get(i+2); |
82 | t.type = keyword; |
83 | t.file = dropPrefix("cheesebase-master/" , file); |
84 | map.put(t.name, t); |
85 | } |
86 | } |
87 | |
88 | definitions.putAll(findInitializers(text)); |
89 | } |
90 | } |
91 | } |
92 | |
93 | static L replace(L in, O a, O b) { |
94 | new L l; |
95 | for (O x: in) |
96 | l.add(eq(x, a) ? b : x); |
97 | ret l; |
98 | } |
99 | |
100 | static S a(S s) { |
101 | ret ("aeiou".contains(substr(s,0, 1)) ? "an " : "a ")+s; |
102 | } |
download show line numbers debug dex old transpilations
Travelled to 16 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, jtubtzbbkimh, lpdgvwnxivlt, mqqgnosmbjvj, onxytkatvevr, pyentgdyhuwx, pzhvpgtvlbxg, teubizvjbppd, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
Snippet ID: | #1002105 |
Snippet name: | Cheesebase Bot (knows stuff about the "cheesebase" project) |
Eternal ID of this version: | #1002105/1 |
Text MD5: | 495e8489f0f731cefaeb6ba6f5863120 |
Transpilation MD5: | 54399904d550a7bbfdd60992170b0df4 |
Author: | stefan |
Category: | javax |
Type: | JavaX source code |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2015-12-20 22:53:25 |
Source code size: | 2824 bytes / 102 lines |
Pitched / IR pitched: | No / Yes |
Views / Downloads: | 761 / 1739 |
Referenced in: | [show references] |