annotate scid/theme.c @ 57:bc617784ec97

scid: many fixes in pages
author David Demelier <markand@malikania.fr>
date Wed, 17 Aug 2022 18:26:27 +0200
parents 16f1c72d1635
children 070d8c92ca30
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
1 /*
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
2 * theme.c -- theme management
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
3 *
32
081e1c258e64 misc: update copyright years
David Demelier <markand@malikania.fr>
parents: 30
diff changeset
4 * Copyright (c) 2021-2022 David Demelier <markand@malikania.fr>
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
5 *
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
8 * copyright notice and this permission notice appear in all copies.
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
9 *
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
17 */
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
18
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <assert.h>
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <errno.h>
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <limits.h>
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <string.h>
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
23
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include <duktape.h>
29
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
25 #include <jansson.h>
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
26 #include <mustache.h>
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
27
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 #include "log.h"
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 #include "theme.h"
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 #include "util.h"
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
31
29
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
32 #define SIGNATURE DUK_HIDDEN_SYMBOL("File")
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
33
33
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 32
diff changeset
34 static duk_context *context;
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 32
diff changeset
35 static char base[PATH_MAX];
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
36
29
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
37 /* {{{ mustache support */
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 static void
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
40 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
41 {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
42 (void)code;
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 const char *path = data;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
45
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
46 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
47 }
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
48
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
49 static int
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
50 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
51 {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
52 FILE *fp = data;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
53
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
54 if (fwrite(output, 1, size, fp) != size)
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
55 return -1;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
56
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
57 return 0;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
58 }
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
59
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
60 static int
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
61 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
62 {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
63 FILE *fp = data;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
64
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
65 for (size_t i = 0; i < size; ++i) {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
66 switch (output[i]) {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
67 case '"':
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
68 if (mch_out_verbatim("&quot;", 6, fp) < 0)
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
69 return -1;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
70 break;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
71 case '&':
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
72 if (mch_out_verbatim("&amp;", 5, fp) < 0)
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
73 return -1;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
74 break;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
75 case '<':
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
76 if (mch_out_verbatim("&lt;", 4, fp) < 0)
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
77 return -1;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
78 break;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
79 case '>':
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
80 if (mch_out_verbatim("&gt;", 4, fp) < 0)
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
81 return -1;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
82 break;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
83 default:
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
84 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
85 return -1;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
86 break;
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 }
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
89
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
90 return 0;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
91 }
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 static inline int
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
94 mch_out_int(FILE *fp, intmax_t val)
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
95 {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
96 char buf[64] = {0};
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 snprintf(buf, sizeof (buf), "%jd", val);
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
99
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
100 return mch_out_verbatim(buf, strlen(buf), fp);
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
101 }
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 static inline int
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
104 mch_out_double(FILE *fp, double val)
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 char buf[64] = {0};
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
107
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
108 snprintf(buf, sizeof (buf), "%f", val);
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
109
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
110 return mch_out_verbatim(buf, strlen(buf), fp);
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
111 }
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
112
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
113 static int
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
114 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
115 {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
116 (void)pdata;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
117
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
118 FILE *fp = rdata;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
119 const json_t *value = node;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
120
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
121 switch (json_typeof(value)) {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
122 case JSON_OBJECT:
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
123 case JSON_ARRAY:
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
124 /* This indicates a document construction error. */
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
125 // TODO: change to error log.
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
126 abort();
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
127 break;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
128 case JSON_STRING:
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
129 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
130 case JSON_INTEGER:
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
131 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
132 case JSON_REAL:
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
133 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
134 case JSON_TRUE:
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
135 return mch_out_verbatim("true", 4, fp);
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
136 case JSON_FALSE:
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
137 return mch_out_verbatim("false", 5, fp);
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
138 default:
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
139 break;
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
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
142 return 0;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
143 }
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
144
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
145 static void *
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
146 mch_get_root(void *pdata)
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 return pdata;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
149 }
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 static void *
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
152 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
153 {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
154 (void)pdata;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
155
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
156 json_t *value = node;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
157
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
158 #if 0
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
159 printf("-> Seeking name '%.*s'\n", (int)size, name);
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
160 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
161 #endif
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
162
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
163 if (json_is_object(value))
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
164 return json_object_getn(node, name, size);
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 return NULL;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
167 }
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 static void *
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
170 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
171 {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
172 (void)pdata;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
173
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
174 json_t *value = node;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
175
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
176 #if 0
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
177 printf("-> Seeking index '%u'\n", index);
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
178 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
179 #endif
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 if (json_is_array(value))
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
182 return json_array_get(node, index);
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
183
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
184 return NULL;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
185 }
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
186
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
187 static MUSTACHE_TEMPLATE *
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
188 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
189 {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
190 (void)name;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
191 (void)size;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
192 (void)pdata;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
193
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
194 return NULL;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
195 }
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
196
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
197 static int
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
198 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
199 {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
200 MUSTACHE_PARSER parser = {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
201 .parse_error = mch_parse_error
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
202 };
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
203 MUSTACHE_RENDERER rdr = {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
204 .out_verbatim = mch_out_verbatim,
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
205 .out_escaped = mch_out_escaped
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
206 };
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
207 MUSTACHE_DATAPROVIDER pv = {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
208 .dump = mch_dump,
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
209 .get_root = mch_get_root,
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
210 .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
211 .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
212 .get_partial = mch_get_partial
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 MUSTACHE_TEMPLATE *tmpl;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
215 int status;
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
216
29
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
217 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
218 return -1;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
219
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
220 status = mustache_process(tmpl, &rdr, fp, &pv, doc);
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
221 mustache_release(tmpl);
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 return status ? -1 : 0;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
224 }
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
225
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
226 void
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
227 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
228 {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
229 assert(path);
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
230
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
231 char *in = NULL;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
232
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
233 if ((in = util_read(path))) {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
234 /* 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
235 if (mch_process(path, in, fp, doc) < 0)
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
236 log_warn("theme: mustache error %s", path);
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
237
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
238 free(in);
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
239 } else
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
240 log_warn("theme: %s: %s", path, strerror(errno));
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
241 }
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
242
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
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
245 /* {{{ Scid module */
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
246
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
247 static duk_ret_t
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
248 Scid_render(duk_context *ctx)
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
249 {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
250 FILE *fp = duk_require_pointer(ctx, 0);
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
251 const char *path = duk_require_string(ctx, 1);
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
252 const char *json = duk_json_encode(ctx, 2);
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
253 json_t *doc = NULL;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
254 json_error_t err;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
255
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
256 if (json && !(doc = json_loads(json, 0, &err)))
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
257 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
258
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
259 mch_templatize(fp, theme_path(path), doc);
29
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
260
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
261 if (doc)
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
262 json_decref(doc);
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
263
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
264 return 0;
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 static duk_ret_t
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
268 Scid_print(duk_context *ctx)
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
269 {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
270 puts(duk_require_string(ctx, 0));
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
271
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
272 return 0;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
273 }
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
274
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
275 static const duk_function_list_entry functions[] = {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
276 { "render", Scid_render, 3 },
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
277 { "print", Scid_print, 1 },
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
278 { NULL, NULL, 0 }
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
279 };
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
280
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
281 /* }}} */
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
282
43
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
283 static inline void push_object(duk_context *, json_t *);
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
284 static inline void push_array(duk_context *, json_t *);
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
285
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
286 static inline void
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
287 push_value(duk_context *ctx, json_t *val)
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
288 {
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
289 switch (json_typeof(val)) {
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
290 case JSON_STRING:
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
291 duk_push_string(ctx, json_string_value(val));
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
292 break;
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
293 case JSON_INTEGER:
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
294 duk_push_number(ctx, json_integer_value(val));
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
295 break;
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
296 case JSON_REAL:
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
297 duk_push_number(ctx, json_real_value(val));
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
298 break;
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
299 case JSON_TRUE:
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
300 duk_push_true(ctx);
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
301 break;
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
302 case JSON_FALSE:
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
303 duk_push_false(ctx);
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
304 break;
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
305 case JSON_OBJECT:
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
306 push_object(ctx, val);
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
307 break;
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
308 case JSON_ARRAY:
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
309 push_array(ctx, val);
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
310 break;
46
16f1c72d1635 scid: simplify theme code
David Demelier <markand@malikania.fr>
parents: 44
diff changeset
311 default:
16f1c72d1635 scid: simplify theme code
David Demelier <markand@malikania.fr>
parents: 44
diff changeset
312 duk_push_null(ctx);
16f1c72d1635 scid: simplify theme code
David Demelier <markand@malikania.fr>
parents: 44
diff changeset
313 break;
43
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
314 }
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
315 }
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
316
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
317 static inline void
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
318 push_object(duk_context *ctx, json_t *object)
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
319 {
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
320 assert(json_is_object(object));
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
321
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
322 json_t *val;
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
323 const char *key;
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
324
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
325 duk_push_object(ctx);
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
326
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
327 json_object_foreach(object, key, val) {
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
328 push_value(ctx, val);
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
329 duk_put_prop_string(ctx, -2, key);
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
330 }
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
331 }
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
332
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
333 static inline void
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
334 push_array(duk_context *ctx, json_t *array)
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
335 {
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
336 assert(json_is_array(array));
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
337
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
338 json_t *val;
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
339 size_t i;
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
340
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
341 duk_push_array(ctx);
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
342
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
343 json_array_foreach(array, i, val) {
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
344 push_value(ctx, val);
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
345 duk_put_prop_index(ctx, -2, i);
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
346 }
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
347 }
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
348
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
349 static char *
43
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
350 call(json_t *json, const char *function)
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
351 {
43
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
352 char *out = NULL;
29
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
353 size_t outsz = 0;
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
354 FILE *fp;
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
355
33
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 32
diff changeset
356 duk_get_global_string(context, function);
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
357
33
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 32
diff changeset
358 if (duk_is_callable(context, -1)) {
43
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
359 fp = util_open_memstream(&out, &outsz);
33
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 32
diff changeset
360 duk_push_pointer(context, fp);
43
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
361 push_value(context, json);
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
362
33
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 32
diff changeset
363 if (duk_pcall(context, 2) != 0)
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 32
diff changeset
364 log_warn("theme: %s", duk_safe_to_string(context, -1));
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
365
33
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 32
diff changeset
366 duk_pop(context);
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
367 fclose(fp);
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
368 } else
33
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 32
diff changeset
369 duk_pop(context);
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
370
29
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
371 if (!out)
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
372 out = util_strdup("");
43
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
373 if (json)
6854efe15210 scid: push json recursively
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
374 json_decref(json);
29
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
375
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
376 return out;
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
377 }
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
378
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
379 void
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
380 theme_open(const char *directory)
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
381 {
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
382 assert(directory);
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
383
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
384 const char *path;
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
385 char *data;
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
386
33
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 32
diff changeset
387 util_strlcpy(base, directory, sizeof (base));
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 32
diff changeset
388 context = duk_create_heap_default();
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
389 path = theme_path("theme.js");
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
390
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
391 if (!(data = util_read(path)))
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
392 log_warn("theme: %s: %s", path, strerror(errno));
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
393 else {
33
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 32
diff changeset
394 if (duk_peval_string(context, data) != 0)
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 32
diff changeset
395 log_warn("theme: %s", duk_safe_to_string(context, -1));
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
396
33
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 32
diff changeset
397 duk_pop(context);
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 32
diff changeset
398 duk_push_object(context);
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 32
diff changeset
399 duk_put_function_list(context, -1, functions);
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 32
diff changeset
400 duk_put_global_string(context, "Scid");
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
401 free(data);
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
402 }
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
403 }
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
404
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
405 const char *
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
406 theme_path(const char *filename)
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
407 {
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
408 assert(filename);
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
409
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
410 /* Build path to the template file. */
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
411 static _Thread_local char path[PATH_MAX];
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
412
33
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 32
diff changeset
413 snprintf(path, sizeof (path), "%s/%s", base, filename);
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
414
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
415 return path;
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
416 }
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
417
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
418 char *
46
16f1c72d1635 scid: simplify theme code
David Demelier <markand@malikania.fr>
parents: 44
diff changeset
419 theme_render(const char *function, json_t *json)
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
420 {
46
16f1c72d1635 scid: simplify theme code
David Demelier <markand@malikania.fr>
parents: 44
diff changeset
421 assert(function);
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
422
46
16f1c72d1635 scid: simplify theme code
David Demelier <markand@malikania.fr>
parents: 44
diff changeset
423 return call(json, function);
41
00b9af607524 scid: implement /jobresults/id page
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
424 }
00b9af607524 scid: implement /jobresults/id page
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
425
00b9af607524 scid: implement /jobresults/id page
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
426 char *
46
16f1c72d1635 scid: simplify theme code
David Demelier <markand@malikania.fr>
parents: 44
diff changeset
427 theme_status(int status, const char *message)
29
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
428 {
46
16f1c72d1635 scid: simplify theme code
David Demelier <markand@malikania.fr>
parents: 44
diff changeset
429 return theme_render("onPageStatus", util_json_pack("{si ss}",
44
576f4b1ec79f scid: implement API authentication
David Demelier <markand@malikania.fr>
parents: 43
diff changeset
430 "status", status,
576f4b1ec79f scid: implement API authentication
David Demelier <markand@malikania.fr>
parents: 43
diff changeset
431 "message", message
46
16f1c72d1635 scid: simplify theme code
David Demelier <markand@malikania.fr>
parents: 44
diff changeset
432 ));
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
433 }
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
434
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
435 void
46
16f1c72d1635 scid: simplify theme code
David Demelier <markand@malikania.fr>
parents: 44
diff changeset
436 theme_finish(void)
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
437 {
33
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 32
diff changeset
438 duk_destroy_heap(context);
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
439 }