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,492 @@
|
|
|
1
|
+
= First Conversion Tutorial
|
|
2
|
+
:page-nav_order: 3
|
|
3
|
+
:page-parent: Getting Started
|
|
4
|
+
|
|
5
|
+
== Purpose
|
|
6
|
+
|
|
7
|
+
This step-by-step tutorial guides you through your first PostScript to SVG conversion using Postsvg. You'll learn the complete workflow from creating a simple PostScript file to viewing the resulting SVG.
|
|
8
|
+
|
|
9
|
+
== References
|
|
10
|
+
|
|
11
|
+
* link:../index.adoc[Documentation Home]
|
|
12
|
+
* link:../getting-started.adoc[Getting Started Overview]
|
|
13
|
+
* link:installation.adoc[Installation Guide]
|
|
14
|
+
* link:basic-usage.adoc[Basic Usage]
|
|
15
|
+
* link:../postscript/fundamentals.adoc[PostScript Fundamentals]
|
|
16
|
+
|
|
17
|
+
== Concepts
|
|
18
|
+
|
|
19
|
+
**PostScript**:: A page description language that describes how to draw vector graphics using commands.
|
|
20
|
+
|
|
21
|
+
**Path**:: A sequence of connected lines and curves that define a shape.
|
|
22
|
+
|
|
23
|
+
**Stroke**:: Drawing the outline of a path.
|
|
24
|
+
|
|
25
|
+
**Fill**:: Filling the interior of a closed path with color.
|
|
26
|
+
|
|
27
|
+
**BoundingBox**:: The rectangular area that contains all graphics in an EPS file.
|
|
28
|
+
|
|
29
|
+
== Prerequisites
|
|
30
|
+
|
|
31
|
+
Before starting this tutorial:
|
|
32
|
+
|
|
33
|
+
* ✅ Postsvg installed (see link:installation.adoc[Installation Guide])
|
|
34
|
+
* ✅ Text editor (any editor will work)
|
|
35
|
+
* ✅ Terminal/command prompt access
|
|
36
|
+
* ✅ Web browser for viewing SVG
|
|
37
|
+
|
|
38
|
+
Verify installation:
|
|
39
|
+
|
|
40
|
+
[source,sh]
|
|
41
|
+
----
|
|
42
|
+
postsvg version
|
|
43
|
+
# Should output: postsvg version 0.1.0 (or similar)
|
|
44
|
+
----
|
|
45
|
+
|
|
46
|
+
== Step 1: Create a Simple PostScript File
|
|
47
|
+
|
|
48
|
+
Let's create a PostScript file that draws a simple triangle.
|
|
49
|
+
|
|
50
|
+
**1. Create a new file named `triangle.ps`:**
|
|
51
|
+
|
|
52
|
+
[source,sh]
|
|
53
|
+
----
|
|
54
|
+
# Using your text editor, or create with echo:
|
|
55
|
+
cat > triangle.ps << 'EOF'
|
|
56
|
+
%!PS-Adobe-3.0 EPSF-3.0
|
|
57
|
+
%%BoundingBox: 0 0 200 200
|
|
58
|
+
%%Title: Simple Triangle
|
|
59
|
+
|
|
60
|
+
% Draw a triangle
|
|
61
|
+
newpath
|
|
62
|
+
100 50 moveto
|
|
63
|
+
150 150 lineto
|
|
64
|
+
50 150 lineto
|
|
65
|
+
closepath
|
|
66
|
+
|
|
67
|
+
% Set color to blue
|
|
68
|
+
0 0 1 setrgbcolor
|
|
69
|
+
|
|
70
|
+
% Fill the triangle
|
|
71
|
+
fill
|
|
72
|
+
|
|
73
|
+
showpage
|
|
74
|
+
EOF
|
|
75
|
+
----
|
|
76
|
+
|
|
77
|
+
**2. Understanding the PostScript code:**
|
|
78
|
+
|
|
79
|
+
[source,postscript]
|
|
80
|
+
----
|
|
81
|
+
%!PS-Adobe-3.0 EPSF-3.0 <1>
|
|
82
|
+
%%BoundingBox: 0 0 200 200 <2>
|
|
83
|
+
%%Title: Simple Triangle <3>
|
|
84
|
+
|
|
85
|
+
newpath <4>
|
|
86
|
+
100 50 moveto <5>
|
|
87
|
+
150 150 lineto <6>
|
|
88
|
+
50 150 lineto <7>
|
|
89
|
+
closepath <8>
|
|
90
|
+
|
|
91
|
+
0 0 1 setrgbcolor <9>
|
|
92
|
+
fill <10>
|
|
93
|
+
|
|
94
|
+
showpage <11>
|
|
95
|
+
----
|
|
96
|
+
<1> PostScript header identifying file type
|
|
97
|
+
<2> Defines the drawing area (width: 200, height: 200)
|
|
98
|
+
<3> Optional title comment
|
|
99
|
+
<4> Initialize a new path
|
|
100
|
+
<5> Move to starting point (100, 50)
|
|
101
|
+
<6> Draw line to (150, 150)
|
|
102
|
+
<7> Draw line to (50, 150)
|
|
103
|
+
<8> Close the path back to start
|
|
104
|
+
<9> Set color to blue (R=0, G=0, B=1)
|
|
105
|
+
<10> Fill the closed path with current color
|
|
106
|
+
<11> End the page
|
|
107
|
+
|
|
108
|
+
== Step 2: Convert to SVG
|
|
109
|
+
|
|
110
|
+
Now let's convert the PostScript file to SVG.
|
|
111
|
+
|
|
112
|
+
**Using the command line:**
|
|
113
|
+
|
|
114
|
+
[source,sh]
|
|
115
|
+
----
|
|
116
|
+
postsvg convert triangle.ps triangle.svg
|
|
117
|
+
----
|
|
118
|
+
|
|
119
|
+
**Expected output:**
|
|
120
|
+
|
|
121
|
+
[source]
|
|
122
|
+
----
|
|
123
|
+
Successfully converted triangle.ps to triangle.svg
|
|
124
|
+
----
|
|
125
|
+
|
|
126
|
+
**What happened:**
|
|
127
|
+
|
|
128
|
+
1. Postsvg read `triangle.ps`
|
|
129
|
+
2. Parsed the PostScript commands
|
|
130
|
+
3. Interpreted the drawing operations
|
|
131
|
+
4. Generated equivalent SVG markup
|
|
132
|
+
5. Saved to `triangle.svg`
|
|
133
|
+
|
|
134
|
+
== Step 3: View the Result
|
|
135
|
+
|
|
136
|
+
**Open the SVG file in a web browser:**
|
|
137
|
+
|
|
138
|
+
[source,sh]
|
|
139
|
+
----
|
|
140
|
+
# macOS
|
|
141
|
+
open triangle.svg
|
|
142
|
+
|
|
143
|
+
# Linux
|
|
144
|
+
xdg-open triangle.svg
|
|
145
|
+
|
|
146
|
+
# Windows
|
|
147
|
+
start triangle.svg
|
|
148
|
+
----
|
|
149
|
+
|
|
150
|
+
**Or view the SVG code:**
|
|
151
|
+
|
|
152
|
+
[source,sh]
|
|
153
|
+
----
|
|
154
|
+
cat triangle.svg
|
|
155
|
+
----
|
|
156
|
+
|
|
157
|
+
**Expected SVG output:**
|
|
158
|
+
|
|
159
|
+
[source,xml]
|
|
160
|
+
----
|
|
161
|
+
<?xml version="1.0" standalone="no"?>
|
|
162
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
|
163
|
+
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
164
|
+
<svg xmlns="http://www.w3.org/2000/svg"
|
|
165
|
+
width="200" height="200"
|
|
166
|
+
viewBox="0 0 200 200">
|
|
167
|
+
<path d="M 100 150 L 150 50 L 50 50 Z"
|
|
168
|
+
fill="#0000ff"/>
|
|
169
|
+
</svg>
|
|
170
|
+
----
|
|
171
|
+
|
|
172
|
+
**You should see:** A blue triangle in your browser!
|
|
173
|
+
|
|
174
|
+
== Step 4: Experiment with Variations
|
|
175
|
+
|
|
176
|
+
Now let's try some variations to understand how Postsvg works.
|
|
177
|
+
|
|
178
|
+
=== Variation 1: Change the Color
|
|
179
|
+
|
|
180
|
+
**Modify `triangle.ps` to use red:**
|
|
181
|
+
|
|
182
|
+
[source,postscript]
|
|
183
|
+
----
|
|
184
|
+
% Change this line:
|
|
185
|
+
0 0 1 setrgbcolor
|
|
186
|
+
|
|
187
|
+
% To this (red):
|
|
188
|
+
1 0 0 setrgbcolor
|
|
189
|
+
----
|
|
190
|
+
|
|
191
|
+
**Convert again:**
|
|
192
|
+
|
|
193
|
+
[source,sh]
|
|
194
|
+
----
|
|
195
|
+
postsvg convert triangle.ps triangle-red.svg
|
|
196
|
+
----
|
|
197
|
+
|
|
198
|
+
**Result:** Red triangle!
|
|
199
|
+
|
|
200
|
+
=== Variation 2: Add a Stroke
|
|
201
|
+
|
|
202
|
+
**Modify to have both fill and stroke:**
|
|
203
|
+
|
|
204
|
+
[source,postscript]
|
|
205
|
+
----
|
|
206
|
+
%!PS-Adobe-3.0 EPSF-3.0
|
|
207
|
+
%%BoundingBox: 0 0 200 200
|
|
208
|
+
|
|
209
|
+
newpath
|
|
210
|
+
100 50 moveto
|
|
211
|
+
150 150 lineto
|
|
212
|
+
50 150 lineto
|
|
213
|
+
closepath
|
|
214
|
+
|
|
215
|
+
% Fill with light blue
|
|
216
|
+
0.7 0.9 1 setrgbcolor
|
|
217
|
+
fill
|
|
218
|
+
|
|
219
|
+
% Stroke with dark blue
|
|
220
|
+
newpath
|
|
221
|
+
100 50 moveto
|
|
222
|
+
150 150 lineto
|
|
223
|
+
50 150 lineto
|
|
224
|
+
closepath
|
|
225
|
+
|
|
226
|
+
0 0 0.5 setrgbcolor
|
|
227
|
+
3 setlinewidth
|
|
228
|
+
stroke
|
|
229
|
+
|
|
230
|
+
showpage
|
|
231
|
+
----
|
|
232
|
+
|
|
233
|
+
**Convert and view:**
|
|
234
|
+
|
|
235
|
+
[source,sh]
|
|
236
|
+
----
|
|
237
|
+
postsvg convert triangle.ps triangle-stroked.svg
|
|
238
|
+
open triangle-stroked.svg
|
|
239
|
+
----
|
|
240
|
+
|
|
241
|
+
**Result:** Light blue triangle with dark blue border!
|
|
242
|
+
|
|
243
|
+
=== Variation 3: Multiple Shapes
|
|
244
|
+
|
|
245
|
+
**Create a file with multiple shapes:**
|
|
246
|
+
|
|
247
|
+
[source,postscript]
|
|
248
|
+
----
|
|
249
|
+
%!PS-Adobe-3.0 EPSF-3.0
|
|
250
|
+
%%BoundingBox: 0 0 300 300
|
|
251
|
+
|
|
252
|
+
% Triangle
|
|
253
|
+
newpath
|
|
254
|
+
50 50 moveto
|
|
255
|
+
100 150 lineto
|
|
256
|
+
0 150 lineto
|
|
257
|
+
closepath
|
|
258
|
+
1 0 0 setrgbcolor
|
|
259
|
+
fill
|
|
260
|
+
|
|
261
|
+
% Circle (approximated with curve)
|
|
262
|
+
newpath
|
|
263
|
+
200 100 50 0 360 arc
|
|
264
|
+
0 1 0 setrgbcolor
|
|
265
|
+
fill
|
|
266
|
+
|
|
267
|
+
% Rectangle
|
|
268
|
+
newpath
|
|
269
|
+
50 200 moveto
|
|
270
|
+
150 200 lineto
|
|
271
|
+
150 280 lineto
|
|
272
|
+
50 280 lineto
|
|
273
|
+
closepath
|
|
274
|
+
0 0 1 setrgbcolor
|
|
275
|
+
fill
|
|
276
|
+
|
|
277
|
+
showpage
|
|
278
|
+
----
|
|
279
|
+
|
|
280
|
+
**Convert:**
|
|
281
|
+
|
|
282
|
+
[source,sh]
|
|
283
|
+
----
|
|
284
|
+
postsvg convert shapes.ps shapes.svg
|
|
285
|
+
----
|
|
286
|
+
|
|
287
|
+
**Result:** Red triangle, green circle, and blue rectangle!
|
|
288
|
+
|
|
289
|
+
== Step 5: Validate Your PostScript
|
|
290
|
+
|
|
291
|
+
Before converting complex files, validate them:
|
|
292
|
+
|
|
293
|
+
[source,sh]
|
|
294
|
+
----
|
|
295
|
+
postsvg check triangle.ps
|
|
296
|
+
----
|
|
297
|
+
|
|
298
|
+
**Expected output:**
|
|
299
|
+
|
|
300
|
+
[source]
|
|
301
|
+
----
|
|
302
|
+
✓ triangle.ps - Valid PostScript file
|
|
303
|
+
File type: EPS
|
|
304
|
+
Validation level: semantic
|
|
305
|
+
No errors found
|
|
306
|
+
----
|
|
307
|
+
|
|
308
|
+
**Try with a broken file:**
|
|
309
|
+
|
|
310
|
+
[source,sh]
|
|
311
|
+
----
|
|
312
|
+
# Create a file with syntax error
|
|
313
|
+
echo '%!PS-Adobe
|
|
314
|
+
newpath
|
|
315
|
+
moveto
|
|
316
|
+
stroke' > broken.ps
|
|
317
|
+
|
|
318
|
+
# Validate it
|
|
319
|
+
postsvg check broken.ps
|
|
320
|
+
----
|
|
321
|
+
|
|
322
|
+
**Output:**
|
|
323
|
+
|
|
324
|
+
[source]
|
|
325
|
+
----
|
|
326
|
+
✗ broken.ps - Semantic error: Stack underflow
|
|
327
|
+
File type: PostScript
|
|
328
|
+
Errors:
|
|
329
|
+
- Line ~3: moveto requires 2 arguments on stack
|
|
330
|
+
----
|
|
331
|
+
|
|
332
|
+
== Step 6: Using the Ruby API
|
|
333
|
+
|
|
334
|
+
Let's do the same conversion using Ruby code.
|
|
335
|
+
|
|
336
|
+
**Create `convert.rb`:**
|
|
337
|
+
|
|
338
|
+
[source,ruby]
|
|
339
|
+
----
|
|
340
|
+
require 'postsvg'
|
|
341
|
+
|
|
342
|
+
# PostScript content
|
|
343
|
+
ps_content = <<~PS
|
|
344
|
+
%!PS-Adobe-3.0 EPSF-3.0
|
|
345
|
+
%%BoundingBox: 0 0 200 200
|
|
346
|
+
|
|
347
|
+
newpath
|
|
348
|
+
100 50 moveto
|
|
349
|
+
150 150 lineto
|
|
350
|
+
50 150 lineto
|
|
351
|
+
closepath
|
|
352
|
+
|
|
353
|
+
0 0 1 setrgbcolor
|
|
354
|
+
fill
|
|
355
|
+
|
|
356
|
+
showpage
|
|
357
|
+
PS
|
|
358
|
+
|
|
359
|
+
# Convert to SVG
|
|
360
|
+
svg = Postsvg.convert(ps_content)
|
|
361
|
+
|
|
362
|
+
# Save to file
|
|
363
|
+
File.write('triangle-ruby.svg', svg)
|
|
364
|
+
|
|
365
|
+
puts "Conversion complete!"
|
|
366
|
+
puts "SVG length: #{svg.length} bytes"
|
|
367
|
+
----
|
|
368
|
+
|
|
369
|
+
**Run the script:**
|
|
370
|
+
|
|
371
|
+
[source,sh]
|
|
372
|
+
----
|
|
373
|
+
ruby convert.rb
|
|
374
|
+
----
|
|
375
|
+
|
|
376
|
+
**Output:**
|
|
377
|
+
|
|
378
|
+
[source]
|
|
379
|
+
----
|
|
380
|
+
Conversion complete!
|
|
381
|
+
SVG length: 285 bytes
|
|
382
|
+
----
|
|
383
|
+
|
|
384
|
+
== Common Issues and Solutions
|
|
385
|
+
|
|
386
|
+
=== Issue 1: Command Not Found
|
|
387
|
+
|
|
388
|
+
**Problem:**
|
|
389
|
+
[source]
|
|
390
|
+
----
|
|
391
|
+
bash: postsvg: command not found
|
|
392
|
+
----
|
|
393
|
+
|
|
394
|
+
**Solution:**
|
|
395
|
+
[source,sh]
|
|
396
|
+
----
|
|
397
|
+
# Check if gem is installed
|
|
398
|
+
gem list postsvg
|
|
399
|
+
|
|
400
|
+
# If not installed
|
|
401
|
+
gem install postsvg
|
|
402
|
+
|
|
403
|
+
# If installed, add to PATH
|
|
404
|
+
export PATH="$PATH:$(gem environment gemdir)/bin"
|
|
405
|
+
----
|
|
406
|
+
|
|
407
|
+
=== Issue 2: Invalid BoundingBox
|
|
408
|
+
|
|
409
|
+
**Problem:**
|
|
410
|
+
SVG appears at wrong size or position.
|
|
411
|
+
|
|
412
|
+
**Solution:**
|
|
413
|
+
Always include a valid BoundingBox comment:
|
|
414
|
+
|
|
415
|
+
[source,postscript]
|
|
416
|
+
----
|
|
417
|
+
%%BoundingBox: llx lly urx ury
|
|
418
|
+
|
|
419
|
+
# Example for 200x200 image:
|
|
420
|
+
%%BoundingBox: 0 0 200 200
|
|
421
|
+
----
|
|
422
|
+
|
|
423
|
+
=== Issue 3: Empty SVG Output
|
|
424
|
+
|
|
425
|
+
**Problem:**
|
|
426
|
+
SVG file is created but shows nothing.
|
|
427
|
+
|
|
428
|
+
**Solutions:**
|
|
429
|
+
|
|
430
|
+
1. **Ensure paths are stroked or filled:**
|
|
431
|
+
[source,postscript]
|
|
432
|
+
----
|
|
433
|
+
newpath
|
|
434
|
+
... path commands ...
|
|
435
|
+
stroke % or fill
|
|
436
|
+
----
|
|
437
|
+
|
|
438
|
+
2. **Check coordinates are within BoundingBox:**
|
|
439
|
+
[source,postscript]
|
|
440
|
+
----
|
|
441
|
+
%%BoundingBox: 0 0 100 100
|
|
442
|
+
% Make sure points are between 0-100
|
|
443
|
+
----
|
|
444
|
+
|
|
445
|
+
3. **Validate the file:**
|
|
446
|
+
[source,sh]
|
|
447
|
+
----
|
|
448
|
+
postsvg check --level=full yourfile.ps
|
|
449
|
+
----
|
|
450
|
+
|
|
451
|
+
== Next Steps
|
|
452
|
+
|
|
453
|
+
Congratulations! You've successfully:
|
|
454
|
+
|
|
455
|
+
* ✅ Created a PostScript file
|
|
456
|
+
* ✅ Converted it to SVG
|
|
457
|
+
* ✅ Viewed the result
|
|
458
|
+
* ✅ Made variations
|
|
459
|
+
* ✅ Validated files
|
|
460
|
+
* ✅ Used both CLI and Ruby API
|
|
461
|
+
|
|
462
|
+
**Continue learning:**
|
|
463
|
+
|
|
464
|
+
* link:common-workflows.adoc[Common Workflows] - Real-world usage patterns
|
|
465
|
+
* link:../postscript/fundamentals.adoc[PostScript Fundamentals] - Learn more PostScript
|
|
466
|
+
* link:../cli-reference.adoc[CLI Reference] - All command options
|
|
467
|
+
* link:../api-reference.adoc[API Reference] - Advanced Ruby usage
|
|
468
|
+
* link:../troubleshooting.adoc[Troubleshooting] - Solve problems
|
|
469
|
+
|
|
470
|
+
== Practice Exercises
|
|
471
|
+
|
|
472
|
+
Try these exercises to reinforce your learning:
|
|
473
|
+
|
|
474
|
+
**Exercise 1: Create a House**
|
|
475
|
+
Draw a simple house using rectangles and triangles.
|
|
476
|
+
|
|
477
|
+
**Exercise 2: Color Gradient Effect**
|
|
478
|
+
Create multiple overlapping shapes with different colors.
|
|
479
|
+
|
|
480
|
+
**Exercise 3: Geometric Pattern**
|
|
481
|
+
Use loops (if you know PostScript) or repeated shapes to create a pattern.
|
|
482
|
+
|
|
483
|
+
**Exercise 4: Text (Challenge)**
|
|
484
|
+
Note: Text is not yet supported, but try to understand why when you attempt it!
|
|
485
|
+
|
|
486
|
+
== Bibliography
|
|
487
|
+
|
|
488
|
+
* link:installation.adoc[Installation Guide]
|
|
489
|
+
* link:basic-usage.adoc[Basic Usage]
|
|
490
|
+
* link:common-workflows.adoc[Common Workflows]
|
|
491
|
+
* link:../postscript/fundamentals.adoc[PostScript Fundamentals]
|
|
492
|
+
* link:https://www.adobe.com/products/postscript/pdfs/PLRM.pdf[PostScript Language Reference]
|