Mercurial > sci
annotate scid/theme.c @ 29:695637f1d8a7
scid: first index page in javascript
author | David Demelier <markand@malikania.fr> |
---|---|
date | Thu, 04 Aug 2022 14:13:58 +0200 |
parents | 4c16bb25e4f1 |
children | 43333d18e4b8 |
rev | line source |
---|---|
28
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 #include <assert.h> |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 #include <errno.h> |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 #include <limits.h> |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
4 #include <string.h> |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 #include <duktape.h> |
29
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
7 #include <jansson.h> |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
8 #include <mustache.h> |
28
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 #include "log.h" |
29
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
11 #include "scid.h" |
28
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 #include "theme.h" |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 #include "util.h" |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 |
29
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
15 #define SIGNATURE DUK_HIDDEN_SYMBOL("File") |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
16 |
28
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 struct theme { |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 char base[PATH_MAX]; |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 duk_context *ctx; |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 }; |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 |
29
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
22 /* {{{ mustache support */ |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
23 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
24 static void |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
25 mch_parse_error(int code, const char *msg, unsigned int line, unsigned int col, void *data) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
26 { |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
27 (void)code; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
28 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
29 const char *path = data; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
30 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
31 log_warn("theme: %s:%u:%u:%s", path, line, col, msg); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
32 } |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
33 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
34 static int |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
35 mch_out_verbatim(const char *output, size_t size, void *data) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
36 { |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
37 FILE *fp = data; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
38 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
39 if (fwrite(output, 1, size, fp) != size) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
40 return -1; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
41 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
42 return 0; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
43 } |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
44 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
45 static int |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
46 mch_out_escaped(const char *output, size_t size, void *data) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
47 { |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
48 FILE *fp = data; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
49 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
50 for (size_t i = 0; i < size; ++i) { |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
51 switch (output[i]) { |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
52 case '"': |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
53 if (mch_out_verbatim(""", 6, fp) < 0) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
54 return -1; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
55 break; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
56 case '&': |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
57 if (mch_out_verbatim("&", 5, fp) < 0) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
58 return -1; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
59 break; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
60 case '<': |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
61 if (mch_out_verbatim("<", 4, fp) < 0) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
62 return -1; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
63 break; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
64 case '>': |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
65 if (mch_out_verbatim(">", 4, fp) < 0) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
66 return -1; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
67 break; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
68 default: |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
69 if (mch_out_verbatim(&output[i], 1, fp) <0) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
70 return -1; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
71 break; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
72 } |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
73 } |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
74 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
75 return 0; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
76 } |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
77 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
78 static inline int |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
79 mch_out_int(FILE *fp, intmax_t val) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
80 { |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
81 char buf[64] = {0}; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
82 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
83 snprintf(buf, sizeof (buf), "%jd", val); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
84 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
85 return mch_out_verbatim(buf, strlen(buf), fp); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
86 } |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
87 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
88 static inline int |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
89 mch_out_double(FILE *fp, double val) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
90 { |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
91 char buf[64] = {0}; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
92 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
93 snprintf(buf, sizeof (buf), "%f", val); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
94 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
95 return mch_out_verbatim(buf, strlen(buf), fp); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
96 } |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
97 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
98 static int |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
99 mch_dump(void *node, int (*outputter)(const char *, size_t, void *), void *rdata, void *pdata) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
100 { |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
101 (void)pdata; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
102 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
103 FILE *fp = rdata; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
104 const json_t *value = node; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
105 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
106 switch (json_typeof(value)) { |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
107 case JSON_OBJECT: |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
108 case JSON_ARRAY: |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
109 /* This indicates a document construction error. */ |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
110 // TODO: change to error log. |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
111 abort(); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
112 break; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
113 case JSON_STRING: |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
114 return outputter(json_string_value(value), json_string_length(value), fp); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
115 case JSON_INTEGER: |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
116 return mch_out_int(fp, json_integer_value(value)); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
117 case JSON_REAL: |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
118 return mch_out_double(fp, json_real_value(value)); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
119 case JSON_TRUE: |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
120 return mch_out_verbatim("true", 4, fp); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
121 case JSON_FALSE: |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
122 return mch_out_verbatim("false", 5, fp); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
123 default: |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
124 break; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
125 } |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
126 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
127 return 0; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
128 } |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
129 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
130 static void * |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
131 mch_get_root(void *pdata) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
132 { |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
133 return pdata; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
134 } |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
135 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
136 static void * |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
137 mch_get_child_by_name(void *node, const char *name, size_t size, void *pdata) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
138 { |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
139 (void)pdata; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
140 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
141 json_t *value = node; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
142 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
143 #if 0 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
144 printf("-> Seeking name '%.*s'\n", (int)size, name); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
145 printf("-> Type of node: %d (%p)\n", json_typeof(value), value); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
146 #endif |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
147 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
148 if (json_is_object(value)) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
149 return json_object_getn(node, name, size); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
150 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
151 return NULL; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
152 } |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
153 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
154 static void * |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
155 mch_get_child_by_index(void *node, unsigned int index, void *pdata) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
156 { |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
157 (void)pdata; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
158 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
159 json_t *value = node; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
160 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
161 #if 0 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
162 printf("-> Seeking index '%u'\n", index); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
163 printf("-> Type of node: %d (%p)\n", json_typeof(value), value); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
164 #endif |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
165 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
166 if (json_is_array(value)) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
167 return json_array_get(node, index); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
168 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
169 return NULL; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
170 } |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
171 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
172 static MUSTACHE_TEMPLATE * |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
173 mch_get_partial(const char *name, size_t size, void *pdata) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
174 { |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
175 (void)name; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
176 (void)size; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
177 (void)pdata; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
178 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
179 return NULL; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
180 } |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
181 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
182 static int |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
183 mch_process(const char *path, const char *input, FILE *fp, json_t *doc) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
184 { |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
185 MUSTACHE_PARSER parser = { |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
186 .parse_error = mch_parse_error |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
187 }; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
188 MUSTACHE_RENDERER rdr = { |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
189 .out_verbatim = mch_out_verbatim, |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
190 .out_escaped = mch_out_escaped |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
191 }; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
192 MUSTACHE_DATAPROVIDER pv = { |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
193 .dump = mch_dump, |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
194 .get_root = mch_get_root, |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
195 .get_child_by_name = mch_get_child_by_name, |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
196 .get_child_by_index = mch_get_child_by_index, |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
197 .get_partial = mch_get_partial |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
198 }; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
199 MUSTACHE_TEMPLATE *tmpl; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
200 int status; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
201 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
202 if (!(tmpl = mustache_compile(input, strlen(input), &parser, (void *)path, 0))) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
203 return -1; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
204 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
205 status = mustache_process(tmpl, &rdr, fp, &pv, doc); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
206 mustache_release(tmpl); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
207 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
208 return status ? -1 : 0; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
209 } |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
210 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
211 void |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
212 mch_templatize(FILE *fp, const char *path, json_t *doc) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
213 { |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
214 assert(path); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
215 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
216 char *in = NULL; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
217 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
218 if ((in = util_read(path))) { |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
219 /* Process template but don't return a partially written file. */ |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
220 if (mch_process(path, in, fp, doc) < 0) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
221 log_warn("theme: mustache error %s", path); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
222 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
223 free(in); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
224 } else |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
225 log_warn("theme: %s: %s", path, strerror(errno)); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
226 } |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
227 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
228 /* }}} */ |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
229 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
230 /* {{{ Scid module */ |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
231 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
232 static duk_ret_t |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
233 Scid_render(duk_context *ctx) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
234 { |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
235 FILE *fp = duk_require_pointer(ctx, 0); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
236 const char *path = duk_require_string(ctx, 1); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
237 const char *json = duk_json_encode(ctx, 2); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
238 json_t *doc = NULL; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
239 json_error_t err; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
240 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
241 if (json && !(doc = json_loads(json, 0, &err))) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
242 return duk_error(ctx, DUK_ERR_ERROR, "%d:%d:%s", err.line, err.column, err.text); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
243 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
244 mch_templatize(fp, theme_path(scid.theme, path), doc); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
245 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
246 if (doc) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
247 json_decref(doc); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
248 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
249 return 0; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
250 } |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
251 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
252 static duk_ret_t |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
253 Scid_print(duk_context *ctx) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
254 { |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
255 puts(duk_require_string(ctx, 0)); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
256 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
257 return 0; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
258 } |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
259 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
260 static const duk_function_list_entry functions[] = { |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
261 { "render", Scid_render, 3 }, |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
262 { "print", Scid_print, 1 }, |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
263 { NULL, NULL, 0 } |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
264 }; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
265 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
266 /* }}} */ |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
267 |
28
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
268 static char * |
29
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
269 call(struct theme *t, json_t *json, const char *function) |
28
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
270 { |
29
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
271 char *out = NULL, *dump = NULL; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
272 size_t outsz = 0; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
273 FILE *fp = NULL; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
274 int nargs = 1; |
28
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
275 |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
276 duk_get_global_string(t->ctx, function); |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
277 |
29
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
278 if (!duk_is_callable(t->ctx, -1)) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
279 goto over; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
280 if (!(fp = open_memstream(&out, &outsz))) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
281 goto over; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
282 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
283 duk_push_pointer(t->ctx, fp); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
284 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
285 if (json && (dump = json_dumps(json, JSON_COMPACT))) { |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
286 duk_push_string(t->ctx, dump); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
287 duk_json_decode(t->ctx, -1); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
288 nargs++; |
28
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
289 } |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
290 |
29
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
291 if (duk_pcall(t->ctx, nargs) != 0) |
28
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
292 log_warn("theme: %s", duk_safe_to_string(t->ctx, -1)); |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
293 |
29
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
294 over: |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
295 duk_pop(t->ctx); |
28
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
296 |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
297 /* |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
298 * For convenience, otherwise all callers have to check for non-NULL |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
299 * after calling the function. |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
300 */ |
29
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
301 free(dump); |
28
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
302 |
29
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
303 if (fp) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
304 fclose(fp); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
305 if (!out) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
306 out = util_strdup(""); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
307 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
308 return out; |
28
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
309 } |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
310 |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
311 const char * |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
312 theme_path(struct theme *t, const char *filename) |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
313 { |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
314 assert(filename); |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
315 |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
316 /* Build path to the template file. */ |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
317 static _Thread_local char path[PATH_MAX]; |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
318 |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
319 snprintf(path, sizeof (path), "%s/%s", t->base, filename); |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
320 |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
321 return path; |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
322 } |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
323 |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
324 struct theme * |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
325 theme_open(const char *directory) |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
326 { |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
327 assert(directory); |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
328 |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
329 struct theme *t; |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
330 char themefile[PATH_MAX], *data; |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
331 |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
332 t = util_calloc(1, sizeof (*t)); |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
333 t->ctx = duk_create_heap_default(); |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
334 util_strlcpy(t->base, directory, sizeof (t->base)); |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
335 |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
336 /* Open theme.js in the directory. */ |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
337 snprintf(themefile, sizeof (themefile), "%s/theme.js", t->base); |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
338 |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
339 if (!(data = util_read(themefile))) |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
340 log_warn("theme: %s: %s", themefile, strerror(errno)); |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
341 else { |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
342 if (duk_peval_string(t->ctx, data) != 0) |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
343 log_warn("theme: %s", duk_safe_to_string(t->ctx, -1)); |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
344 |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
345 duk_pop(t->ctx); |
29
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
346 duk_push_object(t->ctx); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
347 duk_put_function_list(t->ctx, -1, functions); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
348 duk_put_global_string(t->ctx, "Scid"); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
349 free(data); |
28
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
350 } |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
351 |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
352 return t; |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
353 } |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
354 |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
355 char * |
29
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
356 theme_page_index(struct theme *t, json_t *json) |
28
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
357 { |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
358 assert(t); |
29
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
359 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
360 return call(t, json, "onPageIndex"); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
361 } |
28
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
362 |
29
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
363 char * |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
364 theme_page_status(struct theme *t, enum khttp status) |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
365 { |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
366 assert(t); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
367 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
368 (void)t; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
369 (void)status; |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
370 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
371 #if 0 |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
372 return call(t, json, "onPageStatus"); |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
373 #endif |
695637f1d8a7
scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
374 return "ERROR"; |
28
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
375 } |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
376 |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
377 void |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
378 theme_free(struct theme *t) |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
379 { |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
380 assert(t); |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
381 |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
382 duk_destroy_heap(t->ctx); |
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
383 } |