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,386 @@
1
+ /**
2
+ * Tests for Go 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
+ // Set up JSDOM
11
+ const dom = new JSDOM('<!DOCTYPE html><html><body></body></html>');
12
+ global.window = dom.window;
13
+ global.document = dom.window.document;
14
+ global.HTMLElement = dom.window.HTMLElement;
15
+ global.customElements = dom.window.customElements;
16
+
17
+ const syntax = new Syntax();
18
+
19
+ test('Go language can be registered', async () => {
20
+ const language = await syntax.getResource('go');
21
+ assert.ok(language);
22
+ assert.equal(language.name, 'go');
23
+ });
24
+
25
+ test('Go can match keywords', async () => {
26
+ const language = await syntax.getResource('go');
27
+ const code = 'func main() { var x int }';
28
+ const matches = await language.getMatches(syntax, code);
29
+
30
+ const keywords = matches.filter(m => m.type === 'keyword');
31
+ assert.ok(keywords.length > 0);
32
+ assert.ok(keywords.some(m => m.value === 'func'));
33
+ assert.ok(keywords.some(m => m.value === 'var'));
34
+ });
35
+
36
+ test('Go can match package declaration', async () => {
37
+ const language = await syntax.getResource('go');
38
+ const matches = await language.getMatches(syntax, 'package main');
39
+
40
+ const keywords = matches.filter(m => m.type === 'keyword');
41
+ assert.ok(keywords.some(m => m.value === 'package'));
42
+ });
43
+
44
+ test('Go can match import statements', async () => {
45
+ const language = await syntax.getResource('go');
46
+ const matches = await language.getMatches(syntax, 'import "fmt"');
47
+
48
+ const keywords = matches.filter(m => m.type === 'keyword');
49
+ assert.ok(keywords.some(m => m.value === 'import'));
50
+ });
51
+
52
+ test('Go can match control flow keywords', async () => {
53
+ const language = await syntax.getResource('go');
54
+ const code = 'if x > 0 { return } else { break }';
55
+ const matches = await language.getMatches(syntax, code);
56
+
57
+ const keywords = matches.filter(m => m.type === 'keyword');
58
+ assert.ok(keywords.some(m => m.value === 'if'));
59
+ assert.ok(keywords.some(m => m.value === 'else'));
60
+ assert.ok(keywords.some(m => m.value === 'return'));
61
+ assert.ok(keywords.some(m => m.value === 'break'));
62
+ });
63
+
64
+ test('Go can match for loops', async () => {
65
+ const language = await syntax.getResource('go');
66
+ const matches = await language.getMatches(syntax, 'for i := 0; i < 10; i++ {');
67
+
68
+ const keywords = matches.filter(m => m.type === 'keyword');
69
+ assert.ok(keywords.some(m => m.value === 'for'));
70
+ });
71
+
72
+ test('Go can match range loops', async () => {
73
+ const language = await syntax.getResource('go');
74
+ const matches = await language.getMatches(syntax, 'for i, v := range items {');
75
+
76
+ const keywords = matches.filter(m => m.type === 'keyword');
77
+ assert.ok(keywords.some(m => m.value === 'for'));
78
+ assert.ok(keywords.some(m => m.value === 'range'));
79
+ });
80
+
81
+ test('Go can match switch statements', async () => {
82
+ const language = await syntax.getResource('go');
83
+ const code = 'switch x { case 1: fallthrough default: }';
84
+ const matches = await language.getMatches(syntax, code);
85
+
86
+ const keywords = matches.filter(m => m.type === 'keyword');
87
+ assert.ok(keywords.some(m => m.value === 'switch'));
88
+ assert.ok(keywords.some(m => m.value === 'case'));
89
+ assert.ok(keywords.some(m => m.value === 'fallthrough'));
90
+ assert.ok(keywords.some(m => m.value === 'default'));
91
+ });
92
+
93
+ test('Go can match defer keyword', async () => {
94
+ const language = await syntax.getResource('go');
95
+ const matches = await language.getMatches(syntax, 'defer file.Close()');
96
+
97
+ const keywords = matches.filter(m => m.type === 'keyword');
98
+ assert.ok(keywords.some(m => m.value === 'defer'));
99
+ });
100
+
101
+ test('Go can match go keyword (goroutines)', async () => {
102
+ const language = await syntax.getResource('go');
103
+ const matches = await language.getMatches(syntax, 'go processData(x)');
104
+
105
+ const keywords = matches.filter(m => m.type === 'keyword');
106
+ assert.ok(keywords.some(m => m.value === 'go'));
107
+ });
108
+
109
+ test('Go can match channel keywords', async () => {
110
+ const language = await syntax.getResource('go');
111
+ const code = 'var ch chan int; select { case <-ch: }';
112
+ const matches = await language.getMatches(syntax, code);
113
+
114
+ const keywords = matches.filter(m => m.type === 'keyword');
115
+ assert.ok(keywords.some(m => m.value === 'chan'));
116
+ assert.ok(keywords.some(m => m.value === 'select'));
117
+ });
118
+
119
+ test('Go can match type declarations', async () => {
120
+ const language = await syntax.getResource('go');
121
+ const code = 'type Person struct { name string }';
122
+ const matches = await language.getMatches(syntax, code);
123
+
124
+ const keywords = matches.filter(m => m.type === 'keyword');
125
+ assert.ok(keywords.some(m => m.value === 'type'));
126
+ assert.ok(keywords.some(m => m.value === 'struct'));
127
+ });
128
+
129
+ test('Go can match interface keyword', async () => {
130
+ const language = await syntax.getResource('go');
131
+ const matches = await language.getMatches(syntax, 'type Reader interface {');
132
+
133
+ const keywords = matches.filter(m => m.type === 'keyword');
134
+ assert.ok(keywords.some(m => m.value === 'interface'));
135
+ });
136
+
137
+ test('Go can match map keyword', async () => {
138
+ const language = await syntax.getResource('go');
139
+ const matches = await language.getMatches(syntax, 'var m map[string]int');
140
+
141
+ const keywords = matches.filter(m => m.type === 'keyword');
142
+ assert.ok(keywords.some(m => m.value === 'map'));
143
+ });
144
+
145
+ test('Go can match basic types', async () => {
146
+ const language = await syntax.getResource('go');
147
+ const code = 'var x int; var y string; var z byte';
148
+ const matches = await language.getMatches(syntax, code);
149
+
150
+ const types = matches.filter(m => m.type === 'type');
151
+ assert.ok(types.some(m => m.value === 'int'));
152
+ assert.ok(types.some(m => m.value === 'string'));
153
+ assert.ok(types.some(m => m.value === 'byte'));
154
+ });
155
+
156
+ test('Go can match integer type variants', async () => {
157
+ const language = await syntax.getResource('go');
158
+ const code = 'var a int8; var b int16; var c int32; var d int64';
159
+ const matches = await language.getMatches(syntax, code);
160
+
161
+ const types = matches.filter(m => m.type === 'type');
162
+ assert.ok(types.some(m => m.value === 'int8'));
163
+ assert.ok(types.some(m => m.value === 'int16'));
164
+ assert.ok(types.some(m => m.value === 'int32'));
165
+ assert.ok(types.some(m => m.value === 'int64'));
166
+ });
167
+
168
+ test('Go can match unsigned integer types', async () => {
169
+ const language = await syntax.getResource('go');
170
+ const code = 'var a uint; var b uint8; var c uintptr';
171
+ const matches = await language.getMatches(syntax, code);
172
+
173
+ const types = matches.filter(m => m.type === 'type');
174
+ assert.ok(types.some(m => m.value === 'uint'));
175
+ assert.ok(types.some(m => m.value === 'uint8'));
176
+ assert.ok(types.some(m => m.value === 'uintptr'));
177
+ });
178
+
179
+ test('Go can match float types', async () => {
180
+ const language = await syntax.getResource('go');
181
+ const code = 'var x float32; var y float64';
182
+ const matches = await language.getMatches(syntax, code);
183
+
184
+ const types = matches.filter(m => m.type === 'type');
185
+ assert.ok(types.some(m => m.value === 'float32'));
186
+ assert.ok(types.some(m => m.value === 'float64'));
187
+ });
188
+
189
+ test('Go can match complex types', async () => {
190
+ const language = await syntax.getResource('go');
191
+ const code = 'var x complex64; var y complex128';
192
+ const matches = await language.getMatches(syntax, code);
193
+
194
+ const types = matches.filter(m => m.type === 'type');
195
+ assert.ok(types.some(m => m.value === 'complex64'));
196
+ assert.ok(types.some(m => m.value === 'complex128'));
197
+ });
198
+
199
+ test('Go can match boolean constants', async () => {
200
+ const language = await syntax.getResource('go');
201
+ const code = 'x := true; y := false';
202
+ const matches = await language.getMatches(syntax, code);
203
+
204
+ const constants = matches.filter(m => m.type === 'constant');
205
+ assert.ok(constants.some(m => m.value === 'true'));
206
+ assert.ok(constants.some(m => m.value === 'false'));
207
+ });
208
+
209
+ test('Go can match nil constant', async () => {
210
+ const language = await syntax.getResource('go');
211
+ const matches = await language.getMatches(syntax, 'var ptr *int = nil');
212
+
213
+ const constants = matches.filter(m => m.type === 'constant');
214
+ assert.ok(constants.some(m => m.value === 'nil'));
215
+ });
216
+
217
+ test('Go can match iota constant', async () => {
218
+ const language = await syntax.getResource('go');
219
+ const matches = await language.getMatches(syntax, 'const ( A = iota; B )');
220
+
221
+ const constants = matches.filter(m => m.type === 'constant');
222
+ assert.ok(constants.some(m => m.value === 'iota'));
223
+ });
224
+
225
+ test('Go can match operators', async () => {
226
+ const language = await syntax.getResource('go');
227
+ const code = 'x := a + b - c * d / e % f';
228
+ const matches = await language.getMatches(syntax, code);
229
+
230
+ const operators = matches.filter(m => m.type === 'operator');
231
+ assert.ok(operators.some(m => m.value === ':='));
232
+ assert.ok(operators.some(m => m.value === '+'));
233
+ assert.ok(operators.some(m => m.value === '-'));
234
+ assert.ok(operators.some(m => m.value === '*'));
235
+ assert.ok(operators.some(m => m.value === '/'));
236
+ });
237
+
238
+ test('Go can match comparison operators', async () => {
239
+ const language = await syntax.getResource('go');
240
+ const code = 'if x == y && a != b || c < d && e > f {';
241
+ const matches = await language.getMatches(syntax, code);
242
+
243
+ const operators = matches.filter(m => m.type === 'operator');
244
+ assert.ok(operators.some(m => m.value === '=='));
245
+ assert.ok(operators.some(m => m.value === '!='));
246
+ assert.ok(operators.some(m => m.value === '<'));
247
+ assert.ok(operators.some(m => m.value === '>'));
248
+ assert.ok(operators.some(m => m.value === '&&'));
249
+ assert.ok(operators.some(m => m.value === '||'));
250
+ });
251
+
252
+ test('Go can match channel operator', async () => {
253
+ const language = await syntax.getResource('go');
254
+ const matches = await language.getMatches(syntax, 'ch <- value');
255
+
256
+ const operators = matches.filter(m => m.type === 'operator');
257
+ assert.ok(operators.some(m => m.value === '<-'));
258
+ });
259
+
260
+ test('Go can match bit clear operator', async () => {
261
+ const language = await syntax.getResource('go');
262
+ const code = 'x &^= y';
263
+ const matches = await language.getMatches(syntax, code);
264
+
265
+ const operators = matches.filter(m => m.type === 'operator');
266
+ assert.ok(operators.some(m => m.value === '&^='));
267
+ });
268
+
269
+ test('Go can match builtin functions', async () => {
270
+ const language = await syntax.getResource('go');
271
+ const code = 'slice := make([]int, len(arr), cap(arr))';
272
+ const matches = await language.getMatches(syntax, code);
273
+
274
+ const functions = matches.filter(m => m.type === 'function');
275
+ assert.ok(functions.some(m => m.value === 'make'));
276
+ assert.ok(functions.some(m => m.value === 'len'));
277
+ assert.ok(functions.some(m => m.value === 'cap'));
278
+ });
279
+
280
+ test('Go can match append function', async () => {
281
+ const language = await syntax.getResource('go');
282
+ const matches = await language.getMatches(
283
+ syntax,
284
+ 'slice = append(slice, item)'
285
+ );
286
+
287
+ const functions = matches.filter(m => m.type === 'function');
288
+ assert.ok(functions.some(m => m.value === 'append'));
289
+ });
290
+
291
+ test('Go can match panic and recover', async () => {
292
+ const language = await syntax.getResource('go');
293
+ const code = 'defer func() { recover() }(); panic("error")';
294
+ const matches = await language.getMatches(syntax, code);
295
+
296
+ const functions = matches.filter(m => m.type === 'function');
297
+ assert.ok(functions.some(m => m.value === 'panic'));
298
+ assert.ok(functions.some(m => m.value === 'recover'));
299
+ });
300
+
301
+ test('Go can match C-style comments', async () => {
302
+ const language = await syntax.getResource('go');
303
+ const matches = await language.getMatches(syntax, '/* block comment */');
304
+
305
+ const comments = matches.filter(m => m.type === 'comment');
306
+ assert.ok(comments.length > 0);
307
+ });
308
+
309
+ test('Go can match C++-style comments', async () => {
310
+ const language = await syntax.getResource('go');
311
+ const matches = await language.getMatches(syntax, '// line comment');
312
+
313
+ const comments = matches.filter(m => m.type === 'comment');
314
+ assert.ok(comments.length > 0);
315
+ });
316
+
317
+ test('Go can match double-quoted strings', async () => {
318
+ const language = await syntax.getResource('go');
319
+ const matches = await language.getMatches(syntax, 'msg := "Hello, World!"');
320
+
321
+ const strings = matches.filter(m => m.type === 'string');
322
+ assert.ok(strings.some(m => m.value.includes('Hello')));
323
+ });
324
+
325
+ test('Go can match single-quoted runes', async () => {
326
+ const language = await syntax.getResource('go');
327
+ const matches = await language.getMatches(syntax, "ch := 'A'");
328
+
329
+ const strings = matches.filter(m => m.type === 'string');
330
+ assert.ok(strings.length > 0);
331
+ });
332
+
333
+ test('Go can match decimal numbers', async () => {
334
+ const language = await syntax.getResource('go');
335
+ const matches = await language.getMatches(syntax, 'x := 42; y := 3.14');
336
+
337
+ const numbers = matches.filter(
338
+ m => m.type === 'constant' && /\d/.test(m.value)
339
+ );
340
+ assert.ok(numbers.length > 0);
341
+ });
342
+
343
+ test('Go can match hexadecimal numbers', async () => {
344
+ const language = await syntax.getResource('go');
345
+ const matches = await language.getMatches(syntax, 'x := 0xFF');
346
+
347
+ const numbers = matches.filter(
348
+ m => m.type === 'constant' && m.value.includes('0x')
349
+ );
350
+ assert.ok(numbers.length > 0);
351
+ });
352
+
353
+ test('Go can match CamelCase types', async () => {
354
+ const language = await syntax.getResource('go');
355
+ const matches = await language.getMatches(syntax, 'var reader io.Reader');
356
+
357
+ const types = matches.filter(m => m.type === 'type' && /^[A-Z]/.test(m.value));
358
+ assert.ok(types.some(m => m.value === 'Reader'));
359
+ });
360
+
361
+ test('Go can process complete code to HTML', async () => {
362
+ const language = await syntax.getResource('go');
363
+ const code = `package main
364
+
365
+ import "fmt"
366
+
367
+ func main() {
368
+ fmt.Println("Hello, World!")
369
+ }`;
370
+
371
+ const html = await language.process(syntax, code);
372
+ assert.ok(html instanceof HTMLElement);
373
+ const text = html.textContent;
374
+ assert.ok(text.includes('package'));
375
+ assert.ok(text.includes('main'));
376
+ assert.ok(text.includes('Hello'));
377
+ });
378
+
379
+ test('Go can build a syntax tree', async () => {
380
+ const language = await syntax.getResource('go');
381
+ const code = 'func add(x, y int) int { return x + y }';
382
+
383
+ const tree = await language.buildTree(syntax, code, 0);
384
+ assert.ok(tree);
385
+ assert.ok(tree.children.length > 0);
386
+ });