postsvg 0.1.0 → 0.3.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 (201) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +105 -0
  3. data/CLAUDE.md +173 -0
  4. data/Gemfile +2 -3
  5. data/README.adoc +456 -179
  6. data/Rakefile +100 -0
  7. data/TODO.roadmap/00-architecture.md +139 -0
  8. data/TODO.roadmap/01-autoload-migration.md +39 -0
  9. data/TODO.roadmap/02-isolate-dormant-code.md +51 -0
  10. data/TODO.roadmap/03-domain-model.md +66 -0
  11. data/TODO.roadmap/04-lexer.md +40 -0
  12. data/TODO.roadmap/05-parser.md +43 -0
  13. data/TODO.roadmap/06-graphics-state.md +45 -0
  14. data/TODO.roadmap/07-matrix-and-color.md +37 -0
  15. data/TODO.roadmap/08-svg-builder.md +51 -0
  16. data/TODO.roadmap/09-renderer.md +52 -0
  17. data/TODO.roadmap/10-visitor.md +58 -0
  18. data/TODO.roadmap/11-operator-coverage.md +103 -0
  19. data/TODO.roadmap/12-svg-domain.md +62 -0
  20. data/TODO.roadmap/13-translation-handlers.md +69 -0
  21. data/TODO.roadmap/14-ps-serializer.md +49 -0
  22. data/TODO.roadmap/15-cli-and-public-api.md +47 -0
  23. data/TODO.roadmap/16-specs.md +84 -0
  24. data/TODO.roadmap/17-docs-sync.md +47 -0
  25. data/TODO.roadmap/18-performance-and-determinism.md +47 -0
  26. data/TODO.roadmap/19-error-model.md +45 -0
  27. data/TODO.roadmap/20-font-and-text.md +46 -0
  28. data/TODO.roadmap/21-images.md +45 -0
  29. data/TODO.roadmap/22-forms-and-resources.md +25 -0
  30. data/TODO.roadmap/23-level2-level3.md +52 -0
  31. data/TODO.roadmap/24-ci-and-release.md +42 -0
  32. data/TODO.roadmap/README.md +77 -0
  33. data/docs/.gitignore +29 -0
  34. data/docs/CHANGELOG.md +114 -0
  35. data/docs/COMPLETE_DOCUMENTATION_STATUS.md +376 -0
  36. data/docs/DEPLOYMENT.md +456 -0
  37. data/docs/DEPLOYMENT_INSTRUCTIONS.md +229 -0
  38. data/docs/DOCUMENTATION_PLAN.md +425 -0
  39. data/docs/FINAL_SUMMARY.md +657 -0
  40. data/docs/Gemfile +15 -0
  41. data/docs/README.md +327 -0
  42. data/docs/_config.yml +99 -0
  43. data/docs/advanced-topics.adoc +370 -0
  44. data/docs/api-reference/colors.adoc +705 -0
  45. data/docs/api-reference/converter.adoc +699 -0
  46. data/docs/api-reference/execution-context.adoc +1210 -0
  47. data/docs/api-reference/graphics-state.adoc +1070 -0
  48. data/docs/api-reference/interpreter.adoc +810 -0
  49. data/docs/api-reference/matrix.adoc +1179 -0
  50. data/docs/api-reference/path-builder.adoc +1284 -0
  51. data/docs/api-reference/postsvg-module.adoc +388 -0
  52. data/docs/api-reference/svg-generator.adoc +891 -0
  53. data/docs/api-reference/tokenizer.adoc +925 -0
  54. data/docs/api-reference.adoc +221 -0
  55. data/docs/architecture/command-registry.adoc +1191 -0
  56. data/docs/architecture/conversion-pipeline.adoc +746 -0
  57. data/docs/architecture/design-decisions.adoc +999 -0
  58. data/docs/architecture/generator-stage.adoc +1115 -0
  59. data/docs/architecture/graphics-state-model.adoc +1089 -0
  60. data/docs/architecture/interpreter-stage.adoc +1125 -0
  61. data/docs/architecture/parser-stage.adoc +1051 -0
  62. data/docs/architecture.adoc +354 -0
  63. data/docs/cli-reference/batch-command.adoc +616 -0
  64. data/docs/cli-reference/check-command.adoc +677 -0
  65. data/docs/cli-reference/cli-options.adoc +802 -0
  66. data/docs/cli-reference/convert-command.adoc +462 -0
  67. data/docs/cli-reference/version-command.adoc +296 -0
  68. data/docs/cli-reference.adoc +317 -0
  69. data/docs/concepts/conversion-pipeline.adoc +903 -0
  70. data/docs/concepts/coordinate-systems.adoc +836 -0
  71. data/docs/concepts/graphics-state.adoc +861 -0
  72. data/docs/concepts/path-operations.adoc +1076 -0
  73. data/docs/concepts/postscript-language.adoc +859 -0
  74. data/docs/concepts/svg-generation.adoc +937 -0
  75. data/docs/concepts.adoc +198 -0
  76. data/docs/contributing.adoc +443 -0
  77. data/docs/development.adoc +420 -0
  78. data/docs/faq.adoc +493 -0
  79. data/docs/getting-started/basic-usage.adoc +538 -0
  80. data/docs/getting-started/common-workflows.adoc +577 -0
  81. data/docs/getting-started/first-conversion.adoc +492 -0
  82. data/docs/getting-started/installation.adoc +534 -0
  83. data/docs/getting-started.adoc +94 -0
  84. data/docs/index.adoc +248 -0
  85. data/docs/optimization.adoc +196 -0
  86. data/docs/ps2svg_compatibility.adoc +149 -0
  87. data/docs/quick-reference.adoc +453 -0
  88. data/docs/sitemap.adoc +337 -0
  89. data/docs/troubleshooting.adoc +486 -0
  90. data/docs/validation.adoc +772 -0
  91. data/exe/postsvg +1 -0
  92. data/lib/postsvg/cli.rb +104 -57
  93. data/lib/postsvg/color.rb +132 -0
  94. data/lib/postsvg/errors.rb +68 -3
  95. data/lib/postsvg/format_number.rb +22 -0
  96. data/lib/postsvg/graphics_context.rb +80 -0
  97. data/lib/postsvg/graphics_stack.rb +43 -0
  98. data/lib/postsvg/model/literals/array.rb +41 -0
  99. data/lib/postsvg/model/literals/dictionary.rb +34 -0
  100. data/lib/postsvg/model/literals/hex.rb +37 -0
  101. data/lib/postsvg/model/literals/name.rb +40 -0
  102. data/lib/postsvg/model/literals/number.rb +36 -0
  103. data/lib/postsvg/model/literals/procedure.rb +41 -0
  104. data/lib/postsvg/model/literals/string.rb +30 -0
  105. data/lib/postsvg/model/literals.rb +19 -0
  106. data/lib/postsvg/model/operator.rb +58 -0
  107. data/lib/postsvg/model/operators/arithmetic.rb +264 -0
  108. data/lib/postsvg/model/operators/boolean.rb +182 -0
  109. data/lib/postsvg/model/operators/color.rb +74 -0
  110. data/lib/postsvg/model/operators/container.rb +186 -0
  111. data/lib/postsvg/model/operators/control_flow.rb +119 -0
  112. data/lib/postsvg/model/operators/device.rb +21 -0
  113. data/lib/postsvg/model/operators/dictionary.rb +118 -0
  114. data/lib/postsvg/model/operators/font.rb +121 -0
  115. data/lib/postsvg/model/operators/graphics_state.rb +84 -0
  116. data/lib/postsvg/model/operators/painting.rb +29 -0
  117. data/lib/postsvg/model/operators/path.rb +169 -0
  118. data/lib/postsvg/model/operators/stack.rb +72 -0
  119. data/lib/postsvg/model/operators/transformations.rb +103 -0
  120. data/lib/postsvg/model/operators.rb +89 -0
  121. data/lib/postsvg/model/program.rb +68 -0
  122. data/lib/postsvg/model/token.rb +43 -0
  123. data/lib/postsvg/model.rb +17 -0
  124. data/lib/postsvg/options.rb +29 -0
  125. data/lib/postsvg/renderer.rb +85 -0
  126. data/lib/postsvg/serializer.rb +325 -0
  127. data/lib/postsvg/source/ast_builder.rb +308 -0
  128. data/lib/postsvg/source/lexer.rb +322 -0
  129. data/lib/postsvg/source/operand_stack.rb +55 -0
  130. data/lib/postsvg/source.rb +21 -0
  131. data/lib/postsvg/svg/attribute_parser.rb +45 -0
  132. data/lib/postsvg/svg/clip_path_registry.rb +44 -0
  133. data/lib/postsvg/svg/document.rb +22 -0
  134. data/lib/postsvg/svg/element.rb +84 -0
  135. data/lib/postsvg/svg/elements/circle.rb +36 -0
  136. data/lib/postsvg/svg/elements/clip_path.rb +26 -0
  137. data/lib/postsvg/svg/elements/defs.rb +24 -0
  138. data/lib/postsvg/svg/elements/ellipse.rb +38 -0
  139. data/lib/postsvg/svg/elements/group.rb +37 -0
  140. data/lib/postsvg/svg/elements/image.rb +35 -0
  141. data/lib/postsvg/svg/elements/line.rb +36 -0
  142. data/lib/postsvg/svg/elements/path.rb +32 -0
  143. data/lib/postsvg/svg/elements/polygon.rb +12 -0
  144. data/lib/postsvg/svg/elements/polyline.rb +32 -0
  145. data/lib/postsvg/svg/elements/rect.rb +44 -0
  146. data/lib/postsvg/svg/elements/svg.rb +39 -0
  147. data/lib/postsvg/svg/elements/text.rb +42 -0
  148. data/lib/postsvg/svg/elements.rb +31 -0
  149. data/lib/postsvg/svg/paint.rb +34 -0
  150. data/lib/postsvg/svg/parser.rb +39 -0
  151. data/lib/postsvg/svg/path_data/command.rb +27 -0
  152. data/lib/postsvg/svg/path_data/parser.rb +82 -0
  153. data/lib/postsvg/svg/path_data.rb +17 -0
  154. data/lib/postsvg/svg/stroke.rb +31 -0
  155. data/lib/postsvg/svg/transform_list.rb +59 -0
  156. data/lib/postsvg/svg.rb +22 -0
  157. data/lib/postsvg/svg_builder.rb +249 -0
  158. data/lib/postsvg/translation/arc_converter.rb +86 -0
  159. data/lib/postsvg/translation/bounding_box.rb +59 -0
  160. data/lib/postsvg/translation/context.rb +34 -0
  161. data/lib/postsvg/translation/handler_registry.rb +38 -0
  162. data/lib/postsvg/translation/handlers/circle_handler.rb +28 -0
  163. data/lib/postsvg/translation/handlers/clip_path_handler.rb +13 -0
  164. data/lib/postsvg/translation/handlers/defs_handler.rb +15 -0
  165. data/lib/postsvg/translation/handlers/ellipse_handler.rb +31 -0
  166. data/lib/postsvg/translation/handlers/group_handler.rb +21 -0
  167. data/lib/postsvg/translation/handlers/image_handler.rb +20 -0
  168. data/lib/postsvg/translation/handlers/line_handler.rb +23 -0
  169. data/lib/postsvg/translation/handlers/open_handler.rb +18 -0
  170. data/lib/postsvg/translation/handlers/path_handler.rb +356 -0
  171. data/lib/postsvg/translation/handlers/polygon_handler.rb +33 -0
  172. data/lib/postsvg/translation/handlers/polyline_handler.rb +31 -0
  173. data/lib/postsvg/translation/handlers/rect_handler.rb +27 -0
  174. data/lib/postsvg/translation/handlers/shared.rb +110 -0
  175. data/lib/postsvg/translation/handlers/svg_handler.rb +25 -0
  176. data/lib/postsvg/translation/handlers/text_handler.rb +56 -0
  177. data/lib/postsvg/translation/handlers.rb +25 -0
  178. data/lib/postsvg/translation/ps_renderer.rb +105 -0
  179. data/lib/postsvg/translation/record_emitter.rb +35 -0
  180. data/lib/postsvg/translation.rb +17 -0
  181. data/lib/postsvg/version.rb +1 -1
  182. data/lib/postsvg/visitors/ps_visitor/arithmetic.rb +125 -0
  183. data/lib/postsvg/visitors/ps_visitor/boolean.rb +105 -0
  184. data/lib/postsvg/visitors/ps_visitor/color.rb +53 -0
  185. data/lib/postsvg/visitors/ps_visitor/common.rb +66 -0
  186. data/lib/postsvg/visitors/ps_visitor/container.rb +164 -0
  187. data/lib/postsvg/visitors/ps_visitor/control_flow.rb +110 -0
  188. data/lib/postsvg/visitors/ps_visitor/device.rb +20 -0
  189. data/lib/postsvg/visitors/ps_visitor/dictionary.rb +89 -0
  190. data/lib/postsvg/visitors/ps_visitor/font.rb +93 -0
  191. data/lib/postsvg/visitors/ps_visitor/graphics_state.rb +55 -0
  192. data/lib/postsvg/visitors/ps_visitor/painting.rb +90 -0
  193. data/lib/postsvg/visitors/ps_visitor/path.rb +112 -0
  194. data/lib/postsvg/visitors/ps_visitor/stack.rb +47 -0
  195. data/lib/postsvg/visitors/ps_visitor/transformations.rb +101 -0
  196. data/lib/postsvg/visitors/ps_visitor.rb +208 -0
  197. data/lib/postsvg/visitors.rb +9 -0
  198. data/lib/postsvg.rb +93 -59
  199. data/lychee.toml +86 -0
  200. metadata +216 -11
  201. data/postsvg.gemspec +0 -38
