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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
/*
* Generics for Duktape binding in NetSurf
*
* The result of this *MUST* be setting a NetSurf object only.
*
* That object will then be absorbed into the global object as a hidden
* object which is used by the rest of the bindings.
*/
var NetSurf = {
/* The make-proxy call for list-type objects */
makeListProxy: function(inner) {
return new Proxy(inner, {
has: function(target, key) {
if (typeof key == 'number') {
return (key >= 0) && (key < target.length);
} else {
return key in target;
}
},
get: function(target, key) {
if (typeof key == 'number') {
return target.item(key);
} else {
return target[key];
}
},
});
},
/* The make-proxy call for nodemap-type objects */
makeNodeMapProxy: function(inner) {
return new Proxy(inner, {
has: function(target, key) {
if (typeof key == 'number') {
return (key >= 0) && (key < target.length);
} else {
return target.getNamedItem(key) || (key in target);
}
},
get: function(target, key) {
if (typeof key == 'number') {
return target.item(key);
} else {
var attr = target.getNamedItem(key);
if (attr) {
return attr;
}
return target[key];
}
},
});
},
consoleFormatter: function Formatter() {
if (arguments.length == 0) {
return new Array("");
} else if (arguments.length == 1) {
return new Array(arguments[0].toString());
}
const target = arguments[0];
const current = arguments[1];
if (typeof target !== "string") {
return Array.from(arguments);
}
const offset = target.search("%");
if (offset == -1 || offset >= (target.length - 1)) {
// We've a string, but the % either doesn't exist or is
// at the end of it, so give up
return Array.from(arguments);
}
const specifier = target[offset + 1];
var converted = undefined;
if (specifier === 's') {
// Stringification
converted = current.toString();
} else if (specifier === 'd' || specifier === 'i') {
converted = parseInt(current, 10).toString();
} else if (specifier === 'f') {
converted = parseFloat(current).toString();
} else if (specifier === 'o') {
// TODO: Objectification?
converted = current.toString();
} else if (specifier === 'O') {
// TODO: JSONification
converted = current.toString();
}
var result = new Array();
if (converted !== undefined) {
// We converted it, so we need to absorb the formatted thing
// and move on
var newtarget = "";
if (offset > 0) {
newtarget = target.substring(0, offset);
}
newtarget = newtarget + converted;
if (offset < target.length - 2) {
newtarget = newtarget + target.substring(offset + 2, target.length);
}
result.push(newtarget);
} else {
// Undefined, so we drop this argument and move on
result.push(target);
}
var i;
for (i = 2; i < arguments.length; i++) {
result.push(arguments[i]);
}
if (result[0].search("%") == -1) {
return result;
}
if (result.length === 1) {
return result;
}
return Formatter.apply(result);
}
};
|