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