ether-code 0.1.9 → 0.2.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.
@@ -0,0 +1,292 @@
1
+ const TokenType = {
2
+ IDENTIFIER: 'IDENTIFIER',
3
+ STRING: 'STRING',
4
+ BLOCK_STRING: 'BLOCK_STRING',
5
+ NUMBER: 'NUMBER',
6
+ INTEGER: 'INTEGER',
7
+ FLOAT: 'FLOAT',
8
+ HEX: 'HEX',
9
+
10
+ COLON: 'COLON',
11
+ DOUBLE_COLON: 'DOUBLE_COLON',
12
+ EQUALS: 'EQUALS',
13
+ DOUBLE_EQUALS: 'DOUBLE_EQUALS',
14
+ TRIPLE_EQUALS: 'TRIPLE_EQUALS',
15
+ NOT_EQUALS: 'NOT_EQUALS',
16
+ NOT_DOUBLE_EQUALS: 'NOT_DOUBLE_EQUALS',
17
+ COMMA: 'COMMA',
18
+ DOT: 'DOT',
19
+ SPREAD: 'SPREAD',
20
+ ARROW: 'ARROW',
21
+ FAT_ARROW: 'FAT_ARROW',
22
+
23
+ PLUS: 'PLUS',
24
+ PLUS_PLUS: 'PLUS_PLUS',
25
+ PLUS_EQUALS: 'PLUS_EQUALS',
26
+ MINUS: 'MINUS',
27
+ MINUS_MINUS: 'MINUS_MINUS',
28
+ MINUS_EQUALS: 'MINUS_EQUALS',
29
+ STAR: 'STAR',
30
+ STAR_EQUALS: 'STAR_EQUALS',
31
+ DOUBLE_STAR: 'DOUBLE_STAR',
32
+ DOUBLE_STAR_EQUALS: 'DOUBLE_STAR_EQUALS',
33
+ SLASH: 'SLASH',
34
+ SLASH_EQUALS: 'SLASH_EQUALS',
35
+ DOUBLE_SLASH: 'DOUBLE_SLASH',
36
+ PERCENT: 'PERCENT',
37
+ PERCENT_EQUALS: 'PERCENT_EQUALS',
38
+
39
+ BANG: 'BANG',
40
+ QUESTION: 'QUESTION',
41
+ DOUBLE_QUESTION: 'DOUBLE_QUESTION',
42
+ QUESTION_DOT: 'QUESTION_DOT',
43
+ QUESTION_QUESTION_EQUALS: 'QUESTION_QUESTION_EQUALS',
44
+ AMPERSAND: 'AMPERSAND',
45
+ AMPERSAND_EQUALS: 'AMPERSAND_EQUALS',
46
+ DOUBLE_AMPERSAND: 'DOUBLE_AMPERSAND',
47
+ PIPE: 'PIPE',
48
+ PIPE_EQUALS: 'PIPE_EQUALS',
49
+ DOUBLE_PIPE: 'DOUBLE_PIPE',
50
+ PIPE_GT: 'PIPE_GT',
51
+ CARET: 'CARET',
52
+ CARET_EQUALS: 'CARET_EQUALS',
53
+ TILDE: 'TILDE',
54
+
55
+ LT: 'LT',
56
+ LT_LT: 'LT_LT',
57
+ GT: 'GT',
58
+ GT_GT: 'GT_GT',
59
+ GT_GT_GT: 'GT_GT_GT',
60
+ LTE: 'LTE',
61
+ GTE: 'GTE',
62
+ SPACESHIP: 'SPACESHIP',
63
+
64
+ AT: 'AT',
65
+ HASH: 'HASH',
66
+ UNDERSCORE: 'UNDERSCORE',
67
+ BACKSLASH: 'BACKSLASH',
68
+ SEMICOLON: 'SEMICOLON',
69
+
70
+ LPAREN: 'LPAREN',
71
+ RPAREN: 'RPAREN',
72
+ LBRACKET: 'LBRACKET',
73
+ RBRACKET: 'RBRACKET',
74
+ LBRACE: 'LBRACE',
75
+ RBRACE: 'RBRACE',
76
+
77
+ NEWLINE: 'NEWLINE',
78
+ INDENT: 'INDENT',
79
+ DEDENT: 'DEDENT',
80
+
81
+ LANG_BLOCK: 'LANG_BLOCK',
82
+
83
+ COMMENT: 'COMMENT',
84
+ BLOCK_COMMENT: 'BLOCK_COMMENT',
85
+
86
+ EOF: 'EOF',
87
+ ERROR: 'ERROR'
88
+ }
89
+
90
+ const LANG_BLOCKS = [
91
+ 'html', 'css', 'style', 'script', 'js', 'javascript',
92
+ 'php', 'python', 'py', 'ruby', 'rb',
93
+ 'sql', 'graphql', 'gql',
94
+ 'node', 'nodejs', 'ts', 'typescript',
95
+ 'react', 'jsx', 'tsx',
96
+ 'json', 'xml', 'yaml', 'markdown', 'md'
97
+ ]
98
+
99
+ const OPERATORS = {
100
+ ':': TokenType.COLON,
101
+ '::': TokenType.DOUBLE_COLON,
102
+ '=': TokenType.EQUALS,
103
+ '==': TokenType.DOUBLE_EQUALS,
104
+ '===': TokenType.TRIPLE_EQUALS,
105
+ '!=': TokenType.NOT_EQUALS,
106
+ '!==': TokenType.NOT_DOUBLE_EQUALS,
107
+ ',': TokenType.COMMA,
108
+ '.': TokenType.DOT,
109
+ '...': TokenType.SPREAD,
110
+ '->': TokenType.ARROW,
111
+ '=>': TokenType.FAT_ARROW,
112
+
113
+ '+': TokenType.PLUS,
114
+ '++': TokenType.PLUS_PLUS,
115
+ '+=': TokenType.PLUS_EQUALS,
116
+ '-': TokenType.MINUS,
117
+ '--': TokenType.MINUS_MINUS,
118
+ '-=': TokenType.MINUS_EQUALS,
119
+ '*': TokenType.STAR,
120
+ '*=': TokenType.STAR_EQUALS,
121
+ '**': TokenType.DOUBLE_STAR,
122
+ '**=': TokenType.DOUBLE_STAR_EQUALS,
123
+ '/': TokenType.SLASH,
124
+ '/=': TokenType.SLASH_EQUALS,
125
+ '//': TokenType.DOUBLE_SLASH,
126
+ '%': TokenType.PERCENT,
127
+ '%=': TokenType.PERCENT_EQUALS,
128
+
129
+ '!': TokenType.BANG,
130
+ '?': TokenType.QUESTION,
131
+ '??': TokenType.DOUBLE_QUESTION,
132
+ '?.': TokenType.QUESTION_DOT,
133
+ '??=': TokenType.QUESTION_QUESTION_EQUALS,
134
+ '&': TokenType.AMPERSAND,
135
+ '&=': TokenType.AMPERSAND_EQUALS,
136
+ '&&': TokenType.DOUBLE_AMPERSAND,
137
+ '|': TokenType.PIPE,
138
+ '|=': TokenType.PIPE_EQUALS,
139
+ '||': TokenType.DOUBLE_PIPE,
140
+ '|>': TokenType.PIPE_GT,
141
+ '^': TokenType.CARET,
142
+ '^=': TokenType.CARET_EQUALS,
143
+ '~': TokenType.TILDE,
144
+
145
+ '<': TokenType.LT,
146
+ '<<': TokenType.LT_LT,
147
+ '>': TokenType.GT,
148
+ '>>': TokenType.GT_GT,
149
+ '>>>': TokenType.GT_GT_GT,
150
+ '<=': TokenType.LTE,
151
+ '>=': TokenType.GTE,
152
+ '<=>': TokenType.SPACESHIP,
153
+
154
+ '@': TokenType.AT,
155
+ '#': TokenType.HASH,
156
+ '\\': TokenType.BACKSLASH,
157
+ ';': TokenType.SEMICOLON,
158
+
159
+ '(': TokenType.LPAREN,
160
+ ')': TokenType.RPAREN,
161
+ '[': TokenType.LBRACKET,
162
+ ']': TokenType.RBRACKET,
163
+ '{': TokenType.LBRACE,
164
+ '}': TokenType.RBRACE
165
+ }
166
+
167
+ const COMPOUND_KEYWORDS_FR = [
168
+ 'en ligne',
169
+ 'hors ligne',
170
+ 'au survol',
171
+ 'au clic',
172
+ 'au focus',
173
+ 'au focus dans',
174
+ 'au double clic',
175
+ 'au changement',
176
+ 'a la soumission',
177
+ 'a la reinitialisation',
178
+ 'retour a la ligne',
179
+ 'lecture seule',
180
+ 'zone texte',
181
+ 'case a cocher',
182
+ 'bouton radio',
183
+ 'premiere lettre',
184
+ 'premiere ligne',
185
+ 'inferieur ou egal',
186
+ 'superieur ou egal',
187
+ 'espace de noms',
188
+ 'element liste',
189
+ 'racine carree',
190
+ 'nouvelle fenetre',
191
+ 'gauche a droite',
192
+ 'droite a gauche',
193
+ 'definir defaut',
194
+ 'mettre a jour',
195
+ 'cle primaire',
196
+ 'cle etrangere',
197
+ 'non nul',
198
+ 'par defaut',
199
+ 'pointeur bas',
200
+ 'pointeur haut',
201
+ 'obtenir contenu',
202
+ 'erreur type',
203
+ 'erreur syntaxe',
204
+ 'nettoyer gauche',
205
+ 'nettoyer droite',
206
+ 'vers date',
207
+ 'si null',
208
+ 'creer role'
209
+ ]
210
+
211
+ class Token {
212
+ constructor(type, value, line, column, indent = 0) {
213
+ this.type = type
214
+ this.value = value
215
+ this.line = line
216
+ this.column = column
217
+ this.indent = indent
218
+ }
219
+
220
+ is(type) {
221
+ return this.type === type
222
+ }
223
+
224
+ isOneOf(...types) {
225
+ return types.includes(this.type)
226
+ }
227
+
228
+ isOperator() {
229
+ return Object.values(OPERATORS).includes(this.type)
230
+ }
231
+
232
+ isLiteral() {
233
+ return this.isOneOf(
234
+ TokenType.STRING,
235
+ TokenType.BLOCK_STRING,
236
+ TokenType.INTEGER,
237
+ TokenType.FLOAT,
238
+ TokenType.HEX
239
+ )
240
+ }
241
+
242
+ isKeyword(keyword) {
243
+ return this.type === TokenType.IDENTIFIER && this.value.toLowerCase() === keyword.toLowerCase()
244
+ }
245
+
246
+ toString() {
247
+ return `Token(${this.type}, ${JSON.stringify(this.value)}, L${this.line}:${this.column})`
248
+ }
249
+
250
+ toJSON() {
251
+ return {
252
+ type: this.type,
253
+ value: this.value,
254
+ line: this.line,
255
+ column: this.column,
256
+ indent: this.indent
257
+ }
258
+ }
259
+ }
260
+
261
+ function normalizeAccents(str) {
262
+ const accentsMap = {
263
+ 'à': 'a', 'â': 'a', 'ä': 'a', 'á': 'a',
264
+ 'è': 'e', 'ê': 'e', 'ë': 'e', 'é': 'e',
265
+ 'ì': 'i', 'î': 'i', 'ï': 'i', 'í': 'i',
266
+ 'ò': 'o', 'ô': 'o', 'ö': 'o', 'ó': 'o',
267
+ 'ù': 'u', 'û': 'u', 'ü': 'u', 'ú': 'u',
268
+ 'ç': 'c', 'ñ': 'n'
269
+ }
270
+ return str.toLowerCase().split('').map(c => accentsMap[c] || c).join('')
271
+ }
272
+
273
+ function isCompoundKeyword(phrase) {
274
+ const normalized = normalizeAccents(phrase)
275
+ return COMPOUND_KEYWORDS_FR.includes(normalized)
276
+ }
277
+
278
+ function couldBeCompoundStart(partial) {
279
+ const normalized = normalizeAccents(partial)
280
+ return COMPOUND_KEYWORDS_FR.some(c => c.startsWith(normalized + ' '))
281
+ }
282
+
283
+ module.exports = {
284
+ Token,
285
+ TokenType,
286
+ LANG_BLOCKS,
287
+ OPERATORS,
288
+ COMPOUND_KEYWORDS_FR,
289
+ normalizeAccents,
290
+ isCompoundKeyword,
291
+ couldBeCompoundStart
292
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ether-code",
3
- "version": "0.1.9",
3
+ "version": "0.2.0",
4
4
  "description": "Ether - Le langage intentionnel",
5
5
  "main": "cli/compiler.js",
6
6
  "bin": {