-
Notifications
You must be signed in to change notification settings - Fork 1
/
dom.c
52 lines (44 loc) · 1.34 KB
/
dom.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <tcl.h>
#include <string.h>
#include <emscripten.h>
int DomCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) {
char *argsHelp = "attr|css selector key val";
if (objc != 5) {
Tcl_WrongNumArgs(interp, 1, objv, argsHelp);
return TCL_ERROR;
}
const char *action = Tcl_GetString(objv[1]);
const char *selector = Tcl_GetString(objv[2]);
const char *key = Tcl_GetString(objv[3]);
const char *val = Tcl_GetString(objv[4]);
Tcl_Obj *res;
if (strcmp(action, "attr") != 0 && strcmp(action, "css") != 0) {
res = Tcl_NewStringObj("Action must be attr or css", -1);
Tcl_SetObjResult(interp, res);
return TCL_ERROR;
}
// TODO: always catch errors
int numChanged = EM_ASM_INT({
var action = Pointer_stringify($0);
selector = Pointer_stringify($1);
key = Pointer_stringify($2);
val = Pointer_stringify($3);
var elts = document.querySelectorAll(selector);
for (var i = 0; i < elts.length; i++) {
if (action === "attr") {
elts[i][key] = val;
} else {
elts[i].style[key] = val;
}
}
return elts.length;
}, action, selector, key, val);
res = Tcl_NewIntObj(numChanged);
Tcl_SetObjResult(interp, res);
return TCL_OK;
}
void CreateDomCmd(Tcl_Interp *interp) {
Tcl_CreateObjCommand(
interp, "dom", DomCmd, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL
);
}