annotate scid/theme.c @ 30:43333d18e4b8

scid: document theme
author David Demelier <markand@malikania.fr>
date Thu, 04 Aug 2022 14:54:43 +0200
parents 695637f1d8a7
children 081e1c258e64
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 *
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
4 * Copyright (c) 2021 David Demelier <markand@malikania.fr>
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"
29
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
29 #include "scid.h"
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 #include "theme.h"
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 #include "util.h"
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
32
29
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
33 #define SIGNATURE DUK_HIDDEN_SYMBOL("File")
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
34
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
35 static struct {
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 duk_context *ctx;
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
37 } theme;
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
38
29
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
39 /* {{{ mustache support */
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
40
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
41 static void
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
42 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
43 {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
44 (void)code;
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 const char *path = data;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
47
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
48 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
49 }
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
50
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
51 static int
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
52 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
53 {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
54 FILE *fp = data;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
55
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
56 if (fwrite(output, 1, size, fp) != size)
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
57 return -1;
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 return 0;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
60 }
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
61
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
62 static int
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
63 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
64 {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
65 FILE *fp = data;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
66
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
67 for (size_t i = 0; i < size; ++i) {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
68 switch (output[i]) {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
69 case '"':
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
70 if (mch_out_verbatim("&quot;", 6, fp) < 0)
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
71 return -1;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
72 break;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
73 case '&':
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
74 if (mch_out_verbatim("&amp;", 5, fp) < 0)
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
75 return -1;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
76 break;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
77 case '<':
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
78 if (mch_out_verbatim("&lt;", 4, fp) < 0)
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
79 return -1;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
80 break;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
81 case '>':
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
82 if (mch_out_verbatim("&gt;", 4, fp) < 0)
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
83 return -1;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
84 break;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
85 default:
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
86 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
87 return -1;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
88 break;
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 }
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 return 0;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
93 }
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
94
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
95 static inline int
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
96 mch_out_int(FILE *fp, intmax_t val)
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 char buf[64] = {0};
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 snprintf(buf, sizeof (buf), "%jd", val);
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 return mch_out_verbatim(buf, strlen(buf), fp);
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
103 }
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
104
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
105 static inline int
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
106 mch_out_double(FILE *fp, double val)
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 char buf[64] = {0};
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 snprintf(buf, sizeof (buf), "%f", val);
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 return mch_out_verbatim(buf, strlen(buf), fp);
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
113 }
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
114
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
115 static int
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
116 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
117 {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
118 (void)pdata;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
119
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
120 FILE *fp = rdata;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
121 const json_t *value = node;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
122
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
123 switch (json_typeof(value)) {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
124 case JSON_OBJECT:
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
125 case JSON_ARRAY:
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
126 /* This indicates a document construction error. */
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
127 // TODO: change to error log.
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
128 abort();
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
129 break;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
130 case JSON_STRING:
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
131 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
132 case JSON_INTEGER:
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
133 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
134 case JSON_REAL:
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
135 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
136 case JSON_TRUE:
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
137 return mch_out_verbatim("true", 4, fp);
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
138 case JSON_FALSE:
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
139 return mch_out_verbatim("false", 5, fp);
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
140 default:
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
141 break;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
142 }
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
143
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
144 return 0;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
145 }
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
146
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
147 static void *
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
148 mch_get_root(void *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 return pdata;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
151 }
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
152
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
153 static void *
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
154 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
155 {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
156 (void)pdata;
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 json_t *value = node;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
159
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
160 #if 0
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
161 printf("-> Seeking name '%.*s'\n", (int)size, name);
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
162 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
163 #endif
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
164
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
165 if (json_is_object(value))
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
166 return json_object_getn(node, name, size);
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 return NULL;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
169 }
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
170
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
171 static void *
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
172 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
173 {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
174 (void)pdata;
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 json_t *value = node;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
177
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
178 #if 0
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
179 printf("-> Seeking index '%u'\n", index);
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
180 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
181 #endif
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
182
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
183 if (json_is_array(value))
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
184 return json_array_get(node, index);
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 return NULL;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
187 }
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
188
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
189 static MUSTACHE_TEMPLATE *
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
190 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
191 {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
192 (void)name;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
193 (void)size;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
194 (void)pdata;
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 return NULL;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
197 }
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
198
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
199 static int
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
200 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
201 {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
202 MUSTACHE_PARSER parser = {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
203 .parse_error = mch_parse_error
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
204 };
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
205 MUSTACHE_RENDERER rdr = {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
206 .out_verbatim = mch_out_verbatim,
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
207 .out_escaped = mch_out_escaped
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
208 };
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
209 MUSTACHE_DATAPROVIDER pv = {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
210 .dump = mch_dump,
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
211 .get_root = mch_get_root,
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
212 .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
213 .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
214 .get_partial = mch_get_partial
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
215 };
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
216 MUSTACHE_TEMPLATE *tmpl;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
217 int status;
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
218
29
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
219 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
220 return -1;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
221
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
222 status = mustache_process(tmpl, &rdr, fp, &pv, doc);
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
223 mustache_release(tmpl);
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 return status ? -1 : 0;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
226 }
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
227
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
228 void
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
229 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
230 {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
231 assert(path);
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 char *in = NULL;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
234
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
235 if ((in = util_read(path))) {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
236 /* 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
237 if (mch_process(path, in, fp, doc) < 0)
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
238 log_warn("theme: mustache error %s", path);
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
239
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
240 free(in);
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
241 } else
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
242 log_warn("theme: %s: %s", path, strerror(errno));
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 /* }}} */
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 /* {{{ Scid module */
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
248
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
249 static duk_ret_t
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
250 Scid_render(duk_context *ctx)
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
251 {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
252 FILE *fp = duk_require_pointer(ctx, 0);
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
253 const char *path = duk_require_string(ctx, 1);
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
254 const char *json = duk_json_encode(ctx, 2);
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
255 json_t *doc = NULL;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
256 json_error_t err;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
257
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
258 if (json && !(doc = json_loads(json, 0, &err)))
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
259 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
260
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
261 mch_templatize(fp, theme_path(path), doc);
29
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
262
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
263 if (doc)
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
264 json_decref(doc);
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 return 0;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
267 }
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
268
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
269 static duk_ret_t
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
270 Scid_print(duk_context *ctx)
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 puts(duk_require_string(ctx, 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 return 0;
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
275 }
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
276
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
277 static const duk_function_list_entry functions[] = {
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
278 { "render", Scid_render, 3 },
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
279 { "print", Scid_print, 1 },
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
280 { NULL, NULL, 0 }
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
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
283 /* }}} */
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
284
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
285 static char *
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
286 call(const json_t *json, const char *function)
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
287 {
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
288 char *out = NULL, *dump;
29
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
289 size_t outsz = 0;
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
290 FILE *fp;
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
291
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
292 duk_get_global_string(theme.ctx, function);
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
293
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
294 if (duk_is_callable(theme.ctx, -1)) {
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
295 fp = util_open_memstream(&out, &outsz);
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
296 dump = util_json_dump(json);
29
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
297
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
298 duk_push_pointer(theme.ctx, fp);
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
299 duk_push_string(theme.ctx, dump);
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
300 duk_json_decode(theme.ctx, -1);
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
301
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
302 if (duk_pcall(theme.ctx, 2) != 0)
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
303 log_warn("theme: %s", duk_safe_to_string(theme.ctx, -1));
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
304
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
305 duk_pop(theme.ctx);
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
306 fclose(fp);
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
307 free(dump);
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
308 } else
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
309 duk_pop(theme.ctx);
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
310
29
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
311 if (!out)
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
312 out = util_strdup("");
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
313
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
314 return out;
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
315 }
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
316
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
317 void
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
318 theme_open(const char *directory)
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
319 {
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
320 assert(directory);
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
321
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
322 const char *path;
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
323 char *data;
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
324
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
325 theme.ctx = duk_create_heap_default();
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
326 path = theme_path("theme.js");
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
327
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
328 if (!(data = util_read(path)))
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
329 log_warn("theme: %s: %s", path, strerror(errno));
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
330 else {
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
331 if (duk_peval_string(theme.ctx, data) != 0)
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
332 log_warn("theme: %s", duk_safe_to_string(theme.ctx, -1));
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
333
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
334 duk_pop(theme.ctx);
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
335 duk_push_object(theme.ctx);
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
336 duk_put_function_list(theme.ctx, -1, functions);
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
337 duk_put_global_string(theme.ctx, "Scid");
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
338 free(data);
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
339 }
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
340 }
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
341
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
342 const char *
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
343 theme_path(const char *filename)
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
344 {
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
345 assert(filename);
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
346
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
347 /* Build path to the template file. */
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
348 static _Thread_local char path[PATH_MAX];
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
349
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
350 snprintf(path, sizeof (path), "%s/%s", scid.themedir, filename);
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
351
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
352 return path;
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
353 }
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
354
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
355 char *
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
356 theme_page_index(const json_t *json)
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
357 {
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
358 assert(json);
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
359
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
360 return call(json, "onPageIndex");
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
361 }
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
362
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
363 char *
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
364 theme_page_status(enum khttp status)
29
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
365 {
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
366 json_t *doc;
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
367 char *ret;
29
695637f1d8a7 scid: first index page in javascript
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
368
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
369 doc = util_json_pack("{si}", "status", status);
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
370 ret = call(doc, "onPageStatus");
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
371
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
372 json_decref(doc);
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
373
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
374 return ret;
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
375 }
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
376
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
377 void
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
378 theme_free(void)
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
379 {
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 29
diff changeset
380 duk_destroy_heap(theme.ctx);
28
4c16bb25e4f1 scid: implement themes in javascript
David Demelier <markand@malikania.fr>
parents:
diff changeset
381 }