Libraryless. Click here for Pure Java version (7594L/53K/159K).
1 | !752 |
2 | |
3 | static int port = 7654; |
4 | |
5 | concepts. |
6 | |
7 | concept Definition {
|
8 | S name; // what is defined |
9 | S text; // definition text |
10 | O source; // where definition comes from (optional) |
11 | O caveat; // an optional restriction of the definition, like "maybe" or "allegedly" or "rarely" or smth. |
12 | |
13 | *() {}
|
14 | *(S *name, S *text) { change(); }
|
15 | } |
16 | |
17 | p {
|
18 | useProgramDirOf("#1005059");
|
19 | concepts(); |
20 | serveHttp(port); |
21 | makeBot("Wiki.");
|
22 | print("Go to http://localhost:\*port*/ to browse Wiki.\nType here to edit. Commands: def \"the topic\" \"the text\". undef \"the topic\".");
|
23 | } |
24 | |
25 | synchronized answer {
|
26 | if "def * *" {
|
27 | S name = $1, text = $2; |
28 | new Definition(name, text); |
29 | int count = countConcepts(Definition, +name); |
30 | ret "Definition saved! Now have " + n(count, "definition") + " for " + quote(name) + "."; |
31 | } |
32 | |
33 | if "undef *" {
|
34 | S x = $1; |
35 | if (isInteger(x)) |
36 | ret deleteConcept(parseLong(x)) != null ? "Deleted" : "Nothing to delete"; |
37 | else |
38 | ret nempty(deleteConcepts(Definition, name := x)) ? "Deleted" : "Nothing to delete"; |
39 | } |
40 | } |
41 | |
42 | synchronized html {
|
43 | uri = dropPrefix("/", uri);
|
44 | |
45 | // serve definition |
46 | |
47 | if (startsWith(uri, "!")) {
|
48 | S name = substring(uri, 1); |
49 | L<Definition> l = findConceptsWhere(Definition, +name); |
50 | if (empty(l)) |
51 | ret fixHTML("No definition found for " + quote(htmlencode(name)));
|
52 | else |
53 | ret fixHTML( |
54 | htitle("Wiki: " + htmlencode(name))
|
55 | + h1(htmlencode(name)) |
56 | + ul(map(l, func(Definition d) { spanTitle("#" + d.id, htmlencode(d.text)) })));
|
57 | } |
58 | |
59 | // process action |
60 | |
61 | if (eq(uri, "add")) {
|
62 | printStruct(params); |
63 | S name = params.get("word").trim();
|
64 | S text = params.get("definition").trim();
|
65 | new Definition(name, text); |
66 | ret hrefresh("/");
|
67 | } |
68 | |
69 | // serve home page |
70 | |
71 | final MultiSet<S> ms = collectMultiSet(list(Definition.class), "name"); |
72 | L<S> names = sorted(ms.keySet()); |
73 | ret fixHTML( |
74 | htitle_h1("A. I. Wiki!")
|
75 | + p("Yo I got definitions for:")
|
76 | + ul(map(names, func(S name) {
|
77 | int count = ms.get(name); |
78 | //S xinfo = bracketedCount(count); |
79 | Definition example = findConceptWhere(Definition, +name); |
80 | S xinfo = " - " + htmlencode(example.text); |
81 | if (count > 1) xinfo += " +\*count-1*/"; |
82 | ret ahref("/!" + urlencode(name), htmlencode(name)) + xinfo;
|
83 | })) |
84 | + h3("Add definition")
|
85 | + hform( |
86 | htableRaw(ll( |
87 | ll("Word", htextinput("word")),
|
88 | ll("Definition", htextinput("definition", style := "width: 500px")),
|
89 | ll("", hsubmit())
|
90 | )) |
91 | , action := "/add", method := "POST") |
92 | ); |
93 | } |
Began life as a copy of #1005059
download show line numbers debug dex old transpilations
Travelled to 16 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, ddnzoavkxhuk, gwrvuhgaqvyk, ishqpsrjomds, iveijnkanddl, lpdgvwnxivlt, mqqgnosmbjvj, onxytkatvevr, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
| Snippet ID: | #1005066 |
| Snippet name: | Wiki v2 [WORKS] |
| Eternal ID of this version: | #1005066/1 |
| Text MD5: | 3dc9a15d835c07eb6800fb83bd76b0ea |
| Transpilation MD5: | 9265db718c22c7bb7d70c230975ef930 |
| Author: | stefan |
| Category: | javax / a.i. |
| Type: | JavaX source code |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2016-11-10 01:37:30 |
| Source code size: | 2711 bytes / 93 lines |
| Pitched / IR pitched: | No / No |
| Views / Downloads: | 848 / 1009 |
| Referenced in: | [show references] |