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.
Files changed (215) hide show
  1. checksums.yaml +7 -0
  2. data/bin/presently +13 -0
  3. data/lib/presently/application.rb +104 -0
  4. data/lib/presently/clock.rb +77 -0
  5. data/lib/presently/display_view.rb +73 -0
  6. data/lib/presently/environment/application.rb +62 -0
  7. data/lib/presently/page.rb +38 -0
  8. data/lib/presently/page.xrb +31 -0
  9. data/lib/presently/presentation.rb +72 -0
  10. data/lib/presently/presentation_controller.rb +181 -0
  11. data/lib/presently/presenter_view.rb +264 -0
  12. data/lib/presently/slide.rb +148 -0
  13. data/lib/presently/slide_view.rb +92 -0
  14. data/lib/presently/state.rb +66 -0
  15. data/lib/presently/version.rb +9 -0
  16. data/lib/presently.rb +9 -0
  17. data/license.md +21 -0
  18. data/public/_components/@socketry/syntax/Syntax/CodeElement.js +337 -0
  19. data/public/_components/@socketry/syntax/Syntax/Errors.js +52 -0
  20. data/public/_components/@socketry/syntax/Syntax/Language/apache.js +49 -0
  21. data/public/_components/@socketry/syntax/Syntax/Language/applescript.js +157 -0
  22. data/public/_components/@socketry/syntax/Syntax/Language/assembly.js +42 -0
  23. data/public/_components/@socketry/syntax/Syntax/Language/bash-script.js +108 -0
  24. data/public/_components/@socketry/syntax/Syntax/Language/bash.js +32 -0
  25. data/public/_components/@socketry/syntax/Syntax/Language/basic.js +232 -0
  26. data/public/_components/@socketry/syntax/Syntax/Language/c++.js +1 -0
  27. data/public/_components/@socketry/syntax/Syntax/Language/c.js +1 -0
  28. data/public/_components/@socketry/syntax/Syntax/Language/clang.js +201 -0
  29. data/public/_components/@socketry/syntax/Syntax/Language/cpp.js +1 -0
  30. data/public/_components/@socketry/syntax/Syntax/Language/csharp.js +166 -0
  31. data/public/_components/@socketry/syntax/Syntax/Language/css.js +244 -0
  32. data/public/_components/@socketry/syntax/Syntax/Language/diff.js +24 -0
  33. data/public/_components/@socketry/syntax/Syntax/Language/go.js +135 -0
  34. data/public/_components/@socketry/syntax/Syntax/Language/haskell.js +110 -0
  35. data/public/_components/@socketry/syntax/Syntax/Language/html.js +69 -0
  36. data/public/_components/@socketry/syntax/Syntax/Language/io.js +68 -0
  37. data/public/_components/@socketry/syntax/Syntax/Language/java.js +134 -0
  38. data/public/_components/@socketry/syntax/Syntax/Language/javascript.js +89 -0
  39. data/public/_components/@socketry/syntax/Syntax/Language/json.js +36 -0
  40. data/public/_components/@socketry/syntax/Syntax/Language/lisp.js +38 -0
  41. data/public/_components/@socketry/syntax/Syntax/Language/lua.js +87 -0
  42. data/public/_components/@socketry/syntax/Syntax/Language/markdown.js +112 -0
  43. data/public/_components/@socketry/syntax/Syntax/Language/nginx.js +37 -0
  44. data/public/_components/@socketry/syntax/Syntax/Language/objective-c.js +1 -0
  45. data/public/_components/@socketry/syntax/Syntax/Language/ocaml.js +225 -0
  46. data/public/_components/@socketry/syntax/Syntax/Language/pascal.js +166 -0
  47. data/public/_components/@socketry/syntax/Syntax/Language/patch.js +2 -0
  48. data/public/_components/@socketry/syntax/Syntax/Language/perl5.js +317 -0
  49. data/public/_components/@socketry/syntax/Syntax/Language/php-script.js +112 -0
  50. data/public/_components/@socketry/syntax/Syntax/Language/php.js +18 -0
  51. data/public/_components/@socketry/syntax/Syntax/Language/plain.js +20 -0
  52. data/public/_components/@socketry/syntax/Syntax/Language/protobuf.js +77 -0
  53. data/public/_components/@socketry/syntax/Syntax/Language/python.js +208 -0
  54. data/public/_components/@socketry/syntax/Syntax/Language/ruby.js +124 -0
  55. data/public/_components/@socketry/syntax/Syntax/Language/scala.js +81 -0
  56. data/public/_components/@socketry/syntax/Syntax/Language/smalltalk.js +30 -0
  57. data/public/_components/@socketry/syntax/Syntax/Language/sql.js +865 -0
  58. data/public/_components/@socketry/syntax/Syntax/Language/super-collider.js +70 -0
  59. data/public/_components/@socketry/syntax/Syntax/Language/swift.js +176 -0
  60. data/public/_components/@socketry/syntax/Syntax/Language/xml.js +76 -0
  61. data/public/_components/@socketry/syntax/Syntax/Language/xrb.js +33 -0
  62. data/public/_components/@socketry/syntax/Syntax/Language/yaml.js +29 -0
  63. data/public/_components/@socketry/syntax/Syntax/Language.js +276 -0
  64. data/public/_components/@socketry/syntax/Syntax/Loader.js +78 -0
  65. data/public/_components/@socketry/syntax/Syntax/Match.js +546 -0
  66. data/public/_components/@socketry/syntax/Syntax/Rule.js +306 -0
  67. data/public/_components/@socketry/syntax/Syntax.js +356 -0
  68. data/public/_components/@socketry/syntax/bin/syntax-ast.js +42 -0
  69. data/public/_components/@socketry/syntax/examples/_template.html +53 -0
  70. data/public/_components/@socketry/syntax/examples/apache.html +72 -0
  71. data/public/_components/@socketry/syntax/examples/applescript.html +72 -0
  72. data/public/_components/@socketry/syntax/examples/assembly.html +74 -0
  73. data/public/_components/@socketry/syntax/examples/bash.html +90 -0
  74. data/public/_components/@socketry/syntax/examples/basic.html +87 -0
  75. data/public/_components/@socketry/syntax/examples/c.html +141 -0
  76. data/public/_components/@socketry/syntax/examples/clang.html +202 -0
  77. data/public/_components/@socketry/syntax/examples/csharp.html +110 -0
  78. data/public/_components/@socketry/syntax/examples/css-colors.html +179 -0
  79. data/public/_components/@socketry/syntax/examples/custom-theme.html +155 -0
  80. data/public/_components/@socketry/syntax/examples/diff.html +142 -0
  81. data/public/_components/@socketry/syntax/examples/examples.css +216 -0
  82. data/public/_components/@socketry/syntax/examples/go.html +413 -0
  83. data/public/_components/@socketry/syntax/examples/haskell.html +373 -0
  84. data/public/_components/@socketry/syntax/examples/html.html +316 -0
  85. data/public/_components/@socketry/syntax/examples/index.html +97 -0
  86. data/public/_components/@socketry/syntax/examples/io.html +552 -0
  87. data/public/_components/@socketry/syntax/examples/java.html +786 -0
  88. data/public/_components/@socketry/syntax/examples/javascript.html +199 -0
  89. data/public/_components/@socketry/syntax/examples/json.html +150 -0
  90. data/public/_components/@socketry/syntax/examples/lisp.html +476 -0
  91. data/public/_components/@socketry/syntax/examples/lua.html +737 -0
  92. data/public/_components/@socketry/syntax/examples/markdown.html +121 -0
  93. data/public/_components/@socketry/syntax/examples/mixed.html +306 -0
  94. data/public/_components/@socketry/syntax/examples/nginx.html +554 -0
  95. data/public/_components/@socketry/syntax/examples/ocaml.html +596 -0
  96. data/public/_components/@socketry/syntax/examples/pascal.html +762 -0
  97. data/public/_components/@socketry/syntax/examples/perl5.html +488 -0
  98. data/public/_components/@socketry/syntax/examples/php-script.html +142 -0
  99. data/public/_components/@socketry/syntax/examples/php.html +95 -0
  100. data/public/_components/@socketry/syntax/examples/plain.html +222 -0
  101. data/public/_components/@socketry/syntax/examples/protobuf.html +405 -0
  102. data/public/_components/@socketry/syntax/examples/python.html +82 -0
  103. data/public/_components/@socketry/syntax/examples/readme.md +79 -0
  104. data/public/_components/@socketry/syntax/examples/ruby.html +58 -0
  105. data/public/_components/@socketry/syntax/examples/scala.html +41 -0
  106. data/public/_components/@socketry/syntax/examples/smalltalk.html +436 -0
  107. data/public/_components/@socketry/syntax/examples/sql.html +373 -0
  108. data/public/_components/@socketry/syntax/examples/super-collider.html +55 -0
  109. data/public/_components/@socketry/syntax/examples/swift.html +176 -0
  110. data/public/_components/@socketry/syntax/examples/wrap-demo.html +103 -0
  111. data/public/_components/@socketry/syntax/examples/xml.html +112 -0
  112. data/public/_components/@socketry/syntax/examples/xrb.html +37 -0
  113. data/public/_components/@socketry/syntax/examples/yaml.html +72 -0
  114. data/public/_components/@socketry/syntax/license.md +21 -0
  115. data/public/_components/@socketry/syntax/package-lock.json +834 -0
  116. data/public/_components/@socketry/syntax/package.json +43 -0
  117. data/public/_components/@socketry/syntax/readme.md +162 -0
  118. data/public/_components/@socketry/syntax/test/Syntax/CodeElement.js +306 -0
  119. data/public/_components/@socketry/syntax/test/Syntax/ErrorHandling.js +85 -0
  120. data/public/_components/@socketry/syntax/test/Syntax/Language/apache.js +153 -0
  121. data/public/_components/@socketry/syntax/test/Syntax/Language/applescript.js +198 -0
  122. data/public/_components/@socketry/syntax/test/Syntax/Language/assembly.js +209 -0
  123. data/public/_components/@socketry/syntax/test/Syntax/Language/bash-script.js +225 -0
  124. data/public/_components/@socketry/syntax/test/Syntax/Language/bash.js +162 -0
  125. data/public/_components/@socketry/syntax/test/Syntax/Language/basic.js +265 -0
  126. data/public/_components/@socketry/syntax/test/Syntax/Language/clang.js +390 -0
  127. data/public/_components/@socketry/syntax/test/Syntax/Language/csharp.js +436 -0
  128. data/public/_components/@socketry/syntax/test/Syntax/Language/css.js +431 -0
  129. data/public/_components/@socketry/syntax/test/Syntax/Language/diff.js +206 -0
  130. data/public/_components/@socketry/syntax/test/Syntax/Language/go.js +386 -0
  131. data/public/_components/@socketry/syntax/test/Syntax/Language/haskell.js +454 -0
  132. data/public/_components/@socketry/syntax/test/Syntax/Language/html.js +111 -0
  133. data/public/_components/@socketry/syntax/test/Syntax/Language/io.js +229 -0
  134. data/public/_components/@socketry/syntax/test/Syntax/Language/java.js +362 -0
  135. data/public/_components/@socketry/syntax/test/Syntax/Language/javascript.js +101 -0
  136. data/public/_components/@socketry/syntax/test/Syntax/Language/json.js +101 -0
  137. data/public/_components/@socketry/syntax/test/Syntax/Language/lisp.js +224 -0
  138. data/public/_components/@socketry/syntax/test/Syntax/Language/lua.js +307 -0
  139. data/public/_components/@socketry/syntax/test/Syntax/Language/markdown.js +163 -0
  140. data/public/_components/@socketry/syntax/test/Syntax/Language/nginx.js +267 -0
  141. data/public/_components/@socketry/syntax/test/Syntax/Language/ocaml.js +299 -0
  142. data/public/_components/@socketry/syntax/test/Syntax/Language/pascal.js +311 -0
  143. data/public/_components/@socketry/syntax/test/Syntax/Language/perl5.js +333 -0
  144. data/public/_components/@socketry/syntax/test/Syntax/Language/php-script.js +197 -0
  145. data/public/_components/@socketry/syntax/test/Syntax/Language/php.js +92 -0
  146. data/public/_components/@socketry/syntax/test/Syntax/Language/plain.js +327 -0
  147. data/public/_components/@socketry/syntax/test/Syntax/Language/protobuf.js +294 -0
  148. data/public/_components/@socketry/syntax/test/Syntax/Language/python.js +213 -0
  149. data/public/_components/@socketry/syntax/test/Syntax/Language/ruby.js +70 -0
  150. data/public/_components/@socketry/syntax/test/Syntax/Language/scala.js +75 -0
  151. data/public/_components/@socketry/syntax/test/Syntax/Language/smalltalk.js +223 -0
  152. data/public/_components/@socketry/syntax/test/Syntax/Language/sql.js +281 -0
  153. data/public/_components/@socketry/syntax/test/Syntax/Language/super-collider.js +66 -0
  154. data/public/_components/@socketry/syntax/test/Syntax/Language/swift.js +71 -0
  155. data/public/_components/@socketry/syntax/test/Syntax/Language/xml.js +170 -0
  156. data/public/_components/@socketry/syntax/test/Syntax/Language/xrb.js +57 -0
  157. data/public/_components/@socketry/syntax/test/Syntax/Language/yaml.js +123 -0
  158. data/public/_components/@socketry/syntax/test/Syntax/Language.js +62 -0
  159. data/public/_components/@socketry/syntax/test/Syntax/Match.js +40 -0
  160. data/public/_components/@socketry/syntax/test/Syntax/Rule.js +251 -0
  161. data/public/_components/@socketry/syntax/test/Syntax.js +38 -0
  162. data/public/_components/@socketry/syntax/test/helpers/ast-matcher.js +90 -0
  163. data/public/_components/@socketry/syntax/themes/base/apache.css +1 -0
  164. data/public/_components/@socketry/syntax/themes/base/applescript.css +1 -0
  165. data/public/_components/@socketry/syntax/themes/base/assembly.css +1 -0
  166. data/public/_components/@socketry/syntax/themes/base/bash.css +1 -0
  167. data/public/_components/@socketry/syntax/themes/base/basic.css +1 -0
  168. data/public/_components/@socketry/syntax/themes/base/c.css +1 -0
  169. data/public/_components/@socketry/syntax/themes/base/clang.css +0 -0
  170. data/public/_components/@socketry/syntax/themes/base/csharp.css +1 -0
  171. data/public/_components/@socketry/syntax/themes/base/css.css +22 -0
  172. data/public/_components/@socketry/syntax/themes/base/diff.css +48 -0
  173. data/public/_components/@socketry/syntax/themes/base/go.css +1 -0
  174. data/public/_components/@socketry/syntax/themes/base/haskell.css +1 -0
  175. data/public/_components/@socketry/syntax/themes/base/html.css +1 -0
  176. data/public/_components/@socketry/syntax/themes/base/io.css +1 -0
  177. data/public/_components/@socketry/syntax/themes/base/java.css +1 -0
  178. data/public/_components/@socketry/syntax/themes/base/javascript.css +1 -0
  179. data/public/_components/@socketry/syntax/themes/base/json.css +41 -0
  180. data/public/_components/@socketry/syntax/themes/base/lisp.css +1 -0
  181. data/public/_components/@socketry/syntax/themes/base/lua.css +1 -0
  182. data/public/_components/@socketry/syntax/themes/base/markdown.css +16 -0
  183. data/public/_components/@socketry/syntax/themes/base/nginx.css +1 -0
  184. data/public/_components/@socketry/syntax/themes/base/ocaml.css +1 -0
  185. data/public/_components/@socketry/syntax/themes/base/pascal.css +1 -0
  186. data/public/_components/@socketry/syntax/themes/base/perl5.css +1 -0
  187. data/public/_components/@socketry/syntax/themes/base/php-script.css +1 -0
  188. data/public/_components/@socketry/syntax/themes/base/php.css +1 -0
  189. data/public/_components/@socketry/syntax/themes/base/plain.css +1 -0
  190. data/public/_components/@socketry/syntax/themes/base/protobuf.css +1 -0
  191. data/public/_components/@socketry/syntax/themes/base/python.css +1 -0
  192. data/public/_components/@socketry/syntax/themes/base/ruby.css +23 -0
  193. data/public/_components/@socketry/syntax/themes/base/scala.css +3 -0
  194. data/public/_components/@socketry/syntax/themes/base/smalltalk.css +1 -0
  195. data/public/_components/@socketry/syntax/themes/base/sql.css +1 -0
  196. data/public/_components/@socketry/syntax/themes/base/super-collider.css +33 -0
  197. data/public/_components/@socketry/syntax/themes/base/swift.css +1 -0
  198. data/public/_components/@socketry/syntax/themes/base/syntax.css +63 -0
  199. data/public/_components/@socketry/syntax/themes/base/xml.css +1 -0
  200. data/public/_components/@socketry/syntax/themes/base/xrb.css +29 -0
  201. data/public/_components/@socketry/syntax/themes/base/yaml.css +1 -0
  202. data/public/_components/@socketry/syntax/themes/theming.md +233 -0
  203. data/public/_components/@socketry/syntax/update-examples.js +135 -0
  204. data/public/_static/index.css +593 -0
  205. data/public/application.js +147 -0
  206. data/readme.md +69 -0
  207. data/releases.md +3 -0
  208. data/templates/code.xrb +12 -0
  209. data/templates/default.xrb +5 -0
  210. data/templates/image.xrb +8 -0
  211. data/templates/section.xrb +5 -0
  212. data/templates/title.xrb +8 -0
  213. data/templates/translation.xrb +8 -0
  214. data/templates/two_column.xrb +8 -0
  215. metadata +280 -0
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Tests for Apache 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 registerApache from '../../../Syntax/Language/apache.js';
15
+ import {
16
+ assertToken,
17
+ assertTokenType,
18
+ assertTokenCount,
19
+ getMatchText
20
+ } from '../../helpers/ast-matcher.js';
21
+
22
+ test('Apache language can be registered', async () => {
23
+ const syntax = new Syntax();
24
+ registerApache(syntax);
25
+ const language = await syntax.getLanguage('apache');
26
+ assert.ok(language);
27
+ assert.strictEqual(language.name, 'apache');
28
+ });
29
+
30
+ test('Apache can match opening tags', async () => {
31
+ const syntax = new Syntax();
32
+ registerApache(syntax);
33
+ const language = await syntax.getLanguage('apache');
34
+
35
+ const code = '<VirtualHost *:80>';
36
+ const matches = await language.getMatches(syntax, code);
37
+
38
+ assertToken(code, matches, 'tag', '<VirtualHost *:80>');
39
+ assertToken(code, matches, 'tag-name', 'VirtualHost');
40
+ });
41
+
42
+ test('Apache can match closing tags', async () => {
43
+ const syntax = new Syntax();
44
+ registerApache(syntax);
45
+ const language = await syntax.getLanguage('apache');
46
+
47
+ const code = '</VirtualHost>';
48
+ const matches = await language.getMatches(syntax, code);
49
+
50
+ assertToken(code, matches, 'tag', '</VirtualHost>');
51
+ assertToken(code, matches, 'tag-name', 'VirtualHost');
52
+ });
53
+
54
+ test('Apache can match directives', async () => {
55
+ const syntax = new Syntax();
56
+ registerApache(syntax);
57
+ const language = await syntax.getLanguage('apache');
58
+
59
+ const code = ' ServerName example.com\n DocumentRoot /var/www';
60
+ const matches = await language.getMatches(syntax, code);
61
+
62
+ assertToken(code, matches, 'function', 'ServerName');
63
+ assertToken(code, matches, 'function', 'DocumentRoot');
64
+ });
65
+
66
+ test('Apache can match comments', async () => {
67
+ const syntax = new Syntax();
68
+ registerApache(syntax);
69
+ const language = await syntax.getLanguage('apache');
70
+
71
+ const code = '# This is a comment\nServerName example.com';
72
+ const matches = await language.getMatches(syntax, code);
73
+
74
+ const commentMatch = assertTokenType(matches, 'comment');
75
+ const text = getMatchText(code, commentMatch);
76
+ assert.ok(text.startsWith('#'));
77
+ });
78
+
79
+ test('Apache can match single-quoted strings', async () => {
80
+ const syntax = new Syntax();
81
+ registerApache(syntax);
82
+ const language = await syntax.getLanguage('apache');
83
+
84
+ const code = "ErrorLog 'logs/error.log'";
85
+ const matches = await language.getMatches(syntax, code);
86
+
87
+ assertToken(code, matches, 'string', "'logs/error.log'");
88
+ });
89
+
90
+ test('Apache can match double-quoted strings', async () => {
91
+ const syntax = new Syntax();
92
+ registerApache(syntax);
93
+ const language = await syntax.getLanguage('apache');
94
+
95
+ const code = 'ErrorLog "logs/error.log"';
96
+ const matches = await language.getMatches(syntax, code);
97
+
98
+ assertToken(code, matches, 'string', '"logs/error.log"');
99
+ });
100
+
101
+ test('Apache can match URLs', async () => {
102
+ const syntax = new Syntax();
103
+ registerApache(syntax);
104
+ const language = await syntax.getLanguage('apache');
105
+
106
+ const code = 'Redirect https://example.com/new';
107
+ const matches = await language.getMatches(syntax, code);
108
+
109
+ assertToken(code, matches, 'href', 'https://example.com/new');
110
+ });
111
+
112
+ test('Apache can process code to HTML', async () => {
113
+ const syntax = new Syntax();
114
+ registerApache(syntax);
115
+ const language = await syntax.getLanguage('apache');
116
+
117
+ const code = '<VirtualHost *:80>\n ServerName example.com\n</VirtualHost>';
118
+ const html = await language.process(syntax, code);
119
+
120
+ assert.ok(html.innerHTML.includes('tag'));
121
+ assert.ok(html.innerHTML.includes('VirtualHost'));
122
+ assert.ok(html.innerHTML.includes('function'));
123
+ assert.ok(html.innerHTML.includes('ServerName'));
124
+ });
125
+
126
+ test('Apache creates documentation links for directives', async () => {
127
+ const syntax = new Syntax();
128
+ registerApache(syntax);
129
+ const language = await syntax.getLanguage('apache');
130
+
131
+ const code = ' ServerName example.com';
132
+ const html = await language.process(syntax, code);
133
+
134
+ // Should have link to Apache documentation
135
+ const links = html.querySelectorAll('a.function');
136
+ assert.ok(links.length > 0);
137
+ assert.ok(links[0].href.includes('httpd.apache.org'));
138
+ assert.ok(links[0].href.includes('ServerName'));
139
+ assert.strictEqual(links[0].textContent, 'ServerName');
140
+ });
141
+
142
+ test('Apache can build a syntax tree', async () => {
143
+ const syntax = new Syntax();
144
+ registerApache(syntax);
145
+ const language = await syntax.getLanguage('apache');
146
+
147
+ const code = 'ServerName example.com';
148
+ const tree = await language.buildTree(syntax, code, 0);
149
+
150
+ assert.ok(tree);
151
+ assert.strictEqual(tree.offset, 0);
152
+ assert.strictEqual(tree.length, code.length);
153
+ });
@@ -0,0 +1,198 @@
1
+ /**
2
+ * Tests for AppleScript 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 registerAppleScript from '../../../Syntax/Language/applescript.js';
15
+ import {
16
+ assertToken,
17
+ assertTokenType,
18
+ assertTokenCount,
19
+ getMatchText
20
+ } from '../../helpers/ast-matcher.js';
21
+
22
+ test('AppleScript language can be registered', async () => {
23
+ const syntax = new Syntax();
24
+ registerAppleScript(syntax);
25
+ const language = await syntax.getLanguage('applescript');
26
+ assert.ok(language);
27
+ assert.strictEqual(language.name, 'applescript');
28
+ });
29
+
30
+ test('AppleScript can match basic keywords', async () => {
31
+ const syntax = new Syntax();
32
+ registerAppleScript(syntax);
33
+ const language = await syntax.getLanguage('applescript');
34
+
35
+ const code = 'set x to 5\nreturn x';
36
+ const matches = await language.getMatches(syntax, code);
37
+
38
+ assertToken(code, matches, 'keyword', 'set');
39
+ assertToken(code, matches, 'keyword', 'to');
40
+ assertToken(code, matches, 'keyword', 'return');
41
+ });
42
+
43
+ test('AppleScript can match ordinal keywords', async () => {
44
+ const syntax = new Syntax();
45
+ registerAppleScript(syntax);
46
+ const language = await syntax.getLanguage('applescript');
47
+
48
+ const code = 'first item of myList';
49
+ const matches = await language.getMatches(syntax, code);
50
+
51
+ assertToken(code, matches, 'keyword', 'first');
52
+ });
53
+
54
+ test('AppleScript can match special keywords', async () => {
55
+ const syntax = new Syntax();
56
+ registerAppleScript(syntax);
57
+ const language = await syntax.getLanguage('applescript');
58
+
59
+ const code = 'activate application "Safari"\nset x to true\nset y to false';
60
+ const matches = await language.getMatches(syntax, code);
61
+
62
+ assertToken(code, matches, 'keyword', 'activate');
63
+ assertToken(code, matches, 'keyword', 'true');
64
+ assertToken(code, matches, 'keyword', 'false');
65
+ });
66
+
67
+ test('AppleScript can match double-dash comments', async () => {
68
+ const syntax = new Syntax();
69
+ registerAppleScript(syntax);
70
+ const language = await syntax.getLanguage('applescript');
71
+
72
+ const code = '-- This is a comment\nset x to 1';
73
+ const matches = await language.getMatches(syntax, code);
74
+
75
+ const commentMatch = assertTokenType(matches, 'comment');
76
+ const text = getMatchText(code, commentMatch);
77
+ assert.ok(text.startsWith('--'));
78
+ });
79
+
80
+ test('AppleScript can match hash comments', async () => {
81
+ const syntax = new Syntax();
82
+ registerAppleScript(syntax);
83
+ const language = await syntax.getLanguage('applescript');
84
+
85
+ const code = '# This is a comment\nset x to 1';
86
+ const matches = await language.getMatches(syntax, code);
87
+
88
+ const commentMatch = assertTokenType(matches, 'comment');
89
+ const text = getMatchText(code, commentMatch);
90
+ assert.ok(text.startsWith('#'));
91
+ });
92
+
93
+ test('AppleScript can match block comments', async () => {
94
+ const syntax = new Syntax();
95
+ registerAppleScript(syntax);
96
+ const language = await syntax.getLanguage('applescript');
97
+
98
+ const code = '(* This is a block comment *)\nset x to 1';
99
+ const matches = await language.getMatches(syntax, code);
100
+
101
+ assertToken(code, matches, 'comment', '(* This is a block comment *)');
102
+ });
103
+
104
+ test('AppleScript can match double-quoted strings', async () => {
105
+ const syntax = new Syntax();
106
+ registerAppleScript(syntax);
107
+ const language = await syntax.getLanguage('applescript');
108
+
109
+ const code = 'set msg to "Hello World"';
110
+ const matches = await language.getMatches(syntax, code);
111
+
112
+ assertToken(code, matches, 'string', '"Hello World"');
113
+ });
114
+
115
+ test('AppleScript can match ordinal numbers', async () => {
116
+ const syntax = new Syntax();
117
+ registerAppleScript(syntax);
118
+ const language = await syntax.getLanguage('applescript');
119
+
120
+ const code = '1st item, 2nd item, 3rd item, 4th item';
121
+ const matches = await language.getMatches(syntax, code);
122
+
123
+ assertToken(code, matches, 'constant', '1st');
124
+ assertToken(code, matches, 'constant', '2nd');
125
+ assertToken(code, matches, 'constant', '3rd');
126
+ assertToken(code, matches, 'constant', '4th');
127
+ });
128
+
129
+ test('AppleScript can match decimal numbers', async () => {
130
+ const syntax = new Syntax();
131
+ registerAppleScript(syntax);
132
+ const language = await syntax.getLanguage('applescript');
133
+
134
+ const code = 'set x to 42\nset y to 3.14';
135
+ const matches = await language.getMatches(syntax, code);
136
+
137
+ assertToken(code, matches, 'constant', '42');
138
+ assertToken(code, matches, 'constant', '3.14');
139
+ });
140
+
141
+ test('AppleScript can match operators', async () => {
142
+ const syntax = new Syntax();
143
+ registerAppleScript(syntax);
144
+ const language = await syntax.getLanguage('applescript');
145
+
146
+ const code = 'set x to 5 + 3 * 2';
147
+ const matches = await language.getMatches(syntax, code);
148
+
149
+ assertTokenCount(matches, 'operator', 2); // + and *
150
+ });
151
+
152
+ test('AppleScript can match control flow keywords', async () => {
153
+ const syntax = new Syntax();
154
+ registerAppleScript(syntax);
155
+ const language = await syntax.getLanguage('applescript');
156
+
157
+ const code = 'if x is equal to 5 then\nend if';
158
+ const matches = await language.getMatches(syntax, code);
159
+
160
+ assertToken(code, matches, 'keyword', 'if');
161
+ assertToken(code, matches, 'keyword', 'is equal to');
162
+ });
163
+
164
+ test('AppleScript can match URLs', async () => {
165
+ const syntax = new Syntax();
166
+ registerAppleScript(syntax);
167
+ const language = await syntax.getLanguage('applescript');
168
+
169
+ const code = 'open location "https://example.com"';
170
+ const matches = await language.getMatches(syntax, code);
171
+
172
+ assertToken(code, matches, 'href', 'https://example.com');
173
+ });
174
+
175
+ test('AppleScript can process code to HTML', async () => {
176
+ const syntax = new Syntax();
177
+ registerAppleScript(syntax);
178
+ const language = await syntax.getLanguage('applescript');
179
+
180
+ const code = 'set x to 5';
181
+ const html = await language.process(syntax, code);
182
+
183
+ assert.ok(html.innerHTML.includes('keyword'));
184
+ assert.ok(html.innerHTML.includes('set'));
185
+ });
186
+
187
+ test('AppleScript can build a syntax tree', async () => {
188
+ const syntax = new Syntax();
189
+ registerAppleScript(syntax);
190
+ const language = await syntax.getLanguage('applescript');
191
+
192
+ const code = 'set x to 5';
193
+ const tree = await language.buildTree(syntax, code, 0);
194
+
195
+ assert.ok(tree);
196
+ assert.strictEqual(tree.offset, 0);
197
+ assert.strictEqual(tree.length, code.length);
198
+ });
@@ -0,0 +1,209 @@
1
+ /**
2
+ * Tests for Assembly 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 registerAssembly from '../../../Syntax/Language/assembly.js';
15
+ import {
16
+ assertToken,
17
+ assertTokenType,
18
+ assertTokenCount,
19
+ getMatchText
20
+ } from '../../helpers/ast-matcher.js';
21
+
22
+ test('Assembly language can be registered', async () => {
23
+ const syntax = new Syntax();
24
+ registerAssembly(syntax);
25
+ const language = await syntax.getLanguage('assembly');
26
+ assert.ok(language);
27
+ assert.strictEqual(language.name, 'assembly');
28
+ });
29
+
30
+ test('Assembly can be registered with asm alias', async () => {
31
+ const syntax = new Syntax();
32
+ registerAssembly(syntax);
33
+ const language = await syntax.getLanguage('asm');
34
+ assert.ok(language);
35
+ assert.strictEqual(language.name, 'assembly');
36
+ });
37
+
38
+ test('Assembly can match C-style comments', async () => {
39
+ const syntax = new Syntax();
40
+ registerAssembly(syntax);
41
+ const language = await syntax.getLanguage('assembly');
42
+
43
+ const code = '/* This is a comment */\nmov eax, ebx';
44
+ const matches = await language.getMatches(syntax, code);
45
+
46
+ assertToken(code, matches, 'comment', '/* This is a comment */');
47
+ });
48
+
49
+ test('Assembly can match C++-style comments', async () => {
50
+ const syntax = new Syntax();
51
+ registerAssembly(syntax);
52
+ const language = await syntax.getLanguage('assembly');
53
+
54
+ const code = '// This is a comment\nmov eax, ebx';
55
+ const matches = await language.getMatches(syntax, code);
56
+
57
+ const commentMatch = assertTokenType(matches, 'comment');
58
+ const text = getMatchText(code, commentMatch);
59
+ assert.ok(text.startsWith('//'));
60
+ });
61
+
62
+ test('Assembly can match directives', async () => {
63
+ const syntax = new Syntax();
64
+ registerAssembly(syntax);
65
+ const language = await syntax.getLanguage('assembly');
66
+
67
+ const code = '.text\n.global main\n.data';
68
+ const matches = await language.getMatches(syntax, code);
69
+
70
+ assertToken(code, matches, 'directive', '.text');
71
+ assertToken(code, matches, 'directive', '.global');
72
+ assertToken(code, matches, 'directive', '.data');
73
+ });
74
+
75
+ test('Assembly can match labels', async () => {
76
+ const syntax = new Syntax();
77
+ registerAssembly(syntax);
78
+ const language = await syntax.getLanguage('assembly');
79
+
80
+ const code = 'main:\n mov eax, 0\nloop_start:\n inc eax';
81
+ const matches = await language.getMatches(syntax, code);
82
+
83
+ assertToken(code, matches, 'label', 'main:');
84
+ assertToken(code, matches, 'label', 'loop_start:');
85
+ });
86
+
87
+ test('Assembly can match instructions', async () => {
88
+ const syntax = new Syntax();
89
+ registerAssembly(syntax);
90
+ const language = await syntax.getLanguage('assembly');
91
+
92
+ const code = ' mov eax, ebx\n add ecx, edx\n ret';
93
+ const matches = await language.getMatches(syntax, code);
94
+
95
+ assertToken(code, matches, 'function', 'mov');
96
+ assertToken(code, matches, 'function', 'add');
97
+ assertToken(code, matches, 'function', 'ret');
98
+ });
99
+
100
+ test('Assembly can match registers', async () => {
101
+ const syntax = new Syntax();
102
+ registerAssembly(syntax);
103
+ const language = await syntax.getLanguage('assembly');
104
+
105
+ const code = 'mov %eax, %ebx\nadd %ecx, %edx';
106
+ const matches = await language.getMatches(syntax, code);
107
+
108
+ assertToken(code, matches, 'register', '%eax');
109
+ assertToken(code, matches, 'register', '%ebx');
110
+ assertToken(code, matches, 'register', '%ecx');
111
+ assertToken(code, matches, 'register', '%edx');
112
+ });
113
+
114
+ test('Assembly can match decimal numbers', async () => {
115
+ const syntax = new Syntax();
116
+ registerAssembly(syntax);
117
+ const language = await syntax.getLanguage('assembly');
118
+
119
+ const code = 'mov eax, 42\nadd ebx, -10';
120
+ const matches = await language.getMatches(syntax, code);
121
+
122
+ assertToken(code, matches, 'constant', '42');
123
+ assertToken(code, matches, 'constant', '-10');
124
+ });
125
+
126
+ test('Assembly can match hexadecimal numbers', async () => {
127
+ const syntax = new Syntax();
128
+ registerAssembly(syntax);
129
+ const language = await syntax.getLanguage('assembly');
130
+
131
+ const code = 'mov eax, 0xFF\nadd ebx, 0x10';
132
+ const matches = await language.getMatches(syntax, code);
133
+
134
+ assertToken(code, matches, 'constant', '0xFF');
135
+ assertToken(code, matches, 'constant', '0x10');
136
+ });
137
+
138
+ test('Assembly can match single-quoted strings', async () => {
139
+ const syntax = new Syntax();
140
+ registerAssembly(syntax);
141
+ const language = await syntax.getLanguage('assembly');
142
+
143
+ const code = "db 'Hello'";
144
+ const matches = await language.getMatches(syntax, code);
145
+
146
+ assertToken(code, matches, 'string', "'Hello'");
147
+ });
148
+
149
+ test('Assembly can match double-quoted strings', async () => {
150
+ const syntax = new Syntax();
151
+ registerAssembly(syntax);
152
+ const language = await syntax.getLanguage('assembly');
153
+
154
+ const code = 'db "World"';
155
+ const matches = await language.getMatches(syntax, code);
156
+
157
+ assertToken(code, matches, 'string', '"World"');
158
+ });
159
+
160
+ test('Assembly can match hash comments', async () => {
161
+ const syntax = new Syntax();
162
+ registerAssembly(syntax);
163
+ const language = await syntax.getLanguage('assembly');
164
+
165
+ const code = '# This is a comment\nmov eax, ebx';
166
+ const matches = await language.getMatches(syntax, code);
167
+
168
+ const commentMatch = assertTokenType(matches, 'comment');
169
+ const text = getMatchText(code, commentMatch);
170
+ assert.ok(text.startsWith('#'));
171
+ });
172
+
173
+ test('Assembly can match URLs', async () => {
174
+ const syntax = new Syntax();
175
+ registerAssembly(syntax);
176
+ const language = await syntax.getLanguage('assembly');
177
+
178
+ const code = '# See https://example.com/docs';
179
+ const matches = await language.getMatches(syntax, code);
180
+
181
+ assertToken(code, matches, 'href', 'https://example.com/docs');
182
+ });
183
+
184
+ test('Assembly can process code to HTML', async () => {
185
+ const syntax = new Syntax();
186
+ registerAssembly(syntax);
187
+ const language = await syntax.getLanguage('assembly');
188
+
189
+ const code = 'main:\n mov eax, 0\n ret';
190
+ const html = await language.process(syntax, code);
191
+
192
+ assert.ok(html.innerHTML.includes('label'));
193
+ assert.ok(html.innerHTML.includes('main'));
194
+ assert.ok(html.innerHTML.includes('function'));
195
+ assert.ok(html.innerHTML.includes('mov'));
196
+ });
197
+
198
+ test('Assembly can build a syntax tree', async () => {
199
+ const syntax = new Syntax();
200
+ registerAssembly(syntax);
201
+ const language = await syntax.getLanguage('assembly');
202
+
203
+ const code = 'mov eax, 0';
204
+ const tree = await language.buildTree(syntax, code, 0);
205
+
206
+ assert.ok(tree);
207
+ assert.strictEqual(tree.offset, 0);
208
+ assert.strictEqual(tree.length, code.length);
209
+ });