@herb-tools/printer 0.6.0 → 0.6.1

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.
package/dist/printer.js CHANGED
@@ -32,6 +32,11 @@ export class Printer extends Visitor {
32
32
  if (isToken(input)) {
33
33
  return input.value;
34
34
  }
35
+ if (Array.isArray(input)) {
36
+ this.context.reset();
37
+ input.forEach(node => this.visit(node));
38
+ return this.context.getOutput();
39
+ }
35
40
  const node = isParseResult(input) ? input.value : input;
36
41
  if (options.ignoreErrors === false && node.recursiveErrors().length > 0) {
37
42
  throw new Error(`Cannot print the node (${node.type}) since it or any of its children has parse errors. Either pass in a valid Node or call \`print()\` using \`print(node, { ignoreErrors: true })\``);
@@ -40,284 +45,6 @@ export class Printer extends Visitor {
40
45
  this.visit(node);
41
46
  return this.context.getOutput();
42
47
  }
43
- visitDocumentNode(node) {
44
- this.visitChildNodes(node);
45
- }
46
- visitLiteralNode(node) {
47
- this.context.write(node.content);
48
- }
49
- visitHTMLTextNode(node) {
50
- this.write(node.content);
51
- }
52
- visitWhitespaceNode(node) {
53
- if (node.value) {
54
- this.write(node.value.value);
55
- }
56
- }
57
- visitHTMLOpenTagNode(node) {
58
- if (node.tag_opening) {
59
- this.context.write(node.tag_opening.value);
60
- }
61
- if (node.tag_name) {
62
- this.context.write(node.tag_name.value);
63
- }
64
- this.visitChildNodes(node);
65
- if (node.tag_closing) {
66
- this.context.write(node.tag_closing.value);
67
- }
68
- }
69
- visitHTMLCloseTagNode(node) {
70
- if (node.tag_opening) {
71
- this.context.write(node.tag_opening.value);
72
- }
73
- if (node.tag_name) {
74
- this.context.write(node.tag_name.value);
75
- }
76
- if (node.tag_closing) {
77
- this.context.write(node.tag_closing.value);
78
- }
79
- }
80
- visitHTMLElementNode(node) {
81
- const tagName = node.tag_name?.value;
82
- if (tagName) {
83
- this.context.enterTag(tagName);
84
- }
85
- if (node.open_tag) {
86
- this.visit(node.open_tag);
87
- }
88
- if (node.body) {
89
- node.body.forEach(child => this.visit(child));
90
- }
91
- if (node.close_tag) {
92
- this.visit(node.close_tag);
93
- }
94
- if (tagName) {
95
- this.context.exitTag();
96
- }
97
- }
98
- visitHTMLAttributeNode(node) {
99
- if (node.name) {
100
- this.visit(node.name);
101
- }
102
- if (node.equals) {
103
- this.context.write(node.equals.value);
104
- }
105
- if (node.equals && node.value) {
106
- this.visit(node.value);
107
- }
108
- }
109
- visitHTMLAttributeNameNode(node) {
110
- this.visitChildNodes(node);
111
- }
112
- visitHTMLAttributeValueNode(node) {
113
- if (node.quoted && node.open_quote) {
114
- this.context.write(node.open_quote.value);
115
- }
116
- this.visitChildNodes(node);
117
- if (node.quoted && node.close_quote) {
118
- this.context.write(node.close_quote.value);
119
- }
120
- }
121
- visitHTMLCommentNode(node) {
122
- if (node.comment_start) {
123
- this.context.write(node.comment_start.value);
124
- }
125
- this.visitChildNodes(node);
126
- if (node.comment_end) {
127
- this.context.write(node.comment_end.value);
128
- }
129
- }
130
- visitHTMLDoctypeNode(node) {
131
- if (node.tag_opening) {
132
- this.context.write(node.tag_opening.value);
133
- }
134
- this.visitChildNodes(node);
135
- if (node.tag_closing) {
136
- this.context.write(node.tag_closing.value);
137
- }
138
- }
139
- visitXMLDeclarationNode(node) {
140
- if (node.tag_opening) {
141
- this.context.write(node.tag_opening.value);
142
- }
143
- this.visitChildNodes(node);
144
- if (node.tag_closing) {
145
- this.context.write(node.tag_closing.value);
146
- }
147
- }
148
- visitCDATANode(node) {
149
- if (node.tag_opening) {
150
- this.context.write(node.tag_opening.value);
151
- }
152
- this.visitChildNodes(node);
153
- if (node.tag_closing) {
154
- this.context.write(node.tag_closing.value);
155
- }
156
- }
157
- visitERBContentNode(node) {
158
- this.printERBNode(node);
159
- }
160
- visitERBIfNode(node) {
161
- this.printERBNode(node);
162
- if (node.statements) {
163
- node.statements.forEach(statement => this.visit(statement));
164
- }
165
- if (node.subsequent) {
166
- this.visit(node.subsequent);
167
- }
168
- if (node.end_node) {
169
- this.visit(node.end_node);
170
- }
171
- }
172
- visitERBElseNode(node) {
173
- this.printERBNode(node);
174
- if (node.statements) {
175
- node.statements.forEach(statement => this.visit(statement));
176
- }
177
- }
178
- visitERBEndNode(node) {
179
- this.printERBNode(node);
180
- }
181
- visitERBBlockNode(node) {
182
- this.printERBNode(node);
183
- if (node.body) {
184
- node.body.forEach(child => this.visit(child));
185
- }
186
- if (node.end_node) {
187
- this.visit(node.end_node);
188
- }
189
- }
190
- visitERBCaseNode(node) {
191
- this.printERBNode(node);
192
- if (node.children) {
193
- node.children.forEach(child => this.visit(child));
194
- }
195
- if (node.conditions) {
196
- node.conditions.forEach(condition => this.visit(condition));
197
- }
198
- if (node.else_clause) {
199
- this.visit(node.else_clause);
200
- }
201
- if (node.end_node) {
202
- this.visit(node.end_node);
203
- }
204
- }
205
- visitERBWhenNode(node) {
206
- this.printERBNode(node);
207
- if (node.statements) {
208
- node.statements.forEach(statement => this.visit(statement));
209
- }
210
- }
211
- visitERBWhileNode(node) {
212
- this.printERBNode(node);
213
- if (node.statements) {
214
- node.statements.forEach(statement => this.visit(statement));
215
- }
216
- if (node.end_node) {
217
- this.visit(node.end_node);
218
- }
219
- }
220
- visitERBUntilNode(node) {
221
- this.printERBNode(node);
222
- if (node.statements) {
223
- node.statements.forEach(statement => this.visit(statement));
224
- }
225
- if (node.end_node) {
226
- this.visit(node.end_node);
227
- }
228
- }
229
- visitERBForNode(node) {
230
- this.printERBNode(node);
231
- if (node.statements) {
232
- node.statements.forEach(statement => this.visit(statement));
233
- }
234
- if (node.end_node) {
235
- this.visit(node.end_node);
236
- }
237
- }
238
- visitERBBeginNode(node) {
239
- this.printERBNode(node);
240
- if (node.statements) {
241
- node.statements.forEach(statement => this.visit(statement));
242
- }
243
- if (node.rescue_clause) {
244
- this.visit(node.rescue_clause);
245
- }
246
- if (node.else_clause) {
247
- this.visit(node.else_clause);
248
- }
249
- if (node.ensure_clause) {
250
- this.visit(node.ensure_clause);
251
- }
252
- if (node.end_node) {
253
- this.visit(node.end_node);
254
- }
255
- }
256
- visitERBRescueNode(node) {
257
- this.printERBNode(node);
258
- if (node.statements) {
259
- node.statements.forEach(statement => this.visit(statement));
260
- }
261
- if (node.subsequent) {
262
- this.visit(node.subsequent);
263
- }
264
- }
265
- visitERBEnsureNode(node) {
266
- this.printERBNode(node);
267
- if (node.statements) {
268
- node.statements.forEach(statement => this.visit(statement));
269
- }
270
- }
271
- visitERBUnlessNode(node) {
272
- this.printERBNode(node);
273
- if (node.statements) {
274
- node.statements.forEach(statement => this.visit(statement));
275
- }
276
- if (node.else_clause) {
277
- this.visit(node.else_clause);
278
- }
279
- if (node.end_node) {
280
- this.visit(node.end_node);
281
- }
282
- }
283
- visitERBYieldNode(node) {
284
- this.printERBNode(node);
285
- }
286
- visitERBInNode(node) {
287
- this.printERBNode(node);
288
- if (node.statements) {
289
- node.statements.forEach(statement => this.visit(statement));
290
- }
291
- }
292
- visitERBCaseMatchNode(node) {
293
- this.printERBNode(node);
294
- if (node.children) {
295
- node.children.forEach(child => this.visit(child));
296
- }
297
- if (node.conditions) {
298
- node.conditions.forEach(condition => this.visit(condition));
299
- }
300
- if (node.else_clause) {
301
- this.visit(node.else_clause);
302
- }
303
- if (node.end_node) {
304
- this.visit(node.end_node);
305
- }
306
- }
307
- /**
308
- * Print ERB node tags and content
309
- */
310
- printERBNode(node) {
311
- if (node.tag_opening) {
312
- this.context.write(node.tag_opening.value);
313
- }
314
- if (node.content) {
315
- this.context.write(node.content.value);
316
- }
317
- if (node.tag_closing) {
318
- this.context.write(node.tag_closing.value);
319
- }
320
- }
321
48
  write(content) {
322
49
  this.context.write(content);
323
50
  }
@@ -1 +1 @@
1
- {"version":3,"file":"printer.js","sourceRoot":"","sources":["../src/printer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"printer.js","sourceRoot":"","sources":["../src/printer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,OAAO,EAAsB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAcjD;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAiB;IACjD,YAAY,EAAE,KAAK;CACpB,CAAA;AAED,MAAM,OAAgB,OAAQ,SAAQ,OAAO;IACjC,OAAO,GAAiB,IAAI,YAAY,EAAE,CAAA;IAEpD;;;;;;;OAOG;IACH,MAAM,CAAC,KAAK,CAAC,KAA0C,EAAE,UAAwB,qBAAqB;QACpG,MAAM,OAAO,GAAG,IAAK,IAAY,EAAE,CAAA;QAEnC,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACtC,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,KAA0C,EAAE,UAAwB,qBAAqB;QAC7F,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACnB,OAAO,KAAK,CAAC,KAAK,CAAA;QACpB,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;YACpB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;YACvC,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAA;QACjC,CAAC;QAED,MAAM,IAAI,GAAS,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAA;QAE7D,IAAI,OAAO,CAAC,YAAY,KAAK,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxE,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,IAAI,mJAAmJ,CAAC,CAAA;QACzM,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;QAEpB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAEhB,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAA;IACjC,CAAC;IAES,KAAK,CAAC,OAAe;QAC7B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAC7B,CAAC;CACF"}
@@ -1 +1 @@
1
- {"root":["../src/cli.ts","../src/herb-print.ts","../src/identity-printer.ts","../src/index.ts","../src/print-context.ts","../src/printer.ts"],"version":"5.9.2"}
1
+ {"root":["../src/cli.ts","../src/erb-to-ruby-string-printer.ts","../src/herb-print.ts","../src/identity-printer.ts","../src/index.ts","../src/print-context.ts","../src/printer.ts"],"version":"5.9.2"}
@@ -0,0 +1,42 @@
1
+ import { IdentityPrinter } from "./identity-printer.js";
2
+ import { PrintOptions } from "./printer.js";
3
+ import { ERBContentNode } from "@herb-tools/core";
4
+ import { HTMLTextNode, ERBIfNode, ERBUnlessNode, Node, HTMLAttributeValueNode } from "@herb-tools/core";
5
+ export interface ERBToRubyStringOptions extends PrintOptions {
6
+ /**
7
+ * Whether to force wrapping the output in double quotes even for single ERB nodes
8
+ * @default false
9
+ */
10
+ forceQuotes?: boolean;
11
+ }
12
+ export declare const DEFAULT_ERB_TO_RUBY_STRING_OPTIONS: ERBToRubyStringOptions;
13
+ /**
14
+ * ERBToRubyStringPrinter - Converts ERB snippets to Ruby strings with interpolation
15
+ *
16
+ * This printer transforms ERB templates into Ruby strings by:
17
+ * - Converting literal text to string content
18
+ * - Converting <%= %> tags to #{} interpolation
19
+ * - Converting simple if/else blocks to ternary operators
20
+ * - Ignoring <% %> tags (they don't produce output)
21
+ *
22
+ * Examples:
23
+ * - `hello world <%= hello %>` => `"hello world #{hello}"`
24
+ * - `hello world <% hello %>` => `"hello world "`
25
+ * - `Welcome <%= user.name %>!` => `"Welcome #{user.name}!"`
26
+ * - `<% if logged_in? %>Welcome<% else %>Login<% end %>` => `"logged_in? ? "Welcome" : "Login"`
27
+ * - `<% if logged_in? %>Welcome<% else %>Login<% end %>!` => `"#{logged_in? ? "Welcome" : "Login"}!"`
28
+ */
29
+ export declare class ERBToRubyStringPrinter extends IdentityPrinter {
30
+ static print(node: Node, options?: Partial<ERBToRubyStringOptions>): string;
31
+ visitHTMLTextNode(node: HTMLTextNode): void;
32
+ visitERBContentNode(node: ERBContentNode): void;
33
+ visitERBIfNode(node: ERBIfNode): void;
34
+ visitERBUnlessNode(node: ERBUnlessNode): void;
35
+ visitHTMLAttributeValueNode(node: HTMLAttributeValueNode): void;
36
+ private canConvertToTernary;
37
+ private convertToTernary;
38
+ private convertToTernaryWithoutWrapper;
39
+ private canConvertUnlessToTernary;
40
+ private convertUnlessToTernary;
41
+ private convertUnlessToTernaryWithoutWrapper;
42
+ }
@@ -1,4 +1,5 @@
1
1
  import { Printer } from "./printer.js";
2
+ import type * as Nodes from "@herb-tools/core";
2
3
  /**
3
4
  * IdentityPrinter - Provides lossless reconstruction of the original source
4
5
  *
@@ -9,4 +10,38 @@ import { Printer } from "./printer.js";
9
10
  * - Verifying AST round-trip fidelity
10
11
  */
11
12
  export declare class IdentityPrinter extends Printer {
13
+ visitLiteralNode(node: Nodes.LiteralNode): void;
14
+ visitHTMLTextNode(node: Nodes.HTMLTextNode): void;
15
+ visitWhitespaceNode(node: Nodes.WhitespaceNode): void;
16
+ visitHTMLOpenTagNode(node: Nodes.HTMLOpenTagNode): void;
17
+ visitHTMLCloseTagNode(node: Nodes.HTMLCloseTagNode): void;
18
+ visitHTMLElementNode(node: Nodes.HTMLElementNode): void;
19
+ visitHTMLAttributeNode(node: Nodes.HTMLAttributeNode): void;
20
+ visitHTMLAttributeNameNode(node: Nodes.HTMLAttributeNameNode): void;
21
+ visitHTMLAttributeValueNode(node: Nodes.HTMLAttributeValueNode): void;
22
+ visitHTMLCommentNode(node: Nodes.HTMLCommentNode): void;
23
+ visitHTMLDoctypeNode(node: Nodes.HTMLDoctypeNode): void;
24
+ visitXMLDeclarationNode(node: Nodes.XMLDeclarationNode): void;
25
+ visitCDATANode(node: Nodes.CDATANode): void;
26
+ visitERBContentNode(node: Nodes.ERBContentNode): void;
27
+ visitERBIfNode(node: Nodes.ERBIfNode): void;
28
+ visitERBElseNode(node: Nodes.ERBElseNode): void;
29
+ visitERBEndNode(node: Nodes.ERBEndNode): void;
30
+ visitERBBlockNode(node: Nodes.ERBBlockNode): void;
31
+ visitERBCaseNode(node: Nodes.ERBCaseNode): void;
32
+ visitERBWhenNode(node: Nodes.ERBWhenNode): void;
33
+ visitERBWhileNode(node: Nodes.ERBWhileNode): void;
34
+ visitERBUntilNode(node: Nodes.ERBUntilNode): void;
35
+ visitERBForNode(node: Nodes.ERBForNode): void;
36
+ visitERBBeginNode(node: Nodes.ERBBeginNode): void;
37
+ visitERBRescueNode(node: Nodes.ERBRescueNode): void;
38
+ visitERBEnsureNode(node: Nodes.ERBEnsureNode): void;
39
+ visitERBUnlessNode(node: Nodes.ERBUnlessNode): void;
40
+ visitERBYieldNode(node: Nodes.ERBYieldNode): void;
41
+ visitERBInNode(node: Nodes.ERBInNode): void;
42
+ visitERBCaseMatchNode(node: Nodes.ERBCaseMatchNode): void;
43
+ /**
44
+ * Print ERB node tags and content
45
+ */
46
+ protected printERBNode(node: Nodes.ERBNode): void;
12
47
  }
@@ -1,4 +1,5 @@
1
1
  export { IdentityPrinter } from "./identity-printer.js";
2
+ export { ERBToRubyStringPrinter } from "./erb-to-ruby-string-printer.js";
2
3
  export { PrintContext } from "./print-context.js";
3
4
  export { Printer, DEFAULT_PRINT_OPTIONS } from "./printer.js";
4
5
  export type { PrintOptions } from "./printer.js";
@@ -1,6 +1,5 @@
1
1
  import { Node, Visitor, Token, ParseResult } from "@herb-tools/core";
2
2
  import { PrintContext } from "./print-context.js";
3
- import type * as Nodes from "@herb-tools/core";
4
3
  /**
5
4
  * Options for controlling the printing behavior
6
5
  */
@@ -26,7 +25,7 @@ export declare abstract class Printer extends Visitor {
26
25
  * @returns The printed string representation of the input
27
26
  * @throws {Error} When node has parse errors and ignoreErrors is false
28
27
  */
29
- static print(input: Token | Node | ParseResult, options?: PrintOptions): string;
28
+ static print(input: Token | Node | ParseResult | Node[], options?: PrintOptions): string;
30
29
  /**
31
30
  * Print a node, token, or parse result to a string
32
31
  *
@@ -35,41 +34,6 @@ export declare abstract class Printer extends Visitor {
35
34
  * @returns The printed string representation of the input
36
35
  * @throws {Error} When node has parse errors and ignoreErrors is false
37
36
  */
38
- print(input: Token | Node | ParseResult, options?: PrintOptions): string;
39
- visitDocumentNode(node: Nodes.DocumentNode): void;
40
- visitLiteralNode(node: Nodes.LiteralNode): void;
41
- visitHTMLTextNode(node: Nodes.HTMLTextNode): void;
42
- visitWhitespaceNode(node: Nodes.WhitespaceNode): void;
43
- visitHTMLOpenTagNode(node: Nodes.HTMLOpenTagNode): void;
44
- visitHTMLCloseTagNode(node: Nodes.HTMLCloseTagNode): void;
45
- visitHTMLElementNode(node: Nodes.HTMLElementNode): void;
46
- visitHTMLAttributeNode(node: Nodes.HTMLAttributeNode): void;
47
- visitHTMLAttributeNameNode(node: Nodes.HTMLAttributeNameNode): void;
48
- visitHTMLAttributeValueNode(node: Nodes.HTMLAttributeValueNode): void;
49
- visitHTMLCommentNode(node: Nodes.HTMLCommentNode): void;
50
- visitHTMLDoctypeNode(node: Nodes.HTMLDoctypeNode): void;
51
- visitXMLDeclarationNode(node: Nodes.XMLDeclarationNode): void;
52
- visitCDATANode(node: Nodes.CDATANode): void;
53
- visitERBContentNode(node: Nodes.ERBContentNode): void;
54
- visitERBIfNode(node: Nodes.ERBIfNode): void;
55
- visitERBElseNode(node: Nodes.ERBElseNode): void;
56
- visitERBEndNode(node: Nodes.ERBEndNode): void;
57
- visitERBBlockNode(node: Nodes.ERBBlockNode): void;
58
- visitERBCaseNode(node: Nodes.ERBCaseNode): void;
59
- visitERBWhenNode(node: Nodes.ERBWhenNode): void;
60
- visitERBWhileNode(node: Nodes.ERBWhileNode): void;
61
- visitERBUntilNode(node: Nodes.ERBUntilNode): void;
62
- visitERBForNode(node: Nodes.ERBForNode): void;
63
- visitERBBeginNode(node: Nodes.ERBBeginNode): void;
64
- visitERBRescueNode(node: Nodes.ERBRescueNode): void;
65
- visitERBEnsureNode(node: Nodes.ERBEnsureNode): void;
66
- visitERBUnlessNode(node: Nodes.ERBUnlessNode): void;
67
- visitERBYieldNode(node: Nodes.ERBYieldNode): void;
68
- visitERBInNode(node: Nodes.ERBInNode): void;
69
- visitERBCaseMatchNode(node: Nodes.ERBCaseMatchNode): void;
70
- /**
71
- * Print ERB node tags and content
72
- */
73
- protected printERBNode(node: Nodes.ERBNode): void;
37
+ print(input: Token | Node | ParseResult | Node[], options?: PrintOptions): string;
74
38
  protected write(content: string): void;
75
39
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@herb-tools/printer",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "AST printer infrastructure and lossless reconstruction tool for HTML+ERB templates",
5
5
  "license": "MIT",
6
6
  "homepage": "https://herb-tools.dev",
@@ -37,7 +37,7 @@
37
37
  "prepublishOnly": "yarn clean && yarn build && yarn test"
38
38
  },
39
39
  "dependencies": {
40
- "@herb-tools/core": "0.6.0",
40
+ "@herb-tools/core": "0.6.1",
41
41
  "glob": "^10.3.10"
42
42
  },
43
43
  "files": [