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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +105 -0
- data/CLAUDE.md +173 -0
- data/Gemfile +2 -3
- data/README.adoc +456 -179
- data/Rakefile +100 -0
- data/TODO.roadmap/00-architecture.md +139 -0
- data/TODO.roadmap/01-autoload-migration.md +39 -0
- data/TODO.roadmap/02-isolate-dormant-code.md +51 -0
- data/TODO.roadmap/03-domain-model.md +66 -0
- data/TODO.roadmap/04-lexer.md +40 -0
- data/TODO.roadmap/05-parser.md +43 -0
- data/TODO.roadmap/06-graphics-state.md +45 -0
- data/TODO.roadmap/07-matrix-and-color.md +37 -0
- data/TODO.roadmap/08-svg-builder.md +51 -0
- data/TODO.roadmap/09-renderer.md +52 -0
- data/TODO.roadmap/10-visitor.md +58 -0
- data/TODO.roadmap/11-operator-coverage.md +103 -0
- data/TODO.roadmap/12-svg-domain.md +62 -0
- data/TODO.roadmap/13-translation-handlers.md +69 -0
- data/TODO.roadmap/14-ps-serializer.md +49 -0
- data/TODO.roadmap/15-cli-and-public-api.md +47 -0
- data/TODO.roadmap/16-specs.md +84 -0
- data/TODO.roadmap/17-docs-sync.md +47 -0
- data/TODO.roadmap/18-performance-and-determinism.md +47 -0
- data/TODO.roadmap/19-error-model.md +45 -0
- data/TODO.roadmap/20-font-and-text.md +46 -0
- data/TODO.roadmap/21-images.md +45 -0
- data/TODO.roadmap/22-forms-and-resources.md +25 -0
- data/TODO.roadmap/23-level2-level3.md +52 -0
- data/TODO.roadmap/24-ci-and-release.md +42 -0
- data/TODO.roadmap/README.md +77 -0
- data/docs/.gitignore +29 -0
- data/docs/CHANGELOG.md +114 -0
- data/docs/COMPLETE_DOCUMENTATION_STATUS.md +376 -0
- data/docs/DEPLOYMENT.md +456 -0
- data/docs/DEPLOYMENT_INSTRUCTIONS.md +229 -0
- data/docs/DOCUMENTATION_PLAN.md +425 -0
- data/docs/FINAL_SUMMARY.md +657 -0
- data/docs/Gemfile +15 -0
- data/docs/README.md +327 -0
- data/docs/_config.yml +99 -0
- data/docs/advanced-topics.adoc +370 -0
- data/docs/api-reference/colors.adoc +705 -0
- data/docs/api-reference/converter.adoc +699 -0
- data/docs/api-reference/execution-context.adoc +1210 -0
- data/docs/api-reference/graphics-state.adoc +1070 -0
- data/docs/api-reference/interpreter.adoc +810 -0
- data/docs/api-reference/matrix.adoc +1179 -0
- data/docs/api-reference/path-builder.adoc +1284 -0
- data/docs/api-reference/postsvg-module.adoc +388 -0
- data/docs/api-reference/svg-generator.adoc +891 -0
- data/docs/api-reference/tokenizer.adoc +925 -0
- data/docs/api-reference.adoc +221 -0
- data/docs/architecture/command-registry.adoc +1191 -0
- data/docs/architecture/conversion-pipeline.adoc +746 -0
- data/docs/architecture/design-decisions.adoc +999 -0
- data/docs/architecture/generator-stage.adoc +1115 -0
- data/docs/architecture/graphics-state-model.adoc +1089 -0
- data/docs/architecture/interpreter-stage.adoc +1125 -0
- data/docs/architecture/parser-stage.adoc +1051 -0
- data/docs/architecture.adoc +354 -0
- data/docs/cli-reference/batch-command.adoc +616 -0
- data/docs/cli-reference/check-command.adoc +677 -0
- data/docs/cli-reference/cli-options.adoc +802 -0
- data/docs/cli-reference/convert-command.adoc +462 -0
- data/docs/cli-reference/version-command.adoc +296 -0
- data/docs/cli-reference.adoc +317 -0
- data/docs/concepts/conversion-pipeline.adoc +903 -0
- data/docs/concepts/coordinate-systems.adoc +836 -0
- data/docs/concepts/graphics-state.adoc +861 -0
- data/docs/concepts/path-operations.adoc +1076 -0
- data/docs/concepts/postscript-language.adoc +859 -0
- data/docs/concepts/svg-generation.adoc +937 -0
- data/docs/concepts.adoc +198 -0
- data/docs/contributing.adoc +443 -0
- data/docs/development.adoc +420 -0
- data/docs/faq.adoc +493 -0
- data/docs/getting-started/basic-usage.adoc +538 -0
- data/docs/getting-started/common-workflows.adoc +577 -0
- data/docs/getting-started/first-conversion.adoc +492 -0
- data/docs/getting-started/installation.adoc +534 -0
- data/docs/getting-started.adoc +94 -0
- data/docs/index.adoc +248 -0
- data/docs/optimization.adoc +196 -0
- data/docs/ps2svg_compatibility.adoc +149 -0
- data/docs/quick-reference.adoc +453 -0
- data/docs/sitemap.adoc +337 -0
- data/docs/troubleshooting.adoc +486 -0
- data/docs/validation.adoc +772 -0
- data/exe/postsvg +1 -0
- data/lib/postsvg/cli.rb +104 -57
- data/lib/postsvg/color.rb +132 -0
- data/lib/postsvg/errors.rb +68 -3
- data/lib/postsvg/format_number.rb +22 -0
- data/lib/postsvg/graphics_context.rb +80 -0
- data/lib/postsvg/graphics_stack.rb +43 -0
- data/lib/postsvg/model/literals/array.rb +41 -0
- data/lib/postsvg/model/literals/dictionary.rb +34 -0
- data/lib/postsvg/model/literals/hex.rb +37 -0
- data/lib/postsvg/model/literals/name.rb +40 -0
- data/lib/postsvg/model/literals/number.rb +36 -0
- data/lib/postsvg/model/literals/procedure.rb +41 -0
- data/lib/postsvg/model/literals/string.rb +30 -0
- data/lib/postsvg/model/literals.rb +19 -0
- data/lib/postsvg/model/operator.rb +58 -0
- data/lib/postsvg/model/operators/arithmetic.rb +264 -0
- data/lib/postsvg/model/operators/boolean.rb +182 -0
- data/lib/postsvg/model/operators/color.rb +74 -0
- data/lib/postsvg/model/operators/container.rb +186 -0
- data/lib/postsvg/model/operators/control_flow.rb +119 -0
- data/lib/postsvg/model/operators/device.rb +21 -0
- data/lib/postsvg/model/operators/dictionary.rb +118 -0
- data/lib/postsvg/model/operators/font.rb +121 -0
- data/lib/postsvg/model/operators/graphics_state.rb +84 -0
- data/lib/postsvg/model/operators/painting.rb +29 -0
- data/lib/postsvg/model/operators/path.rb +169 -0
- data/lib/postsvg/model/operators/stack.rb +72 -0
- data/lib/postsvg/model/operators/transformations.rb +103 -0
- data/lib/postsvg/model/operators.rb +89 -0
- data/lib/postsvg/model/program.rb +68 -0
- data/lib/postsvg/model/token.rb +43 -0
- data/lib/postsvg/model.rb +17 -0
- data/lib/postsvg/options.rb +29 -0
- data/lib/postsvg/renderer.rb +85 -0
- data/lib/postsvg/serializer.rb +325 -0
- data/lib/postsvg/source/ast_builder.rb +308 -0
- data/lib/postsvg/source/lexer.rb +322 -0
- data/lib/postsvg/source/operand_stack.rb +55 -0
- data/lib/postsvg/source.rb +21 -0
- data/lib/postsvg/svg/attribute_parser.rb +45 -0
- data/lib/postsvg/svg/clip_path_registry.rb +44 -0
- data/lib/postsvg/svg/document.rb +22 -0
- data/lib/postsvg/svg/element.rb +84 -0
- data/lib/postsvg/svg/elements/circle.rb +36 -0
- data/lib/postsvg/svg/elements/clip_path.rb +26 -0
- data/lib/postsvg/svg/elements/defs.rb +24 -0
- data/lib/postsvg/svg/elements/ellipse.rb +38 -0
- data/lib/postsvg/svg/elements/group.rb +37 -0
- data/lib/postsvg/svg/elements/image.rb +35 -0
- data/lib/postsvg/svg/elements/line.rb +36 -0
- data/lib/postsvg/svg/elements/path.rb +32 -0
- data/lib/postsvg/svg/elements/polygon.rb +12 -0
- data/lib/postsvg/svg/elements/polyline.rb +32 -0
- data/lib/postsvg/svg/elements/rect.rb +44 -0
- data/lib/postsvg/svg/elements/svg.rb +39 -0
- data/lib/postsvg/svg/elements/text.rb +42 -0
- data/lib/postsvg/svg/elements.rb +31 -0
- data/lib/postsvg/svg/paint.rb +34 -0
- data/lib/postsvg/svg/parser.rb +39 -0
- data/lib/postsvg/svg/path_data/command.rb +27 -0
- data/lib/postsvg/svg/path_data/parser.rb +82 -0
- data/lib/postsvg/svg/path_data.rb +17 -0
- data/lib/postsvg/svg/stroke.rb +31 -0
- data/lib/postsvg/svg/transform_list.rb +59 -0
- data/lib/postsvg/svg.rb +22 -0
- data/lib/postsvg/svg_builder.rb +249 -0
- data/lib/postsvg/translation/arc_converter.rb +86 -0
- data/lib/postsvg/translation/bounding_box.rb +59 -0
- data/lib/postsvg/translation/context.rb +34 -0
- data/lib/postsvg/translation/handler_registry.rb +38 -0
- data/lib/postsvg/translation/handlers/circle_handler.rb +28 -0
- data/lib/postsvg/translation/handlers/clip_path_handler.rb +13 -0
- data/lib/postsvg/translation/handlers/defs_handler.rb +15 -0
- data/lib/postsvg/translation/handlers/ellipse_handler.rb +31 -0
- data/lib/postsvg/translation/handlers/group_handler.rb +21 -0
- data/lib/postsvg/translation/handlers/image_handler.rb +20 -0
- data/lib/postsvg/translation/handlers/line_handler.rb +23 -0
- data/lib/postsvg/translation/handlers/open_handler.rb +18 -0
- data/lib/postsvg/translation/handlers/path_handler.rb +356 -0
- data/lib/postsvg/translation/handlers/polygon_handler.rb +33 -0
- data/lib/postsvg/translation/handlers/polyline_handler.rb +31 -0
- data/lib/postsvg/translation/handlers/rect_handler.rb +27 -0
- data/lib/postsvg/translation/handlers/shared.rb +110 -0
- data/lib/postsvg/translation/handlers/svg_handler.rb +25 -0
- data/lib/postsvg/translation/handlers/text_handler.rb +56 -0
- data/lib/postsvg/translation/handlers.rb +25 -0
- data/lib/postsvg/translation/ps_renderer.rb +105 -0
- data/lib/postsvg/translation/record_emitter.rb +35 -0
- data/lib/postsvg/translation.rb +17 -0
- data/lib/postsvg/version.rb +1 -1
- data/lib/postsvg/visitors/ps_visitor/arithmetic.rb +125 -0
- data/lib/postsvg/visitors/ps_visitor/boolean.rb +105 -0
- data/lib/postsvg/visitors/ps_visitor/color.rb +53 -0
- data/lib/postsvg/visitors/ps_visitor/common.rb +66 -0
- data/lib/postsvg/visitors/ps_visitor/container.rb +164 -0
- data/lib/postsvg/visitors/ps_visitor/control_flow.rb +110 -0
- data/lib/postsvg/visitors/ps_visitor/device.rb +20 -0
- data/lib/postsvg/visitors/ps_visitor/dictionary.rb +89 -0
- data/lib/postsvg/visitors/ps_visitor/font.rb +93 -0
- data/lib/postsvg/visitors/ps_visitor/graphics_state.rb +55 -0
- data/lib/postsvg/visitors/ps_visitor/painting.rb +90 -0
- data/lib/postsvg/visitors/ps_visitor/path.rb +112 -0
- data/lib/postsvg/visitors/ps_visitor/stack.rb +47 -0
- data/lib/postsvg/visitors/ps_visitor/transformations.rb +101 -0
- data/lib/postsvg/visitors/ps_visitor.rb +208 -0
- data/lib/postsvg/visitors.rb +9 -0
- data/lib/postsvg.rb +93 -59
- data/lychee.toml +86 -0
- metadata +216 -11
- 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]
|