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,221 @@
|
|
|
1
|
+
= API Reference
|
|
2
|
+
:page-nav_order: 4
|
|
3
|
+
|
|
4
|
+
== Purpose
|
|
5
|
+
|
|
6
|
+
This section provides complete Ruby API documentation for all Postsvg classes and methods. Use this reference to integrate Postsvg into your Ruby applications programmatically.
|
|
7
|
+
|
|
8
|
+
== References
|
|
9
|
+
|
|
10
|
+
* link:index.adoc[Documentation Home]
|
|
11
|
+
* link:getting-started.adoc[Getting Started Guide]
|
|
12
|
+
* link:concepts.adoc[Core Concepts]
|
|
13
|
+
* link:https://rubygems.org/gems/postsvg[RubyGems Package]
|
|
14
|
+
|
|
15
|
+
== Concepts
|
|
16
|
+
|
|
17
|
+
**Module Methods**:: Top-level convenience methods in the [`Postsvg`](../lib/postsvg.rb:10) module for quick conversions.
|
|
18
|
+
|
|
19
|
+
**Converter Class**:: The main [`Converter`](../lib/postsvg/converter.rb:8) class for controlled conversion with options.
|
|
20
|
+
|
|
21
|
+
**Interpreter**:: The [`Interpreter`](../lib/postsvg/interpreter.rb:9) class that executes PostScript commands.
|
|
22
|
+
|
|
23
|
+
**Graphics State**:: The [`GraphicsState`](../lib/postsvg/graphics_state.rb:5) class managing drawing parameters.
|
|
24
|
+
|
|
25
|
+
**Execution Context**:: The [`ExecutionContext`](../lib/postsvg/execution_context.rb:9) class coordinating the execution environment.
|
|
26
|
+
|
|
27
|
+
== API Reference Topics
|
|
28
|
+
|
|
29
|
+
link:api-reference/postsvg-module.adoc[**Postsvg Module**]::
|
|
30
|
+
Top-level module methods: [`convert`](../lib/postsvg.rb:13), [`convert_file`](../lib/postsvg.rb:24), BoundingBox extraction.
|
|
31
|
+
|
|
32
|
+
link:api-reference/converter.adoc[**Converter Class**]::
|
|
33
|
+
The [`Converter`](../lib/postsvg/converter.rb:8) class for converting PostScript to SVG with options.
|
|
34
|
+
|
|
35
|
+
link:api-reference/interpreter.adoc[**Interpreter Class**]::
|
|
36
|
+
The [`Interpreter`](../lib/postsvg/interpreter.rb:9) class that parses and executes PostScript commands.
|
|
37
|
+
|
|
38
|
+
link:api-reference/execution-context.adoc[**ExecutionContext Class**]::
|
|
39
|
+
The [`ExecutionContext`](../lib/postsvg/execution_context.rb:9) class managing operand stack, dictionaries, and graphics state.
|
|
40
|
+
|
|
41
|
+
link:api-reference/graphics-state.adoc[**GraphicsState Class**]::
|
|
42
|
+
The [`GraphicsState`](../lib/postsvg/graphics_state.rb:5) class managing current path, colors, and transformations.
|
|
43
|
+
|
|
44
|
+
link:api-reference/svg-generator.adoc[**SvgGenerator Class**]::
|
|
45
|
+
The [`SvgGenerator`](../lib/postsvg/svg_generator.rb:7) class creating SVG output from graphics operations.
|
|
46
|
+
|
|
47
|
+
link:api-reference/path-builder.adoc[**PathBuilder Class**]::
|
|
48
|
+
The [`PathBuilder`](../lib/postsvg/path_builder.rb:7) class for constructing SVG path data.
|
|
49
|
+
|
|
50
|
+
link:api-reference/matrix.adoc[**Matrix Class**]::
|
|
51
|
+
The [`Matrix`](../lib/postsvg/matrix.rb:6) class for coordinate transformations.
|
|
52
|
+
|
|
53
|
+
link:api-reference/colors.adoc[**Colors Module**]::
|
|
54
|
+
The [`Colors`](../lib/postsvg/colors.rb:5) module for color space conversions.
|
|
55
|
+
|
|
56
|
+
== Quick Reference
|
|
57
|
+
|
|
58
|
+
=== Basic Conversion
|
|
59
|
+
|
|
60
|
+
[source,ruby]
|
|
61
|
+
----
|
|
62
|
+
require 'postsvg'
|
|
63
|
+
|
|
64
|
+
# Convert PostScript content to SVG
|
|
65
|
+
ps_content = File.read('input.ps')
|
|
66
|
+
svg = Postsvg.convert(ps_content)
|
|
67
|
+
|
|
68
|
+
# Convert file directly
|
|
69
|
+
Postsvg.convert_file('input.eps', 'output.svg')
|
|
70
|
+
|
|
71
|
+
# Get SVG content without saving
|
|
72
|
+
svg_content = Postsvg.convert_file('input.ps')
|
|
73
|
+
----
|
|
74
|
+
|
|
75
|
+
=== Using Converter Class
|
|
76
|
+
|
|
77
|
+
[source,ruby]
|
|
78
|
+
----
|
|
79
|
+
require 'postsvg'
|
|
80
|
+
|
|
81
|
+
# Create converter with options
|
|
82
|
+
converter = Postsvg::Converter.new(
|
|
83
|
+
ps_content,
|
|
84
|
+
strict_mode: true
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
# Perform conversion
|
|
88
|
+
svg_output = converter.convert
|
|
89
|
+
----
|
|
90
|
+
|
|
91
|
+
=== Color Conversions
|
|
92
|
+
|
|
93
|
+
[source,ruby]
|
|
94
|
+
----
|
|
95
|
+
require 'postsvg'
|
|
96
|
+
|
|
97
|
+
# Convert RGB to hex
|
|
98
|
+
Postsvg::Colors.color2rgb([0.5, 0.5, 0.5]) # => "#808080"
|
|
99
|
+
|
|
100
|
+
# Convert grayscale to RGB hex
|
|
101
|
+
Postsvg::Colors.gray2rgb(0.75) # => "#bfbfbf"
|
|
102
|
+
|
|
103
|
+
# Convert CMYK to RGB hex
|
|
104
|
+
Postsvg::Colors.cmyk2rgb([0.0, 0.5, 1.0, 0.0]) # => "#ff8000"
|
|
105
|
+
----
|
|
106
|
+
|
|
107
|
+
=== Matrix Operations
|
|
108
|
+
|
|
109
|
+
[source,ruby]
|
|
110
|
+
----
|
|
111
|
+
require 'postsvg'
|
|
112
|
+
|
|
113
|
+
# Create identity matrix
|
|
114
|
+
matrix = Postsvg::Matrix.new
|
|
115
|
+
|
|
116
|
+
# Apply transformations
|
|
117
|
+
matrix.translate(10, 20)
|
|
118
|
+
matrix.scale(2.0, 2.0)
|
|
119
|
+
matrix.rotate(45)
|
|
120
|
+
|
|
121
|
+
# Transform points
|
|
122
|
+
result = matrix.apply_point(100, 100)
|
|
123
|
+
# => { x: transformed_x, y: transformed_y }
|
|
124
|
+
|
|
125
|
+
# Get SVG transform string
|
|
126
|
+
matrix.to_transform_string
|
|
127
|
+
# => "matrix(1.414,-1.414,1.414,1.414,10,20)"
|
|
128
|
+
----
|
|
129
|
+
|
|
130
|
+
== Error Handling
|
|
131
|
+
|
|
132
|
+
Postsvg defines custom error classes in [`lib/postsvg/errors.rb`](../lib/postsvg/errors.rb:1):
|
|
133
|
+
|
|
134
|
+
[source,ruby]
|
|
135
|
+
----
|
|
136
|
+
require 'postsvg'
|
|
137
|
+
|
|
138
|
+
begin
|
|
139
|
+
svg = Postsvg.convert(malformed_ps)
|
|
140
|
+
rescue Postsvg::Error => e
|
|
141
|
+
# Handle Postsvg-specific errors
|
|
142
|
+
puts "Conversion error: #{e.message}"
|
|
143
|
+
rescue StandardError => e
|
|
144
|
+
# Handle other errors
|
|
145
|
+
puts "Unexpected error: #{e.message}"
|
|
146
|
+
end
|
|
147
|
+
----
|
|
148
|
+
|
|
149
|
+
**Error Classes:**
|
|
150
|
+
|
|
151
|
+
* `Postsvg::Error` - Base error class
|
|
152
|
+
* `Postsvg::ParseError` - Parsing errors
|
|
153
|
+
* `Postsvg::ConversionError` - Conversion errors
|
|
154
|
+
* `Postsvg::ValidationError` - Validation errors
|
|
155
|
+
|
|
156
|
+
== Strict Mode
|
|
157
|
+
|
|
158
|
+
Enable strict mode to fail on unknown operators:
|
|
159
|
+
|
|
160
|
+
[source,ruby]
|
|
161
|
+
----
|
|
162
|
+
# Strict mode with Converter
|
|
163
|
+
converter = Postsvg::Converter.new(
|
|
164
|
+
ps_content,
|
|
165
|
+
strict_mode: true
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
# Strict mode fails on unknown operators
|
|
169
|
+
begin
|
|
170
|
+
svg = converter.convert
|
|
171
|
+
rescue Postsvg::Error => e
|
|
172
|
+
puts "Unknown operator: #{e.message}"
|
|
173
|
+
end
|
|
174
|
+
----
|
|
175
|
+
|
|
176
|
+
Without strict mode, unknown operators are silently ignored.
|
|
177
|
+
|
|
178
|
+
== Thread Safety
|
|
179
|
+
|
|
180
|
+
Postsvg classes are not thread-safe. Create separate instances for concurrent operations:
|
|
181
|
+
|
|
182
|
+
[source,ruby]
|
|
183
|
+
----
|
|
184
|
+
# Bad: sharing converter across threads
|
|
185
|
+
converter = Postsvg::Converter.new(ps_content)
|
|
186
|
+
threads = 10.times.map do
|
|
187
|
+
Thread.new { converter.convert } # Not thread-safe!
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
# Good: one converter per thread
|
|
191
|
+
threads = 10.times.map do |i|
|
|
192
|
+
Thread.new do
|
|
193
|
+
ps = File.read("file_#{i}.ps")
|
|
194
|
+
Postsvg::Converter.new(ps).convert
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
----
|
|
198
|
+
|
|
199
|
+
== Performance Considerations
|
|
200
|
+
|
|
201
|
+
**Memory Usage:**
|
|
202
|
+
- Large PostScript files may consume significant memory during parsing
|
|
203
|
+
- Consider processing files in batches for bulk conversions
|
|
204
|
+
|
|
205
|
+
**Optimization:**
|
|
206
|
+
- Reuse `Converter` instances when possible (but not across threads)
|
|
207
|
+
- Use `convert_file` for direct file-to-file conversion
|
|
208
|
+
- Enable strict mode only during development/testing
|
|
209
|
+
|
|
210
|
+
== Next Steps
|
|
211
|
+
|
|
212
|
+
* Review link:cli-reference.adoc[CLI Reference] for command-line usage
|
|
213
|
+
* Explore link:advanced-topics.adoc[Advanced Topics] for complex scenarios
|
|
214
|
+
* Check link:concepts.adoc[Core Concepts] for architecture understanding
|
|
215
|
+
* See link:development.adoc[Development Guide] for extending Postsvg
|
|
216
|
+
|
|
217
|
+
== Bibliography
|
|
218
|
+
|
|
219
|
+
* link:api-reference/postsvg-module.adoc[Postsvg Module Documentation]
|
|
220
|
+
* link:api-reference/converter.adoc[Converter Class Documentation]
|
|
221
|
+
* link:https://ruby-doc.org/[Ruby Documentation]
|