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,486 @@
1
+ = Troubleshooting
2
+ :page-nav_order: 10
3
+
4
+ == Purpose
5
+
6
+ This guide helps you diagnose and resolve common issues when using Postsvg. If you can't find a solution here, check the link:faq.adoc[FAQ] or link:https://github.com/metanorma/postsvg/issues[create an issue].
7
+
8
+ == References
9
+
10
+ * link:index.adoc[Documentation Home]
11
+ * link:faq.adoc[FAQ]
12
+ * link:cli-reference.adoc[CLI Reference]
13
+ * link:https://github.com/metanorma/postsvg/issues[Issue Tracker]
14
+
15
+ == Common Issues
16
+
17
+ === Installation Problems
18
+
19
+ ==== Gem Installation Fails
20
+
21
+ **Problem:**
22
+ [source,sh]
23
+ ----
24
+ $ gem install postsvg
25
+ ERROR: Could not find a valid gem 'postsvg'
26
+ ----
27
+
28
+ **Solutions:**
29
+
30
+ 1. **Check gem sources:**
31
+ [source,sh]
32
+ ----
33
+ gem sources --list
34
+ # Should include https://rubygems.org
35
+ ----
36
+
37
+ 2. **Update RubyGems:**
38
+ [source,sh]
39
+ ----
40
+ gem update --system
41
+ ----
42
+
43
+ 3. **Install specific version:**
44
+ [source,sh]
45
+ ----
46
+ gem install postsvg -v '0.1.0'
47
+ ----
48
+
49
+ ==== Command Not Found
50
+
51
+ **Problem:**
52
+ [source,sh]
53
+ ----
54
+ $ postsvg version
55
+ bash: postsvg: command not found
56
+ ----
57
+
58
+ **Solutions:**
59
+
60
+ 1. **Check gem bin directory:**
61
+ [source,sh]
62
+ ----
63
+ gem environment
64
+ # Look for GEM PATHS and EXECUTABLE DIRECTORY
65
+ ----
66
+
67
+ 2. **Add to PATH:**
68
+ [source,sh]
69
+ ----
70
+ export PATH="$PATH:$(gem environment gemdir)/bin"
71
+ # Add to ~/.bashrc or ~/.zshrc for persistence
72
+ ----
73
+
74
+ 3. **Use bundle exec:**
75
+ [source,sh]
76
+ ----
77
+ bundle exec postsvg version
78
+ ----
79
+
80
+ ==== Permission Denied
81
+
82
+ **Problem:**
83
+ [source,sh]
84
+ ----
85
+ $ gem install postsvg
86
+ ERROR: While executing gem ... (Errno::EACCES)
87
+ Permission denied
88
+ ----
89
+
90
+ **Solutions:**
91
+
92
+ 1. **Use user install:**
93
+ [source,sh]
94
+ ----
95
+ gem install --user-install postsvg
96
+ ----
97
+
98
+ 2. **Use bundler:**
99
+ [source,sh]
100
+ ----
101
+ # Add to Gemfile
102
+ gem 'postsvg'
103
+
104
+ # Install
105
+ bundle install
106
+ ----
107
+
108
+ 3. **Fix gem directory permissions** (not recommended):
109
+ [source,sh]
110
+ ----
111
+ sudo gem install postsvg # Use with caution
112
+ ----
113
+
114
+ === Conversion Errors
115
+
116
+ ==== Unknown Operator Error
117
+
118
+ **Problem:**
119
+ [source]
120
+ ----
121
+ Conversion error: Unknown operator: complexoperator
122
+ ----
123
+
124
+ **Diagnosis:**
125
+
126
+ PostScript file contains operators not yet implemented in Postsvg.
127
+
128
+ **Solutions:**
129
+
130
+ 1. **Disable strict mode** (for non-critical operators):
131
+ [source,ruby]
132
+ ----
133
+ converter = Postsvg::Converter.new(
134
+ ps_content,
135
+ strict_mode: false
136
+ )
137
+ ----
138
+
139
+ 2. **Check operator support:**
140
+ - Review link:postscript/operators/index.adoc[Operator Reference]
141
+ - See link:index.adoc#current-limitations[Current Limitations]
142
+
143
+ 3. **Request feature** or link:contributing.adoc[contribute implementation]:
144
+ - link:https://github.com/metanorma/postsvg/issues/new[Create feature request]
145
+
146
+ ==== Malformed BoundingBox
147
+
148
+ **Problem:**
149
+ [source]
150
+ ----
151
+ Warning: Invalid BoundingBox, using defaults
152
+ ----
153
+
154
+ **Diagnosis:**
155
+
156
+ BoundingBox comment is missing or malformed.
157
+
158
+ **Solutions:**
159
+
160
+ 1. **Add BoundingBox comment:**
161
+ [source,postscript]
162
+ ----
163
+ %!PS-Adobe-3.0 EPSF-3.0
164
+ %%BoundingBox: 0 0 612 792
165
+ ----
166
+
167
+ 2. **Accept default dimensions:**
168
+ - Postsvg uses 1920x1080 as fallback
169
+ - May result in incorrect scaling
170
+
171
+ 3. **Calculate BoundingBox manually:**
172
+ [source,sh]
173
+ ----
174
+ # Use Ghostscript to find BoundingBox
175
+ gs -dNOPAUSE -dBATCH -sDEVICE=bbox input.ps 2>&1 | grep BoundingBox
176
+ ----
177
+
178
+ ==== Empty or Corrupted Output
179
+
180
+ **Problem:**
181
+ Generated SVG is empty or displays incorrectly.
182
+
183
+ **Diagnosis:**
184
+
185
+ Possible causes:
186
+ * Unsupported PostScript features
187
+ * Path construction errors
188
+ * Coordinate system issues
189
+
190
+ **Solutions:**
191
+
192
+ 1. **Validate PostScript file:**
193
+ [source,sh]
194
+ ----
195
+ postsvg check --level=full document.ps
196
+ ----
197
+
198
+ 2. **Check SVG output:**
199
+ [source,sh]
200
+ ----
201
+ # View in browser
202
+ open output.svg
203
+
204
+ # Inspect SVG content
205
+ cat output.svg | grep '<path'
206
+ ----
207
+
208
+ 3. **Enable verbose logging** (if available in future version):
209
+ [source,ruby]
210
+ ----
211
+ Postsvg::Logger.level = :debug
212
+ svg = Postsvg.convert(ps_content)
213
+ ----
214
+
215
+ === Validation Errors
216
+
217
+ ==== Syntax Validation Fails
218
+
219
+ **Problem:**
220
+ [source]
221
+ ----
222
+ ✗ document.ps - Syntax error: Unmatched delimiter
223
+ ----
224
+
225
+ **Solutions:**
226
+
227
+ 1. **Check delimiters:**
228
+ - Ensure all `[`, `{`, `(`, `<` have matching closers
229
+ - Common issue: missing `}` or `]`
230
+
231
+ 2. **Validate with different level:**
232
+ [source,sh]
233
+ ----
234
+ # Try syntax-only
235
+ postsvg check --level=syntax document.ps
236
+ ----
237
+
238
+ 3. **Check file encoding:**
239
+ [source,sh]
240
+ ----
241
+ file -I document.ps
242
+ # Should be: text/plain; charset=us-ascii
243
+ ----
244
+
245
+ ==== Semantic Validation Fails
246
+
247
+ **Problem:**
248
+ [source]
249
+ ----
250
+ ✗ document.ps - Semantic error: Stack underflow
251
+ ----
252
+
253
+ **Solutions:**
254
+
255
+ 1. **Check stack operations:**
256
+ - Operators popping more values than available
257
+ - Missing operands for commands
258
+
259
+ 2. **Review PostScript code:**
260
+ [source,postscript]
261
+ ----
262
+ % Bad - stack underflow
263
+ add % No values on stack
264
+
265
+ % Good
266
+ 10 20 add % Two values provided
267
+ ----
268
+
269
+ 3. **Test with simpler file:**
270
+ Create minimal test case to isolate issue
271
+
272
+ === Performance Issues
273
+
274
+ ==== Slow Conversion
275
+
276
+ **Problem:**
277
+ Conversion takes very long for large files.
278
+
279
+ **Solutions:**
280
+
281
+ 1. **Profile the conversion:**
282
+ [source,ruby]
283
+ ----
284
+ require 'benchmark'
285
+
286
+ time = Benchmark.measure do
287
+ Postsvg.convert_file('large.ps', 'output.svg')
288
+ end
289
+ puts "Time: #{time.real}s"
290
+ ----
291
+
292
+ 2. **Batch processing:**
293
+ [source,ruby]
294
+ ----
295
+ # Process files sequentially, not all at once
296
+ Dir.glob('*.ps').each do |file|
297
+ Postsvg.convert_file(file, file.sub('.ps', '.svg'))
298
+ GC.start # Force garbage collection
299
+ end
300
+ ----
301
+
302
+ 3. **Check file size:**
303
+ [source,sh]
304
+ ----
305
+ # If file > 10MB, may be slow
306
+ ls -lh large.ps
307
+ ----
308
+
309
+ ==== High Memory Usage
310
+
311
+ **Problem:**
312
+ Ruby process consumes excessive memory.
313
+
314
+ **Solutions:**
315
+
316
+ 1. **Process in batches:**
317
+ [source,ruby]
318
+ ----
319
+ files.each_slice(10) do |batch|
320
+ batch.each { |f| Postsvg.convert_file(f) }
321
+ GC.start
322
+ end
323
+ ----
324
+
325
+ 2. **Stream processing** (not yet supported):
326
+ Currently Postsvg loads entire file into memory
327
+
328
+ 3. **Increase Ruby memory limit:**
329
+ [source,sh]
330
+ ----
331
+ RUBY_GC_HEAP_GROWTH_FACTOR=1.1 postsvg batch large_dir/
332
+ ----
333
+
334
+ === Output Quality Issues
335
+
336
+ ==== Colors Incorrect
337
+
338
+ **Problem:**
339
+ Output colors don't match original PostScript.
340
+
341
+ **Diagnosis:**
342
+
343
+ Possible causes:
344
+ * CMYK color space (partial support)
345
+ * Custom color spaces (not supported)
346
+ * ICC profiles (not supported)
347
+
348
+ **Solutions:**
349
+
350
+ 1. **Convert to RGB:**
351
+ Preprocess PostScript to use RGB colors only
352
+
353
+ 2. **Check color space:**
354
+ [source,postscript]
355
+ ----
356
+ % Supported
357
+ 0.5 0.5 0.5 setrgbcolor
358
+ 0.5 setgray
359
+
360
+ % Partially supported
361
+ 0.5 0.3 0.1 0.0 setcmykcolor
362
+
363
+ % Not supported
364
+ [/Pattern /DeviceRGB] setcolorspace
365
+ ----
366
+
367
+ ==== Paths Distorted
368
+
369
+ **Problem:**
370
+ Shapes appear distorted or incorrect in SVG.
371
+
372
+ **Solutions:**
373
+
374
+ 1. **Check coordinate transformation:**
375
+ [source,sh]
376
+ ----
377
+ # Verify BoundingBox is correct
378
+ grep BoundingBox input.ps
379
+ ----
380
+
381
+ 2. **Inspect transformation matrices:**
382
+ Look for unusual scale/rotate operations
383
+
384
+ 3. **Compare with reference:**
385
+ [source,sh]
386
+ ----
387
+ # Convert with Ghostscript for comparison
388
+ gs -dNOPAUSE -dBATCH -sDEVICE=svg -sOutputFile=ref.svg input.ps
389
+ ----
390
+
391
+ ==== Text Missing or Incorrect
392
+
393
+ **Problem:**
394
+ Text doesn't appear in SVG output.
395
+
396
+ **Diagnosis:**
397
+
398
+ Text operations are not yet fully supported. See link:index.adoc#current-limitations[Current Limitations].
399
+
400
+ **Solutions:**
401
+
402
+ 1. **Convert text to outlines:**
403
+ Use external tool to convert text to paths before processing
404
+
405
+ 2. **Use Ghostscript for text-heavy files:**
406
+ [source,sh]
407
+ ----
408
+ gs -dNOPAUSE -dBATCH -sDEVICE=svg -sOutputFile=output.svg input.ps
409
+ ----
410
+
411
+ == Debugging Techniques
412
+
413
+ === Enable Verbose Output
414
+
415
+ [source,ruby]
416
+ ----
417
+ # In Ruby code
418
+ require 'postsvg'
419
+
420
+ # Add debug output to identify issues
421
+ converter = Postsvg::Converter.new(ps_content)
422
+ puts "BoundingBox: #{converter.extract_bounding_box.inspect}"
423
+ ----
424
+
425
+ === Minimal Test Case
426
+
427
+ Create minimal PostScript to isolate issue:
428
+
429
+ [source,postscript]
430
+ ----
431
+ %!PS-Adobe-3.0
432
+ %%BoundingBox: 0 0 100 100
433
+ newpath
434
+ 50 50 moveto
435
+ 90 50 lineto
436
+ stroke
437
+ showpage
438
+ ----
439
+
440
+ === Check Intermediate Steps
441
+
442
+ [source,ruby]
443
+ ----
444
+ # Test tokenization
445
+ tokens = Postsvg::Tokenizer.tokenize(ps_content)
446
+ puts "Tokens: #{tokens.inspect}"
447
+
448
+ # Test interpretation
449
+ interpreter = Postsvg::Interpreter.new
450
+ result = interpreter.interpret(tokens, bounding_box)
451
+ puts "SVG: #{result[:svg]}"
452
+ ----
453
+
454
+ == Getting Help
455
+
456
+ If troubleshooting doesn't resolve your issue:
457
+
458
+ 1. **Search existing issues:**
459
+ link:https://github.com/metanorma/postsvg/issues[GitHub Issues]
460
+
461
+ 2. **Create minimal reproducible example:**
462
+ - Simplest PostScript that shows the problem
463
+ - Expected vs actual output
464
+ - Error messages and logs
465
+
466
+ 3. **Report the issue:**
467
+ link:https://github.com/metanorma/postsvg/issues/new[Create New Issue]
468
+
469
+ 4. **Provide context:**
470
+ - Postsvg version: `postsvg version`
471
+ - Ruby version: `ruby -v`
472
+ - Operating system
473
+ - Complete error message
474
+
475
+ == Next Steps
476
+
477
+ * Check link:faq.adoc[FAQ] for common questions
478
+ * Review link:validation.adoc[Validation System] for quality checks
479
+ * See link:contributing.adoc[Contributing Guide] to report issues
480
+ * Read link:development.adoc[Development Guide] to fix issues yourself
481
+
482
+ == Bibliography
483
+
484
+ * link:faq.adoc[Frequently Asked Questions]
485
+ * link:validation.adoc[Validation System]
486
+ * link:https://github.com/metanorma/postsvg/issues[GitHub Issues]