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,486 @@
|
|
|
1
|
+
= Troubleshooting
|
|
2
|
+
:page-nav_order: 10
|
|
3
|
+
|
|
4
|
+
== Purpose
|
|
5
|
+
|
|
6
|
+
This guide helps you diagnose and resolve common issues when using Postsvg. If you can't find a solution here, check the link:faq.adoc[FAQ] or link:https://github.com/metanorma/postsvg/issues[create an issue].
|
|
7
|
+
|
|
8
|
+
== References
|
|
9
|
+
|
|
10
|
+
* link:index.adoc[Documentation Home]
|
|
11
|
+
* link:faq.adoc[FAQ]
|
|
12
|
+
* link:cli-reference.adoc[CLI Reference]
|
|
13
|
+
* link:https://github.com/metanorma/postsvg/issues[Issue Tracker]
|
|
14
|
+
|
|
15
|
+
== Common Issues
|
|
16
|
+
|
|
17
|
+
=== Installation Problems
|
|
18
|
+
|
|
19
|
+
==== Gem Installation Fails
|
|
20
|
+
|
|
21
|
+
**Problem:**
|
|
22
|
+
[source,sh]
|
|
23
|
+
----
|
|
24
|
+
$ gem install postsvg
|
|
25
|
+
ERROR: Could not find a valid gem 'postsvg'
|
|
26
|
+
----
|
|
27
|
+
|
|
28
|
+
**Solutions:**
|
|
29
|
+
|
|
30
|
+
1. **Check gem sources:**
|
|
31
|
+
[source,sh]
|
|
32
|
+
----
|
|
33
|
+
gem sources --list
|
|
34
|
+
# Should include https://rubygems.org
|
|
35
|
+
----
|
|
36
|
+
|
|
37
|
+
2. **Update RubyGems:**
|
|
38
|
+
[source,sh]
|
|
39
|
+
----
|
|
40
|
+
gem update --system
|
|
41
|
+
----
|
|
42
|
+
|
|
43
|
+
3. **Install specific version:**
|
|
44
|
+
[source,sh]
|
|
45
|
+
----
|
|
46
|
+
gem install postsvg -v '0.1.0'
|
|
47
|
+
----
|
|
48
|
+
|
|
49
|
+
==== Command Not Found
|
|
50
|
+
|
|
51
|
+
**Problem:**
|
|
52
|
+
[source,sh]
|
|
53
|
+
----
|
|
54
|
+
$ postsvg version
|
|
55
|
+
bash: postsvg: command not found
|
|
56
|
+
----
|
|
57
|
+
|
|
58
|
+
**Solutions:**
|
|
59
|
+
|
|
60
|
+
1. **Check gem bin directory:**
|
|
61
|
+
[source,sh]
|
|
62
|
+
----
|
|
63
|
+
gem environment
|
|
64
|
+
# Look for GEM PATHS and EXECUTABLE DIRECTORY
|
|
65
|
+
----
|
|
66
|
+
|
|
67
|
+
2. **Add to PATH:**
|
|
68
|
+
[source,sh]
|
|
69
|
+
----
|
|
70
|
+
export PATH="$PATH:$(gem environment gemdir)/bin"
|
|
71
|
+
# Add to ~/.bashrc or ~/.zshrc for persistence
|
|
72
|
+
----
|
|
73
|
+
|
|
74
|
+
3. **Use bundle exec:**
|
|
75
|
+
[source,sh]
|
|
76
|
+
----
|
|
77
|
+
bundle exec postsvg version
|
|
78
|
+
----
|
|
79
|
+
|
|
80
|
+
==== Permission Denied
|
|
81
|
+
|
|
82
|
+
**Problem:**
|
|
83
|
+
[source,sh]
|
|
84
|
+
----
|
|
85
|
+
$ gem install postsvg
|
|
86
|
+
ERROR: While executing gem ... (Errno::EACCES)
|
|
87
|
+
Permission denied
|
|
88
|
+
----
|
|
89
|
+
|
|
90
|
+
**Solutions:**
|
|
91
|
+
|
|
92
|
+
1. **Use user install:**
|
|
93
|
+
[source,sh]
|
|
94
|
+
----
|
|
95
|
+
gem install --user-install postsvg
|
|
96
|
+
----
|
|
97
|
+
|
|
98
|
+
2. **Use bundler:**
|
|
99
|
+
[source,sh]
|
|
100
|
+
----
|
|
101
|
+
# Add to Gemfile
|
|
102
|
+
gem 'postsvg'
|
|
103
|
+
|
|
104
|
+
# Install
|
|
105
|
+
bundle install
|
|
106
|
+
----
|
|
107
|
+
|
|
108
|
+
3. **Fix gem directory permissions** (not recommended):
|
|
109
|
+
[source,sh]
|
|
110
|
+
----
|
|
111
|
+
sudo gem install postsvg # Use with caution
|
|
112
|
+
----
|
|
113
|
+
|
|
114
|
+
=== Conversion Errors
|
|
115
|
+
|
|
116
|
+
==== Unknown Operator Error
|
|
117
|
+
|
|
118
|
+
**Problem:**
|
|
119
|
+
[source]
|
|
120
|
+
----
|
|
121
|
+
Conversion error: Unknown operator: complexoperator
|
|
122
|
+
----
|
|
123
|
+
|
|
124
|
+
**Diagnosis:**
|
|
125
|
+
|
|
126
|
+
PostScript file contains operators not yet implemented in Postsvg.
|
|
127
|
+
|
|
128
|
+
**Solutions:**
|
|
129
|
+
|
|
130
|
+
1. **Disable strict mode** (for non-critical operators):
|
|
131
|
+
[source,ruby]
|
|
132
|
+
----
|
|
133
|
+
converter = Postsvg::Converter.new(
|
|
134
|
+
ps_content,
|
|
135
|
+
strict_mode: false
|
|
136
|
+
)
|
|
137
|
+
----
|
|
138
|
+
|
|
139
|
+
2. **Check operator support:**
|
|
140
|
+
- Review link:postscript/operators/index.adoc[Operator Reference]
|
|
141
|
+
- See link:index.adoc#current-limitations[Current Limitations]
|
|
142
|
+
|
|
143
|
+
3. **Request feature** or link:contributing.adoc[contribute implementation]:
|
|
144
|
+
- link:https://github.com/metanorma/postsvg/issues/new[Create feature request]
|
|
145
|
+
|
|
146
|
+
==== Malformed BoundingBox
|
|
147
|
+
|
|
148
|
+
**Problem:**
|
|
149
|
+
[source]
|
|
150
|
+
----
|
|
151
|
+
Warning: Invalid BoundingBox, using defaults
|
|
152
|
+
----
|
|
153
|
+
|
|
154
|
+
**Diagnosis:**
|
|
155
|
+
|
|
156
|
+
BoundingBox comment is missing or malformed.
|
|
157
|
+
|
|
158
|
+
**Solutions:**
|
|
159
|
+
|
|
160
|
+
1. **Add BoundingBox comment:**
|
|
161
|
+
[source,postscript]
|
|
162
|
+
----
|
|
163
|
+
%!PS-Adobe-3.0 EPSF-3.0
|
|
164
|
+
%%BoundingBox: 0 0 612 792
|
|
165
|
+
----
|
|
166
|
+
|
|
167
|
+
2. **Accept default dimensions:**
|
|
168
|
+
- Postsvg uses 1920x1080 as fallback
|
|
169
|
+
- May result in incorrect scaling
|
|
170
|
+
|
|
171
|
+
3. **Calculate BoundingBox manually:**
|
|
172
|
+
[source,sh]
|
|
173
|
+
----
|
|
174
|
+
# Use Ghostscript to find BoundingBox
|
|
175
|
+
gs -dNOPAUSE -dBATCH -sDEVICE=bbox input.ps 2>&1 | grep BoundingBox
|
|
176
|
+
----
|
|
177
|
+
|
|
178
|
+
==== Empty or Corrupted Output
|
|
179
|
+
|
|
180
|
+
**Problem:**
|
|
181
|
+
Generated SVG is empty or displays incorrectly.
|
|
182
|
+
|
|
183
|
+
**Diagnosis:**
|
|
184
|
+
|
|
185
|
+
Possible causes:
|
|
186
|
+
* Unsupported PostScript features
|
|
187
|
+
* Path construction errors
|
|
188
|
+
* Coordinate system issues
|
|
189
|
+
|
|
190
|
+
**Solutions:**
|
|
191
|
+
|
|
192
|
+
1. **Validate PostScript file:**
|
|
193
|
+
[source,sh]
|
|
194
|
+
----
|
|
195
|
+
postsvg check --level=full document.ps
|
|
196
|
+
----
|
|
197
|
+
|
|
198
|
+
2. **Check SVG output:**
|
|
199
|
+
[source,sh]
|
|
200
|
+
----
|
|
201
|
+
# View in browser
|
|
202
|
+
open output.svg
|
|
203
|
+
|
|
204
|
+
# Inspect SVG content
|
|
205
|
+
cat output.svg | grep '<path'
|
|
206
|
+
----
|
|
207
|
+
|
|
208
|
+
3. **Enable verbose logging** (if available in future version):
|
|
209
|
+
[source,ruby]
|
|
210
|
+
----
|
|
211
|
+
Postsvg::Logger.level = :debug
|
|
212
|
+
svg = Postsvg.convert(ps_content)
|
|
213
|
+
----
|
|
214
|
+
|
|
215
|
+
=== Validation Errors
|
|
216
|
+
|
|
217
|
+
==== Syntax Validation Fails
|
|
218
|
+
|
|
219
|
+
**Problem:**
|
|
220
|
+
[source]
|
|
221
|
+
----
|
|
222
|
+
✗ document.ps - Syntax error: Unmatched delimiter
|
|
223
|
+
----
|
|
224
|
+
|
|
225
|
+
**Solutions:**
|
|
226
|
+
|
|
227
|
+
1. **Check delimiters:**
|
|
228
|
+
- Ensure all `[`, `{`, `(`, `<` have matching closers
|
|
229
|
+
- Common issue: missing `}` or `]`
|
|
230
|
+
|
|
231
|
+
2. **Validate with different level:**
|
|
232
|
+
[source,sh]
|
|
233
|
+
----
|
|
234
|
+
# Try syntax-only
|
|
235
|
+
postsvg check --level=syntax document.ps
|
|
236
|
+
----
|
|
237
|
+
|
|
238
|
+
3. **Check file encoding:**
|
|
239
|
+
[source,sh]
|
|
240
|
+
----
|
|
241
|
+
file -I document.ps
|
|
242
|
+
# Should be: text/plain; charset=us-ascii
|
|
243
|
+
----
|
|
244
|
+
|
|
245
|
+
==== Semantic Validation Fails
|
|
246
|
+
|
|
247
|
+
**Problem:**
|
|
248
|
+
[source]
|
|
249
|
+
----
|
|
250
|
+
✗ document.ps - Semantic error: Stack underflow
|
|
251
|
+
----
|
|
252
|
+
|
|
253
|
+
**Solutions:**
|
|
254
|
+
|
|
255
|
+
1. **Check stack operations:**
|
|
256
|
+
- Operators popping more values than available
|
|
257
|
+
- Missing operands for commands
|
|
258
|
+
|
|
259
|
+
2. **Review PostScript code:**
|
|
260
|
+
[source,postscript]
|
|
261
|
+
----
|
|
262
|
+
% Bad - stack underflow
|
|
263
|
+
add % No values on stack
|
|
264
|
+
|
|
265
|
+
% Good
|
|
266
|
+
10 20 add % Two values provided
|
|
267
|
+
----
|
|
268
|
+
|
|
269
|
+
3. **Test with simpler file:**
|
|
270
|
+
Create minimal test case to isolate issue
|
|
271
|
+
|
|
272
|
+
=== Performance Issues
|
|
273
|
+
|
|
274
|
+
==== Slow Conversion
|
|
275
|
+
|
|
276
|
+
**Problem:**
|
|
277
|
+
Conversion takes very long for large files.
|
|
278
|
+
|
|
279
|
+
**Solutions:**
|
|
280
|
+
|
|
281
|
+
1. **Profile the conversion:**
|
|
282
|
+
[source,ruby]
|
|
283
|
+
----
|
|
284
|
+
require 'benchmark'
|
|
285
|
+
|
|
286
|
+
time = Benchmark.measure do
|
|
287
|
+
Postsvg.convert_file('large.ps', 'output.svg')
|
|
288
|
+
end
|
|
289
|
+
puts "Time: #{time.real}s"
|
|
290
|
+
----
|
|
291
|
+
|
|
292
|
+
2. **Batch processing:**
|
|
293
|
+
[source,ruby]
|
|
294
|
+
----
|
|
295
|
+
# Process files sequentially, not all at once
|
|
296
|
+
Dir.glob('*.ps').each do |file|
|
|
297
|
+
Postsvg.convert_file(file, file.sub('.ps', '.svg'))
|
|
298
|
+
GC.start # Force garbage collection
|
|
299
|
+
end
|
|
300
|
+
----
|
|
301
|
+
|
|
302
|
+
3. **Check file size:**
|
|
303
|
+
[source,sh]
|
|
304
|
+
----
|
|
305
|
+
# If file > 10MB, may be slow
|
|
306
|
+
ls -lh large.ps
|
|
307
|
+
----
|
|
308
|
+
|
|
309
|
+
==== High Memory Usage
|
|
310
|
+
|
|
311
|
+
**Problem:**
|
|
312
|
+
Ruby process consumes excessive memory.
|
|
313
|
+
|
|
314
|
+
**Solutions:**
|
|
315
|
+
|
|
316
|
+
1. **Process in batches:**
|
|
317
|
+
[source,ruby]
|
|
318
|
+
----
|
|
319
|
+
files.each_slice(10) do |batch|
|
|
320
|
+
batch.each { |f| Postsvg.convert_file(f) }
|
|
321
|
+
GC.start
|
|
322
|
+
end
|
|
323
|
+
----
|
|
324
|
+
|
|
325
|
+
2. **Stream processing** (not yet supported):
|
|
326
|
+
Currently Postsvg loads entire file into memory
|
|
327
|
+
|
|
328
|
+
3. **Increase Ruby memory limit:**
|
|
329
|
+
[source,sh]
|
|
330
|
+
----
|
|
331
|
+
RUBY_GC_HEAP_GROWTH_FACTOR=1.1 postsvg batch large_dir/
|
|
332
|
+
----
|
|
333
|
+
|
|
334
|
+
=== Output Quality Issues
|
|
335
|
+
|
|
336
|
+
==== Colors Incorrect
|
|
337
|
+
|
|
338
|
+
**Problem:**
|
|
339
|
+
Output colors don't match original PostScript.
|
|
340
|
+
|
|
341
|
+
**Diagnosis:**
|
|
342
|
+
|
|
343
|
+
Possible causes:
|
|
344
|
+
* CMYK color space (partial support)
|
|
345
|
+
* Custom color spaces (not supported)
|
|
346
|
+
* ICC profiles (not supported)
|
|
347
|
+
|
|
348
|
+
**Solutions:**
|
|
349
|
+
|
|
350
|
+
1. **Convert to RGB:**
|
|
351
|
+
Preprocess PostScript to use RGB colors only
|
|
352
|
+
|
|
353
|
+
2. **Check color space:**
|
|
354
|
+
[source,postscript]
|
|
355
|
+
----
|
|
356
|
+
% Supported
|
|
357
|
+
0.5 0.5 0.5 setrgbcolor
|
|
358
|
+
0.5 setgray
|
|
359
|
+
|
|
360
|
+
% Partially supported
|
|
361
|
+
0.5 0.3 0.1 0.0 setcmykcolor
|
|
362
|
+
|
|
363
|
+
% Not supported
|
|
364
|
+
[/Pattern /DeviceRGB] setcolorspace
|
|
365
|
+
----
|
|
366
|
+
|
|
367
|
+
==== Paths Distorted
|
|
368
|
+
|
|
369
|
+
**Problem:**
|
|
370
|
+
Shapes appear distorted or incorrect in SVG.
|
|
371
|
+
|
|
372
|
+
**Solutions:**
|
|
373
|
+
|
|
374
|
+
1. **Check coordinate transformation:**
|
|
375
|
+
[source,sh]
|
|
376
|
+
----
|
|
377
|
+
# Verify BoundingBox is correct
|
|
378
|
+
grep BoundingBox input.ps
|
|
379
|
+
----
|
|
380
|
+
|
|
381
|
+
2. **Inspect transformation matrices:**
|
|
382
|
+
Look for unusual scale/rotate operations
|
|
383
|
+
|
|
384
|
+
3. **Compare with reference:**
|
|
385
|
+
[source,sh]
|
|
386
|
+
----
|
|
387
|
+
# Convert with Ghostscript for comparison
|
|
388
|
+
gs -dNOPAUSE -dBATCH -sDEVICE=svg -sOutputFile=ref.svg input.ps
|
|
389
|
+
----
|
|
390
|
+
|
|
391
|
+
==== Text Missing or Incorrect
|
|
392
|
+
|
|
393
|
+
**Problem:**
|
|
394
|
+
Text doesn't appear in SVG output.
|
|
395
|
+
|
|
396
|
+
**Diagnosis:**
|
|
397
|
+
|
|
398
|
+
Text operations are not yet fully supported. See link:index.adoc#current-limitations[Current Limitations].
|
|
399
|
+
|
|
400
|
+
**Solutions:**
|
|
401
|
+
|
|
402
|
+
1. **Convert text to outlines:**
|
|
403
|
+
Use external tool to convert text to paths before processing
|
|
404
|
+
|
|
405
|
+
2. **Use Ghostscript for text-heavy files:**
|
|
406
|
+
[source,sh]
|
|
407
|
+
----
|
|
408
|
+
gs -dNOPAUSE -dBATCH -sDEVICE=svg -sOutputFile=output.svg input.ps
|
|
409
|
+
----
|
|
410
|
+
|
|
411
|
+
== Debugging Techniques
|
|
412
|
+
|
|
413
|
+
=== Enable Verbose Output
|
|
414
|
+
|
|
415
|
+
[source,ruby]
|
|
416
|
+
----
|
|
417
|
+
# In Ruby code
|
|
418
|
+
require 'postsvg'
|
|
419
|
+
|
|
420
|
+
# Add debug output to identify issues
|
|
421
|
+
converter = Postsvg::Converter.new(ps_content)
|
|
422
|
+
puts "BoundingBox: #{converter.extract_bounding_box.inspect}"
|
|
423
|
+
----
|
|
424
|
+
|
|
425
|
+
=== Minimal Test Case
|
|
426
|
+
|
|
427
|
+
Create minimal PostScript to isolate issue:
|
|
428
|
+
|
|
429
|
+
[source,postscript]
|
|
430
|
+
----
|
|
431
|
+
%!PS-Adobe-3.0
|
|
432
|
+
%%BoundingBox: 0 0 100 100
|
|
433
|
+
newpath
|
|
434
|
+
50 50 moveto
|
|
435
|
+
90 50 lineto
|
|
436
|
+
stroke
|
|
437
|
+
showpage
|
|
438
|
+
----
|
|
439
|
+
|
|
440
|
+
=== Check Intermediate Steps
|
|
441
|
+
|
|
442
|
+
[source,ruby]
|
|
443
|
+
----
|
|
444
|
+
# Test tokenization
|
|
445
|
+
tokens = Postsvg::Tokenizer.tokenize(ps_content)
|
|
446
|
+
puts "Tokens: #{tokens.inspect}"
|
|
447
|
+
|
|
448
|
+
# Test interpretation
|
|
449
|
+
interpreter = Postsvg::Interpreter.new
|
|
450
|
+
result = interpreter.interpret(tokens, bounding_box)
|
|
451
|
+
puts "SVG: #{result[:svg]}"
|
|
452
|
+
----
|
|
453
|
+
|
|
454
|
+
== Getting Help
|
|
455
|
+
|
|
456
|
+
If troubleshooting doesn't resolve your issue:
|
|
457
|
+
|
|
458
|
+
1. **Search existing issues:**
|
|
459
|
+
link:https://github.com/metanorma/postsvg/issues[GitHub Issues]
|
|
460
|
+
|
|
461
|
+
2. **Create minimal reproducible example:**
|
|
462
|
+
- Simplest PostScript that shows the problem
|
|
463
|
+
- Expected vs actual output
|
|
464
|
+
- Error messages and logs
|
|
465
|
+
|
|
466
|
+
3. **Report the issue:**
|
|
467
|
+
link:https://github.com/metanorma/postsvg/issues/new[Create New Issue]
|
|
468
|
+
|
|
469
|
+
4. **Provide context:**
|
|
470
|
+
- Postsvg version: `postsvg version`
|
|
471
|
+
- Ruby version: `ruby -v`
|
|
472
|
+
- Operating system
|
|
473
|
+
- Complete error message
|
|
474
|
+
|
|
475
|
+
== Next Steps
|
|
476
|
+
|
|
477
|
+
* Check link:faq.adoc[FAQ] for common questions
|
|
478
|
+
* Review link:validation.adoc[Validation System] for quality checks
|
|
479
|
+
* See link:contributing.adoc[Contributing Guide] to report issues
|
|
480
|
+
* Read link:development.adoc[Development Guide] to fix issues yourself
|
|
481
|
+
|
|
482
|
+
== Bibliography
|
|
483
|
+
|
|
484
|
+
* link:faq.adoc[Frequently Asked Questions]
|
|
485
|
+
* link:validation.adoc[Validation System]
|
|
486
|
+
* link:https://github.com/metanorma/postsvg/issues[GitHub Issues]
|