presently 0.1.0
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.
- checksums.yaml +7 -0
- data/bin/presently +13 -0
- data/lib/presently/application.rb +104 -0
- data/lib/presently/clock.rb +77 -0
- data/lib/presently/display_view.rb +73 -0
- data/lib/presently/environment/application.rb +62 -0
- data/lib/presently/page.rb +38 -0
- data/lib/presently/page.xrb +31 -0
- data/lib/presently/presentation.rb +72 -0
- data/lib/presently/presentation_controller.rb +181 -0
- data/lib/presently/presenter_view.rb +264 -0
- data/lib/presently/slide.rb +148 -0
- data/lib/presently/slide_view.rb +92 -0
- data/lib/presently/state.rb +66 -0
- data/lib/presently/version.rb +9 -0
- data/lib/presently.rb +9 -0
- data/license.md +21 -0
- data/public/_components/@socketry/syntax/Syntax/CodeElement.js +337 -0
- data/public/_components/@socketry/syntax/Syntax/Errors.js +52 -0
- data/public/_components/@socketry/syntax/Syntax/Language/apache.js +49 -0
- data/public/_components/@socketry/syntax/Syntax/Language/applescript.js +157 -0
- data/public/_components/@socketry/syntax/Syntax/Language/assembly.js +42 -0
- data/public/_components/@socketry/syntax/Syntax/Language/bash-script.js +108 -0
- data/public/_components/@socketry/syntax/Syntax/Language/bash.js +32 -0
- data/public/_components/@socketry/syntax/Syntax/Language/basic.js +232 -0
- data/public/_components/@socketry/syntax/Syntax/Language/c++.js +1 -0
- data/public/_components/@socketry/syntax/Syntax/Language/c.js +1 -0
- data/public/_components/@socketry/syntax/Syntax/Language/clang.js +201 -0
- data/public/_components/@socketry/syntax/Syntax/Language/cpp.js +1 -0
- data/public/_components/@socketry/syntax/Syntax/Language/csharp.js +166 -0
- data/public/_components/@socketry/syntax/Syntax/Language/css.js +244 -0
- data/public/_components/@socketry/syntax/Syntax/Language/diff.js +24 -0
- data/public/_components/@socketry/syntax/Syntax/Language/go.js +135 -0
- data/public/_components/@socketry/syntax/Syntax/Language/haskell.js +110 -0
- data/public/_components/@socketry/syntax/Syntax/Language/html.js +69 -0
- data/public/_components/@socketry/syntax/Syntax/Language/io.js +68 -0
- data/public/_components/@socketry/syntax/Syntax/Language/java.js +134 -0
- data/public/_components/@socketry/syntax/Syntax/Language/javascript.js +89 -0
- data/public/_components/@socketry/syntax/Syntax/Language/json.js +36 -0
- data/public/_components/@socketry/syntax/Syntax/Language/lisp.js +38 -0
- data/public/_components/@socketry/syntax/Syntax/Language/lua.js +87 -0
- data/public/_components/@socketry/syntax/Syntax/Language/markdown.js +112 -0
- data/public/_components/@socketry/syntax/Syntax/Language/nginx.js +37 -0
- data/public/_components/@socketry/syntax/Syntax/Language/objective-c.js +1 -0
- data/public/_components/@socketry/syntax/Syntax/Language/ocaml.js +225 -0
- data/public/_components/@socketry/syntax/Syntax/Language/pascal.js +166 -0
- data/public/_components/@socketry/syntax/Syntax/Language/patch.js +2 -0
- data/public/_components/@socketry/syntax/Syntax/Language/perl5.js +317 -0
- data/public/_components/@socketry/syntax/Syntax/Language/php-script.js +112 -0
- data/public/_components/@socketry/syntax/Syntax/Language/php.js +18 -0
- data/public/_components/@socketry/syntax/Syntax/Language/plain.js +20 -0
- data/public/_components/@socketry/syntax/Syntax/Language/protobuf.js +77 -0
- data/public/_components/@socketry/syntax/Syntax/Language/python.js +208 -0
- data/public/_components/@socketry/syntax/Syntax/Language/ruby.js +124 -0
- data/public/_components/@socketry/syntax/Syntax/Language/scala.js +81 -0
- data/public/_components/@socketry/syntax/Syntax/Language/smalltalk.js +30 -0
- data/public/_components/@socketry/syntax/Syntax/Language/sql.js +865 -0
- data/public/_components/@socketry/syntax/Syntax/Language/super-collider.js +70 -0
- data/public/_components/@socketry/syntax/Syntax/Language/swift.js +176 -0
- data/public/_components/@socketry/syntax/Syntax/Language/xml.js +76 -0
- data/public/_components/@socketry/syntax/Syntax/Language/xrb.js +33 -0
- data/public/_components/@socketry/syntax/Syntax/Language/yaml.js +29 -0
- data/public/_components/@socketry/syntax/Syntax/Language.js +276 -0
- data/public/_components/@socketry/syntax/Syntax/Loader.js +78 -0
- data/public/_components/@socketry/syntax/Syntax/Match.js +546 -0
- data/public/_components/@socketry/syntax/Syntax/Rule.js +306 -0
- data/public/_components/@socketry/syntax/Syntax.js +356 -0
- data/public/_components/@socketry/syntax/bin/syntax-ast.js +42 -0
- data/public/_components/@socketry/syntax/examples/_template.html +53 -0
- data/public/_components/@socketry/syntax/examples/apache.html +72 -0
- data/public/_components/@socketry/syntax/examples/applescript.html +72 -0
- data/public/_components/@socketry/syntax/examples/assembly.html +74 -0
- data/public/_components/@socketry/syntax/examples/bash.html +90 -0
- data/public/_components/@socketry/syntax/examples/basic.html +87 -0
- data/public/_components/@socketry/syntax/examples/c.html +141 -0
- data/public/_components/@socketry/syntax/examples/clang.html +202 -0
- data/public/_components/@socketry/syntax/examples/csharp.html +110 -0
- data/public/_components/@socketry/syntax/examples/css-colors.html +179 -0
- data/public/_components/@socketry/syntax/examples/custom-theme.html +155 -0
- data/public/_components/@socketry/syntax/examples/diff.html +142 -0
- data/public/_components/@socketry/syntax/examples/examples.css +216 -0
- data/public/_components/@socketry/syntax/examples/go.html +413 -0
- data/public/_components/@socketry/syntax/examples/haskell.html +373 -0
- data/public/_components/@socketry/syntax/examples/html.html +316 -0
- data/public/_components/@socketry/syntax/examples/index.html +97 -0
- data/public/_components/@socketry/syntax/examples/io.html +552 -0
- data/public/_components/@socketry/syntax/examples/java.html +786 -0
- data/public/_components/@socketry/syntax/examples/javascript.html +199 -0
- data/public/_components/@socketry/syntax/examples/json.html +150 -0
- data/public/_components/@socketry/syntax/examples/lisp.html +476 -0
- data/public/_components/@socketry/syntax/examples/lua.html +737 -0
- data/public/_components/@socketry/syntax/examples/markdown.html +121 -0
- data/public/_components/@socketry/syntax/examples/mixed.html +306 -0
- data/public/_components/@socketry/syntax/examples/nginx.html +554 -0
- data/public/_components/@socketry/syntax/examples/ocaml.html +596 -0
- data/public/_components/@socketry/syntax/examples/pascal.html +762 -0
- data/public/_components/@socketry/syntax/examples/perl5.html +488 -0
- data/public/_components/@socketry/syntax/examples/php-script.html +142 -0
- data/public/_components/@socketry/syntax/examples/php.html +95 -0
- data/public/_components/@socketry/syntax/examples/plain.html +222 -0
- data/public/_components/@socketry/syntax/examples/protobuf.html +405 -0
- data/public/_components/@socketry/syntax/examples/python.html +82 -0
- data/public/_components/@socketry/syntax/examples/readme.md +79 -0
- data/public/_components/@socketry/syntax/examples/ruby.html +58 -0
- data/public/_components/@socketry/syntax/examples/scala.html +41 -0
- data/public/_components/@socketry/syntax/examples/smalltalk.html +436 -0
- data/public/_components/@socketry/syntax/examples/sql.html +373 -0
- data/public/_components/@socketry/syntax/examples/super-collider.html +55 -0
- data/public/_components/@socketry/syntax/examples/swift.html +176 -0
- data/public/_components/@socketry/syntax/examples/wrap-demo.html +103 -0
- data/public/_components/@socketry/syntax/examples/xml.html +112 -0
- data/public/_components/@socketry/syntax/examples/xrb.html +37 -0
- data/public/_components/@socketry/syntax/examples/yaml.html +72 -0
- data/public/_components/@socketry/syntax/license.md +21 -0
- data/public/_components/@socketry/syntax/package-lock.json +834 -0
- data/public/_components/@socketry/syntax/package.json +43 -0
- data/public/_components/@socketry/syntax/readme.md +162 -0
- data/public/_components/@socketry/syntax/test/Syntax/CodeElement.js +306 -0
- data/public/_components/@socketry/syntax/test/Syntax/ErrorHandling.js +85 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/apache.js +153 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/applescript.js +198 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/assembly.js +209 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/bash-script.js +225 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/bash.js +162 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/basic.js +265 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/clang.js +390 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/csharp.js +436 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/css.js +431 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/diff.js +206 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/go.js +386 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/haskell.js +454 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/html.js +111 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/io.js +229 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/java.js +362 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/javascript.js +101 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/json.js +101 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/lisp.js +224 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/lua.js +307 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/markdown.js +163 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/nginx.js +267 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/ocaml.js +299 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/pascal.js +311 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/perl5.js +333 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/php-script.js +197 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/php.js +92 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/plain.js +327 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/protobuf.js +294 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/python.js +213 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/ruby.js +70 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/scala.js +75 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/smalltalk.js +223 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/sql.js +281 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/super-collider.js +66 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/swift.js +71 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/xml.js +170 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/xrb.js +57 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language/yaml.js +123 -0
- data/public/_components/@socketry/syntax/test/Syntax/Language.js +62 -0
- data/public/_components/@socketry/syntax/test/Syntax/Match.js +40 -0
- data/public/_components/@socketry/syntax/test/Syntax/Rule.js +251 -0
- data/public/_components/@socketry/syntax/test/Syntax.js +38 -0
- data/public/_components/@socketry/syntax/test/helpers/ast-matcher.js +90 -0
- data/public/_components/@socketry/syntax/themes/base/apache.css +1 -0
- data/public/_components/@socketry/syntax/themes/base/applescript.css +1 -0
- data/public/_components/@socketry/syntax/themes/base/assembly.css +1 -0
- data/public/_components/@socketry/syntax/themes/base/bash.css +1 -0
- data/public/_components/@socketry/syntax/themes/base/basic.css +1 -0
- data/public/_components/@socketry/syntax/themes/base/c.css +1 -0
- data/public/_components/@socketry/syntax/themes/base/clang.css +0 -0
- data/public/_components/@socketry/syntax/themes/base/csharp.css +1 -0
- data/public/_components/@socketry/syntax/themes/base/css.css +22 -0
- data/public/_components/@socketry/syntax/themes/base/diff.css +48 -0
- data/public/_components/@socketry/syntax/themes/base/go.css +1 -0
- data/public/_components/@socketry/syntax/themes/base/haskell.css +1 -0
- data/public/_components/@socketry/syntax/themes/base/html.css +1 -0
- data/public/_components/@socketry/syntax/themes/base/io.css +1 -0
- data/public/_components/@socketry/syntax/themes/base/java.css +1 -0
- data/public/_components/@socketry/syntax/themes/base/javascript.css +1 -0
- data/public/_components/@socketry/syntax/themes/base/json.css +41 -0
- data/public/_components/@socketry/syntax/themes/base/lisp.css +1 -0
- data/public/_components/@socketry/syntax/themes/base/lua.css +1 -0
- data/public/_components/@socketry/syntax/themes/base/markdown.css +16 -0
- data/public/_components/@socketry/syntax/themes/base/nginx.css +1 -0
- data/public/_components/@socketry/syntax/themes/base/ocaml.css +1 -0
- data/public/_components/@socketry/syntax/themes/base/pascal.css +1 -0
- data/public/_components/@socketry/syntax/themes/base/perl5.css +1 -0
- data/public/_components/@socketry/syntax/themes/base/php-script.css +1 -0
- data/public/_components/@socketry/syntax/themes/base/php.css +1 -0
- data/public/_components/@socketry/syntax/themes/base/plain.css +1 -0
- data/public/_components/@socketry/syntax/themes/base/protobuf.css +1 -0
- data/public/_components/@socketry/syntax/themes/base/python.css +1 -0
- data/public/_components/@socketry/syntax/themes/base/ruby.css +23 -0
- data/public/_components/@socketry/syntax/themes/base/scala.css +3 -0
- data/public/_components/@socketry/syntax/themes/base/smalltalk.css +1 -0
- data/public/_components/@socketry/syntax/themes/base/sql.css +1 -0
- data/public/_components/@socketry/syntax/themes/base/super-collider.css +33 -0
- data/public/_components/@socketry/syntax/themes/base/swift.css +1 -0
- data/public/_components/@socketry/syntax/themes/base/syntax.css +63 -0
- data/public/_components/@socketry/syntax/themes/base/xml.css +1 -0
- data/public/_components/@socketry/syntax/themes/base/xrb.css +29 -0
- data/public/_components/@socketry/syntax/themes/base/yaml.css +1 -0
- data/public/_components/@socketry/syntax/themes/theming.md +233 -0
- data/public/_components/@socketry/syntax/update-examples.js +135 -0
- data/public/_static/index.css +593 -0
- data/public/application.js +147 -0
- data/readme.md +69 -0
- data/releases.md +3 -0
- data/templates/code.xrb +12 -0
- data/templates/default.xrb +5 -0
- data/templates/image.xrb +8 -0
- data/templates/section.xrb +5 -0
- data/templates/title.xrb +8 -0
- data/templates/translation.xrb +8 -0
- data/templates/two_column.xrb +8 -0
- metadata +280 -0
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for Python language definition
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import {test} from 'node:test';
|
|
6
|
+
import assert from 'node:assert';
|
|
7
|
+
import {JSDOM} from 'jsdom';
|
|
8
|
+
|
|
9
|
+
// Setup DOM environment
|
|
10
|
+
const dom = new JSDOM('<!DOCTYPE html><html><body></body></html>');
|
|
11
|
+
global.document = dom.window.document;
|
|
12
|
+
|
|
13
|
+
import Syntax from '../../../Syntax.js';
|
|
14
|
+
import registerPython from '../../../Syntax/Language/python.js';
|
|
15
|
+
import {
|
|
16
|
+
assertToken,
|
|
17
|
+
assertTokenType,
|
|
18
|
+
assertTokenCount,
|
|
19
|
+
getMatchText
|
|
20
|
+
} from '../../helpers/ast-matcher.js';
|
|
21
|
+
|
|
22
|
+
test('Python language can be registered', async () => {
|
|
23
|
+
const syntax = new Syntax();
|
|
24
|
+
registerPython(syntax);
|
|
25
|
+
const language = await syntax.getLanguage('python');
|
|
26
|
+
assert.ok(language);
|
|
27
|
+
assert.strictEqual(language.name, 'python');
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
test('Python can match keywords', async () => {
|
|
31
|
+
const syntax = new Syntax();
|
|
32
|
+
registerPython(syntax);
|
|
33
|
+
const language = await syntax.getLanguage('python');
|
|
34
|
+
|
|
35
|
+
const code = 'def foo():\n return True';
|
|
36
|
+
const matches = await language.getMatches(syntax, code);
|
|
37
|
+
|
|
38
|
+
assertToken(code, matches, 'keyword', 'def');
|
|
39
|
+
assertToken(code, matches, 'keyword', 'return');
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test('Python can match builtin functions', async () => {
|
|
43
|
+
const syntax = new Syntax();
|
|
44
|
+
registerPython(syntax);
|
|
45
|
+
const language = await syntax.getLanguage('python');
|
|
46
|
+
|
|
47
|
+
const code = 'len(list)';
|
|
48
|
+
const matches = await language.getMatches(syntax, code);
|
|
49
|
+
|
|
50
|
+
assertToken(code, matches, 'builtin', 'len');
|
|
51
|
+
assertToken(code, matches, 'builtin', 'list');
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test('Python can match decorators', async () => {
|
|
55
|
+
const syntax = new Syntax();
|
|
56
|
+
registerPython(syntax);
|
|
57
|
+
const language = await syntax.getLanguage('python');
|
|
58
|
+
|
|
59
|
+
const code = '@property\ndef foo(self):\n pass';
|
|
60
|
+
const matches = await language.getMatches(syntax, code);
|
|
61
|
+
|
|
62
|
+
assertToken(code, matches, 'decorator', '@property');
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
test('Python can match constants', async () => {
|
|
66
|
+
const syntax = new Syntax();
|
|
67
|
+
registerPython(syntax);
|
|
68
|
+
const language = await syntax.getLanguage('python');
|
|
69
|
+
|
|
70
|
+
const code = 'x = True\ny = False\nz = None\nself.value = 42';
|
|
71
|
+
const matches = await language.getMatches(syntax, code);
|
|
72
|
+
|
|
73
|
+
assertToken(code, matches, 'constant', 'True');
|
|
74
|
+
assertToken(code, matches, 'constant', 'False');
|
|
75
|
+
assertToken(code, matches, 'constant', 'None');
|
|
76
|
+
assertToken(code, matches, 'constant', 'self');
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test('Python can match single-quoted strings', async () => {
|
|
80
|
+
const syntax = new Syntax();
|
|
81
|
+
registerPython(syntax);
|
|
82
|
+
const language = await syntax.getLanguage('python');
|
|
83
|
+
|
|
84
|
+
const code = "s = 'hello world'";
|
|
85
|
+
const matches = await language.getMatches(syntax, code);
|
|
86
|
+
|
|
87
|
+
assertToken(code, matches, 'string', "'hello world'");
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test('Python can match double-quoted strings', async () => {
|
|
91
|
+
const syntax = new Syntax();
|
|
92
|
+
registerPython(syntax);
|
|
93
|
+
const language = await syntax.getLanguage('python');
|
|
94
|
+
|
|
95
|
+
const code = 's = "hello world"';
|
|
96
|
+
const matches = await language.getMatches(syntax, code);
|
|
97
|
+
|
|
98
|
+
assertToken(code, matches, 'string', '"hello world"');
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
test('Python can match triple-quoted strings (docstrings)', async () => {
|
|
102
|
+
const syntax = new Syntax();
|
|
103
|
+
registerPython(syntax);
|
|
104
|
+
const language = await syntax.getLanguage('python');
|
|
105
|
+
|
|
106
|
+
const code = '"""This is a docstring"""';
|
|
107
|
+
const matches = await language.getMatches(syntax, code);
|
|
108
|
+
|
|
109
|
+
assertToken(code, matches, 'comment', '"""This is a docstring"""');
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
test('Python can match hash comments', async () => {
|
|
113
|
+
const syntax = new Syntax();
|
|
114
|
+
registerPython(syntax);
|
|
115
|
+
const language = await syntax.getLanguage('python');
|
|
116
|
+
|
|
117
|
+
const code = '# This is a comment\nx = 1';
|
|
118
|
+
const matches = await language.getMatches(syntax, code);
|
|
119
|
+
|
|
120
|
+
const commentMatch = assertTokenType(matches, 'comment');
|
|
121
|
+
const text = getMatchText(code, commentMatch);
|
|
122
|
+
assert.ok(text.startsWith('#'));
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
test('Python can match operators', async () => {
|
|
126
|
+
const syntax = new Syntax();
|
|
127
|
+
registerPython(syntax);
|
|
128
|
+
const language = await syntax.getLanguage('python');
|
|
129
|
+
|
|
130
|
+
const code = 'x += y * 2';
|
|
131
|
+
const matches = await language.getMatches(syntax, code);
|
|
132
|
+
|
|
133
|
+
assertTokenCount(matches, 'operator', 2); // At least += and *
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
test('Python can match numbers', async () => {
|
|
137
|
+
const syntax = new Syntax();
|
|
138
|
+
registerPython(syntax);
|
|
139
|
+
const language = await syntax.getLanguage('python');
|
|
140
|
+
|
|
141
|
+
const code = 'x = 42\ny = 3.14\nz = 0xFF';
|
|
142
|
+
const matches = await language.getMatches(syntax, code);
|
|
143
|
+
|
|
144
|
+
const constants = assertTokenCount(matches, 'constant', 3);
|
|
145
|
+
const texts = constants.map(m => getMatchText(code, m));
|
|
146
|
+
assert.ok(texts.includes('42'));
|
|
147
|
+
assert.ok(texts.includes('3.14'));
|
|
148
|
+
assert.ok(texts.includes('0xFF'));
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
test('Python can match CamelCase class names', async () => {
|
|
152
|
+
const syntax = new Syntax();
|
|
153
|
+
registerPython(syntax);
|
|
154
|
+
const language = await syntax.getLanguage('python');
|
|
155
|
+
|
|
156
|
+
const code = 'class MyClass:\n pass';
|
|
157
|
+
const matches = await language.getMatches(syntax, code);
|
|
158
|
+
|
|
159
|
+
assertToken(code, matches, 'type', 'MyClass');
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
test('Python can match function calls', async () => {
|
|
163
|
+
const syntax = new Syntax();
|
|
164
|
+
registerPython(syntax);
|
|
165
|
+
const language = await syntax.getLanguage('python');
|
|
166
|
+
|
|
167
|
+
const code = 'result = my_function(arg)';
|
|
168
|
+
const matches = await language.getMatches(syntax, code);
|
|
169
|
+
|
|
170
|
+
assertToken(code, matches, 'function', 'my_function');
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
test('Python can process code to HTML', async () => {
|
|
174
|
+
const syntax = new Syntax();
|
|
175
|
+
registerPython(syntax);
|
|
176
|
+
const language = await syntax.getLanguage('python');
|
|
177
|
+
|
|
178
|
+
const code = 'def foo():\n return True';
|
|
179
|
+
const html = await language.process(syntax, code);
|
|
180
|
+
|
|
181
|
+
assert.ok(html.innerHTML.includes('keyword'));
|
|
182
|
+
assert.ok(html.innerHTML.includes('def'));
|
|
183
|
+
assert.ok(html.innerHTML.includes('return'));
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
test('Python can build a syntax tree', async () => {
|
|
187
|
+
const syntax = new Syntax();
|
|
188
|
+
registerPython(syntax);
|
|
189
|
+
const language = await syntax.getLanguage('python');
|
|
190
|
+
|
|
191
|
+
const code = 'x = 42';
|
|
192
|
+
const tree = await language.buildTree(syntax, code, 0);
|
|
193
|
+
|
|
194
|
+
assert.ok(tree);
|
|
195
|
+
assert.strictEqual(tree.offset, 0);
|
|
196
|
+
assert.strictEqual(tree.length, code.length);
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
test('Python creates documentation links for functions', async () => {
|
|
200
|
+
const syntax = new Syntax();
|
|
201
|
+
registerPython(syntax);
|
|
202
|
+
const language = await syntax.getLanguage('python');
|
|
203
|
+
|
|
204
|
+
const code = 'len(list)';
|
|
205
|
+
const html = await language.process(syntax, code);
|
|
206
|
+
|
|
207
|
+
// Should have links to Python documentation
|
|
208
|
+
const links = html.querySelectorAll('a.builtin');
|
|
209
|
+
assert.strictEqual(links.length, 2);
|
|
210
|
+
assert.ok(links[0].href.includes('docs.python.org'));
|
|
211
|
+
assert.ok(links[0].href.includes('len'));
|
|
212
|
+
assert.strictEqual(links[0].textContent, 'len');
|
|
213
|
+
});
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import Syntax from '../../../Syntax.js';
|
|
2
|
+
import registerRuby from '../../../Syntax/Language/ruby.js';
|
|
3
|
+
import {strictEqual} from 'node:assert';
|
|
4
|
+
import test from 'node:test';
|
|
5
|
+
|
|
6
|
+
async function getTypesFor(code) {
|
|
7
|
+
const syntax = new Syntax();
|
|
8
|
+
registerRuby(syntax);
|
|
9
|
+
const language = await syntax.getLanguage('ruby');
|
|
10
|
+
const matches = await language.getMatches(syntax, code);
|
|
11
|
+
return matches.map(m => m.expression.type);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
test('Ruby: keywords highlighted', async () => {
|
|
15
|
+
const types = await getTypesFor('def method\nend');
|
|
16
|
+
strictEqual(types.includes('keyword'), true);
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
test('Ruby: values/constants', async () => {
|
|
20
|
+
const types = await getTypesFor('self true false nil super');
|
|
21
|
+
strictEqual(types.filter(t => t === 'constant').length >= 3, true);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test('Ruby: access modifiers', async () => {
|
|
25
|
+
const types = await getTypesFor('private\nprotected\npublic');
|
|
26
|
+
strictEqual(types.includes('access'), true);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test('Ruby: variables', async () => {
|
|
30
|
+
const types = await getTypesFor('@@class_var @instance $global');
|
|
31
|
+
strictEqual(types.includes('variable'), true);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test('Ruby: operators', async () => {
|
|
35
|
+
const types = await getTypesFor('a + b - c * d / e');
|
|
36
|
+
strictEqual(types.includes('operator'), true);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test('Ruby: strings', async () => {
|
|
40
|
+
const types = await getTypesFor('\'single\' "double"');
|
|
41
|
+
strictEqual(types.filter(t => t === 'string').length >= 2, true);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test('Ruby: numbers', async () => {
|
|
45
|
+
const types = await getTypesFor('0xFF 123 3.14');
|
|
46
|
+
strictEqual(types.filter(t => t === 'constant').length >= 2, true);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
test('Ruby: comments and links', async () => {
|
|
50
|
+
const types = await getTypesFor('# comment http://example.com');
|
|
51
|
+
strictEqual(types.includes('comment'), true);
|
|
52
|
+
strictEqual(types.includes('href'), true);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test('Ruby: regex literal', async () => {
|
|
56
|
+
const types = await getTypesFor('/foo.+bar/i');
|
|
57
|
+
strictEqual(types.includes('constant'), true);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
test('Ruby: symbols', async () => {
|
|
61
|
+
const types1 = await getTypesFor(':symbol');
|
|
62
|
+
strictEqual(types1.includes('constant'), true);
|
|
63
|
+
const types2 = await getTypesFor('::symbol');
|
|
64
|
+
strictEqual(types2.includes('constant'), false);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test('Ruby: function detection', async () => {
|
|
68
|
+
const types = await getTypesFor('def compute\nend\nobject.method');
|
|
69
|
+
strictEqual(types.includes('function'), true);
|
|
70
|
+
});
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import Syntax from '../../../Syntax.js';
|
|
2
|
+
import registerScala from '../../../Syntax/Language/scala.js';
|
|
3
|
+
import registerXML from '../../../Syntax/Language/xml.js';
|
|
4
|
+
import {strictEqual, ok} from 'node:assert';
|
|
5
|
+
import test from 'node:test';
|
|
6
|
+
|
|
7
|
+
async function getLanguage() {
|
|
8
|
+
const syntax = new Syntax();
|
|
9
|
+
registerXML(syntax);
|
|
10
|
+
registerScala(syntax);
|
|
11
|
+
return await syntax.getLanguage('scala');
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function typesFrom(matches) {
|
|
15
|
+
return matches.map(m => m.expression.type);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
test('Scala: keywords highlighted', async () => {
|
|
19
|
+
const language = await getLanguage();
|
|
20
|
+
const code =
|
|
21
|
+
'object App extends App { def run(): Unit = if (true) return else for (x <- xs) yield x }';
|
|
22
|
+
const matches = await language.getMatches(Syntax.default, code);
|
|
23
|
+
const types = typesFrom(matches);
|
|
24
|
+
ok(types.includes('keyword'));
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test('Scala: operators highlighted', async () => {
|
|
28
|
+
const language = await getLanguage();
|
|
29
|
+
const code = 'xs.map(x => x: Int) @annot #hash';
|
|
30
|
+
const matches = await language.getMatches(Syntax.default, code);
|
|
31
|
+
const operators = matches.filter(m => m.expression.type === 'operator');
|
|
32
|
+
ok(operators.length > 0);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test('Scala: constants highlighted', async () => {
|
|
36
|
+
const language = await getLanguage();
|
|
37
|
+
const code = 'this == null || true && !false';
|
|
38
|
+
const matches = await language.getMatches(Syntax.default, code);
|
|
39
|
+
const constants = matches.filter(m => m.expression.type === 'constant');
|
|
40
|
+
ok(constants.length >= 3);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
test('Scala: triple and double quoted strings', async () => {
|
|
44
|
+
const language = await getLanguage();
|
|
45
|
+
const code = 'val a = "hello"; val b = """multi\nline"""';
|
|
46
|
+
const matches = await language.getMatches(Syntax.default, code);
|
|
47
|
+
const strings = matches.filter(m => m.expression.type === 'string');
|
|
48
|
+
ok(strings.length >= 2);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test('Scala: function names', async () => {
|
|
52
|
+
const language = await getLanguage();
|
|
53
|
+
const code = 'def compute(x: Int) = x + 1; value.toString';
|
|
54
|
+
const matches = await language.getMatches(Syntax.default, code);
|
|
55
|
+
const functions = matches.filter(m => m.expression.type === 'function');
|
|
56
|
+
ok(functions.length >= 2);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test('Scala: types and c-style function calls', async () => {
|
|
60
|
+
const language = await getLanguage();
|
|
61
|
+
const code = 'val x: MyType = MyType(1)';
|
|
62
|
+
const matches = await language.getMatches(Syntax.default, code);
|
|
63
|
+
const types = matches.filter(m => m.expression.type === 'type');
|
|
64
|
+
const functions = matches.filter(m => m.expression.type === 'function');
|
|
65
|
+
ok(types.length >= 1);
|
|
66
|
+
ok(functions.length >= 1);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
test('Scala: comments', async () => {
|
|
70
|
+
const language = await getLanguage();
|
|
71
|
+
const code = '/* block */ // line';
|
|
72
|
+
const matches = await language.getMatches(Syntax.default, code);
|
|
73
|
+
const comments = matches.filter(m => m.expression.type === 'comment');
|
|
74
|
+
ok(comments.length >= 2);
|
|
75
|
+
});
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for Smalltalk language syntax highlighting
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import {test} from 'node:test';
|
|
6
|
+
import assert from 'node:assert/strict';
|
|
7
|
+
import {JSDOM} from 'jsdom';
|
|
8
|
+
import Syntax from '../../../Syntax.js';
|
|
9
|
+
|
|
10
|
+
const dom = new JSDOM('<!DOCTYPE html><html><body></body></html>');
|
|
11
|
+
global.window = dom.window;
|
|
12
|
+
global.document = dom.window.document;
|
|
13
|
+
global.HTMLElement = dom.window.HTMLElement;
|
|
14
|
+
global.customElements = dom.window.customElements;
|
|
15
|
+
|
|
16
|
+
const syntax = new Syntax();
|
|
17
|
+
|
|
18
|
+
test('Smalltalk language can be registered', async () => {
|
|
19
|
+
const language = await syntax.getResource('smalltalk');
|
|
20
|
+
assert.ok(language);
|
|
21
|
+
assert.equal(language.name, 'smalltalk');
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test('Smalltalk can match self keyword', async () => {
|
|
25
|
+
const language = await syntax.getResource('smalltalk');
|
|
26
|
+
const matches = await language.getMatches(syntax, 'self doSomething');
|
|
27
|
+
const constants = matches.filter(m => m.type === 'constant');
|
|
28
|
+
assert.ok(constants.some(m => m.value === 'self'));
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test('Smalltalk can match super keyword', async () => {
|
|
32
|
+
const language = await syntax.getResource('smalltalk');
|
|
33
|
+
const matches = await language.getMatches(syntax, 'super initialize');
|
|
34
|
+
const constants = matches.filter(m => m.type === 'constant');
|
|
35
|
+
assert.ok(constants.some(m => m.value === 'super'));
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test('Smalltalk can match true and false', async () => {
|
|
39
|
+
const language = await syntax.getResource('smalltalk');
|
|
40
|
+
const matches = await language.getMatches(syntax, 'true & false');
|
|
41
|
+
const constants = matches.filter(m => m.type === 'constant');
|
|
42
|
+
assert.ok(constants.some(m => m.value === 'true'));
|
|
43
|
+
assert.ok(constants.some(m => m.value === 'false'));
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
test('Smalltalk can match nil keyword', async () => {
|
|
47
|
+
const language = await syntax.getResource('smalltalk');
|
|
48
|
+
const matches = await language.getMatches(syntax, 'x := nil');
|
|
49
|
+
const constants = matches.filter(m => m.type === 'constant');
|
|
50
|
+
assert.ok(constants.some(m => m.value === 'nil'));
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test('Smalltalk can match bracket operators', async () => {
|
|
54
|
+
const language = await syntax.getResource('smalltalk');
|
|
55
|
+
const matches = await language.getMatches(syntax, '[x + 1]');
|
|
56
|
+
const operators = matches.filter(m => m.type === 'operator');
|
|
57
|
+
assert.ok(operators.some(m => m.value === '['));
|
|
58
|
+
assert.ok(operators.some(m => m.value === ']'));
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test('Smalltalk can match pipe operator', async () => {
|
|
62
|
+
const language = await syntax.getResource('smalltalk');
|
|
63
|
+
const matches = await language.getMatches(syntax, '| temp |');
|
|
64
|
+
const operators = matches.filter(m => m.type === 'operator');
|
|
65
|
+
assert.ok(operators.some(m => m.value === '|'));
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test('Smalltalk can match assignment operator', async () => {
|
|
69
|
+
const language = await syntax.getResource('smalltalk');
|
|
70
|
+
const matches = await language.getMatches(syntax, 'x := 42');
|
|
71
|
+
const operators = matches.filter(m => m.type === 'operator');
|
|
72
|
+
assert.ok(operators.some(m => m.value === ':='));
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
test('Smalltalk can match statement separator', async () => {
|
|
76
|
+
const language = await syntax.getResource('smalltalk');
|
|
77
|
+
const matches = await language.getMatches(syntax, 'x := 1. y := 2');
|
|
78
|
+
const operators = matches.filter(m => m.type === 'operator');
|
|
79
|
+
assert.ok(operators.some(m => m.value === '.'));
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
test('Smalltalk can match unary message selectors', async () => {
|
|
83
|
+
const language = await syntax.getResource('smalltalk');
|
|
84
|
+
const matches = await language.getMatches(syntax, 'self initialize');
|
|
85
|
+
// Unary messages are just identifiers, not highlighted specially
|
|
86
|
+
assert.ok(matches.length > 0);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
test('Smalltalk can match keyword message selectors', async () => {
|
|
90
|
+
const language = await syntax.getResource('smalltalk');
|
|
91
|
+
const matches = await language.getMatches(syntax, 'object at: key put: value');
|
|
92
|
+
const functions = matches.filter(m => m.type === 'function');
|
|
93
|
+
assert.ok(functions.some(m => m.value === 'at:'));
|
|
94
|
+
assert.ok(functions.some(m => m.value === 'put:'));
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
test('Smalltalk can match method definition selectors', async () => {
|
|
98
|
+
const language = await syntax.getResource('smalltalk');
|
|
99
|
+
const matches = await language.getMatches(syntax, 'setName: aName age: anAge');
|
|
100
|
+
const functions = matches.filter(m => m.type === 'function');
|
|
101
|
+
assert.ok(functions.some(m => m.value === 'setName:'));
|
|
102
|
+
assert.ok(functions.some(m => m.value === 'age:'));
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
test('Smalltalk can match CamelCase types', async () => {
|
|
106
|
+
const language = await syntax.getResource('smalltalk');
|
|
107
|
+
const matches = await language.getMatches(syntax, 'OrderedCollection new');
|
|
108
|
+
const types = matches.filter(m => m.type === 'type');
|
|
109
|
+
assert.ok(types.some(m => m.value === 'OrderedCollection'));
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
test('Smalltalk can match class names', async () => {
|
|
113
|
+
const language = await syntax.getResource('smalltalk');
|
|
114
|
+
const matches = await language.getMatches(syntax, 'Array with: String');
|
|
115
|
+
const types = matches.filter(m => m.type === 'type');
|
|
116
|
+
assert.ok(types.some(m => m.value === 'Array'));
|
|
117
|
+
assert.ok(types.some(m => m.value === 'String'));
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
test('Smalltalk can match single-quoted strings', async () => {
|
|
121
|
+
const language = await syntax.getResource('smalltalk');
|
|
122
|
+
const matches = await language.getMatches(syntax, "'Hello, World!'");
|
|
123
|
+
const strings = matches.filter(m => m.type === 'string');
|
|
124
|
+
assert.ok(strings.some(m => m.value === "'Hello, World!'"));
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
test('Smalltalk can match strings with escaped quotes', async () => {
|
|
128
|
+
const language = await syntax.getResource('smalltalk');
|
|
129
|
+
const matches = await language.getMatches(syntax, "'It''s a test'");
|
|
130
|
+
const strings = matches.filter(m => m.type === 'string');
|
|
131
|
+
// In Smalltalk, two single quotes represent an escaped quote
|
|
132
|
+
assert.ok(strings.length > 0);
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
test('Smalltalk can match decimal numbers', async () => {
|
|
136
|
+
const language = await syntax.getResource('smalltalk');
|
|
137
|
+
const matches = await language.getMatches(syntax, 'x := 42');
|
|
138
|
+
const numbers = matches.filter(m => m.type === 'constant');
|
|
139
|
+
assert.ok(numbers.some(m => m.value === '42'));
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
test('Smalltalk can match floating point numbers', async () => {
|
|
143
|
+
const language = await syntax.getResource('smalltalk');
|
|
144
|
+
const matches = await language.getMatches(syntax, 'pi := 3.14159');
|
|
145
|
+
const numbers = matches.filter(m => m.type === 'constant');
|
|
146
|
+
assert.ok(numbers.some(m => m.value === '3.14159'));
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
test('Smalltalk can match hexadecimal numbers', async () => {
|
|
150
|
+
const language = await syntax.getResource('smalltalk');
|
|
151
|
+
const matches = await language.getMatches(syntax, 'color := 0xFF');
|
|
152
|
+
const numbers = matches.filter(m => m.type === 'constant');
|
|
153
|
+
assert.ok(numbers.some(m => m.value === '0xFF'));
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
test('Smalltalk can match blocks', async () => {
|
|
157
|
+
const language = await syntax.getResource('smalltalk');
|
|
158
|
+
const matches = await language.getMatches(syntax, '[x + 1] value');
|
|
159
|
+
const operators = matches.filter(m => m.type === 'operator');
|
|
160
|
+
assert.ok(operators.some(m => m.value === '['));
|
|
161
|
+
assert.ok(operators.some(m => m.value === ']'));
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
test('Smalltalk can match temporary variable declarations', async () => {
|
|
165
|
+
const language = await syntax.getResource('smalltalk');
|
|
166
|
+
const matches = await language.getMatches(syntax, '| temp1 temp2 |');
|
|
167
|
+
const operators = matches.filter(m => m.type === 'operator');
|
|
168
|
+
const pipes = operators.filter(m => m.value === '|');
|
|
169
|
+
assert.equal(pipes.length, 2);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
test('Smalltalk can process method definition', async () => {
|
|
173
|
+
const language = await syntax.getResource('smalltalk');
|
|
174
|
+
const code = `initialize
|
|
175
|
+
super initialize.
|
|
176
|
+
collection := OrderedCollection new`;
|
|
177
|
+
const matches = await language.getMatches(syntax, code);
|
|
178
|
+
assert.ok(matches.length > 0);
|
|
179
|
+
|
|
180
|
+
const constants = matches.filter(m => m.type === 'constant');
|
|
181
|
+
assert.ok(constants.some(m => m.value === 'super'));
|
|
182
|
+
|
|
183
|
+
const types = matches.filter(m => m.type === 'type');
|
|
184
|
+
assert.ok(types.some(m => m.value === 'OrderedCollection'));
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
test('Smalltalk can process cascade messages', async () => {
|
|
188
|
+
const language = await syntax.getResource('smalltalk');
|
|
189
|
+
const code = `stream
|
|
190
|
+
nextPutAll: 'Hello';
|
|
191
|
+
space;
|
|
192
|
+
nextPutAll: 'World'`;
|
|
193
|
+
const matches = await language.getMatches(syntax, code);
|
|
194
|
+
|
|
195
|
+
const functions = matches.filter(m => m.type === 'function');
|
|
196
|
+
assert.ok(functions.some(m => m.value === 'nextPutAll:'));
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
test('Smalltalk can process complete class method', async () => {
|
|
200
|
+
const language = await syntax.getResource('smalltalk');
|
|
201
|
+
const code = `factorial: n
|
|
202
|
+
| result |
|
|
203
|
+
result := 1.
|
|
204
|
+
n > 1 ifTrue: [
|
|
205
|
+
result := n * (self factorial: n - 1)
|
|
206
|
+
].
|
|
207
|
+
^ result`;
|
|
208
|
+
const matches = await language.getMatches(syntax, code);
|
|
209
|
+
assert.ok(matches.length > 0);
|
|
210
|
+
|
|
211
|
+
const operators = matches.filter(m => m.type === 'operator');
|
|
212
|
+
assert.ok(operators.some(m => m.value === '|'));
|
|
213
|
+
assert.ok(operators.some(m => m.value === ':='));
|
|
214
|
+
assert.ok(operators.some(m => m.value === '['));
|
|
215
|
+
assert.ok(operators.some(m => m.value === ']'));
|
|
216
|
+
|
|
217
|
+
const constants = matches.filter(m => m.type === 'constant');
|
|
218
|
+
assert.ok(constants.some(m => m.value === 'self'));
|
|
219
|
+
|
|
220
|
+
const functions = matches.filter(m => m.type === 'function');
|
|
221
|
+
assert.ok(functions.some(m => m.value === 'factorial:'));
|
|
222
|
+
assert.ok(functions.some(m => m.value === 'ifTrue:'));
|
|
223
|
+
});
|