Mercurial > sci
annotate scid/theme.c @ 85:cf49ab595e2e default tip @
sciworkerd: avoid spawning several tasks
author | David Demelier <markand@malikania.fr> |
---|---|
date | Thu, 09 Mar 2023 10:43:48 +0100 |
parents | 71cd8447e3a4 |
children |
rev | line source |
---|---|
30 | 1 /* |
2 * theme.c -- theme management | |
3 * | |
80
71cd8447e3a4
misc: update copyright years
David Demelier <markand@malikania.fr>
parents:
77
diff
changeset
|
4 * Copyright (c) 2021-2023 David Demelier <markand@malikania.fr> |
30 | 5 * |
6 * Permission to use, copy, modify, and/or distribute this software for any | |
7 * purpose with or without fee is hereby granted, provided that the above | |
8 * copyright notice and this permission notice appear in all copies. | |
9 * | |
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
17 */ | |
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 |
77 | 54 if (output && fwrite(output, 1, size, fp) != size) |
29
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(""", 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("&", 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("<", 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(">", 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 | 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 | 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 | 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 | 367 fclose(fp); |
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 | 379 void |
380 theme_open(const char *directory) | |
381 { | |
382 assert(directory); | |
383 | |
384 const char *path; | |
385 char *data; | |
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 | 389 path = theme_path("theme.js"); |
390 | |
391 if (!(data = util_read(path))) | |
392 log_warn("theme: %s: %s", path, strerror(errno)); | |
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 | 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 | 401 free(data); |
402 } | |
403 } | |
404 | |
28
4c16bb25e4f1
scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
405 const char * |
30 | 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 | 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 } |