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,225 @@
1
+ /**
2
+ * Tests for bash-script and bash-statement language definitions
3
+ */
4
+
5
+ import {test} from 'node:test';
6
+ import assert from 'node:assert';
7
+
8
+ import Syntax from '../../../Syntax.js';
9
+ import register from '../../../Syntax/Language/bash-script.js';
10
+
11
+ test('bash-script language can be registered', async () => {
12
+ const syntax = new Syntax();
13
+ register(syntax);
14
+ const language = await syntax.getLanguage('bash-script');
15
+ assert.ok(language);
16
+ assert.strictEqual(language.name, 'bash-script');
17
+ });
18
+
19
+ test('bash-statement language can be registered', async () => {
20
+ const syntax = new Syntax();
21
+ register(syntax);
22
+ const language = await syntax.getLanguage('bash-statement');
23
+ assert.ok(language);
24
+ assert.strictEqual(language.name, 'bash-statement');
25
+ });
26
+
27
+ test('bash-script can highlight operators', async () => {
28
+ const syntax = new Syntax();
29
+ register(syntax);
30
+ const language = await syntax.getLanguage('bash-script');
31
+
32
+ const code = 'command1 && command2';
33
+ const matches = await language.getMatches(syntax, code);
34
+
35
+ const operators = matches.filter(m => m.type === 'operator');
36
+ assert.ok(operators.length > 0);
37
+ assert.ok(operators.some(m => m.value === '&&'));
38
+ });
39
+
40
+ test('bash-script can highlight pipe operators', async () => {
41
+ const syntax = new Syntax();
42
+ register(syntax);
43
+ const language = await syntax.getLanguage('bash-script');
44
+
45
+ const code = 'cat file | grep pattern';
46
+ const matches = await language.getMatches(syntax, code);
47
+
48
+ const pipe = matches.find(m => m.value === '|' && m.type === 'operator');
49
+ assert.ok(pipe);
50
+ });
51
+
52
+ test('bash-script can highlight semicolon separators', async () => {
53
+ const syntax = new Syntax();
54
+ register(syntax);
55
+ const language = await syntax.getLanguage('bash-script');
56
+
57
+ const code = 'echo hello; echo world';
58
+ const matches = await language.getMatches(syntax, code);
59
+
60
+ const semicolon = matches.find(m => m.value === ';' && m.type === 'operator');
61
+ assert.ok(semicolon);
62
+ });
63
+
64
+ test('bash-statement can highlight keywords', async () => {
65
+ const syntax = new Syntax();
66
+ register(syntax);
67
+ const language = await syntax.getLanguage('bash-statement');
68
+
69
+ const code = 'if [ $x -eq 1 ]; then echo yes; fi';
70
+ const matches = await language.getMatches(syntax, code);
71
+
72
+ const keywords = matches.filter(m => m.type === 'keyword');
73
+ assert.ok(keywords.length > 0);
74
+ assert.ok(keywords.some(m => m.value === 'if'));
75
+ assert.ok(keywords.some(m => m.value === 'then'));
76
+ assert.ok(keywords.some(m => m.value === 'fi'));
77
+ });
78
+
79
+ test('bash-statement can highlight for loops', async () => {
80
+ const syntax = new Syntax();
81
+ register(syntax);
82
+ const language = await syntax.getLanguage('bash-statement');
83
+
84
+ const code = 'for i in 1 2 3; do echo $i; done';
85
+ const matches = await language.getMatches(syntax, code);
86
+
87
+ const keywords = matches.filter(m => m.type === 'keyword');
88
+ assert.ok(keywords.some(m => m.value === 'for'));
89
+ assert.ok(keywords.some(m => m.value === 'do'));
90
+ assert.ok(keywords.some(m => m.value === 'done'));
91
+ });
92
+
93
+ test('bash-statement can highlight variables', async () => {
94
+ const syntax = new Syntax();
95
+ register(syntax);
96
+ const language = await syntax.getLanguage('bash-statement');
97
+
98
+ const code = 'echo $HOME';
99
+ const matches = await language.getMatches(syntax, code);
100
+
101
+ const variable = matches.find(m => m.type === 'variable');
102
+ assert.ok(variable);
103
+ assert.strictEqual(variable.value, '$HOME');
104
+ });
105
+
106
+ test('bash-statement can highlight environment variable assignments', async () => {
107
+ const syntax = new Syntax();
108
+ register(syntax);
109
+ const language = await syntax.getLanguage('bash-statement');
110
+
111
+ const code = 'PATH=/usr/bin';
112
+ const matches = await language.getMatches(syntax, code);
113
+
114
+ // Should recognize variable assignment
115
+ assert.ok(matches.length > 0);
116
+ });
117
+
118
+ test('bash-statement can highlight arithmetic expressions', async () => {
119
+ const syntax = new Syntax();
120
+ register(syntax);
121
+ const language = await syntax.getLanguage('bash-statement');
122
+
123
+ const code = 'result=$((5 + 3))';
124
+ const matches = await language.getMatches(syntax, code);
125
+
126
+ const expression = matches.find(m => m.type === 'expression');
127
+ assert.ok(expression);
128
+ });
129
+
130
+ test('bash-statement can highlight command substitution with backticks', async () => {
131
+ const syntax = new Syntax();
132
+ register(syntax);
133
+ const language = await syntax.getLanguage('bash-statement');
134
+
135
+ const code = 'date=`date +%Y-%m-%d`';
136
+ const matches = await language.getMatches(syntax, code);
137
+
138
+ assert.ok(matches.length > 0);
139
+ });
140
+
141
+ test('bash-statement can highlight single-quoted strings', async () => {
142
+ const syntax = new Syntax();
143
+ register(syntax);
144
+ const language = await syntax.getLanguage('bash-statement');
145
+
146
+ const code = "echo 'hello world'";
147
+ const matches = await language.getMatches(syntax, code);
148
+
149
+ const string = matches.find(m => m.type === 'string');
150
+ assert.ok(string);
151
+ });
152
+
153
+ test('bash-statement can highlight double-quoted strings', async () => {
154
+ const syntax = new Syntax();
155
+ register(syntax);
156
+ const language = await syntax.getLanguage('bash-statement');
157
+
158
+ const code = 'echo "hello world"';
159
+ const matches = await language.getMatches(syntax, code);
160
+
161
+ const string = matches.find(m => m.type === 'string');
162
+ assert.ok(string);
163
+ });
164
+
165
+ test('bash-statement can highlight command options', async () => {
166
+ const syntax = new Syntax();
167
+ register(syntax);
168
+ const language = await syntax.getLanguage('bash-statement');
169
+
170
+ const code = 'ls -la --color=auto';
171
+ const matches = await language.getMatches(syntax, code);
172
+
173
+ const options = matches.filter(m => m.type === 'option');
174
+ assert.ok(options.length > 0);
175
+ });
176
+
177
+ test('bash-statement can highlight comments', async () => {
178
+ const syntax = new Syntax();
179
+ register(syntax);
180
+ const language = await syntax.getLanguage('bash-statement');
181
+
182
+ const code = '# This is a comment';
183
+ const matches = await language.getMatches(syntax, code);
184
+
185
+ const comment = matches.find(m => m.type === 'comment');
186
+ assert.ok(comment);
187
+ });
188
+
189
+ test('bash-statement can highlight decimal numbers', async () => {
190
+ const syntax = new Syntax();
191
+ register(syntax);
192
+ const language = await syntax.getLanguage('bash-statement');
193
+
194
+ const code = 'echo 42';
195
+ const matches = await language.getMatches(syntax, code);
196
+
197
+ const number = matches.find(m => m.type === 'constant');
198
+ assert.ok(number);
199
+ });
200
+
201
+ test('bash-statement can handle case statements', async () => {
202
+ const syntax = new Syntax();
203
+ register(syntax);
204
+ const language = await syntax.getLanguage('bash-statement');
205
+
206
+ const code = 'case $var in';
207
+ const matches = await language.getMatches(syntax, code);
208
+
209
+ const keyword = matches.find(m => m.value === 'case' && m.type === 'keyword');
210
+ assert.ok(keyword);
211
+ });
212
+
213
+ test('bash-statement can handle function definitions', async () => {
214
+ const syntax = new Syntax();
215
+ register(syntax);
216
+ const language = await syntax.getLanguage('bash-statement');
217
+
218
+ const code = 'function myFunc {';
219
+ const matches = await language.getMatches(syntax, code);
220
+
221
+ const keyword = matches.find(
222
+ m => m.value === 'function' && m.type === 'keyword'
223
+ );
224
+ assert.ok(keyword);
225
+ });
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Tests for bash language definition
3
+ */
4
+
5
+ import {test} from 'node:test';
6
+ import assert from 'node:assert';
7
+
8
+ import Syntax from '../../../Syntax.js';
9
+ import register from '../../../Syntax/Language/bash.js';
10
+ import registerBashScript from '../../../Syntax/Language/bash-script.js';
11
+
12
+ test('bash language can be registered', async () => {
13
+ const syntax = new Syntax();
14
+ registerBashScript(syntax);
15
+ register(syntax);
16
+ const language = await syntax.getLanguage('bash');
17
+ assert.ok(language);
18
+ assert.strictEqual(language.name, 'bash');
19
+ });
20
+
21
+ test('bash can highlight shell prompts', async () => {
22
+ const syntax = new Syntax();
23
+ registerBashScript(syntax);
24
+ register(syntax);
25
+ const language = await syntax.getLanguage('bash');
26
+
27
+ const code = '$ echo hello';
28
+ const matches = await language.getMatches(syntax, code);
29
+
30
+ assert.ok(matches.length > 0);
31
+ assert.strictEqual(matches[0].type, 'prompt');
32
+ });
33
+
34
+ test('bash can embed bash-script for command execution', async () => {
35
+ const syntax = new Syntax();
36
+ registerBashScript(syntax);
37
+ register(syntax);
38
+ const language = await syntax.getLanguage('bash');
39
+
40
+ const code = '$ ls -la';
41
+ const matches = await language.getMatches(syntax, code);
42
+
43
+ // Should find prompt and embedded bash-script execution
44
+ const hasPrompt = matches.some(m => m.type === 'prompt');
45
+ assert.ok(hasPrompt);
46
+ });
47
+
48
+ test('bash can handle multi-line commands', async () => {
49
+ const syntax = new Syntax();
50
+ registerBashScript(syntax);
51
+ register(syntax);
52
+ const language = await syntax.getLanguage('bash');
53
+
54
+ const code = '$ echo "line 1"\n$ echo "line 2"';
55
+ const matches = await language.getMatches(syntax, code);
56
+
57
+ // Should find multiple prompts
58
+ const promptMatches = matches.filter(m => m.type === 'prompt');
59
+ assert.ok(promptMatches.length >= 2);
60
+ });
61
+
62
+ test('bash can handle comments in commands', async () => {
63
+ const syntax = new Syntax();
64
+ registerBashScript(syntax);
65
+ register(syntax);
66
+ const language = await syntax.getLanguage('bash');
67
+
68
+ const code = '$ echo test # inline comment';
69
+ const matches = await language.getMatches(syntax, code);
70
+
71
+ // Should have prompt at minimum
72
+ assert.ok(matches.length > 0);
73
+ });
74
+
75
+ test('bash can handle strings in commands', async () => {
76
+ const syntax = new Syntax();
77
+ registerBashScript(syntax);
78
+ register(syntax);
79
+ const language = await syntax.getLanguage('bash');
80
+
81
+ const code = '$ echo "hello world"';
82
+ const matches = await language.getMatches(syntax, code);
83
+
84
+ assert.ok(matches.length > 0);
85
+ });
86
+
87
+ test('bash can match dollar sign prompts', async () => {
88
+ const syntax = new Syntax();
89
+ registerBashScript(syntax);
90
+ register(syntax);
91
+ const language = await syntax.getLanguage('bash');
92
+
93
+ const code = '$ pwd';
94
+ const matches = await language.getMatches(syntax, code);
95
+
96
+ const prompt = matches.find(m => m.type === 'prompt');
97
+ assert.ok(prompt);
98
+ assert.strictEqual(prompt.value, '$');
99
+ });
100
+
101
+ test('bash can match hash prompts for root', async () => {
102
+ const syntax = new Syntax();
103
+ registerBashScript(syntax);
104
+ register(syntax);
105
+ const language = await syntax.getLanguage('bash');
106
+
107
+ const code = '# whoami';
108
+ const matches = await language.getMatches(syntax, code);
109
+
110
+ // Could be either prompt or comment depending on pattern priority
111
+ assert.ok(matches.length > 0);
112
+ });
113
+
114
+ test('bash can handle complex command with options', async () => {
115
+ const syntax = new Syntax();
116
+ registerBashScript(syntax);
117
+ register(syntax);
118
+ const language = await syntax.getLanguage('bash');
119
+
120
+ const code = '$ grep -r "pattern" /path/to/dir';
121
+ const matches = await language.getMatches(syntax, code);
122
+
123
+ assert.ok(matches.length > 0);
124
+ const hasPrompt = matches.some(m => m.type === 'prompt');
125
+ assert.ok(hasPrompt);
126
+ });
127
+
128
+ test('bash can handle pipes in commands', async () => {
129
+ const syntax = new Syntax();
130
+ registerBashScript(syntax);
131
+ register(syntax);
132
+ const language = await syntax.getLanguage('bash');
133
+
134
+ const code = '$ cat file.txt | grep search';
135
+ const matches = await language.getMatches(syntax, code);
136
+
137
+ assert.ok(matches.length > 0);
138
+ });
139
+
140
+ test('bash can handle command substitution', async () => {
141
+ const syntax = new Syntax();
142
+ registerBashScript(syntax);
143
+ register(syntax);
144
+ const language = await syntax.getLanguage('bash');
145
+
146
+ const code = '$ echo $(date)';
147
+ const matches = await language.getMatches(syntax, code);
148
+
149
+ assert.ok(matches.length > 0);
150
+ });
151
+
152
+ test('bash can handle variables in commands', async () => {
153
+ const syntax = new Syntax();
154
+ registerBashScript(syntax);
155
+ register(syntax);
156
+ const language = await syntax.getLanguage('bash');
157
+
158
+ const code = '$ echo $PATH';
159
+ const matches = await language.getMatches(syntax, code);
160
+
161
+ assert.ok(matches.length > 0);
162
+ });
@@ -0,0 +1,265 @@
1
+ /**
2
+ * Tests for BASIC/VB language definition
3
+ */
4
+
5
+ import {test} from 'node:test';
6
+ import assert from 'node:assert';
7
+
8
+ import Syntax from '../../../Syntax.js';
9
+ import register from '../../../Syntax/Language/basic.js';
10
+
11
+ test('BASIC language can be registered', async () => {
12
+ const syntax = new Syntax();
13
+ register(syntax);
14
+ const language = await syntax.getLanguage('basic');
15
+ assert.ok(language);
16
+ assert.strictEqual(language.name, 'basic');
17
+ });
18
+
19
+ test('BASIC can be registered with vb alias', async () => {
20
+ const syntax = new Syntax();
21
+ register(syntax);
22
+ const language = await syntax.getLanguage('vb');
23
+ assert.ok(language);
24
+ assert.strictEqual(language.name, 'basic');
25
+ });
26
+
27
+ test('BASIC can highlight keywords', async () => {
28
+ const syntax = new Syntax();
29
+ register(syntax);
30
+ const language = await syntax.getLanguage('basic');
31
+
32
+ const code = 'Dim x As Integer\nIf x > 0 Then\n Print x\nEnd If';
33
+ const matches = await language.getMatches(syntax, code);
34
+
35
+ const keywords = matches.filter(m => m.type === 'keyword');
36
+ assert.ok(keywords.length > 0);
37
+ assert.ok(keywords.some(m => m.value.toLowerCase() === 'dim'));
38
+ assert.ok(keywords.some(m => m.value.toLowerCase() === 'if'));
39
+ assert.ok(keywords.some(m => m.value.toLowerCase() === 'then'));
40
+ assert.ok(keywords.some(m => m.value.toLowerCase() === 'end'));
41
+ });
42
+
43
+ test('BASIC can highlight types', async () => {
44
+ const syntax = new Syntax();
45
+ register(syntax);
46
+ const language = await syntax.getLanguage('basic');
47
+
48
+ const code = 'Dim x As Integer\nDim s As String';
49
+ const matches = await language.getMatches(syntax, code);
50
+
51
+ const types = matches.filter(m => m.type === 'type');
52
+ assert.ok(types.length > 0);
53
+ assert.ok(types.some(m => m.value === 'Integer'));
54
+ assert.ok(types.some(m => m.value === 'String'));
55
+ });
56
+
57
+ test('BASIC can highlight access modifiers', async () => {
58
+ const syntax = new Syntax();
59
+ register(syntax);
60
+ const language = await syntax.getLanguage('basic');
61
+
62
+ const code = 'Public Sub MyMethod()\nPrivate x As Integer\nEnd Sub';
63
+ const matches = await language.getMatches(syntax, code);
64
+
65
+ const access = matches.filter(m => m.type === 'access');
66
+ assert.ok(access.length > 0);
67
+ assert.ok(access.some(m => m.value === 'Public'));
68
+ assert.ok(access.some(m => m.value === 'Private'));
69
+ });
70
+
71
+ test('BASIC can highlight constants', async () => {
72
+ const syntax = new Syntax();
73
+ register(syntax);
74
+ const language = await syntax.getLanguage('basic');
75
+
76
+ const code = 'If x = True Then\n y = False\nEnd If';
77
+ const matches = await language.getMatches(syntax, code);
78
+
79
+ const constants = matches.filter(m => m.type === 'constant');
80
+ assert.ok(constants.length > 0);
81
+ assert.ok(constants.some(m => m.value === 'True'));
82
+ assert.ok(constants.some(m => m.value === 'False'));
83
+ });
84
+
85
+ test('BASIC can highlight Me/MyClass/MyBase', async () => {
86
+ const syntax = new Syntax();
87
+ register(syntax);
88
+ const language = await syntax.getLanguage('basic');
89
+
90
+ const code = 'Me.Property = MyBase.Value';
91
+ const matches = await language.getMatches(syntax, code);
92
+
93
+ const constants = matches.filter(m => m.type === 'constant');
94
+ assert.ok(constants.some(m => m.value === 'Me'));
95
+ assert.ok(constants.some(m => m.value === 'MyBase'));
96
+ });
97
+
98
+ test('BASIC can highlight operators', async () => {
99
+ const syntax = new Syntax();
100
+ register(syntax);
101
+ const language = await syntax.getLanguage('basic');
102
+
103
+ const code = 'x = y + z - 5 * 2';
104
+ const matches = await language.getMatches(syntax, code);
105
+
106
+ const operators = matches.filter(m => m.type === 'operator');
107
+ assert.ok(operators.length > 0);
108
+ assert.ok(operators.some(m => m.value === '+'));
109
+ assert.ok(operators.some(m => m.value === '-'));
110
+ assert.ok(operators.some(m => m.value === '*'));
111
+ });
112
+
113
+ test('BASIC can highlight VB-style comments', async () => {
114
+ const syntax = new Syntax();
115
+ register(syntax);
116
+ const language = await syntax.getLanguage('basic');
117
+
118
+ const code = "' This is a comment\nDim x As Integer";
119
+ const matches = await language.getMatches(syntax, code);
120
+
121
+ const comment = matches.find(m => m.type === 'comment');
122
+ assert.ok(comment);
123
+ assert.ok(comment.value.includes('This is a comment'));
124
+ });
125
+
126
+ test('BASIC can highlight REM comments', async () => {
127
+ const syntax = new Syntax();
128
+ register(syntax);
129
+ const language = await syntax.getLanguage('basic');
130
+
131
+ const code = 'REM This is a remark\nDim x As Integer';
132
+ const matches = await language.getMatches(syntax, code);
133
+
134
+ const rem = matches.find(
135
+ m => m.type === 'keyword' && m.value.toLowerCase() === 'rem'
136
+ );
137
+ assert.ok(rem);
138
+ });
139
+
140
+ test('BASIC can highlight double-quoted strings', async () => {
141
+ const syntax = new Syntax();
142
+ register(syntax);
143
+ const language = await syntax.getLanguage('basic');
144
+
145
+ const code = 'Dim msg As String = "Hello World"';
146
+ const matches = await language.getMatches(syntax, code);
147
+
148
+ const string = matches.find(m => m.type === 'string');
149
+ assert.ok(string);
150
+ });
151
+
152
+ test('BASIC can highlight numbers', async () => {
153
+ const syntax = new Syntax();
154
+ register(syntax);
155
+ const language = await syntax.getLanguage('basic');
156
+
157
+ const code = 'Dim x As Integer = 42';
158
+ const matches = await language.getMatches(syntax, code);
159
+
160
+ const number = matches.find(m => m.type === 'constant' && m.value === '42');
161
+ assert.ok(number);
162
+ });
163
+
164
+ test('BASIC can highlight Function declarations', async () => {
165
+ const syntax = new Syntax();
166
+ register(syntax);
167
+ const language = await syntax.getLanguage('basic');
168
+
169
+ const code =
170
+ 'Function Add(a As Integer, b As Integer) As Integer\n Return a + b\nEnd Function';
171
+ const matches = await language.getMatches(syntax, code);
172
+
173
+ const keywords = matches.filter(m => m.type === 'keyword');
174
+ assert.ok(keywords.some(m => m.value.toLowerCase() === 'function'));
175
+ assert.ok(keywords.some(m => m.value.toLowerCase() === 'return'));
176
+ });
177
+
178
+ test('BASIC can highlight Sub declarations', async () => {
179
+ const syntax = new Syntax();
180
+ register(syntax);
181
+ const language = await syntax.getLanguage('basic');
182
+
183
+ const code = 'Sub MyMethod()\n Print "Hello"\nEnd Sub';
184
+ const matches = await language.getMatches(syntax, code);
185
+
186
+ const keywords = matches.filter(m => m.type === 'keyword');
187
+ assert.ok(keywords.some(m => m.value.toLowerCase() === 'sub'));
188
+ });
189
+
190
+ test('BASIC can highlight For loops', async () => {
191
+ const syntax = new Syntax();
192
+ register(syntax);
193
+ const language = await syntax.getLanguage('basic');
194
+
195
+ const code = 'For i = 1 To 10\n Print i\nNext i';
196
+ const matches = await language.getMatches(syntax, code);
197
+
198
+ const keywords = matches.filter(m => m.type === 'keyword');
199
+ assert.ok(keywords.some(m => m.value.toLowerCase() === 'for'));
200
+ assert.ok(keywords.some(m => m.value.toLowerCase() === 'to'));
201
+ assert.ok(keywords.some(m => m.value.toLowerCase() === 'next'));
202
+ });
203
+
204
+ test('BASIC can highlight While loops', async () => {
205
+ const syntax = new Syntax();
206
+ register(syntax);
207
+ const language = await syntax.getLanguage('basic');
208
+
209
+ const code = 'While x < 10\n x = x + 1\nEnd While';
210
+ const matches = await language.getMatches(syntax, code);
211
+
212
+ const keywords = matches.filter(m => m.type === 'keyword');
213
+ assert.ok(keywords.some(m => m.value.toLowerCase() === 'while'));
214
+ });
215
+
216
+ test('BASIC can highlight Select Case', async () => {
217
+ const syntax = new Syntax();
218
+ register(syntax);
219
+ const language = await syntax.getLanguage('basic');
220
+
221
+ const code = 'Select Case x\n Case 1\n Print "One"\nEnd Select';
222
+ const matches = await language.getMatches(syntax, code);
223
+
224
+ const keywords = matches.filter(m => m.type === 'keyword');
225
+ assert.ok(keywords.some(m => m.value.toLowerCase() === 'select'));
226
+ assert.ok(keywords.some(m => m.value.toLowerCase() === 'case'));
227
+ });
228
+
229
+ test('BASIC can highlight Class declarations', async () => {
230
+ const syntax = new Syntax();
231
+ register(syntax);
232
+ const language = await syntax.getLanguage('basic');
233
+
234
+ const code = 'Public Class MyClass\n Private x As Integer\nEnd Class';
235
+ const matches = await language.getMatches(syntax, code);
236
+
237
+ const keywords = matches.filter(m => m.type === 'keyword');
238
+ assert.ok(keywords.some(m => m.value.toLowerCase() === 'class'));
239
+ });
240
+
241
+ test('BASIC can highlight Nothing constant', async () => {
242
+ const syntax = new Syntax();
243
+ register(syntax);
244
+ const language = await syntax.getLanguage('basic');
245
+
246
+ const code = 'If obj Is Nothing Then';
247
+ const matches = await language.getMatches(syntax, code);
248
+
249
+ const constants = matches.filter(m => m.type === 'constant');
250
+ assert.ok(constants.some(m => m.value === 'Nothing'));
251
+ });
252
+
253
+ test('BASIC can highlight CamelCase types', async () => {
254
+ const syntax = new Syntax();
255
+ register(syntax);
256
+ const language = await syntax.getLanguage('basic');
257
+
258
+ const code = 'Dim customer As CustomerRecord';
259
+ const matches = await language.getMatches(syntax, code);
260
+
261
+ const type = matches.find(
262
+ m => m.type === 'type' && m.value === 'CustomerRecord'
263
+ );
264
+ assert.ok(type);
265
+ });