rapydscript-ns 0.9.1 → 0.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agignore +1 -1
- package/.github/workflows/ci.yml +38 -38
- package/=template.pyj +5 -5
- package/CHANGELOG.md +3 -1
- package/HACKING.md +103 -103
- package/LICENSE +24 -24
- package/README.md +1 -1
- package/TODO.md +117 -0
- package/add-toc-to-readme +2 -2
- package/bin/export +75 -75
- package/bin/rapydscript +70 -70
- package/bin/web-repl-export +102 -102
- package/build +2 -2
- package/language-service/index.js +7 -7
- package/language-service/language-service.d.ts +1 -1
- package/package.json +6 -2
- package/publish.py +37 -37
- package/release/compiler.js +245 -230
- package/release/signatures.json +22 -22
- package/session.vim +4 -4
- package/setup.cfg +2 -2
- package/src/compiler.pyj +36 -36
- package/src/errors.pyj +30 -30
- package/src/lib/aes.pyj +646 -646
- package/src/lib/copy.pyj +120 -120
- package/src/lib/elementmaker.pyj +83 -83
- package/src/lib/encodings.pyj +126 -126
- package/src/lib/gettext.pyj +569 -569
- package/src/lib/itertools.pyj +580 -580
- package/src/lib/math.pyj +193 -193
- package/src/lib/operator.pyj +11 -11
- package/src/lib/pythonize.pyj +20 -20
- package/src/lib/random.pyj +118 -118
- package/src/lib/react.pyj +74 -74
- package/src/lib/traceback.pyj +63 -63
- package/src/lib/uuid.pyj +77 -77
- package/src/monaco-language-service/diagnostics.js +2 -2
- package/src/monaco-language-service/dts.js +550 -550
- package/src/monaco-language-service/index.js +2 -2
- package/src/output/comments.pyj +45 -45
- package/src/output/exceptions.pyj +201 -201
- package/src/output/jsx.pyj +164 -164
- package/src/output/loops.pyj +9 -0
- package/src/output/treeshake.pyj +182 -182
- package/src/output/utils.pyj +72 -72
- package/src/string_interpolation.pyj +72 -72
- package/src/unicode_aliases.pyj +576 -576
- package/src/utils.pyj +192 -192
- package/test/_import_one.pyj +37 -37
- package/test/_import_two/__init__.pyj +11 -11
- package/test/_import_two/level2/deep.pyj +4 -4
- package/test/_import_two/other.pyj +6 -6
- package/test/_import_two/sub.pyj +13 -13
- package/test/aes_vectors.pyj +421 -421
- package/test/annotations.pyj +80 -80
- package/test/decorators.pyj +77 -77
- package/test/docstrings.pyj +39 -39
- package/test/elementmaker_test.pyj +45 -45
- package/test/functions.pyj +151 -151
- package/test/generators.pyj +41 -41
- package/test/generic.pyj +370 -370
- package/test/imports.pyj +72 -72
- package/test/internationalization.pyj +73 -73
- package/test/lint.pyj +164 -164
- package/test/loops.pyj +85 -85
- package/test/numpy.pyj +734 -734
- package/test/omit_function_metadata.pyj +20 -20
- package/test/repl.pyj +121 -121
- package/test/scoped_flags.pyj +76 -76
- package/test/unit/index.js +66 -0
- package/test/unit/language-service-dts.js +543 -543
- package/test/unit/language-service-hover.js +455 -455
- package/test/unit/language-service.js +1 -1
- package/tools/compiler.d.ts +367 -0
- package/tools/completer.js +131 -131
- package/tools/gettext.js +185 -185
- package/tools/ini.js +65 -65
- package/tools/msgfmt.js +187 -187
- package/tools/repl.js +223 -223
- package/tools/test.js +118 -118
- package/tools/utils.js +128 -128
- package/tools/web_repl.js +95 -95
- package/try +41 -41
- package/web-repl/env.js +196 -196
- package/web-repl/index.html +163 -163
- package/web-repl/prism.css +139 -139
- package/web-repl/prism.js +113 -113
- package/web-repl/rapydscript.js +224 -224
- package/web-repl/sha1.js +25 -25
package/src/lib/copy.pyj
CHANGED
|
@@ -1,120 +1,120 @@
|
|
|
1
|
-
# vim:fileencoding=utf-8
|
|
2
|
-
# License: BSD
|
|
3
|
-
# RapydScript implementation of Python's copy standard library.
|
|
4
|
-
#
|
|
5
|
-
# Supported: copy, deepcopy
|
|
6
|
-
# Classes may define __copy__() and __deepcopy__(memo) for custom behaviour.
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
def _is_primitive(x):
|
|
10
|
-
t = jstype(x)
|
|
11
|
-
return x is None or t is 'number' or t is 'boolean' or t is 'string' or t is 'undefined'
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
def copy(x):
|
|
15
|
-
"""Return a shallow copy of x.
|
|
16
|
-
|
|
17
|
-
For immutable primitives (numbers, strings, booleans, None) the object
|
|
18
|
-
itself is returned unchanged. For containers a new container of the same
|
|
19
|
-
type is created whose top-level items are the same objects as in the
|
|
20
|
-
original.
|
|
21
|
-
|
|
22
|
-
Dispatch order:
|
|
23
|
-
1. Primitive → return as-is.
|
|
24
|
-
2. ``__copy__`` method → call and return.
|
|
25
|
-
3. list → ``list(x)`` (slice).
|
|
26
|
-
4. set → ``set(x)``.
|
|
27
|
-
5. frozenset → ``frozenset(x)``.
|
|
28
|
-
6. dict (ρσ_dict) → ``x.copy()``.
|
|
29
|
-
7. Plain JS object (constructor is Object or null-proto) → Object.assign.
|
|
30
|
-
8. Other object (class instance) → Object.create + Object.assign.
|
|
31
|
-
"""
|
|
32
|
-
if _is_primitive(x):
|
|
33
|
-
return x
|
|
34
|
-
if jstype(x.__copy__) is 'function':
|
|
35
|
-
return x.__copy__()
|
|
36
|
-
if Array.isArray(x):
|
|
37
|
-
return list(x)
|
|
38
|
-
if isinstance(x, set):
|
|
39
|
-
return set(x)
|
|
40
|
-
if isinstance(x, frozenset):
|
|
41
|
-
return frozenset(x)
|
|
42
|
-
if isinstance(x, dict):
|
|
43
|
-
return x.copy()
|
|
44
|
-
proto = Object.getPrototypeOf(x)
|
|
45
|
-
if x.constructor is Object or proto is None:
|
|
46
|
-
return Object.assign({}, x)
|
|
47
|
-
# Class instance: create a same-prototype object and copy own properties.
|
|
48
|
-
result = Object.create(proto)
|
|
49
|
-
Object.assign(result, x)
|
|
50
|
-
return result
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
def deepcopy(x, memo=None):
|
|
54
|
-
"""Return a deep (recursive) copy of x.
|
|
55
|
-
|
|
56
|
-
Circular references are handled via the *memo* mapping (a JS Map), which
|
|
57
|
-
stores already-copied objects so that they are only copied once.
|
|
58
|
-
|
|
59
|
-
Dispatch order (same structure as ``copy`` but recursive):
|
|
60
|
-
1. Primitive → return as-is.
|
|
61
|
-
2. Memo hit → return the previously copied object.
|
|
62
|
-
3. ``__deepcopy__(memo)`` method → call and return.
|
|
63
|
-
4. list → recurse into elements.
|
|
64
|
-
5. set → recurse into elements, build new set.
|
|
65
|
-
6. frozenset → recurse into elements, build new frozenset.
|
|
66
|
-
7. dict → recurse into keys and values.
|
|
67
|
-
8. Plain JS object → recurse into own-enumerable properties.
|
|
68
|
-
9. Class instance → recurse into own-enumerable properties.
|
|
69
|
-
"""
|
|
70
|
-
if memo is None:
|
|
71
|
-
memo = v'new Map()'
|
|
72
|
-
if _is_primitive(x):
|
|
73
|
-
return x
|
|
74
|
-
if memo.has(x):
|
|
75
|
-
return memo.get(x)
|
|
76
|
-
if jstype(x.__deepcopy__) is 'function':
|
|
77
|
-
result = x.__deepcopy__(memo)
|
|
78
|
-
memo.set(x, result)
|
|
79
|
-
return result
|
|
80
|
-
if Array.isArray(x):
|
|
81
|
-
result = []
|
|
82
|
-
memo.set(x, result)
|
|
83
|
-
for i in range(x.length):
|
|
84
|
-
result.push(deepcopy(x[i], memo))
|
|
85
|
-
return result
|
|
86
|
-
if isinstance(x, set):
|
|
87
|
-
result = set()
|
|
88
|
-
memo.set(x, result)
|
|
89
|
-
iterator = x[ρσ_iterator_symbol]()
|
|
90
|
-
r = iterator.next()
|
|
91
|
-
while not r.done:
|
|
92
|
-
result.add(deepcopy(r.value, memo))
|
|
93
|
-
r = iterator.next()
|
|
94
|
-
return result
|
|
95
|
-
if isinstance(x, frozenset):
|
|
96
|
-
items = []
|
|
97
|
-
iterator = x[ρσ_iterator_symbol]()
|
|
98
|
-
r = iterator.next()
|
|
99
|
-
while not r.done:
|
|
100
|
-
items.push(deepcopy(r.value, memo))
|
|
101
|
-
r = iterator.next()
|
|
102
|
-
result = frozenset(items)
|
|
103
|
-
memo.set(x, result)
|
|
104
|
-
return result
|
|
105
|
-
if isinstance(x, dict):
|
|
106
|
-
result = dict()
|
|
107
|
-
memo.set(x, result)
|
|
108
|
-
iterator = x.items()
|
|
109
|
-
r = iterator.next()
|
|
110
|
-
while not r.done:
|
|
111
|
-
result.set(deepcopy(r.value[0], memo), deepcopy(r.value[1], memo))
|
|
112
|
-
r = iterator.next()
|
|
113
|
-
return result
|
|
114
|
-
proto = Object.getPrototypeOf(x)
|
|
115
|
-
result = Object.create(proto)
|
|
116
|
-
memo.set(x, result)
|
|
117
|
-
keys = Object.keys(x)
|
|
118
|
-
for i in range(keys.length):
|
|
119
|
-
result[keys[i]] = deepcopy(x[keys[i]], memo)
|
|
120
|
-
return result
|
|
1
|
+
# vim:fileencoding=utf-8
|
|
2
|
+
# License: BSD
|
|
3
|
+
# RapydScript implementation of Python's copy standard library.
|
|
4
|
+
#
|
|
5
|
+
# Supported: copy, deepcopy
|
|
6
|
+
# Classes may define __copy__() and __deepcopy__(memo) for custom behaviour.
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def _is_primitive(x):
|
|
10
|
+
t = jstype(x)
|
|
11
|
+
return x is None or t is 'number' or t is 'boolean' or t is 'string' or t is 'undefined'
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def copy(x):
|
|
15
|
+
"""Return a shallow copy of x.
|
|
16
|
+
|
|
17
|
+
For immutable primitives (numbers, strings, booleans, None) the object
|
|
18
|
+
itself is returned unchanged. For containers a new container of the same
|
|
19
|
+
type is created whose top-level items are the same objects as in the
|
|
20
|
+
original.
|
|
21
|
+
|
|
22
|
+
Dispatch order:
|
|
23
|
+
1. Primitive → return as-is.
|
|
24
|
+
2. ``__copy__`` method → call and return.
|
|
25
|
+
3. list → ``list(x)`` (slice).
|
|
26
|
+
4. set → ``set(x)``.
|
|
27
|
+
5. frozenset → ``frozenset(x)``.
|
|
28
|
+
6. dict (ρσ_dict) → ``x.copy()``.
|
|
29
|
+
7. Plain JS object (constructor is Object or null-proto) → Object.assign.
|
|
30
|
+
8. Other object (class instance) → Object.create + Object.assign.
|
|
31
|
+
"""
|
|
32
|
+
if _is_primitive(x):
|
|
33
|
+
return x
|
|
34
|
+
if jstype(x.__copy__) is 'function':
|
|
35
|
+
return x.__copy__()
|
|
36
|
+
if Array.isArray(x):
|
|
37
|
+
return list(x)
|
|
38
|
+
if isinstance(x, set):
|
|
39
|
+
return set(x)
|
|
40
|
+
if isinstance(x, frozenset):
|
|
41
|
+
return frozenset(x)
|
|
42
|
+
if isinstance(x, dict):
|
|
43
|
+
return x.copy()
|
|
44
|
+
proto = Object.getPrototypeOf(x)
|
|
45
|
+
if x.constructor is Object or proto is None:
|
|
46
|
+
return Object.assign({}, x)
|
|
47
|
+
# Class instance: create a same-prototype object and copy own properties.
|
|
48
|
+
result = Object.create(proto)
|
|
49
|
+
Object.assign(result, x)
|
|
50
|
+
return result
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def deepcopy(x, memo=None):
|
|
54
|
+
"""Return a deep (recursive) copy of x.
|
|
55
|
+
|
|
56
|
+
Circular references are handled via the *memo* mapping (a JS Map), which
|
|
57
|
+
stores already-copied objects so that they are only copied once.
|
|
58
|
+
|
|
59
|
+
Dispatch order (same structure as ``copy`` but recursive):
|
|
60
|
+
1. Primitive → return as-is.
|
|
61
|
+
2. Memo hit → return the previously copied object.
|
|
62
|
+
3. ``__deepcopy__(memo)`` method → call and return.
|
|
63
|
+
4. list → recurse into elements.
|
|
64
|
+
5. set → recurse into elements, build new set.
|
|
65
|
+
6. frozenset → recurse into elements, build new frozenset.
|
|
66
|
+
7. dict → recurse into keys and values.
|
|
67
|
+
8. Plain JS object → recurse into own-enumerable properties.
|
|
68
|
+
9. Class instance → recurse into own-enumerable properties.
|
|
69
|
+
"""
|
|
70
|
+
if memo is None:
|
|
71
|
+
memo = v'new Map()'
|
|
72
|
+
if _is_primitive(x):
|
|
73
|
+
return x
|
|
74
|
+
if memo.has(x):
|
|
75
|
+
return memo.get(x)
|
|
76
|
+
if jstype(x.__deepcopy__) is 'function':
|
|
77
|
+
result = x.__deepcopy__(memo)
|
|
78
|
+
memo.set(x, result)
|
|
79
|
+
return result
|
|
80
|
+
if Array.isArray(x):
|
|
81
|
+
result = []
|
|
82
|
+
memo.set(x, result)
|
|
83
|
+
for i in range(x.length):
|
|
84
|
+
result.push(deepcopy(x[i], memo))
|
|
85
|
+
return result
|
|
86
|
+
if isinstance(x, set):
|
|
87
|
+
result = set()
|
|
88
|
+
memo.set(x, result)
|
|
89
|
+
iterator = x[ρσ_iterator_symbol]()
|
|
90
|
+
r = iterator.next()
|
|
91
|
+
while not r.done:
|
|
92
|
+
result.add(deepcopy(r.value, memo))
|
|
93
|
+
r = iterator.next()
|
|
94
|
+
return result
|
|
95
|
+
if isinstance(x, frozenset):
|
|
96
|
+
items = []
|
|
97
|
+
iterator = x[ρσ_iterator_symbol]()
|
|
98
|
+
r = iterator.next()
|
|
99
|
+
while not r.done:
|
|
100
|
+
items.push(deepcopy(r.value, memo))
|
|
101
|
+
r = iterator.next()
|
|
102
|
+
result = frozenset(items)
|
|
103
|
+
memo.set(x, result)
|
|
104
|
+
return result
|
|
105
|
+
if isinstance(x, dict):
|
|
106
|
+
result = dict()
|
|
107
|
+
memo.set(x, result)
|
|
108
|
+
iterator = x.items()
|
|
109
|
+
r = iterator.next()
|
|
110
|
+
while not r.done:
|
|
111
|
+
result.set(deepcopy(r.value[0], memo), deepcopy(r.value[1], memo))
|
|
112
|
+
r = iterator.next()
|
|
113
|
+
return result
|
|
114
|
+
proto = Object.getPrototypeOf(x)
|
|
115
|
+
result = Object.create(proto)
|
|
116
|
+
memo.set(x, result)
|
|
117
|
+
keys = Object.keys(x)
|
|
118
|
+
for i in range(keys.length):
|
|
119
|
+
result[keys[i]] = deepcopy(x[keys[i]], memo)
|
|
120
|
+
return result
|
package/src/lib/elementmaker.pyj
CHANGED
|
@@ -1,83 +1,83 @@
|
|
|
1
|
-
# vim:fileencoding=utf-8
|
|
2
|
-
# License: GPL v3 Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>
|
|
3
|
-
|
|
4
|
-
html_elements = {
|
|
5
|
-
'a', 'abbr', 'acronym', 'address', 'area',
|
|
6
|
-
'article', 'aside', 'audio', 'b', 'base', 'big', 'body', 'blockquote', 'br', 'button',
|
|
7
|
-
'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup',
|
|
8
|
-
'command', 'datagrid', 'datalist', 'dd', 'del', 'details', 'dfn',
|
|
9
|
-
'dialog', 'dir', 'div', 'dl', 'dt', 'em', 'event-source', 'fieldset',
|
|
10
|
-
'figcaption', 'figure', 'footer', 'font', 'form', 'header', 'h1',
|
|
11
|
-
'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'head', 'i', 'iframe', 'img', 'input', 'ins',
|
|
12
|
-
'keygen', 'kbd', 'label', 'legend', 'li', 'm', 'map', 'menu', 'meter',
|
|
13
|
-
'multicol', 'nav', 'nextid', 'ol', 'output', 'optgroup', 'option',
|
|
14
|
-
'p', 'pre', 'progress', 'q', 's', 'samp', 'script', 'section', 'select',
|
|
15
|
-
'small', 'sound', 'source', 'spacer', 'span', 'strike', 'strong', 'style',
|
|
16
|
-
'sub', 'sup', 'table', 'tbody', 'td', 'textarea', 'time', 'tfoot',
|
|
17
|
-
'th', 'thead', 'tr', 'tt', 'u', 'ul', 'var', 'video'
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
mathml_elements = {
|
|
21
|
-
'maction', 'math', 'merror', 'mfrac', 'mi',
|
|
22
|
-
'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom',
|
|
23
|
-
'mprescripts', 'mroot', 'mrow', 'mspace', 'msqrt', 'mstyle', 'msub',
|
|
24
|
-
'msubsup', 'msup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder',
|
|
25
|
-
'munderover', 'none'
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
svg_elements = {
|
|
29
|
-
'a', 'animate', 'animateColor', 'animateMotion',
|
|
30
|
-
'animateTransform', 'clipPath', 'circle', 'defs', 'desc', 'ellipse',
|
|
31
|
-
'font-face', 'font-face-name', 'font-face-src', 'g', 'glyph', 'hkern',
|
|
32
|
-
'linearGradient', 'line', 'marker', 'metadata', 'missing-glyph',
|
|
33
|
-
'mpath', 'path', 'polygon', 'polyline', 'radialGradient', 'rect',
|
|
34
|
-
'set', 'stop', 'svg', 'switch', 'text', 'title', 'tspan', 'use'
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
html5_tags = html_elements.union(mathml_elements).union(svg_elements)
|
|
38
|
-
|
|
39
|
-
def _makeelement(tag, *args, **kwargs):
|
|
40
|
-
ans = this.createElement(tag)
|
|
41
|
-
|
|
42
|
-
for attr in kwargs:
|
|
43
|
-
vattr = str.replace(str.rstrip(attr, '_'), '_', '-')
|
|
44
|
-
val = kwargs[attr]
|
|
45
|
-
if callable(val):
|
|
46
|
-
if str.startswith(attr, 'on'):
|
|
47
|
-
attr = attr[2:]
|
|
48
|
-
ans.addEventListener(attr, val)
|
|
49
|
-
elif val is True:
|
|
50
|
-
ans.setAttribute(vattr, vattr)
|
|
51
|
-
elif jstype(val) is 'string':
|
|
52
|
-
ans.setAttribute(vattr, val)
|
|
53
|
-
|
|
54
|
-
for arg in args:
|
|
55
|
-
if jstype(arg) is 'string':
|
|
56
|
-
arg = this.createTextNode(arg)
|
|
57
|
-
ans.appendChild(arg)
|
|
58
|
-
return ans
|
|
59
|
-
|
|
60
|
-
def maker_for_document(document):
|
|
61
|
-
# Create an elementmaker to be used with the specified document
|
|
62
|
-
E = _makeelement.bind(document)
|
|
63
|
-
Object.defineProperties(E, {
|
|
64
|
-
tag: {
|
|
65
|
-
'value':_makeelement.bind(document, tag)
|
|
66
|
-
} for tag in html5_tags
|
|
67
|
-
})
|
|
68
|
-
return E
|
|
69
|
-
|
|
70
|
-
if jstype(document) is 'undefined':
|
|
71
|
-
E = maker_for_document({
|
|
72
|
-
'createTextNode': def(value): return value;,
|
|
73
|
-
'createElement': def(name):
|
|
74
|
-
return {
|
|
75
|
-
'name':name,
|
|
76
|
-
'children':[],
|
|
77
|
-
'attributes':{},
|
|
78
|
-
'setAttribute': def(name, val): this.attributes[name] = val;,
|
|
79
|
-
'appendChild': def(child): this.children.push(child);,
|
|
80
|
-
}
|
|
81
|
-
})
|
|
82
|
-
else:
|
|
83
|
-
E = maker_for_document(document)
|
|
1
|
+
# vim:fileencoding=utf-8
|
|
2
|
+
# License: GPL v3 Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>
|
|
3
|
+
|
|
4
|
+
html_elements = {
|
|
5
|
+
'a', 'abbr', 'acronym', 'address', 'area',
|
|
6
|
+
'article', 'aside', 'audio', 'b', 'base', 'big', 'body', 'blockquote', 'br', 'button',
|
|
7
|
+
'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup',
|
|
8
|
+
'command', 'datagrid', 'datalist', 'dd', 'del', 'details', 'dfn',
|
|
9
|
+
'dialog', 'dir', 'div', 'dl', 'dt', 'em', 'event-source', 'fieldset',
|
|
10
|
+
'figcaption', 'figure', 'footer', 'font', 'form', 'header', 'h1',
|
|
11
|
+
'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'head', 'i', 'iframe', 'img', 'input', 'ins',
|
|
12
|
+
'keygen', 'kbd', 'label', 'legend', 'li', 'm', 'map', 'menu', 'meter',
|
|
13
|
+
'multicol', 'nav', 'nextid', 'ol', 'output', 'optgroup', 'option',
|
|
14
|
+
'p', 'pre', 'progress', 'q', 's', 'samp', 'script', 'section', 'select',
|
|
15
|
+
'small', 'sound', 'source', 'spacer', 'span', 'strike', 'strong', 'style',
|
|
16
|
+
'sub', 'sup', 'table', 'tbody', 'td', 'textarea', 'time', 'tfoot',
|
|
17
|
+
'th', 'thead', 'tr', 'tt', 'u', 'ul', 'var', 'video'
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
mathml_elements = {
|
|
21
|
+
'maction', 'math', 'merror', 'mfrac', 'mi',
|
|
22
|
+
'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom',
|
|
23
|
+
'mprescripts', 'mroot', 'mrow', 'mspace', 'msqrt', 'mstyle', 'msub',
|
|
24
|
+
'msubsup', 'msup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder',
|
|
25
|
+
'munderover', 'none'
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
svg_elements = {
|
|
29
|
+
'a', 'animate', 'animateColor', 'animateMotion',
|
|
30
|
+
'animateTransform', 'clipPath', 'circle', 'defs', 'desc', 'ellipse',
|
|
31
|
+
'font-face', 'font-face-name', 'font-face-src', 'g', 'glyph', 'hkern',
|
|
32
|
+
'linearGradient', 'line', 'marker', 'metadata', 'missing-glyph',
|
|
33
|
+
'mpath', 'path', 'polygon', 'polyline', 'radialGradient', 'rect',
|
|
34
|
+
'set', 'stop', 'svg', 'switch', 'text', 'title', 'tspan', 'use'
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
html5_tags = html_elements.union(mathml_elements).union(svg_elements)
|
|
38
|
+
|
|
39
|
+
def _makeelement(tag, *args, **kwargs):
|
|
40
|
+
ans = this.createElement(tag)
|
|
41
|
+
|
|
42
|
+
for attr in kwargs:
|
|
43
|
+
vattr = str.replace(str.rstrip(attr, '_'), '_', '-')
|
|
44
|
+
val = kwargs[attr]
|
|
45
|
+
if callable(val):
|
|
46
|
+
if str.startswith(attr, 'on'):
|
|
47
|
+
attr = attr[2:]
|
|
48
|
+
ans.addEventListener(attr, val)
|
|
49
|
+
elif val is True:
|
|
50
|
+
ans.setAttribute(vattr, vattr)
|
|
51
|
+
elif jstype(val) is 'string':
|
|
52
|
+
ans.setAttribute(vattr, val)
|
|
53
|
+
|
|
54
|
+
for arg in args:
|
|
55
|
+
if jstype(arg) is 'string':
|
|
56
|
+
arg = this.createTextNode(arg)
|
|
57
|
+
ans.appendChild(arg)
|
|
58
|
+
return ans
|
|
59
|
+
|
|
60
|
+
def maker_for_document(document):
|
|
61
|
+
# Create an elementmaker to be used with the specified document
|
|
62
|
+
E = _makeelement.bind(document)
|
|
63
|
+
Object.defineProperties(E, {
|
|
64
|
+
tag: {
|
|
65
|
+
'value':_makeelement.bind(document, tag)
|
|
66
|
+
} for tag in html5_tags
|
|
67
|
+
})
|
|
68
|
+
return E
|
|
69
|
+
|
|
70
|
+
if jstype(document) is 'undefined':
|
|
71
|
+
E = maker_for_document({
|
|
72
|
+
'createTextNode': def(value): return value;,
|
|
73
|
+
'createElement': def(name):
|
|
74
|
+
return {
|
|
75
|
+
'name':name,
|
|
76
|
+
'children':[],
|
|
77
|
+
'attributes':{},
|
|
78
|
+
'setAttribute': def(name, val): this.attributes[name] = val;,
|
|
79
|
+
'appendChild': def(child): this.children.push(child);,
|
|
80
|
+
}
|
|
81
|
+
})
|
|
82
|
+
else:
|
|
83
|
+
E = maker_for_document(document)
|