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,453 @@
1
+ = Quick Reference
2
+ :page-nav_order: 12
3
+
4
+ == Purpose
5
+
6
+ This quick reference provides fast access to the most commonly used Postsvg commands, API methods, and workflows. Perfect for experienced users who need a quick reminder.
7
+
8
+ == Installation
9
+
10
+ [source,sh]
11
+ ----
12
+ # Via RubyGems
13
+ gem install postsvg
14
+
15
+ # Via Bundler - add to Gemfile
16
+ gem 'postsvg'
17
+ bundle install
18
+ ----
19
+
20
+ == Command-Line Interface
21
+
22
+ === Convert Commands
23
+
24
+ [source,sh]
25
+ ----
26
+ # Convert single file
27
+ postsvg convert input.ps output.svg
28
+
29
+ # Convert to stdout
30
+ postsvg convert input.ps > output.svg
31
+
32
+ # Batch convert directory
33
+ postsvg batch input_dir/ output_dir/
34
+
35
+ # Convert in place
36
+ postsvg batch files/
37
+ ----
38
+
39
+ === Validation Commands
40
+
41
+ [source,sh]
42
+ ----
43
+ # Basic validation
44
+ postsvg check document.ps
45
+
46
+ # Syntax only (fast)
47
+ postsvg check --level=syntax document.ps
48
+
49
+ # Full validation (complete conversion test)
50
+ postsvg check --level=full document.ps
51
+
52
+ # Multiple files
53
+ postsvg check *.ps
54
+
55
+ # JSON output for CI/CD
56
+ postsvg check --format=json --no-color document.ps
57
+ ----
58
+
59
+ === Common Options
60
+
61
+ [cols="1,3"]
62
+ |===
63
+ | Option | Description
64
+
65
+ | `--strict`
66
+ | Enable strict mode (fail on unknown operators)
67
+
68
+ | `--verbose`
69
+ | Show detailed information
70
+
71
+ | `--quiet`
72
+ | Suppress success messages
73
+
74
+ | `--no-color`
75
+ | Disable colored output
76
+
77
+ | `--fail-fast`
78
+ | Stop at first error
79
+
80
+ | `--level=LEVEL`
81
+ | Validation level: syntax, semantic, full
82
+
83
+ | `--format=FORMAT`
84
+ | Output format: text, yaml, json
85
+
86
+ | `--eps-version=VER`
87
+ | Validate EPS version (1.0, 2.0, 3.0)
88
+ |===
89
+
90
+ == Ruby API
91
+
92
+ === Module Methods
93
+
94
+ [source,ruby]
95
+ ----
96
+ require 'postsvg'
97
+
98
+ # Convert content
99
+ svg = Postsvg.convert(ps_content)
100
+
101
+ # Convert file
102
+ Postsvg.convert_file('input.ps', 'output.svg')
103
+
104
+ # Get SVG without saving
105
+ svg = Postsvg.convert_file('input.ps')
106
+ ----
107
+
108
+ === Converter Class
109
+
110
+ [source,ruby]
111
+ ----
112
+ require 'postsvg'
113
+
114
+ # Basic conversion
115
+ converter = Postsvg::Converter.new(ps_content)
116
+ svg = converter.convert
117
+
118
+ # With strict mode
119
+ converter = Postsvg::Converter.new(
120
+ ps_content,
121
+ strict_mode: true
122
+ )
123
+ svg = converter.convert
124
+ ----
125
+
126
+ === Error Handling
127
+
128
+ [source,ruby]
129
+ ----
130
+ begin
131
+ svg = Postsvg.convert(ps_content)
132
+ rescue Postsvg::ParseError => e
133
+ puts "Parse error: #{e.message}"
134
+ rescue Postsvg::ConversionError => e
135
+ puts "Conversion error: #{e.message}"
136
+ rescue Postsvg::Error => e
137
+ puts "Error: #{e.message}"
138
+ end
139
+ ----
140
+
141
+ == Common Workflows
142
+
143
+ === Validate Then Convert
144
+
145
+ [source,sh]
146
+ ----
147
+ # Shell script
148
+ if postsvg check document.ps; then
149
+ postsvg convert document.ps document.svg
150
+ fi
151
+ ----
152
+
153
+ [source,ruby]
154
+ ----
155
+ # Ruby script
156
+ if system("postsvg check #{file}")
157
+ Postsvg.convert_file(file, output)
158
+ end
159
+ ----
160
+
161
+ === Batch Processing
162
+
163
+ [source,ruby]
164
+ ----
165
+ Dir.glob('*.ps').each do |file|
166
+ begin
167
+ Postsvg.convert_file(file, file.sub('.ps', '.svg'))
168
+ puts "✓ #{file}"
169
+ rescue => e
170
+ puts "✗ #{file}: #{e.message}"
171
+ end
172
+ end
173
+ ----
174
+
175
+ === CI/CD Integration
176
+
177
+ **GitHub Actions:**
178
+ [source,yaml]
179
+ ----
180
+ - uses: ruby/setup-ruby@v1
181
+ with:
182
+ ruby-version: '3.2'
183
+ - run: gem install postsvg
184
+ - run: postsvg check --format=json *.ps
185
+ ----
186
+
187
+ **GitLab CI:**
188
+ [source,yaml]
189
+ ----
190
+ validate:
191
+ image: ruby:3.2
192
+ script:
193
+ - gem install postsvg
194
+ - postsvg check --level=full *.ps
195
+ ----
196
+
197
+ == PostScript Basics
198
+
199
+ === File Structure
200
+
201
+ [source,postscript]
202
+ ----
203
+ %!PS-Adobe-3.0 EPSF-3.0 # Header
204
+ %%BoundingBox: 0 0 612 792 # Required for EPS
205
+ %%Title: My Document # Optional metadata
206
+
207
+ % Your PostScript commands here
208
+ newpath
209
+ 100 100 moveto
210
+ 200 200 lineto
211
+ stroke
212
+
213
+ showpage # End
214
+ ----
215
+
216
+ === Common Operations
217
+
218
+ **Path Construction:**
219
+ [source,postscript]
220
+ ----
221
+ newpath % Start new path
222
+ x y moveto % Move to point
223
+ x y lineto % Line to point
224
+ x y r a1 a2 arc % Arc
225
+ closepath % Close path
226
+ ----
227
+
228
+ **Painting:**
229
+ [source,postscript]
230
+ ----
231
+ stroke % Draw path outline
232
+ fill % Fill path interior
233
+ eofill % Even-odd fill
234
+ clip % Set clipping path
235
+ ----
236
+
237
+ **Colors:**
238
+ [source,postscript]
239
+ ----
240
+ r g b setrgbcolor % RGB (0-1)
241
+ gray setgray % Grayscale (0-1)
242
+ c m y k setcmykcolor % CMYK (0-1)
243
+ ----
244
+
245
+ **Transformations:**
246
+ [source,postscript]
247
+ ----
248
+ dx dy translate % Move origin
249
+ sx sy scale % Scale coordinates
250
+ angle rotate % Rotate (degrees)
251
+ ----
252
+
253
+ **Graphics State:**
254
+ [source,postscript]
255
+ ----
256
+ gsave % Save state
257
+ grestore % Restore state
258
+ width setlinewidth % Set line width
259
+ ----
260
+
261
+ == Supported Features
262
+
263
+ ✅ **Fully Supported:**
264
+ - Path construction (moveto, lineto, curveto)
265
+ - Basic painting (stroke, fill)
266
+ - RGB and grayscale colors
267
+ - Coordinate transformations
268
+ - Graphics state management
269
+ - Stack operations
270
+
271
+ ⚠️ **Partially Supported:**
272
+ - CMYK colors (converted to RGB)
273
+ - Basic clipping paths
274
+
275
+ ❌ **Not Yet Supported:**
276
+ - Text rendering
277
+ - Gradients and patterns
278
+ - Raster images
279
+ - Advanced Level 2/3 features
280
+
281
+ == Troubleshooting
282
+
283
+ **Command not found:**
284
+ [source,sh]
285
+ ----
286
+ export PATH="$PATH:$(gem environment gemdir)/bin"
287
+ ----
288
+
289
+ **Empty SVG output:**
290
+ - Check BoundingBox is present
291
+ - Ensure paths are stroked or filled
292
+ - Validate with `postsvg check --level=full`
293
+
294
+ **Unknown operator error:**
295
+ - Disable strict mode in Ruby API
296
+ - Check operator support in documentation
297
+ - Report missing operators as feature request
298
+
299
+ **Memory issues:**
300
+ [source,ruby]
301
+ ----
302
+ # Process in batches
303
+ files.each_slice(10) do |batch|
304
+ batch.each { |f| convert(f) }
305
+ GC.start
306
+ end
307
+ ----
308
+
309
+ ## File Formats
310
+
311
+ **Input Formats:**
312
+ - `.ps` - PostScript files
313
+ - `.eps` - Encapsulated PostScript files
314
+
315
+ **Output Format:**
316
+ - `.svg` - Scalable Vector Graphics (XML-based)
317
+
318
+ **BoundingBox Formats:**
319
+ [source,postscript]
320
+ ----
321
+ %%BoundingBox: 0 0 612 792 # Standard
322
+ %%BoundingBox: (atend) # Deferred
323
+ %%HiResBoundingBox: 0.0 0.0 612.5 792.5 # High-res
324
+ ----
325
+
326
+ ## Environment Variables
327
+
328
+ **Ruby Version:**
329
+ [source,sh]
330
+ ----
331
+ ruby -v # Check version (need 2.7+)
332
+ ----
333
+
334
+ **Gem Paths:**
335
+ [source,sh]
336
+ ----
337
+ gem environment # Show all gem paths
338
+ which postsvg # Show postsvg location
339
+ ----
340
+
341
+ ## Performance Tips
342
+
343
+ **For Large Files:**
344
+ - Process sequentially with GC
345
+ - Monitor memory usage
346
+ - Consider chunking if possible
347
+
348
+ **For Batch Operations:**
349
+ - Use batch command for directories
350
+ - Process in slices for many files
351
+ - Log errors for later review
352
+
353
+ **For Production:**
354
+ - Cache converted files
355
+ - Validate before conversion
356
+ - Use strict mode in development only
357
+
358
+ == Exit Codes
359
+
360
+ [cols="1,3"]
361
+ |===
362
+ | Code | Meaning
363
+
364
+ | 0
365
+ | Success - operation completed
366
+
367
+ | 1
368
+ | Failure - errors occurred
369
+ |===
370
+
371
+ == Common Patterns
372
+
373
+ **Safe Conversion:**
374
+ [source,ruby]
375
+ ----
376
+ def safe_convert(input, output)
377
+ Postsvg.convert_file(input, output)
378
+ true
379
+ rescue => e
380
+ puts "Error: #{e.message}"
381
+ false
382
+ end
383
+ ----
384
+
385
+ **With Validation:**
386
+ [source,ruby]
387
+ ----
388
+ def convert_if_valid(file)
389
+ return unless system("postsvg check #{file}")
390
+ Postsvg.convert_file(file, file.sub('.ps', '.svg'))
391
+ end
392
+ ----
393
+
394
+ **Batch with Stats:**
395
+ [source,ruby]
396
+ ----
397
+ stats = { success: 0, failed: 0 }
398
+ Dir.glob('*.ps').each do |f|
399
+ Postsvg.convert_file(f, f.sub('.ps', '.svg'))
400
+ stats[:success] += 1
401
+ rescue
402
+ stats[:failed] += 1
403
+ end
404
+ puts "Success: #{stats[:success]}, Failed: #{stats[:failed]}"
405
+ ----
406
+
407
+ == Resource Links
408
+
409
+ **Documentation:**
410
+ - link:getting-started.adoc[Getting Started Guide]
411
+ - link:api-reference.adoc[Complete API Reference]
412
+ - link:cli-reference.adoc[CLI Command Reference]
413
+ - link:troubleshooting.adoc[Troubleshooting Guide]
414
+
415
+ **External Resources:**
416
+ - link:https://rubygems.org/gems/postsvg[Postsvg on RubyGems]
417
+ - link:https://github.com/metanorma/postsvg[GitHub Repository]
418
+ - link:https://www.adobe.com/products/postscript/pdfs/PLRM.pdf[PostScript Language Reference]
419
+
420
+ == Version Information
421
+
422
+ Check your Postsvg version:
423
+ [source,sh]
424
+ ----
425
+ postsvg version
426
+ # Output: postsvg version 0.1.0
427
+ ----
428
+
429
+ Check gem information:
430
+ [source,sh]
431
+ ----
432
+ gem list postsvg
433
+ gem info postsvg
434
+ ----
435
+
436
+ == Getting Help
437
+
438
+ 1. Check link:troubleshooting.adoc[Troubleshooting Guide]
439
+ 2. Review link:faq.adoc[FAQ]
440
+ 3. Search link:https://github.com/metanorma/postsvg/issues[GitHub Issues]
441
+ 4. Create new issue if needed
442
+
443
+ == Next Steps
444
+
445
+ **New Users:**
446
+ - link:getting-started/installation.adoc[Install Postsvg]
447
+ - link:getting-started/first-conversion.adoc[First Conversion Tutorial]
448
+ - link:getting-started/basic-usage.adoc[Learn Basic Usage]
449
+
450
+ **Experienced Users:**
451
+ - link:advanced-topics.adoc[Advanced Topics]
452
+ - link:api-reference.adoc[Full API Reference]
453
+ - link:development.adoc[Contributing Guide]