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,462 @@
1
+ = convert Command
2
+ :page-nav_order: 1
3
+ :page-parent: CLI Reference
4
+
5
+ == Purpose
6
+
7
+ The `convert` command is the primary CLI tool for converting single PostScript or EPS files to SVG format. It provides a simple, straightforward interface for one-off conversions.
8
+
9
+ == References
10
+
11
+ * link:../index.adoc[Documentation Home]
12
+ * link:../cli-reference.adoc[CLI Reference Overview]
13
+ * link:batch-command.adoc[batch Command]
14
+ * link:check-command.adoc[check Command]
15
+ * link:../getting-started/basic-usage.adoc[Basic Usage]
16
+
17
+ == Concepts
18
+
19
+ **Single File Conversion**:: Converting one PostScript or EPS file at a time.
20
+
21
+ **Standard Output (stdout)**:: Sending output to the console instead of a file, useful for piping to other commands.
22
+
23
+ **Exit Code**:: A numeric value indicating success (0) or failure (1) that scripts can check.
24
+
25
+ **Strict Mode**:: A validation mode that fails immediately on unknown operators.
26
+
27
+ == Command Syntax
28
+
29
+ [source,sh]
30
+ ----
31
+ postsvg convert [OPTIONS] INPUT_FILE [OUTPUT_FILE] <1>
32
+ ----
33
+ <1> Convert INPUT_FILE to SVG, optionally saving to OUTPUT_FILE
34
+
35
+ **Where:**
36
+
37
+ `INPUT_FILE`:: Path to PostScript (`.ps`) or EPS (`.eps`) file (required)
38
+
39
+ `OUTPUT_FILE`:: Path where SVG should be saved (optional). If omitted, SVG is written to stdout.
40
+
41
+ **Options:**
42
+
43
+ `--strict`:: Enable strict mode (fail on unknown operators)
44
+
45
+ **Exit Codes:**
46
+ * `0` - Success
47
+ * `1` - Failure (file not found, conversion error, etc.)
48
+
49
+ **Source:**
50
+ [`lib/postsvg/cli.rb:10-50`](../../lib/postsvg/cli.rb:10)
51
+
52
+ == Basic Usage
53
+
54
+ === Convert to File
55
+
56
+ Convert PostScript to SVG and save to file:
57
+
58
+ [source,sh]
59
+ ----
60
+ postsvg convert input.ps output.svg <1>
61
+ ----
62
+ <1> Reads `input.ps`, converts to SVG, saves as `output.svg`
63
+
64
+ **Output:**
65
+ [source]
66
+ ----
67
+ Successfully converted input.ps to output.svg
68
+ ----
69
+
70
+ .Convert EPS to SVG
71
+ [example]
72
+ ====
73
+ [source,sh]
74
+ ----
75
+ $ postsvg convert diagram.eps diagram.svg
76
+ Successfully converted diagram.eps to diagram.svg
77
+
78
+ $ ls -lh diagram.svg
79
+ -rw-r--r-- 1 user group 1.2K Jan 24 10:00 diagram.svg
80
+ ----
81
+ ====
82
+
83
+ === Convert to stdout
84
+
85
+ Output SVG to console instead of file:
86
+
87
+ [source,sh]
88
+ ----
89
+ postsvg convert input.ps <1>
90
+ ----
91
+ <1> Writes SVG to stdout (no output file specified)
92
+
93
+ **Output:**
94
+ [source,xml]
95
+ ----
96
+ <?xml version="1.0" standalone="no"?>
97
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
98
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
99
+ <svg xmlns="http://www.w3.org/2000/svg"...>
100
+ <path d="..."/>
101
+ </svg>
102
+ ----
103
+
104
+ .Redirect stdout to file
105
+ [example]
106
+ ====
107
+ [source,sh]
108
+ ----
109
+ # Redirect to file
110
+ postsvg convert input.ps > output.svg
111
+
112
+ # Pipe to another command
113
+ postsvg convert input.ps | xmllint --format - > formatted.svg
114
+
115
+ # Preview in browser
116
+ postsvg convert input.ps | less
117
+ ----
118
+ ====
119
+
120
+ == Command Options
121
+
122
+ === --strict
123
+
124
+ Enable strict mode to fail on unknown operators.
125
+
126
+ [source,sh]
127
+ ----
128
+ postsvg convert --strict input.ps output.svg <1>
129
+ ----
130
+ <1> Fail immediately if unknown operators are encountered
131
+
132
+ **Use Cases:**
133
+ * Development and testing
134
+ * Validating PostScript compatibility
135
+ * Ensuring all operators are supported
136
+ * Debugging conversion issues
137
+
138
+ .Strict mode example
139
+ [example]
140
+ ====
141
+ [source,sh]
142
+ ----
143
+ # Without strict mode (ignores unknown operators)
144
+ $ postsvg convert test.ps test.svg
145
+ Successfully converted test.ps to test.svg
146
+
147
+ # With strict mode (fails on unknown operators)
148
+ $ postsvg convert --strict test.ps test.svg
149
+ Conversion error: Unknown operator: complexoperator
150
+ ----
151
+
152
+ In strict mode, conversion fails immediately when an unsupported operator is encountered, helping you identify compatibility issues.
153
+ ====
154
+
155
+ == File Format Support
156
+
157
+ === Supported Input Formats
158
+
159
+ **PostScript Files (`.ps`):**
160
+ - Standard PostScript files
161
+ - May or may not have BoundingBox
162
+ - Can contain multiple pages
163
+
164
+ **EPS Files (`.eps`):**
165
+ - Encapsulated PostScript
166
+ - Should have `%%BoundingBox` comment
167
+ - Typically single page
168
+
169
+ .Input format detection
170
+ [example]
171
+ ====
172
+ [source,sh]
173
+ ----
174
+ # Works with both formats
175
+ postsvg convert document.ps document.svg
176
+ postsvg convert diagram.eps diagram.svg
177
+
178
+ # File extension doesn't matter - content is what counts
179
+ postsvg convert file.txt output.svg # Works if contains PostScript
180
+ ----
181
+ ====
182
+
183
+ === Output Format
184
+
185
+ Always generates **SVG 1.1** compliant markup:
186
+
187
+ [source,xml]
188
+ ----
189
+ <?xml version="1.0" standalone="no"?>
190
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
191
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
192
+ <svg xmlns="http://www.w3.org/2000/svg"
193
+ width="..." height="..."
194
+ viewBox="...">
195
+ <!-- SVG content -->
196
+ </svg>
197
+ ----
198
+
199
+ == Error Messages
200
+
201
+ === File Not Found
202
+
203
+ [source]
204
+ ----
205
+ $ postsvg convert missing.ps output.svg
206
+ Error: Input file 'missing.ps' not found
207
+ ----
208
+
209
+ **Exit code:** 1
210
+
211
+ **Solution:** Check file path and ensure file exists
212
+
213
+ === Conversion Error
214
+
215
+ [source]
216
+ ----
217
+ $ postsvg convert broken.ps output.svg
218
+ Conversion error: Stack underflow at operator 'moveto'
219
+ ----
220
+
221
+ **Exit code:** 1
222
+
223
+ **Solutions:**
224
+ 1. Validate with: `postsvg check broken.ps`
225
+ 2. Try without strict mode
226
+ 3. Check PostScript syntax
227
+
228
+ === Unknown Operator (Strict Mode)
229
+
230
+ [source]
231
+ ----
232
+ $ postsvg convert --strict advanced.ps output.svg
233
+ Conversion error: Unknown operator: shfill
234
+ ----
235
+
236
+ **Exit code:** 1
237
+
238
+ **Solutions:**
239
+ 1. Remove `--strict` flag (ignore unknown operators)
240
+ 2. Check link:../postscript/operators/index.adoc[supported operators]
241
+ 3. Request feature or contribute implementation
242
+
243
+ == Usage Patterns
244
+
245
+ === Pattern 1: Validate Then Convert
246
+
247
+ [source,sh]
248
+ ----
249
+ #!/bin/bash
250
+ # safe-convert.sh
251
+
252
+ INPUT="$1"
253
+ OUTPUT="$2"
254
+
255
+ # Validate first
256
+ if postsvg check "$INPUT"; then
257
+ # Convert if valid
258
+ postsvg convert "$INPUT" "$OUTPUT"
259
+ echo "✓ Conversion complete"
260
+ else
261
+ echo "✗ Validation failed"
262
+ exit 1
263
+ fi
264
+ ----
265
+
266
+ === Pattern 2: Convert Multiple Files
267
+
268
+ [source,sh]
269
+ ----
270
+ #!/bin/bash
271
+ # convert-all.sh
272
+
273
+ for file in *.ps; do
274
+ output="${file%.ps}.svg"
275
+
276
+ if postsvg convert "$file" "$output"; then
277
+ echo "✓ $file → $output"
278
+ else
279
+ echo "✗ Failed: $file"
280
+ fi
281
+ done
282
+ ----
283
+
284
+ === Pattern 3: Preview Conversion
285
+
286
+ [source,sh]
287
+ ----
288
+ # Convert and immediately open in browser
289
+ postsvg convert diagram.eps diagram.svg && open diagram.svg
290
+
291
+ # Or pipe directly to browser (macOS)
292
+ postsvg convert diagram.eps | open -f -a Safari
293
+ ----
294
+
295
+ === Pattern 4: CI/CD Integration
296
+
297
+ [source,yaml]
298
+ ----
299
+ # .github/workflows/convert.yml
300
+ - name: Convert PostScript files
301
+ run: |
302
+ for file in docs/*.ps; do
303
+ postsvg convert "$file" "${file%.ps}.svg" || exit 1
304
+ done
305
+ ----
306
+
307
+ == Performance Tips
308
+
309
+ **For Large Files:**
310
+ [source,sh]
311
+ ----
312
+ # Monitor conversion time
313
+ time postsvg convert large.ps large.svg
314
+
315
+ # Check memory usage (Linux)
316
+ /usr/bin/time -v postsvg convert large.ps large.svg
317
+ ----
318
+
319
+ **For Many Files:**
320
+ Use link:batch-command.adoc[batch command] instead:
321
+ [source,sh]
322
+ ----
323
+ # More efficient for multiple files
324
+ postsvg batch input_dir/ output_dir/
325
+ ----
326
+
327
+ == Environment Considerations
328
+
329
+ === Working Directory
330
+
331
+ The command respects relative paths:
332
+
333
+ [source,sh]
334
+ ----
335
+ # From current directory
336
+ postsvg convert ./files/input.ps ./output/result.svg
337
+
338
+ # With absolute paths
339
+ postsvg convert /path/to/input.ps /path/to/output.svg
340
+
341
+ # Parent directory
342
+ postsvg convert ../input.ps ./output.svg
343
+ ----
344
+
345
+ === File Permissions
346
+
347
+ **Required Permissions:**
348
+ * Read permission on input file
349
+ * Write permission on output directory
350
+
351
+ [source,sh]
352
+ ----
353
+ # Check permissions
354
+ ls -l input.ps
355
+
356
+ # Fix if needed
357
+ chmod +r input.ps
358
+ chmod +w output_directory/
359
+ ----
360
+
361
+ == Integration Examples
362
+
363
+ === Shell Script Integration
364
+
365
+ [source,sh]
366
+ ----
367
+ #!/bin/bash
368
+ # production-convert.sh
369
+
370
+ set -euo pipefail # Exit on error
371
+
372
+ INPUT="${1:?Input file required}"
373
+ OUTPUT="${2:?Output file required}"
374
+
375
+ # Backup existing output
376
+ if [ -f "$OUTPUT" ]; then
377
+ cp "$OUTPUT" "${OUTPUT}.backup"
378
+ fi
379
+
380
+ # Convert with error handling
381
+ if postsvg convert "$INPUT" "$OUTPUT"; then
382
+ echo "Success: $OUTPUT"
383
+ rm -f "${OUTPUT}.backup"
384
+ exit 0
385
+ else
386
+ echo "Failed: Restoring backup"
387
+ [ -f "${OUTPUT}.backup" ] && mv "${OUTPUT}.backup" "$OUTPUT"
388
+ exit 1
389
+ fi
390
+ ----
391
+
392
+ === Makefile Integration
393
+
394
+ [source,makefile]
395
+ ----
396
+ # Makefile
397
+ .SUFFIXES: .ps .svg
398
+
399
+ .ps.svg:
400
+ postsvg convert $< $@
401
+
402
+ # Convert all PS files
403
+ all: $(patsubst %.ps,%.svg,$(wildcard *.ps))
404
+
405
+ clean:
406
+ rm -f *.svg
407
+
408
+ .PHONY: all clean
409
+ ----
410
+
411
+ == Comparison with Other Commands
412
+
413
+ [cols="1,2,2"]
414
+ |===
415
+ | Feature | convert | batch
416
+
417
+ | Files processed
418
+ | Single file
419
+ | Multiple files
420
+
421
+ | Output control
422
+ | Precise (file or stdout)
423
+ | Directory-based
424
+
425
+ | Error handling
426
+ | Immediate exit
427
+ | Continue on error
428
+
429
+ | Use case
430
+ | One-off conversion
431
+ | Bulk processing
432
+
433
+ | Performance
434
+ | One file overhead
435
+ | Optimized for many files
436
+ |===
437
+
438
+ **When to use `convert`:**
439
+ - ✅ Converting single files
440
+ - ✅ Need precise output control
441
+ - ✅ Piping to other commands
442
+ - ✅ Scripted individual conversions
443
+
444
+ **When to use `batch`:**
445
+ - ✅ Converting multiple files
446
+ - ✅ Processing entire directories
447
+ - ✅ Want progress reporting
448
+ - ✅ Continue on individual failures
449
+
450
+ == Next Steps
451
+
452
+ * Learn link:batch-command.adoc[batch command] for multiple files
453
+ * Review link:check-command.adoc[check command] for validation
454
+ * See link:../getting-started/basic-usage.adoc[Basic Usage] for examples
455
+ * Check link:../api-reference/converter.adoc[Converter Class] for API equivalent
456
+
457
+ == Bibliography
458
+
459
+ * link:batch-command.adoc[batch Command Documentation]
460
+ * link:check-command.adoc[check Command Documentation]
461
+ * link:../api-reference/converter.adoc[Converter Class API]
462
+ * link:../getting-started/common-workflows.adoc[Common Workflows]