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
data/docs/faq.adoc ADDED
@@ -0,0 +1,493 @@
1
+ = Frequently Asked Questions
2
+ :page-nav_order: 11
3
+
4
+ == Purpose
5
+
6
+ This page answers common questions about Postsvg, its capabilities, limitations, and usage. If you don't find your answer here, check link:troubleshooting.adoc[Troubleshooting] or link:https://github.com/metanorma/postsvg/issues[ask on GitHub].
7
+
8
+ == References
9
+
10
+ * link:index.adoc[Documentation Home]
11
+ * link:troubleshooting.adoc[Troubleshooting Guide]
12
+ * link:getting-started.adoc[Getting Started]
13
+ * link:https://github.com/metanorma/postsvg/issues[GitHub Issues]
14
+
15
+ == General Questions
16
+
17
+ === What is Postsvg?
18
+
19
+ Postsvg is a pure Ruby library for converting PostScript (PS) and Encapsulated PostScript (EPS) files to Scalable Vector Graphics (SVG) format. Unlike traditional converters that rely on Ghostscript or Inkscape, Postsvg is implemented entirely in Ruby with no external dependencies.
20
+
21
+ === Why use Postsvg instead of Ghostscript?
22
+
23
+ **Advantages of Postsvg:**
24
+ * Pure Ruby - no external dependencies
25
+ * Easy integration in Ruby applications
26
+ * Lightweight and portable
27
+ * Works in restricted environments
28
+ * Better for programmatic use
29
+
30
+ **When to use Ghostscript:**
31
+ * Complex PostScript Level 2/3 features
32
+ * Text rendering required
33
+ * Production-critical conversions
34
+ * Maximum compatibility needed
35
+
36
+ === What PostScript features are supported?
37
+
38
+ **Fully supported:**
39
+ * Path construction (moveto, lineto, curveto, etc.)
40
+ * Basic painting (stroke, fill)
41
+ * RGB and grayscale colors
42
+ * Graphics state management (gsave, grestore)
43
+ * Coordinate transformations
44
+ * Stack operations
45
+ * Basic control flow
46
+
47
+ **Partially supported:**
48
+ * CMYK colors (converted to RGB)
49
+ * Clipping paths (basic support)
50
+
51
+ **Not yet supported:**
52
+ * Text rendering (show, findfont, setfont)
53
+ * Gradients and patterns
54
+ * Raster images
55
+ * Advanced Level 2/3 operators
56
+
57
+ See link:index.adoc#current-limitations[Current Limitations] for details.
58
+
59
+ === Is Postsvg production-ready?
60
+
61
+ Postsvg is suitable for:
62
+ * ✅ Simple vector graphics conversion
63
+ * ✅ Automated workflows and scripting
64
+ * ✅ Development and testing
65
+ * ✅ Files without text or complex features
66
+
67
+ Use caution for:
68
+ * ⚠️ Complex PostScript documents
69
+ * ⚠️ Files with text content
70
+ * ⚠️ Mission-critical production systems
71
+
72
+ Always validate output for your specific use case.
73
+
74
+ == Installation and Setup
75
+
76
+ === What are the system requirements?
77
+
78
+ * **Ruby:** 2.7 or higher
79
+ * **Operating System:** Any (macOS, Linux, Windows)
80
+ * **Dependencies:** None (pure Ruby)
81
+
82
+ === How do I install Postsvg?
83
+
84
+ [source,sh]
85
+ ----
86
+ # Via RubyGems
87
+ gem install postsvg
88
+
89
+ # Via Bundler
90
+ # Add to Gemfile:
91
+ gem 'postsvg'
92
+
93
+ # Then:
94
+ bundle install
95
+ ----
96
+
97
+ See link:getting-started/installation.adoc[Installation Guide] for details.
98
+
99
+ === Can I use Postsvg without Ruby?
100
+
101
+ No, Postsvg is a Ruby library and requires Ruby to run. However, you can:
102
+
103
+ * Use the CLI without writing Ruby code
104
+ * Call Postsvg from other languages via shell commands
105
+ * Package with Ruby in containers/executables
106
+
107
+ == Usage Questions
108
+
109
+ === How do I convert a PostScript file to SVG?
110
+
111
+ **Command line:**
112
+ [source,sh]
113
+ ----
114
+ postsvg convert input.ps output.svg
115
+ ----
116
+
117
+ **Ruby API:**
118
+ [source,ruby]
119
+ ----
120
+ require 'postsvg'
121
+ Postsvg.convert_file('input.ps', 'output.svg')
122
+ ----
123
+
124
+ See link:getting-started/basic-usage.adoc[Basic Usage] for more examples.
125
+
126
+ === Can I convert EPS files?
127
+
128
+ Yes! Postsvg supports both PostScript (.ps) and Encapsulated PostScript (.eps) files.
129
+
130
+ [source,sh]
131
+ ----
132
+ postsvg convert diagram.eps diagram.svg
133
+ ----
134
+
135
+ === How do I batch convert multiple files?
136
+
137
+ **Command line:**
138
+ [source,sh]
139
+ ----
140
+ # Convert all files in directory
141
+ postsvg batch input_dir/ output_dir/
142
+ ----
143
+
144
+ **Ruby API:**
145
+ [source,ruby]
146
+ ----
147
+ Dir.glob('*.ps').each do |file|
148
+ output = file.sub('.ps', '.svg')
149
+ Postsvg.convert_file(file, output)
150
+ end
151
+ ----
152
+
153
+ See link:cli-reference/batch-command.adoc[Batch Command] for details.
154
+
155
+ === What if my file has no BoundingBox?
156
+
157
+ Postsvg falls back to default dimensions (1920x1080). For better results:
158
+
159
+ 1. **Add BoundingBox comment:**
160
+ [source,postscript]
161
+ ----
162
+ %%BoundingBox: 0 0 612 792
163
+ ----
164
+
165
+ 2. **Calculate with Ghostscript:**
166
+ [source,sh]
167
+ ----
168
+ gs -dNOPAUSE -dBATCH -sDEVICE=bbox file.ps 2>&1 | grep BoundingBox
169
+ ----
170
+
171
+ === How do I validate PostScript files?
172
+
173
+ Use the check command:
174
+
175
+ [source,sh]
176
+ ----
177
+ # Basic validation
178
+ postsvg check document.ps
179
+
180
+ # Full validation with conversion test
181
+ postsvg check --level=full document.ps
182
+
183
+ # JSON output for CI/CD
184
+ postsvg check --format=json --no-color document.ps
185
+ ----
186
+
187
+ See link:validation.adoc[Validation System] for details.
188
+
189
+ == Conversion Issues
190
+
191
+ === Why is my output SVG empty?
192
+
193
+ **Common causes:**
194
+
195
+ 1. **Unsupported operators:**
196
+ Check logs for "Unknown operator" errors
197
+
198
+ 2. **Missing BoundingBox:**
199
+ Add `%%BoundingBox:` comment
200
+
201
+ 3. **Path not closed:**
202
+ Ensure paths end with `stroke` or `fill`
203
+
204
+ 4. **Coordinate system issues:**
205
+ Verify coordinates are within BoundingBox
206
+
207
+ See link:troubleshooting.adoc#empty-or-corrupted-output[Troubleshooting] for solutions.
208
+
209
+ === Why doesn't text appear in the output?
210
+
211
+ Text rendering is not yet supported. To work around:
212
+
213
+ 1. **Convert text to outlines** before processing
214
+ 2. **Use Ghostscript** for text-heavy files
215
+ 3. **Wait for future support** (link:contributing.adoc[or contribute!])
216
+
217
+ See link:index.adoc#current-limitations[Current Limitations].
218
+
219
+ === Why are colors wrong?
220
+
221
+ **Possible causes:**
222
+
223
+ 1. **CMYK colors:** Converted to RGB (may differ)
224
+ 2. **Custom color spaces:** Not supported
225
+ 3. **ICC profiles:** Not supported
226
+
227
+ **Solutions:**
228
+ * Use RGB colors in PostScript
229
+ * Accept RGB approximations
230
+ * Preprocess with color conversion tools
231
+
232
+ === What does "Unknown operator" mean?
233
+
234
+ The PostScript file uses an operator not yet implemented in Postsvg.
235
+
236
+ **Solutions:**
237
+
238
+ 1. **Disable strict mode** (if operator is non-critical):
239
+ [source,ruby]
240
+ ----
241
+ Postsvg::Converter.new(content, strict_mode: false)
242
+ ----
243
+
244
+ 2. **Check operator support:**
245
+ link:postscript/operators/index.adoc[Operator Reference]
246
+
247
+ 3. **Request feature:**
248
+ link:https://github.com/metanorma/postsvg/issues/new[Create issue]
249
+
250
+ == Performance Questions
251
+
252
+ === How fast is Postsvg?
253
+
254
+ Performance depends on:
255
+ * File size and complexity
256
+ * Number of paths and operations
257
+ * System resources
258
+
259
+ **Typical performance:**
260
+ * Simple files: < 1 second
261
+ * Complex files: 1-10 seconds
262
+ * Very large files: May take longer
263
+
264
+ === Can I speed up conversion?
265
+
266
+ **Tips:**
267
+
268
+ 1. **Batch processing:**
269
+ [source,ruby]
270
+ ----
271
+ # Process in parallel (with caution)
272
+ files.each_slice(10) do |batch|
273
+ threads = batch.map { |f| Thread.new { convert(f) } }
274
+ threads.each(&:join)
275
+ end
276
+ ----
277
+
278
+ 2. **Reduce file complexity:**
279
+ Simplify PostScript before conversion
280
+
281
+ 3. **Use batch command:**
282
+ [source,sh]
283
+ ----
284
+ postsvg batch input/ output/ # Optimized for multiple files
285
+ ----
286
+
287
+ === Why is memory usage high?
288
+
289
+ Postsvg loads entire files into memory. For large files:
290
+
291
+ 1. **Process sequentially:**
292
+ [source,ruby]
293
+ ----
294
+ files.each do |f|
295
+ convert(f)
296
+ GC.start # Force garbage collection
297
+ end
298
+ ----
299
+
300
+ 2. **Increase Ruby memory:**
301
+ [source,sh]
302
+ ----
303
+ RUBY_GC_HEAP_GROWTH_FACTOR=1.1 postsvg batch files/
304
+ ----
305
+
306
+ == Development Questions
307
+
308
+ === How can I contribute?
309
+
310
+ We welcome contributions! See link:contributing.adoc[Contributing Guide] for:
311
+
312
+ * Bug reports and feature requests
313
+ * Code contributions
314
+ * Documentation improvements
315
+ * Test case additions
316
+
317
+ === How do I add support for a new operator?
318
+
319
+ See link:development/adding-operators.adoc[Adding Operators] guide. Basic steps:
320
+
321
+ 1. Create operator class
322
+ 2. Register in command registry
323
+ 3. Write tests
324
+ 4. Update documentation
325
+
326
+ === Where can I get help with development?
327
+
328
+ * Read link:development.adoc[Development Guide]
329
+ * Check link:architecture.adoc[Architecture Documentation]
330
+ * Ask in GitHub Discussions
331
+ * Comment on relevant issues
332
+
333
+ === What's the roadmap for Postsvg?
334
+
335
+ Current priorities:
336
+
337
+ 1. **Text rendering support** (high priority)
338
+ 2. **Gradient and pattern support**
339
+ 3. **Improved clipping paths**
340
+ 4. **Additional PostScript operators**
341
+ 5. **Performance optimizations**
342
+
343
+ Follow link:https://github.com/metanorma/postsvg/issues[GitHub Issues] for updates.
344
+
345
+ == Integration Questions
346
+
347
+ === Can I use Postsvg in Rails?
348
+
349
+ Yes! Example integration:
350
+
351
+ [source,ruby]
352
+ ----
353
+ # app/services/postscript_converter.rb
354
+ class PostscriptConverter
355
+ def self.convert(uploaded_file)
356
+ ps_content = uploaded_file.read
357
+ Postsvg.convert(ps_content)
358
+ end
359
+ end
360
+
361
+ # In controller
362
+ svg_content = PostscriptConverter.convert(params[:file])
363
+ send_data svg_content, type: 'image/svg+xml'
364
+ ----
365
+
366
+ === Can I use Postsvg in CI/CD?
367
+
368
+ Yes! Use the check command for validation:
369
+
370
+ [source,yaml]
371
+ ----
372
+ # .github/workflows/validate.yml
373
+ - name: Validate PostScript files
374
+ run: |
375
+ gem install postsvg
376
+ postsvg check --format=json --fail-fast *.ps
377
+ ----
378
+
379
+ See link:validation.adoc[Validation System] for CI/CD integration.
380
+
381
+ === Does Postsvg work on Windows?
382
+
383
+ Yes! Postsvg is pure Ruby and works on Windows. Install via:
384
+
385
+ [source,cmd]
386
+ ----
387
+ gem install postsvg
388
+ ----
389
+
390
+ Some shell commands in documentation may need Windows equivalents.
391
+
392
+ === Can I use Postsvg from Python/Node.js?
393
+
394
+ Indirectly, via shell commands:
395
+
396
+ **Python:**
397
+ [source,python]
398
+ ----
399
+ import subprocess
400
+
401
+ subprocess.run(['postsvg', 'convert', 'input.ps', 'output.svg'])
402
+ ----
403
+
404
+ **Node.js:**
405
+ [source,javascript]
406
+ ----
407
+ const { execSync } = require('child_process');
408
+
409
+ execSync('postsvg convert input.ps output.svg');
410
+ ----
411
+
412
+ == Comparison Questions
413
+
414
+ === Postsvg vs Ghostscript?
415
+
416
+ [cols="1,1,1"]
417
+ |===
418
+ | Feature | Postsvg | Ghostscript
419
+
420
+ | Dependencies
421
+ | None (pure Ruby)
422
+ | External binary required
423
+
424
+ | Installation
425
+ | `gem install`
426
+ | System package
427
+
428
+ | Text rendering
429
+ | Not yet supported
430
+ | Full support
431
+
432
+ | Ruby integration
433
+ | Native
434
+ | Via shell
435
+
436
+ | Portability
437
+ | Excellent
438
+ | Platform-dependent
439
+
440
+ | Feature coverage
441
+ | Basic
442
+ | Complete
443
+ |===
444
+
445
+ === Postsvg vs Inkscape?
446
+
447
+ [cols="1,1,1"]
448
+ |===
449
+ | Feature | Postsvg | Inkscape
450
+
451
+ | Programmatic use
452
+ | Excellent
453
+ | Limited
454
+
455
+ | GUI
456
+ | None
457
+ | Full GUI
458
+
459
+ | Batch processing
460
+ | Built-in
461
+ | Via scripting
462
+
463
+ | File support
464
+ | PS/EPS only
465
+ | Many formats
466
+
467
+ | Dependencies
468
+ | None
469
+ | Multiple libraries
470
+ |===
471
+
472
+ === Postsvg vs ps2svg?
473
+
474
+ Postsvg uses test fixtures from ps2svg for compatibility testing. Key differences:
475
+
476
+ * **Postsvg:** Pure Ruby, easier to integrate
477
+ * **ps2svg:** C++ based, faster performance
478
+
479
+ See link:advanced-topics/compatibility.adoc[Compatibility Guide].
480
+
481
+ == Still Have Questions?
482
+
483
+ * Check link:troubleshooting.adoc[Troubleshooting Guide]
484
+ * Review link:getting-started.adoc[Getting Started Guide]
485
+ * Browse link:https://github.com/metanorma/postsvg/issues[GitHub Issues]
486
+ * link:https://github.com/metanorma/postsvg/issues/new[Ask a question]
487
+
488
+ == Bibliography
489
+
490
+ * link:getting-started.adoc[Getting Started Guide]
491
+ * link:troubleshooting.adoc[Troubleshooting]
492
+ * link:validation.adoc[Validation System]
493
+ * link:contributing.adoc[Contributing Guide]