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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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("&quot;", 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("&amp;", 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("&lt;", 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("&gt;", 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 }