@@ -0,0 +1,492 @@
1
+ = First Conversion Tutorial
2
+ :page-nav_order: 3
3
+ :page-parent: Getting Started
4
+
5
+ == Purpose
6
+
7
+ This step-by-step tutorial guides you through your first PostScript to SVG conversion using Postsvg. You'll learn the complete workflow from creating a simple PostScript file to viewing the resulting SVG.
8
+
9
+ == References
10
+
11
+ * link:../index.adoc[Documentation Home]
12
+ * link:../getting-started.adoc[Getting Started Overview]
13
+ * link:installation.adoc[Installation Guide]
14
+ * link:basic-usage.adoc[Basic Usage]
15
+ * link:../postscript/fundamentals.adoc[PostScript Fundamentals]
16
+
17
+ == Concepts
18
+
19
+ **PostScript**:: A page description language that describes how to draw vector graphics using commands.
20
+
21
+ **Path**:: A sequence of connected lines and curves that define a shape.
22
+
23
+ **Stroke**:: Drawing the outline of a path.
24
+
25
+ **Fill**:: Filling the interior of a closed path with color.
26
+
27
+ **BoundingBox**:: The rectangular area that contains all graphics in an EPS file.
28
+
29
+ == Prerequisites
30
+
31
+ Before starting this tutorial:
32
+
33
+ * ✅ Postsvg installed (see link:installation.adoc[Installation Guide])
34
+ * ✅ Text editor (any editor will work)
35
+ * ✅ Terminal/command prompt access
36
+ * ✅ Web browser for viewing SVG
37
+
38
+ Verify installation:
39
+
40
+ [source,sh]
41
+ ----
42
+ postsvg version
43
+ # Should output: postsvg version 0.1.0 (or similar)
44
+ ----
45
+
46
+ == Step 1: Create a Simple PostScript File
47
+
48
+ Let's create a PostScript file that draws a simple triangle.
49
+
50
+ **1. Create a new file named `triangle.ps`:**
51
+
52
+ [source,sh]
53
+ ----
54
+ # Using your text editor, or create with echo:
55
+ cat > triangle.ps << 'EOF'
56
+ %!PS-Adobe-3.0 EPSF-3.0
57
+ %%BoundingBox: 0 0 200 200
58
+ %%Title: Simple Triangle
59
+
60
+ % Draw a triangle
61
+ newpath
62
+ 100 50 moveto
63
+ 150 150 lineto
64
+ 50 150 lineto
65
+ closepath
66
+
67
+ % Set color to blue
68
+ 0 0 1 setrgbcolor
69
+
70
+ % Fill the triangle
71
+ fill
72
+
73
+ showpage
74
+ EOF
75
+ ----
76
+
77
+ **2. Understanding the PostScript code:**
78
+
79
+ [source,postscript]
80
+ ----
81
+ %!PS-Adobe-3.0 EPSF-3.0 <1>
82
+ %%BoundingBox: 0 0 200 200 <2>
83
+ %%Title: Simple Triangle <3>
84
+
85
+ newpath <4>
86
+ 100 50 moveto <5>
87
+ 150 150 lineto <6>
88
+ 50 150 lineto <7>
89
+ closepath <8>
90
+
91
+ 0 0 1 setrgbcolor <9>
92
+ fill <10>
93
+
94
+ showpage <11>
95
+ ----
96
+ <1> PostScript header identifying file type
97
+ <2> Defines the drawing area (width: 200, height: 200)
98
+ <3> Optional title comment
99
+ <4> Initialize a new path
100
+ <5> Move to starting point (100, 50)
101
+ <6> Draw line to (150, 150)
102
+ <7> Draw line to (50, 150)
103
+ <8> Close the path back to start
104
+ <9> Set color to blue (R=0, G=0, B=1)
105
+ <10> Fill the closed path with current color
106
+ <11> End the page
107
+
108
+ == Step 2: Convert to SVG
109
+
110
+ Now let's convert the PostScript file to SVG.
111
+
112
+ **Using the command line:**
113
+
114
+ [source,sh]
115
+ ----
116
+ postsvg convert triangle.ps triangle.svg
117
+ ----
118
+
119
+ **Expected output:**
120
+
121
+ [source]
122
+ ----
123
+ Successfully converted triangle.ps to triangle.svg
124
+ ----
125
+
126
+ **What happened:**
127
+
128
+ 1. Postsvg read `triangle.ps`
129
+ 2. Parsed the PostScript commands
130
+ 3. Interpreted the drawing operations
131
+ 4. Generated equivalent SVG markup
132
+ 5. Saved to `triangle.svg`
133
+
134
+ == Step 3: View the Result
135
+
136
+ **Open the SVG file in a web browser:**
137
+
138
+ [source,sh]
139
+ ----
140
+ # macOS
141
+ open triangle.svg
142
+
143
+ # Linux
144
+ xdg-open triangle.svg
145
+
146
+ # Windows
147
+ start triangle.svg
148
+ ----
149
+
150
+ **Or view the SVG code:**
151
+
152
+ [source,sh]
153
+ ----
154
+ cat triangle.svg
155
+ ----
156
+
157
+ **Expected SVG output:**
158
+
159
+ [source,xml]
160
+ ----
161
+ <?xml version="1.0" standalone="no"?>
162
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
163
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
164
+ <svg xmlns="http://www.w3.org/2000/svg"
165
+ width="200" height="200"
166
+ viewBox="0 0 200 200">
167
+ <path d="M 100 150 L 150 50 L 50 50 Z"
168
+ fill="#0000ff"/>
169
+ </svg>
170
+ ----
171
+
172
+ **You should see:** A blue triangle in your browser!
173
+
174
+ == Step 4: Experiment with Variations
175
+
176
+ Now let's try some variations to understand how Postsvg works.
177
+
178
+ === Variation 1: Change the Color
179
+
180
+ **Modify `triangle.ps` to use red:**
181
+
182
+ [source,postscript]
183
+ ----
184
+ % Change this line:
185
+ 0 0 1 setrgbcolor
186
+
187
+ % To this (red):
188
+ 1 0 0 setrgbcolor
189
+ ----
190
+
191
+ **Convert again:**
192
+
193
+ [source,sh]
194
+ ----
195
+ postsvg convert triangle.ps triangle-red.svg
196
+ ----
197
+
198
+ **Result:** Red triangle!
199
+
200
+ === Variation 2: Add a Stroke
201
+
202
+ **Modify to have both fill and stroke:**
203
+
204
+ [source,postscript]
205
+ ----
206
+ %!PS-Adobe-3.0 EPSF-3.0
207
+ %%BoundingBox: 0 0 200 200
208
+
209
+ newpath
210
+ 100 50 moveto
211
+ 150 150 lineto
212
+ 50 150 lineto
213
+ closepath
214
+
215
+ % Fill with light blue
216
+ 0.7 0.9 1 setrgbcolor
217
+ fill
218
+
219
+ % Stroke with dark blue
220
+ newpath
221
+ 100 50 moveto
222
+ 150 150 lineto
223
+ 50 150 lineto
224
+ closepath
225
+
226
+ 0 0 0.5 setrgbcolor
227
+ 3 setlinewidth
228
+ stroke
229
+
230
+ showpage
231
+ ----
232
+
233
+ **Convert and view:**
234
+
235
+ [source,sh]
236
+ ----
237
+ postsvg convert triangle.ps triangle-stroked.svg
238
+ open triangle-stroked.svg
239
+ ----
240
+
241
+ **Result:** Light blue triangle with dark blue border!
242
+
243
+ === Variation 3: Multiple Shapes
244
+
245
+ **Create a file with multiple shapes:**
246
+
247
+ [source,postscript]
248
+ ----
249
+ %!PS-Adobe-3.0 EPSF-3.0
250
+ %%BoundingBox: 0 0 300 300
251
+
252
+ % Triangle
253
+ newpath
254
+ 50 50 moveto
255
+ 100 150 lineto
256
+ 0 150 lineto
257
+ closepath
258
+ 1 0 0 setrgbcolor
259
+ fill
260
+
261
+ % Circle (approximated with curve)
262
+ newpath
263
+ 200 100 50 0 360 arc
264
+ 0 1 0 setrgbcolor
265
+ fill
266
+
267
+ % Rectangle
268
+ newpath
269
+ 50 200 moveto
270
+ 150 200 lineto
271
+ 150 280 lineto
272
+ 50 280 lineto
273
+ closepath
274
+ 0 0 1 setrgbcolor
275
+ fill
276
+
277
+ showpage
278
+ ----
279
+
280
+ **Convert:**
281
+
282
+ [source,sh]
283
+ ----
284
+ postsvg convert shapes.ps shapes.svg
285
+ ----
286
+
287
+ **Result:** Red triangle, green circle, and blue rectangle!
288
+
289
+ == Step 5: Validate Your PostScript
290
+
291
+ Before converting complex files, validate them:
292
+
293
+ [source,sh]
294
+ ----
295
+ postsvg check triangle.ps
296
+ ----
297
+
298
+ **Expected output:**
299
+
300
+ [source]
301
+ ----
302
+ ✓ triangle.ps - Valid PostScript file
303
+ File type: EPS
304
+ Validation level: semantic
305
+ No errors found
306
+ ----
307
+
308
+ **Try with a broken file:**
309
+
310
+ [source,sh]
311
+ ----
312
+ # Create a file with syntax error
313
+ echo '%!PS-Adobe
314
+ newpath
315
+ moveto
316
+ stroke' > broken.ps
317
+
318
+ # Validate it
319
+ postsvg check broken.ps
320
+ ----
321
+
322
+ **Output:**
323
+
324
+ [source]
325
+ ----
326
+ ✗ broken.ps - Semantic error: Stack underflow
327
+ File type: PostScript
328
+ Errors:
329
+ - Line ~3: moveto requires 2 arguments on stack
330
+ ----
331
+
332
+ == Step 6: Using the Ruby API
333
+
334
+ Let's do the same conversion using Ruby code.
335
+
336
+ **Create `convert.rb`:**
337
+
338
+ [source,ruby]
339
+ ----
340
+ require 'postsvg'
341
+
342
+ # PostScript content
343
+ ps_content = <<~PS
344
+ %!PS-Adobe-3.0 EPSF-3.0
345
+ %%BoundingBox: 0 0 200 200
346
+
347
+ newpath
348
+ 100 50 moveto
349
+ 150 150 lineto
350
+ 50 150 lineto
351
+ closepath
352
+
353
+ 0 0 1 setrgbcolor
354
+ fill
355
+
356
+ showpage
357
+ PS
358
+
359
+ # Convert to SVG
360
+ svg = Postsvg.convert(ps_content)
361
+
362
+ # Save to file
363
+ File.write('triangle-ruby.svg', svg)
364
+
365
+ puts "Conversion complete!"
366
+ puts "SVG length: #{svg.length} bytes"
367
+ ----
368
+
369
+ **Run the script:**
370
+
371
+ [source,sh]
372
+ ----
373
+ ruby convert.rb
374
+ ----
375
+
376
+ **Output:**
377
+
378
+ [source]
379
+ ----
380
+ Conversion complete!
381
+ SVG length: 285 bytes
382
+ ----
383
+
384
+ == Common Issues and Solutions
385
+
386
+ === Issue 1: Command Not Found
387
+
388
+ **Problem:**
389
+ [source]
390
+ ----
391
+ bash: postsvg: command not found
392
+ ----
393
+
394
+ **Solution:**
395
+ [source,sh]
396
+ ----
397
+ # Check if gem is installed
398
+ gem list postsvg
399
+
400
+ # If not installed
401
+ gem install postsvg
402
+
403
+ # If installed, add to PATH
404
+ export PATH="$PATH:$(gem environment gemdir)/bin"
405
+ ----
406
+
407
+ === Issue 2: Invalid BoundingBox
408
+
409
+ **Problem:**
410
+ SVG appears at wrong size or position.
411
+
412
+ **Solution:**
413
+ Always include a valid BoundingBox comment:
414
+
415
+ [source,postscript]
416
+ ----
417
+ %%BoundingBox: llx lly urx ury
418
+
419
+ # Example for 200x200 image:
420
+ %%BoundingBox: 0 0 200 200
421
+ ----
422
+
423
+ === Issue 3: Empty SVG Output
424
+
425
+ **Problem:**
426
+ SVG file is created but shows nothing.
427
+
428
+ **Solutions:**
429
+
430
+ 1. **Ensure paths are stroked or filled:**
431
+ [source,postscript]
432
+ ----
433
+ newpath
434
+ ... path commands ...
435
+ stroke % or fill
436
+ ----
437
+
438
+ 2. **Check coordinates are within BoundingBox:**
439
+ [source,postscript]
440
+ ----
441
+ %%BoundingBox: 0 0 100 100
442
+ % Make sure points are between 0-100
443
+ ----
444
+
445
+ 3. **Validate the file:**
446
+ [source,sh]
447
+ ----
448
+ postsvg check --level=full yourfile.ps
449
+ ----
450
+
451
+ == Next Steps
452
+
453
+ Congratulations! You've successfully:
454
+
455
+ * ✅ Created a PostScript file
456
+ * ✅ Converted it to SVG
457
+ * ✅ Viewed the result
458
+ * ✅ Made variations
459
+ * ✅ Validated files
460
+ * ✅ Used both CLI and Ruby API
461
+
462
+ **Continue learning:**
463
+
464
+ * link:common-workflows.adoc[Common Workflows] - Real-world usage patterns
465
+ * link:../postscript/fundamentals.adoc[PostScript Fundamentals] - Learn more PostScript
466
+ * link:../cli-reference.adoc[CLI Reference] - All command options
467
+ * link:../api-reference.adoc[API Reference] - Advanced Ruby usage
468
+ * link:../troubleshooting.adoc[Troubleshooting] - Solve problems
469
+
470
+ == Practice Exercises
471
+
472
+ Try these exercises to reinforce your learning:
473
+
474
+ **Exercise 1: Create a House**
475
+ Draw a simple house using rectangles and triangles.
476
+
477
+ **Exercise 2: Color Gradient Effect**
478
+ Create multiple overlapping shapes with different colors.
479
+
480
+ **Exercise 3: Geometric Pattern**
481
+ Use loops (if you know PostScript) or repeated shapes to create a pattern.
482
+
483
+ **Exercise 4: Text (Challenge)**
484
+ Note: Text is not yet supported, but try to understand why when you attempt it!
485
+
486
+ == Bibliography
487
+
488
+ * link:installation.adoc[Installation Guide]
489
+ * link:basic-usage.adoc[Basic Usage]
490
+ * link:common-workflows.adoc[Common Workflows]
491
+ * link:../postscript/fundamentals.adoc[PostScript Fundamentals]
492
+ * link:https://www.adobe.com/products/postscript/pdfs/PLRM.pdf[PostScript Language Reference]