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.
Files changed (201) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +105 -0
  3. data/CLAUDE.md +173 -0
  4. data/Gemfile +2 -3
  5. data/README.adoc +456 -179
  6. data/Rakefile +100 -0
  7. data/TODO.roadmap/00-architecture.md +139 -0
  8. data/TODO.roadmap/01-autoload-migration.md +39 -0
  9. data/TODO.roadmap/02-isolate-dormant-code.md +51 -0
  10. data/TODO.roadmap/03-domain-model.md +66 -0
  11. data/TODO.roadmap/04-lexer.md +40 -0
  12. data/TODO.roadmap/05-parser.md +43 -0
  13. data/TODO.roadmap/06-graphics-state.md +45 -0
  14. data/TODO.roadmap/07-matrix-and-color.md +37 -0
  15. data/TODO.roadmap/08-svg-builder.md +51 -0
  16. data/TODO.roadmap/09-renderer.md +52 -0
  17. data/TODO.roadmap/10-visitor.md +58 -0
  18. data/TODO.roadmap/11-operator-coverage.md +103 -0
  19. data/TODO.roadmap/12-svg-domain.md +62 -0
  20. data/TODO.roadmap/13-translation-handlers.md +69 -0
  21. data/TODO.roadmap/14-ps-serializer.md +49 -0
  22. data/TODO.roadmap/15-cli-and-public-api.md +47 -0
  23. data/TODO.roadmap/16-specs.md +84 -0
  24. data/TODO.roadmap/17-docs-sync.md +47 -0
  25. data/TODO.roadmap/18-performance-and-determinism.md +47 -0
  26. data/TODO.roadmap/19-error-model.md +45 -0
  27. data/TODO.roadmap/20-font-and-text.md +46 -0
  28. data/TODO.roadmap/21-images.md +45 -0
  29. data/TODO.roadmap/22-forms-and-resources.md +25 -0
  30. data/TODO.roadmap/23-level2-level3.md +52 -0
  31. data/TODO.roadmap/24-ci-and-release.md +42 -0
  32. data/TODO.roadmap/README.md +77 -0
  33. data/docs/.gitignore +29 -0
  34. data/docs/CHANGELOG.md +114 -0
  35. data/docs/COMPLETE_DOCUMENTATION_STATUS.md +376 -0
  36. data/docs/DEPLOYMENT.md +456 -0
  37. data/docs/DEPLOYMENT_INSTRUCTIONS.md +229 -0
  38. data/docs/DOCUMENTATION_PLAN.md +425 -0
  39. data/docs/FINAL_SUMMARY.md +657 -0
  40. data/docs/Gemfile +15 -0
  41. data/docs/README.md +327 -0
  42. data/docs/_config.yml +99 -0
  43. data/docs/advanced-topics.adoc +370 -0
  44. data/docs/api-reference/colors.adoc +705 -0
  45. data/docs/api-reference/converter.adoc +699 -0
  46. data/docs/api-reference/execution-context.adoc +1210 -0
  47. data/docs/api-reference/graphics-state.adoc +1070 -0
  48. data/docs/api-reference/interpreter.adoc +810 -0
  49. data/docs/api-reference/matrix.adoc +1179 -0
  50. data/docs/api-reference/path-builder.adoc +1284 -0
  51. data/docs/api-reference/postsvg-module.adoc +388 -0
  52. data/docs/api-reference/svg-generator.adoc +891 -0
  53. data/docs/api-reference/tokenizer.adoc +925 -0
  54. data/docs/api-reference.adoc +221 -0
  55. data/docs/architecture/command-registry.adoc +1191 -0
  56. data/docs/architecture/conversion-pipeline.adoc +746 -0
  57. data/docs/architecture/design-decisions.adoc +999 -0
  58. data/docs/architecture/generator-stage.adoc +1115 -0
  59. data/docs/architecture/graphics-state-model.adoc +1089 -0
  60. data/docs/architecture/interpreter-stage.adoc +1125 -0
  61. data/docs/architecture/parser-stage.adoc +1051 -0
  62. data/docs/architecture.adoc +354 -0
  63. data/docs/cli-reference/batch-command.adoc +616 -0
  64. data/docs/cli-reference/check-command.adoc +677 -0
  65. data/docs/cli-reference/cli-options.adoc +802 -0
  66. data/docs/cli-reference/convert-command.adoc +462 -0
  67. data/docs/cli-reference/version-command.adoc +296 -0
  68. data/docs/cli-reference.adoc +317 -0
  69. data/docs/concepts/conversion-pipeline.adoc +903 -0
  70. data/docs/concepts/coordinate-systems.adoc +836 -0
  71. data/docs/concepts/graphics-state.adoc +861 -0
  72. data/docs/concepts/path-operations.adoc +1076 -0
  73. data/docs/concepts/postscript-language.adoc +859 -0
  74. data/docs/concepts/svg-generation.adoc +937 -0
  75. data/docs/concepts.adoc +198 -0
  76. data/docs/contributing.adoc +443 -0
  77. data/docs/development.adoc +420 -0
  78. data/docs/faq.adoc +493 -0
  79. data/docs/getting-started/basic-usage.adoc +538 -0
  80. data/docs/getting-started/common-workflows.adoc +577 -0
  81. data/docs/getting-started/first-conversion.adoc +492 -0
  82. data/docs/getting-started/installation.adoc +534 -0
  83. data/docs/getting-started.adoc +94 -0
  84. data/docs/index.adoc +248 -0
  85. data/docs/optimization.adoc +196 -0
  86. data/docs/ps2svg_compatibility.adoc +149 -0
  87. data/docs/quick-reference.adoc +453 -0
  88. data/docs/sitemap.adoc +337 -0
  89. data/docs/troubleshooting.adoc +486 -0
  90. data/docs/validation.adoc +772 -0
  91. data/exe/postsvg +1 -0
  92. data/lib/postsvg/cli.rb +104 -57
  93. data/lib/postsvg/color.rb +132 -0
  94. data/lib/postsvg/errors.rb +68 -3
  95. data/lib/postsvg/format_number.rb +22 -0
  96. data/lib/postsvg/graphics_context.rb +80 -0
  97. data/lib/postsvg/graphics_stack.rb +43 -0
  98. data/lib/postsvg/model/literals/array.rb +41 -0
  99. data/lib/postsvg/model/literals/dictionary.rb +34 -0
  100. data/lib/postsvg/model/literals/hex.rb +37 -0
  101. data/lib/postsvg/model/literals/name.rb +40 -0
  102. data/lib/postsvg/model/literals/number.rb +36 -0
  103. data/lib/postsvg/model/literals/procedure.rb +41 -0
  104. data/lib/postsvg/model/literals/string.rb +30 -0
  105. data/lib/postsvg/model/literals.rb +19 -0
  106. data/lib/postsvg/model/operator.rb +58 -0
  107. data/lib/postsvg/model/operators/arithmetic.rb +264 -0
  108. data/lib/postsvg/model/operators/boolean.rb +182 -0
  109. data/lib/postsvg/model/operators/color.rb +74 -0
  110. data/lib/postsvg/model/operators/container.rb +186 -0
  111. data/lib/postsvg/model/operators/control_flow.rb +119 -0
  112. data/lib/postsvg/model/operators/device.rb +21 -0
  113. data/lib/postsvg/model/operators/dictionary.rb +118 -0
  114. data/lib/postsvg/model/operators/font.rb +121 -0
  115. data/lib/postsvg/model/operators/graphics_state.rb +84 -0
  116. data/lib/postsvg/model/operators/painting.rb +29 -0
  117. data/lib/postsvg/model/operators/path.rb +169 -0
  118. data/lib/postsvg/model/operators/stack.rb +72 -0
  119. data/lib/postsvg/model/operators/transformations.rb +103 -0
  120. data/lib/postsvg/model/operators.rb +89 -0
  121. data/lib/postsvg/model/program.rb +68 -0
  122. data/lib/postsvg/model/token.rb +43 -0
  123. data/lib/postsvg/model.rb +17 -0
  124. data/lib/postsvg/options.rb +29 -0
  125. data/lib/postsvg/renderer.rb +85 -0
  126. data/lib/postsvg/serializer.rb +325 -0
  127. data/lib/postsvg/source/ast_builder.rb +308 -0
  128. data/lib/postsvg/source/lexer.rb +322 -0
  129. data/lib/postsvg/source/operand_stack.rb +55 -0
  130. data/lib/postsvg/source.rb +21 -0
  131. data/lib/postsvg/svg/attribute_parser.rb +45 -0
  132. data/lib/postsvg/svg/clip_path_registry.rb +44 -0
  133. data/lib/postsvg/svg/document.rb +22 -0
  134. data/lib/postsvg/svg/element.rb +84 -0
  135. data/lib/postsvg/svg/elements/circle.rb +36 -0
  136. data/lib/postsvg/svg/elements/clip_path.rb +26 -0
  137. data/lib/postsvg/svg/elements/defs.rb +24 -0
  138. data/lib/postsvg/svg/elements/ellipse.rb +38 -0
  139. data/lib/postsvg/svg/elements/group.rb +37 -0
  140. data/lib/postsvg/svg/elements/image.rb +35 -0
  141. data/lib/postsvg/svg/elements/line.rb +36 -0
  142. data/lib/postsvg/svg/elements/path.rb +32 -0
  143. data/lib/postsvg/svg/elements/polygon.rb +12 -0
  144. data/lib/postsvg/svg/elements/polyline.rb +32 -0
  145. data/lib/postsvg/svg/elements/rect.rb +44 -0
  146. data/lib/postsvg/svg/elements/svg.rb +39 -0
  147. data/lib/postsvg/svg/elements/text.rb +42 -0
  148. data/lib/postsvg/svg/elements.rb +31 -0
  149. data/lib/postsvg/svg/paint.rb +34 -0
  150. data/lib/postsvg/svg/parser.rb +39 -0
  151. data/lib/postsvg/svg/path_data/command.rb +27 -0
  152. data/lib/postsvg/svg/path_data/parser.rb +82 -0
  153. data/lib/postsvg/svg/path_data.rb +17 -0
  154. data/lib/postsvg/svg/stroke.rb +31 -0
  155. data/lib/postsvg/svg/transform_list.rb +59 -0
  156. data/lib/postsvg/svg.rb +22 -0
  157. data/lib/postsvg/svg_builder.rb +249 -0
  158. data/lib/postsvg/translation/arc_converter.rb +86 -0
  159. data/lib/postsvg/translation/bounding_box.rb +59 -0
  160. data/lib/postsvg/translation/context.rb +34 -0
  161. data/lib/postsvg/translation/handler_registry.rb +38 -0
  162. data/lib/postsvg/translation/handlers/circle_handler.rb +28 -0
  163. data/lib/postsvg/translation/handlers/clip_path_handler.rb +13 -0
  164. data/lib/postsvg/translation/handlers/defs_handler.rb +15 -0
  165. data/lib/postsvg/translation/handlers/ellipse_handler.rb +31 -0
  166. data/lib/postsvg/translation/handlers/group_handler.rb +21 -0
  167. data/lib/postsvg/translation/handlers/image_handler.rb +20 -0
  168. data/lib/postsvg/translation/handlers/line_handler.rb +23 -0
  169. data/lib/postsvg/translation/handlers/open_handler.rb +18 -0
  170. data/lib/postsvg/translation/handlers/path_handler.rb +356 -0
  171. data/lib/postsvg/translation/handlers/polygon_handler.rb +33 -0
  172. data/lib/postsvg/translation/handlers/polyline_handler.rb +31 -0
  173. data/lib/postsvg/translation/handlers/rect_handler.rb +27 -0
  174. data/lib/postsvg/translation/handlers/shared.rb +110 -0
  175. data/lib/postsvg/translation/handlers/svg_handler.rb +25 -0
  176. data/lib/postsvg/translation/handlers/text_handler.rb +56 -0
  177. data/lib/postsvg/translation/handlers.rb +25 -0
  178. data/lib/postsvg/translation/ps_renderer.rb +105 -0
  179. data/lib/postsvg/translation/record_emitter.rb +35 -0
  180. data/lib/postsvg/translation.rb +17 -0
  181. data/lib/postsvg/version.rb +1 -1
  182. data/lib/postsvg/visitors/ps_visitor/arithmetic.rb +125 -0
  183. data/lib/postsvg/visitors/ps_visitor/boolean.rb +105 -0
  184. data/lib/postsvg/visitors/ps_visitor/color.rb +53 -0
  185. data/lib/postsvg/visitors/ps_visitor/common.rb +66 -0
  186. data/lib/postsvg/visitors/ps_visitor/container.rb +164 -0
  187. data/lib/postsvg/visitors/ps_visitor/control_flow.rb +110 -0
  188. data/lib/postsvg/visitors/ps_visitor/device.rb +20 -0
  189. data/lib/postsvg/visitors/ps_visitor/dictionary.rb +89 -0
  190. data/lib/postsvg/visitors/ps_visitor/font.rb +93 -0
  191. data/lib/postsvg/visitors/ps_visitor/graphics_state.rb +55 -0
  192. data/lib/postsvg/visitors/ps_visitor/painting.rb +90 -0
  193. data/lib/postsvg/visitors/ps_visitor/path.rb +112 -0
  194. data/lib/postsvg/visitors/ps_visitor/stack.rb +47 -0
  195. data/lib/postsvg/visitors/ps_visitor/transformations.rb +101 -0
  196. data/lib/postsvg/visitors/ps_visitor.rb +208 -0
  197. data/lib/postsvg/visitors.rb +9 -0
  198. data/lib/postsvg.rb +93 -59
  199. data/lychee.toml +86 -0
  200. metadata +216 -11
  201. 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]