ranger-compiler 3.5.0 → 3.5.2
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.
- package/CHANGELOG.md +1160 -19
- package/LICENSE +3 -1
- package/README.md +124 -29
- package/dist/Lang.rgr +1188 -290
- package/dist/api.d.ts +2343 -879
- package/dist/api.js +79924 -56922
- package/dist/lib/JSON.rgr +102 -91
- package/dist/lib/Shell.rgr +4 -4
- package/dist/lib/apple/AppleToolchain.rgr +4 -4
- package/dist/lib/apple/README.md +5 -4
- package/dist/lib/apple/apple_test.rgr +1 -1
- package/dist/lib/core/README.md +1 -1
- package/dist/lib/evg/EVG.rgr +12 -0
- package/dist/lib/evg/EVGA11yFromTree.rgr +302 -0
- package/dist/lib/evg/EVGA11yTree.rgr +894 -0
- package/dist/lib/evg/EVGBox.rgr +267 -0
- package/dist/lib/evg/EVGBoxShorthandTest.rgr +220 -0
- package/dist/lib/evg/EVGCodepoint.rgr +316 -0
- package/dist/lib/evg/EVGColor.rgr +700 -0
- package/dist/lib/evg/EVGCommands.rgr +177 -0
- package/dist/lib/evg/EVGComponent.rgr +331 -0
- package/dist/lib/evg/EVGComponentTest.rgr +387 -0
- package/dist/lib/evg/EVGConnector.rgr +541 -0
- package/dist/lib/evg/EVGConnectorTest.rgr +306 -0
- package/dist/lib/evg/EVGDisplayList.rgr +4186 -0
- package/dist/lib/evg/EVGEasing.rgr +370 -0
- package/dist/lib/evg/EVGEffectTest.rgr +253 -0
- package/dist/lib/evg/EVGElement.rgr +4914 -0
- package/dist/lib/evg/EVGFixedTest.rgr +289 -0
- package/dist/lib/evg/EVGFlexRulesTest.rgr +317 -0
- package/dist/lib/evg/EVGFlexWrapTest.rgr +246 -0
- package/dist/lib/evg/EVGFling.rgr +244 -0
- package/dist/lib/evg/EVGFocus.rgr +400 -0
- package/dist/lib/evg/EVGFocusTest.rgr +399 -0
- package/dist/lib/evg/EVGGradient.rgr +322 -0
- package/dist/lib/evg/EVGGrapheme.rgr +190 -0
- package/dist/lib/evg/EVGGrid.rgr +975 -0
- package/dist/lib/evg/EVGHitTest.rgr +208 -0
- package/dist/lib/evg/EVGHoles.rgr +294 -0
- package/dist/lib/evg/EVGHostMeasurerTest.rgr +281 -0
- package/dist/lib/evg/EVGHostTextMeasurer.rgr +331 -0
- package/dist/lib/evg/EVGHostTree.rgr +834 -0
- package/dist/lib/evg/EVGHostTreeTest.rgr +447 -0
- package/dist/lib/evg/EVGImageDecode.rgr +117 -0
- package/dist/lib/evg/EVGImageMeasurer.rgr +86 -0
- package/dist/lib/evg/EVGInspect.rgr +883 -0
- package/dist/lib/evg/EVGInvalidateTest.rgr +432 -0
- package/dist/lib/evg/EVGJsonTest.rgr +535 -0
- package/dist/lib/evg/EVGLayout.rgr +4220 -0
- package/dist/lib/evg/EVGMeasure.rgr +1267 -0
- package/dist/lib/evg/EVGOverlayTest.rgr +626 -0
- package/dist/lib/evg/EVGPatch.rgr +1721 -0
- package/dist/lib/evg/EVGPatchTest.rgr +692 -0
- package/dist/lib/evg/EVGPopoverTest.rgr +395 -0
- package/dist/lib/evg/EVGReconcile.rgr +226 -0
- package/dist/lib/evg/EVGReconcileTest.rgr +421 -0
- package/dist/lib/evg/EVGReject.rgr +126 -0
- package/dist/lib/evg/EVGRelayoutTest.rgr +375 -0
- package/dist/lib/evg/EVGRtlLayoutTest.rgr +319 -0
- package/dist/lib/evg/EVGRuler.rgr +232 -0
- package/dist/lib/evg/EVGRulerTest.rgr +172 -0
- package/dist/lib/evg/EVGSelectChrome.rgr +178 -0
- package/dist/lib/evg/EVGStyleCacheTest.rgr +419 -0
- package/dist/lib/evg/EVGStyleSheet.rgr +2148 -0
- package/dist/lib/evg/EVGStyleStateTest.rgr +407 -0
- package/dist/lib/evg/EVGStyleVarTest.rgr +471 -0
- package/dist/lib/evg/EVGText.rgr +105 -0
- package/dist/lib/evg/EVGTextEngine.rgr +536 -0
- package/dist/lib/evg/EVGTextMeasurer.rgr +720 -0
- package/dist/lib/evg/EVGTimingTest.rgr +1417 -0
- package/dist/lib/evg/EVGToolbar.rgr +1369 -0
- package/dist/lib/evg/EVGTransition.rgr +728 -0
- package/dist/lib/evg/EVGTreeJson.rgr +721 -0
- package/dist/lib/evg/EVGUnit.rgr +554 -0
- package/dist/lib/evg/EVGViewportUnitTest.rgr +236 -0
- package/dist/lib/evg/EvgApp.rgr +189 -0
- package/dist/lib/evg/EvgBitmapTracer.rgr +4277 -0
- package/dist/lib/evg/EvgBitmapTracerTest.rgr +2119 -0
- package/dist/lib/evg/EvgHost.rgr +451 -0
- package/dist/lib/evg/EvgTest.rgr +91 -0
- package/dist/lib/evg/EvgTraceColor.rgr +236 -0
- package/dist/lib/evg/EvgTraceCurve.rgr +648 -0
- package/dist/lib/evg/EvgTraceFit.rgr +767 -0
- package/dist/lib/evg/EvgTracePath.rgr +435 -0
- package/dist/lib/evg/EvgTraceTypes.rgr +559 -0
- package/dist/lib/evg/EvgViewport.rgr +313 -0
- package/dist/lib/evg/FxDemoDoc.rgr +185 -0
- package/dist/lib/evg/HOSTS.md +227 -0
- package/dist/lib/evg/ISSUES.md +835 -0
- package/dist/lib/evg/PLAN_ACCESSIBILITY.md +650 -0
- package/dist/lib/evg/PLAN_CSS_LAYOUT_AND_FONTS.md +1124 -0
- package/dist/lib/evg/PLAN_EFFECTS.md +431 -0
- package/dist/lib/evg/PLAN_EVG.md +518 -0
- package/dist/lib/evg/PLAN_EVG_RENDERER.md +1674 -0
- package/dist/lib/evg/PLAN_INSPECTOR.md +788 -0
- package/dist/lib/evg/PLAN_LINKS_AND_FORMS.md +157 -0
- package/dist/lib/evg/PLAN_NATIVE_HOSTS.md +671 -0
- package/dist/lib/evg/PLAN_VECTOR_IR.md +664 -0
- package/dist/lib/evg/PLAN_VIEW_TRANSFORM.md +322 -0
- package/dist/lib/evg/PathBuilder.rgr +333 -0
- package/dist/lib/evg/README.md +1236 -0
- package/dist/lib/evg/SPEC.md +1252 -0
- package/dist/lib/evg/SVGPathParser.rgr +1199 -0
- package/dist/lib/evg/SvgParser.rgr +1736 -0
- package/dist/lib/evg/TODO_EVG_RENDERER.md +595 -0
- package/dist/lib/evg/VectorShapes.rgr +331 -0
- package/dist/lib/evg/VectorStroke.rgr +107 -0
- package/dist/lib/evg/VectorViewBox.rgr +380 -0
- package/dist/lib/evg/agent/README.md +290 -0
- package/dist/lib/evg/agent/evg_agent.rgr +899 -0
- package/dist/lib/evg/agent/fixtures/broken.evg.json +7 -0
- package/dist/lib/evg/agent/fixtures/card.evg.json +9 -0
- package/dist/lib/evg/agent/fixtures/connector.css +63 -0
- package/dist/lib/evg/agent/fixtures/connector.evg.json +14 -0
- package/dist/lib/evg/agent/fixtures/drawn.evg.json +129 -0
- package/dist/lib/evg/agent/fixtures/gradient.evg.json +4 -0
- package/dist/lib/evg/agent/fixtures/popover.css +99 -0
- package/dist/lib/evg/agent/fixtures/popover.evg.json +30 -0
- package/dist/lib/evg/agent/roundtrip.sh +74 -0
- package/dist/lib/evg/agent/smoke.sh +230 -0
- package/dist/lib/evg/android/README.md +97 -0
- package/dist/lib/evg/android/androidstubs/AndroidStubs.kt +175 -0
- package/dist/lib/evg/android/androidstubs/Annotation.kt +10 -0
- package/dist/lib/evg/android/androidstubs/App.kt +30 -0
- package/dist/lib/evg/android/androidstubs/Content.kt +41 -0
- package/dist/lib/evg/android/androidstubs/ContentRes.kt +12 -0
- package/dist/lib/evg/android/androidstubs/InputMethod.kt +46 -0
- package/dist/lib/evg/android/androidstubs/Net.kt +6 -0
- package/dist/lib/evg/android/androidstubs/Os.kt +30 -0
- package/dist/lib/evg/android/androidstubs/Util.kt +15 -0
- package/dist/lib/evg/android/androidstubs/View.kt +113 -0
- package/dist/lib/evg/android/androidstubs/Widget.kt +16 -0
- package/dist/lib/evg/android/src/android/kotlin/fi/ranger/evg/AndroidEvgSurface.kt +323 -0
- package/dist/lib/evg/android/src/android/kotlin/fi/ranger/evg/AndroidTextMeasurer.kt +56 -0
- package/dist/lib/evg/android/src/android/kotlin/fi/ranger/evg/RippleEffect.kt +262 -0
- package/dist/lib/evg/android/src/awt/kotlin/fi/ranger/evg/AwtEvgSurface.kt +238 -0
- package/dist/lib/evg/android/src/awt/kotlin/fi/ranger/evg/AwtTextMeasurer.kt +85 -0
- package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/EvgEngineThread.kt +115 -0
- package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/EvgPainter.kt +231 -0
- package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/EvgSurface.kt +117 -0
- package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/RecordingSurface.kt +94 -0
- package/dist/lib/evg/apple/README.md +128 -0
- package/dist/lib/evg/apple/Sources/CoreGraphicsEvgSurface.swift +329 -0
- package/dist/lib/evg/apple/Sources/CoreTextMeasurer.swift +70 -0
- package/dist/lib/evg/apple/Sources/EvgEngineQueue.swift +105 -0
- package/dist/lib/evg/apple/Sources/EvgPainter.swift +225 -0
- package/dist/lib/evg/apple/Sources/EvgSurface.swift +163 -0
- package/dist/lib/evg/apple/Sources/RecordingSurface.swift +110 -0
- package/dist/lib/evg/bench/EvgLayoutBench.rgr +34 -0
- package/dist/lib/evg/bench/README.md +64 -0
- package/dist/lib/evg/bench/layout-bench.mjs +316 -0
- package/dist/lib/evg/bench/layout-cases.mjs +510 -0
- package/dist/lib/evg/bench/layout-conformance.mjs +254 -0
- package/dist/lib/evg/bin/.gitignore +17 -0
- package/dist/lib/evg/evg_test.rgr +313 -0
- package/dist/lib/evg/gl/README.md +198 -0
- package/dist/lib/evg/gl/a11y-paint-check.mjs +73 -0
- package/dist/lib/evg/gl/blur-check.mjs +399 -0
- package/dist/lib/evg/gl/boxmodel.json +1 -0
- package/dist/lib/evg/gl/demo.html +46 -0
- package/dist/lib/evg/gl/effect-presets.css +285 -0
- package/dist/lib/evg/gl/effect-presets.js +63 -0
- package/dist/lib/evg/gl/effect-shots.mjs +135 -0
- package/dist/lib/evg/gl/evg-a11y.js +566 -0
- package/dist/lib/evg/gl/evg-binary.js +160 -0
- package/dist/lib/evg/gl/evg-engine.js +296 -0
- package/dist/lib/evg/gl/evg-fx.js +237 -0
- package/dist/lib/evg/gl/evg-gestures.js +209 -0
- package/dist/lib/evg/gl/evg-list.js +167 -0
- package/dist/lib/evg/gl/evg-measure.js +186 -0
- package/dist/lib/evg/gl/evg-textinput.js +303 -0
- package/dist/lib/evg/gl/evg-view.js +144 -0
- package/dist/lib/evg/gl/evg-webgl.js +3942 -0
- package/dist/lib/evg/gl/fx-check.mjs +998 -0
- package/dist/lib/evg/gl/fx-demo.html +166 -0
- package/dist/lib/evg/gl/fx-demo.js +2 -0
- package/dist/lib/evg/gl/fx-serve.mjs +47 -0
- package/dist/lib/evg/gl/gestures-check.mjs +189 -0
- package/dist/lib/evg/gl/list-binary-check.mjs +152 -0
- package/dist/lib/evg/gl/measure-check.mjs +135 -0
- package/dist/lib/evg/gl/rotation-check.mjs +207 -0
- package/dist/lib/evg/gl/shift-check.mjs +113 -0
- package/dist/lib/evg/gl/stroke-check.mjs +168 -0
- package/dist/lib/evg/gl/text-snap-check.mjs +139 -0
- package/dist/lib/evg/gl/view-check.mjs +343 -0
- package/dist/lib/evg/gl/view-policy-check.mjs +184 -0
- package/dist/lib/evg/html/evg-dom.js +318 -0
- package/dist/lib/evg/html/evg-html.js +600 -0
- package/dist/lib/evg/inspect/README.md +415 -0
- package/dist/lib/evg/inspect/browser-smoke.mjs +115 -0
- package/dist/lib/evg/inspect/evg-inspect.js +947 -0
- package/dist/lib/evg/inspect/shots/css.png +0 -0
- package/dist/lib/evg/inspect/shots/dashboard.png +0 -0
- package/dist/lib/evg/inspect/shots/pptx-slide.png +0 -0
- package/dist/lib/evg/inspect/shots/state.png +0 -0
- package/dist/lib/evg/inspect/shots.mjs +226 -0
- package/dist/lib/evg/oracle/css-blur.json +576 -0
- package/dist/lib/evg/oracle/css-box.json +157 -0
- package/dist/lib/evg/oracle/css-timing.json +709 -0
- package/dist/lib/evg/oracle/css_blur_oracle.mjs +529 -0
- package/dist/lib/evg/oracle/css_box_oracle.mjs +106 -0
- package/dist/lib/evg/oracle/css_timing_oracle.mjs +389 -0
- package/dist/lib/evg/original/EVGColor.clj +310 -0
- package/dist/lib/evg/original/EVGColorContext.rgr +178 -0
- package/dist/lib/evg/original/SVGPath.rgr +627 -0
- package/dist/lib/evg/original/Vec2.crgr +103 -0
- package/dist/lib/evg/ranger.json +9 -0
- package/dist/lib/evg/showcase/README.md +246 -0
- package/dist/lib/evg/showcase/assets/emblem.svg +30 -0
- package/dist/lib/evg/showcase/assets/rosette.svg +22 -0
- package/dist/lib/evg/showcase/build.mjs +651 -0
- package/dist/lib/evg/showcase/pages/album.tsx +30 -0
- package/dist/lib/evg/showcase/pages/boxmodel.tsx +37 -0
- package/dist/lib/evg/showcase/pages/cards.tsx +41 -0
- package/dist/lib/evg/showcase/pages/chart_api.tsx +170 -0
- package/dist/lib/evg/showcase/pages/charts.tsx +219 -0
- package/dist/lib/evg/showcase/pages/drawing.tsx +160 -0
- package/dist/lib/evg/showcase/pages/emoji.tsx +91 -0
- package/dist/lib/evg/showcase/pages/flex.tsx +46 -0
- package/dist/lib/evg/showcase/pages/more.tsx +332 -0
- package/dist/lib/evg/showcase/pages/plots.tsx +262 -0
- package/dist/lib/evg/showcase/pages/svg.tsx +63 -0
- package/dist/lib/evg/showcase/pages/tables.tsx +209 -0
- package/dist/lib/evg/showcase/pages/typography.tsx +43 -0
- package/dist/lib/evg/showcase/pages/units.tsx +35 -0
- package/dist/lib/evg/showcase/pages/variants.tsx +233 -0
- package/dist/lib/evg/showcase/pages/vector.tsx +75 -0
- package/dist/lib/evg/showcase/pages/views.tsx +223 -0
- package/dist/lib/evg/showcase/tests/chart_api_smoke.mjs +339 -0
- package/dist/lib/evg/showcase/tests/gl_smoke.mjs +125 -0
- package/dist/lib/evg/showcase/themes/chart_api-default.css +15 -0
- package/dist/lib/evg/showcase/themes/charts-default.css +29 -0
- package/dist/lib/evg/showcase/themes/drawing-default.css +35 -0
- package/dist/lib/evg/showcase/themes/more-default.css +128 -0
- package/dist/lib/evg/showcase/themes/plots-default.css +18 -0
- package/dist/lib/evg/showcase/themes/showcase.css +508 -0
- package/dist/lib/evg/showcase/themes/tables-default.css +123 -0
- package/dist/lib/evg/showcase/themes/variants-default.css +15 -0
- package/dist/lib/evg/showcase/themes/views-default.css +15 -0
- package/dist/lib/evg/tools/bench_vs_potrace.mjs +290 -0
- package/dist/lib/evg/tools/evg_image_tool.rgr +488 -0
- package/dist/lib/evg/tools/evg_trace_bench.rgr +114 -0
- package/dist/lib/evg/tools/evg_trace_cli.rgr +662 -0
- package/dist/lib/evg/tools/evg_trace_cpp_bench.rgr +83 -0
- package/dist/lib/evg/tools/run_trace_bench.sh +74 -0
- package/dist/lib/evg/tools/run_trace_cli_smoke.sh +128 -0
- package/dist/lib/evg/web/responsive/EvgResponsiveCheck.rgr +271 -0
- package/dist/lib/evg/web/responsive/EvgResponsiveDemo.rgr +531 -0
- package/dist/lib/evg/web/responsive/README.md +97 -0
- package/dist/lib/evg/web/responsive/build.mjs +90 -0
- package/dist/lib/evg/web/responsive/dom-check.mjs +169 -0
- package/dist/lib/evg/web/responsive/index.html +177 -0
- package/dist/lib/evg/web/responsive/smoke.mjs +221 -0
- package/dist/lib/evg/web/tools/assets-client.mjs +95 -0
- package/dist/lib/evg/web/tools/boot-bench.mjs +189 -0
- package/dist/lib/evg/web/tools/inline-assets.mjs +119 -0
- package/dist/lib/evg/web/tools/minify.mjs +60 -0
- package/dist/lib/evg/web/tracer/build.mjs +87 -0
- package/dist/lib/evg/web/tracer/index.html +2805 -0
- package/dist/lib/evg/web/tracer/sample.png +0 -0
- package/dist/lib/evg/web/tracer/smoke.mjs +1162 -0
- package/dist/lib/evgr/Cargo.lock +21 -0
- package/dist/lib/evgr/Cargo.toml +19 -0
- package/dist/lib/evgr/README.md +140 -0
- package/dist/lib/evgr/bench/NativeBench.rgr +246 -0
- package/dist/lib/evgr/bench/compare.mjs +252 -0
- package/dist/lib/evgr/bench/speed.mjs +277 -0
- package/dist/lib/evgr/bin/.gitignore +3 -0
- package/dist/lib/evgr/src/bin/bench.rs +106 -0
- package/dist/lib/evgr/src/bin/smoke.rs +13 -0
- package/dist/lib/evgr/src/grid.rs +730 -0
- package/dist/lib/evgr/src/lib.rs +1003 -0
- package/dist/lib/evgr/src/style.rs +468 -0
- package/dist/lib/evgr/src/text.rs +83 -0
- package/dist/lib/image/BitReader.rgr +171 -0
- package/dist/lib/image/Buffer.rgr +173 -0
- package/dist/lib/image/DCT.rgr +283 -0
- package/dist/lib/image/Deflate.rgr +339 -0
- package/dist/lib/image/HuffmanDecoder.rgr +181 -0
- package/dist/lib/image/ImageBuffer.rgr +706 -0
- package/dist/lib/image/JPEGDecoder.rgr +808 -0
- package/dist/lib/image/PNGDecoder.rgr +544 -0
- package/dist/lib/image/PNGEncoder.rgr +388 -0
- package/dist/lib/image/PPMImage.rgr +224 -0
- package/dist/lib/image/ProgressiveJPEGDecoder.rgr +1154 -0
- package/dist/lib/image/README.md +33 -0
- package/dist/lib/image/RasterBuffer.rgr +294 -0
- package/dist/lib/image/VP8BoolDecoder.rgr +163 -0
- package/dist/lib/image/WebPDecoder.rgr +433 -0
- package/dist/lib/image/WebPLossless.rgr +1035 -0
- package/dist/lib/image/WebPLossy.rgr +1929 -0
- package/dist/lib/image/ranger.json +9 -0
- package/dist/lib/image/testdata/webp/anim_2f_24x16.webp +0 -0
- package/dist/lib/image/testdata/webp/fixtures.txt +33 -0
- package/dist/lib/image/testdata/webp/gen_fixtures.py +261 -0
- package/dist/lib/image/testdata/webp/ll_1x1.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_alpha_29x21.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_gradient_64x64.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_meta_32x32.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_noise_17x9.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_pal11_23x11.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_pal2_19x7.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_pal40_16x16.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_pal4_13x5.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_photo_40x30.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_predictors_64x32.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_1x1.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_raw_f0_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_raw_f1_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_raw_f2_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_raw_f3_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_vp8l_f0_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_vp8l_f1_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_vp8l_f2_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_vp8l_f3_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alpha_33x17.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_exif_15x11.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_i16_96x80.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_nofilter_24x20.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_odd_17x9.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_photo_48x40.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_q100_20x18.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_sharp_40x36.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_simple_filter_33x31.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_vpx_parts8_37x45.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_vpx_skip_96x80.webp +0 -0
- package/dist/lib/image/tests/WebPDecodeTool.rgr +81 -0
- package/dist/lib/image/tests/WebPDecoderTest.rgr +1162 -0
- package/dist/lib/image/tests/run_webp_tests.sh +39 -0
- package/dist/lib/rust/RsJson.rgr +468 -0
- package/dist/lib/rust/RsPrelude.rgr +1663 -0
- package/dist/lib/shell_test.rgr +7 -7
- package/dist/lib/stdlib.rgr +21 -5
- package/dist/lib/zip/ranger.json +6 -0
- package/dist/rgrc.js +87318 -67610
- package/package.json +1010 -1040
- package/dist/README.md +0 -117
- package/dist/package.json +0 -47
|
@@ -0,0 +1,518 @@
|
|
|
1
|
+
# EVG Layout Engine Implementation Plan
|
|
2
|
+
|
|
3
|
+
**Version:** 1.0
|
|
4
|
+
**Date:** December 2024
|
|
5
|
+
**Language:** Ranger
|
|
6
|
+
|
|
7
|
+
Related sketch (CSS-closer flex/grid, themes, font-correct layout):
|
|
8
|
+
[`PLAN_CSS_LAYOUT_AND_FONTS.md`](./PLAN_CSS_LAYOUT_AND_FONTS.md)
|
|
9
|
+
|
|
10
|
+
Related design (devtools over a live or captured frame — element hierarchy,
|
|
11
|
+
box model, cascade provenance, component debug notes):
|
|
12
|
+
[`PLAN_INSPECTOR.md`](./PLAN_INSPECTOR.md), built so far in
|
|
13
|
+
[`inspect/README.md`](./inspect/README.md)
|
|
14
|
+
|
|
15
|
+
## 1. Overview
|
|
16
|
+
|
|
17
|
+
EVG (Extended Vector Graphics) is a declarative layout engine that calculates element positions and dimensions. It separates layout computation from rendering, allowing multiple output targets (PDF, Canvas, SVG, HTML).
|
|
18
|
+
|
|
19
|
+
### 1.1 Design Goals
|
|
20
|
+
|
|
21
|
+
- **Layout-only engine**: Calculate coordinates, not render directly
|
|
22
|
+
- **Abstract renderer interface**: Call external measurers for font metrics
|
|
23
|
+
- **CSS-like box model**: Margins, padding, borders
|
|
24
|
+
- **Flow layout**: Automatic wrapping and alignment
|
|
25
|
+
- **Absolute positioning**: Support for fixed element placement
|
|
26
|
+
- **Book printing**: Multi-page support for pdf_writer integration
|
|
27
|
+
|
|
28
|
+
### 1.2 Architecture
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
┌─────────────────────────────────────────────────────────┐
|
|
32
|
+
│ EVG Layout Engine │
|
|
33
|
+
├─────────────────────────────────────────────────────────┤
|
|
34
|
+
│ XML Parser → Element Tree → Layout Calculator → Coords │
|
|
35
|
+
└─────────────────────────────────────────────────────────┘
|
|
36
|
+
↓
|
|
37
|
+
ITextMeasurer interface
|
|
38
|
+
↓
|
|
39
|
+
┌─────────────────────────────────────────────────────────┐
|
|
40
|
+
│ Renderers (separate implementation) │
|
|
41
|
+
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────────┐ │
|
|
42
|
+
│ │ PDFKit │ │ Canvas │ │ SVG │ │ pdf_writer │ │
|
|
43
|
+
│ └─────────┘ └─────────┘ └─────────┘ └─────────────┘ │
|
|
44
|
+
└─────────────────────────────────────────────────────────┘
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## 2. File Structure
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
lib/evg/
|
|
51
|
+
├── PLAN_EVG.md # This plan
|
|
52
|
+
├── README.md # Usage documentation
|
|
53
|
+
├── SPEC.md # Format specification
|
|
54
|
+
├── bin/ # Compiled output
|
|
55
|
+
│ └── evg_test.js
|
|
56
|
+
├── original/ # Reference implementations
|
|
57
|
+
│ ├── EVGColor.clj
|
|
58
|
+
│ ├── EVGColorContext.clj
|
|
59
|
+
│ └── SVGPath.clj
|
|
60
|
+
│
|
|
61
|
+
│ === LIBRARY FILES (no main function) ===
|
|
62
|
+
├── EVGUnit.rgr # Unit parsing (px, %, em, hp, fill)
|
|
63
|
+
├── EVGColor.rgr # Color parsing (hex, rgb, rgba, hsl, named)
|
|
64
|
+
├── EVGBox.rgr # Box model (margin, padding, border)
|
|
65
|
+
├── EVGElement.rgr # Element base class with attributes
|
|
66
|
+
├── EVGText.rgr # Text element with measurement
|
|
67
|
+
├── EVGImage.rgr # Image element
|
|
68
|
+
├── EVGContainer.rgr # Container (div) element
|
|
69
|
+
├── EVGParser.rgr # XML parser to element tree
|
|
70
|
+
├── EVGLayout.rgr # Layout algorithm (flow, absolute)
|
|
71
|
+
├── EVGDocument.rgr # Document root with pages
|
|
72
|
+
├── EVGRenderer.rgr # Abstract renderer interface
|
|
73
|
+
│
|
|
74
|
+
│ === TEST/CLI FILE (with main function) ===
|
|
75
|
+
└── evg_test.rgr # Test CLI and examples
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## 3. Implementation Phases
|
|
79
|
+
|
|
80
|
+
### Phase 1: Core Data Structures
|
|
81
|
+
|
|
82
|
+
#### 3.1.1 EVGUnit.rgr - Unit System
|
|
83
|
+
|
|
84
|
+
```ranger
|
|
85
|
+
class EVGUnit {
|
|
86
|
+
def value:double 0.0
|
|
87
|
+
def unitType:int 0 ; 0=px, 1=%, 2=em, 3=hp, 4=fill
|
|
88
|
+
def isSet:boolean false
|
|
89
|
+
def pixels:double 0.0 ; Resolved pixel value
|
|
90
|
+
|
|
91
|
+
sfn parse:EVGUnit (str:string)
|
|
92
|
+
fn resolve:void (parentSize:double fontSize:double)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
; Unit type constants
|
|
96
|
+
; UNIT_PIXELS = 0
|
|
97
|
+
; UNIT_PERCENT = 1
|
|
98
|
+
; UNIT_EM = 2
|
|
99
|
+
; UNIT_HEIGHT_PERCENT = 3
|
|
100
|
+
; UNIT_FILL = 4
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
#### 3.1.2 EVGColor.rgr - Color Parsing
|
|
104
|
+
|
|
105
|
+
```ranger
|
|
106
|
+
class EVGColor {
|
|
107
|
+
def r:double 0.0
|
|
108
|
+
def g:double 0.0
|
|
109
|
+
def b:double 0.0
|
|
110
|
+
def a:double 1.0
|
|
111
|
+
def isSet:boolean false
|
|
112
|
+
|
|
113
|
+
sfn parse:EVGColor (str:string) ; Parse hex, rgb, rgba, hsl, named
|
|
114
|
+
sfn noColor:EVGColor () ; Transparent/unset
|
|
115
|
+
fn toCSSString:string ()
|
|
116
|
+
fn toHexString:string ()
|
|
117
|
+
fn toPDFString:string () ; For pdf_writer
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
#### 3.1.3 EVGBox.rgr - Box Model
|
|
122
|
+
|
|
123
|
+
```ranger
|
|
124
|
+
class EVGBox {
|
|
125
|
+
; Margins
|
|
126
|
+
def marginTop:EVGUnit
|
|
127
|
+
def marginRight:EVGUnit
|
|
128
|
+
def marginBottom:EVGUnit
|
|
129
|
+
def marginLeft:EVGUnit
|
|
130
|
+
|
|
131
|
+
; Padding
|
|
132
|
+
def paddingTop:EVGUnit
|
|
133
|
+
def paddingRight:EVGUnit
|
|
134
|
+
def paddingBottom:EVGUnit
|
|
135
|
+
def paddingLeft:EVGUnit
|
|
136
|
+
|
|
137
|
+
; Border
|
|
138
|
+
def borderWidth:EVGUnit
|
|
139
|
+
def borderColor:EVGColor
|
|
140
|
+
def borderRadius:EVGUnit
|
|
141
|
+
|
|
142
|
+
fn resolveUnits:void (parentWidth:double parentHeight:double fontSize:double)
|
|
143
|
+
fn getInnerWidth:double (outerWidth:double)
|
|
144
|
+
fn getInnerHeight:double (outerHeight:double)
|
|
145
|
+
fn getTotalWidth:double (contentWidth:double)
|
|
146
|
+
fn getTotalHeight:double (contentHeight:double)
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Phase 2: Element Classes
|
|
151
|
+
|
|
152
|
+
#### 3.2.1 EVGElement.rgr - Base Element
|
|
153
|
+
|
|
154
|
+
```ranger
|
|
155
|
+
class EVGElement {
|
|
156
|
+
def id:string ""
|
|
157
|
+
def tagName:string "div"
|
|
158
|
+
def parent@(optional):EVGElement
|
|
159
|
+
def children:[EVGElement]
|
|
160
|
+
|
|
161
|
+
; Dimensions
|
|
162
|
+
def width:EVGUnit
|
|
163
|
+
def height:EVGUnit
|
|
164
|
+
|
|
165
|
+
; Position (for absolute)
|
|
166
|
+
def left:EVGUnit
|
|
167
|
+
def top:EVGUnit
|
|
168
|
+
def right:EVGUnit
|
|
169
|
+
def bottom:EVGUnit
|
|
170
|
+
|
|
171
|
+
; Box model
|
|
172
|
+
def box:EVGBox
|
|
173
|
+
|
|
174
|
+
; Visual
|
|
175
|
+
def backgroundColor:EVGColor
|
|
176
|
+
def opacity:double 1.0
|
|
177
|
+
|
|
178
|
+
; Layout properties
|
|
179
|
+
def direction:string "row" ; row, column
|
|
180
|
+
def align:string "left" ; left, center, right
|
|
181
|
+
def verticalAlign:string "top" ; top, center, bottom
|
|
182
|
+
def isInline:boolean false
|
|
183
|
+
def lineBreak:boolean false
|
|
184
|
+
def overflow:string "visible" ; visible, hidden, page-break
|
|
185
|
+
|
|
186
|
+
; Calculated values (output)
|
|
187
|
+
def calculatedX:double 0.0
|
|
188
|
+
def calculatedY:double 0.0
|
|
189
|
+
def calculatedWidth:double 0.0
|
|
190
|
+
def calculatedHeight:double 0.0
|
|
191
|
+
def calculatedPage:int 0 ; For multi-page
|
|
192
|
+
def isAbsolute:boolean false
|
|
193
|
+
|
|
194
|
+
fn setAttribute:void (name:string value:string)
|
|
195
|
+
fn addChild:void (child:EVGElement)
|
|
196
|
+
fn resolveUnits:void (parentWidth:double parentHeight:double fontSize:double)
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
#### 3.2.2 EVGText.rgr - Text Element
|
|
201
|
+
|
|
202
|
+
```ranger
|
|
203
|
+
class EVGText {
|
|
204
|
+
Extends(EVGElement)
|
|
205
|
+
|
|
206
|
+
def text:string ""
|
|
207
|
+
def fontFamily:string "Helvetica"
|
|
208
|
+
def fontSize:EVGUnit ; Default 14px
|
|
209
|
+
def color:EVGColor
|
|
210
|
+
|
|
211
|
+
; Calculated text metrics
|
|
212
|
+
def measuredWidth:double 0.0
|
|
213
|
+
def measuredHeight:double 0.0
|
|
214
|
+
def lineCount:int 1
|
|
215
|
+
def lines:[string] ; Wrapped lines
|
|
216
|
+
|
|
217
|
+
fn measureText:void (measurer:ITextMeasurer maxWidth:double)
|
|
218
|
+
fn wrapText:void (measurer:ITextMeasurer maxWidth:double)
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
#### 3.2.3 EVGImage.rgr - Image Element
|
|
223
|
+
|
|
224
|
+
```ranger
|
|
225
|
+
class EVGImage {
|
|
226
|
+
Extends(EVGElement)
|
|
227
|
+
|
|
228
|
+
def src:string ""
|
|
229
|
+
def naturalWidth:double 0.0
|
|
230
|
+
def naturalHeight:double 0.0
|
|
231
|
+
def imageData@(optional):buffer ; For embedded images
|
|
232
|
+
|
|
233
|
+
fn setImageSize:void (w:double h:double)
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
#### 3.2.4 EVGContainer.rgr - Container Element
|
|
238
|
+
|
|
239
|
+
```ranger
|
|
240
|
+
class EVGContainer {
|
|
241
|
+
Extends(EVGElement)
|
|
242
|
+
|
|
243
|
+
; Gradient support
|
|
244
|
+
def linearGradient:string ""
|
|
245
|
+
def radialGradient:string ""
|
|
246
|
+
|
|
247
|
+
; Shadow
|
|
248
|
+
def shadowRadius:EVGUnit
|
|
249
|
+
def shadowColor:EVGColor
|
|
250
|
+
def shadowOffsetX:EVGUnit
|
|
251
|
+
def shadowOffsetY:EVGUnit
|
|
252
|
+
|
|
253
|
+
; Transform
|
|
254
|
+
def rotate:double 0.0
|
|
255
|
+
def scale:double 1.0
|
|
256
|
+
}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### Phase 3: Text Measurement Interface
|
|
260
|
+
|
|
261
|
+
#### 3.3.1 EVGRenderer.rgr - Abstract Interface
|
|
262
|
+
|
|
263
|
+
```ranger
|
|
264
|
+
; Interface for text measurement - must be implemented by renderer
|
|
265
|
+
class ITextMeasurer {
|
|
266
|
+
fn measureText:EVGTextMetrics (text:string fontFamily:string fontSize:double)
|
|
267
|
+
fn measureTextWidth:double (text:string fontFamily:string fontSize:double)
|
|
268
|
+
fn getLineHeight:double (fontFamily:string fontSize:double)
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
class EVGTextMetrics {
|
|
272
|
+
def width:double 0.0
|
|
273
|
+
def height:double 0.0
|
|
274
|
+
def ascent:double 0.0
|
|
275
|
+
def descent:double 0.0
|
|
276
|
+
def lineHeight:double 0.0
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
; Simple fallback measurer (estimates)
|
|
280
|
+
class SimpleTextMeasurer {
|
|
281
|
+
Extends(ITextMeasurer)
|
|
282
|
+
|
|
283
|
+
fn measureText:EVGTextMetrics (text:string fontFamily:string fontSize:double) {
|
|
284
|
+
; Estimate: average character width is ~0.5-0.6 of fontSize
|
|
285
|
+
def avgCharWidth:double (fontSize * 0.55)
|
|
286
|
+
def width:double ((to_double (strlen text)) * avgCharWidth)
|
|
287
|
+
def height:double (fontSize * 1.2) ; Line height ~1.2x font size
|
|
288
|
+
; Return metrics...
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
### Phase 4: XML Parser
|
|
294
|
+
|
|
295
|
+
#### 3.4.1 EVGParser.rgr - XML to Element Tree
|
|
296
|
+
|
|
297
|
+
```ranger
|
|
298
|
+
class EVGParser {
|
|
299
|
+
def root@(optional):EVGElement
|
|
300
|
+
def measurer@(optional):ITextMeasurer
|
|
301
|
+
|
|
302
|
+
fn parse:EVGElement (xml:string)
|
|
303
|
+
fn parseElement:EVGElement (tagName:string attributes:map children:[EVGElement])
|
|
304
|
+
fn parseAttributes:void (element:EVGElement attrMap:map)
|
|
305
|
+
|
|
306
|
+
; Attribute parsing helpers
|
|
307
|
+
fn parseUnit:EVGUnit (value:string)
|
|
308
|
+
fn parseColor:EVGColor (value:string)
|
|
309
|
+
fn parseBoolean:boolean (value:string)
|
|
310
|
+
}
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
### Phase 5: Layout Algorithm
|
|
314
|
+
|
|
315
|
+
#### 3.5.1 EVGLayout.rgr - Layout Calculator
|
|
316
|
+
|
|
317
|
+
```ranger
|
|
318
|
+
class EVGLayout {
|
|
319
|
+
def measurer:ITextMeasurer
|
|
320
|
+
def pageWidth:double 0.0
|
|
321
|
+
def pageHeight:double 0.0
|
|
322
|
+
def currentPage:int 0
|
|
323
|
+
|
|
324
|
+
fn layout:void (root:EVGElement)
|
|
325
|
+
fn layoutElement:void (element:EVGElement parentX:double parentY:double
|
|
326
|
+
parentWidth:double parentHeight:double)
|
|
327
|
+
fn layoutChildren:double (parent:EVGElement) ; Returns content height
|
|
328
|
+
fn layoutFlow:double (parent:EVGElement children:[EVGElement])
|
|
329
|
+
fn layoutAbsolute:void (element:EVGElement parent:EVGElement)
|
|
330
|
+
fn alignRow:void (row:[EVGElement] parent:EVGElement rowHeight:double)
|
|
331
|
+
fn measureTextElement:void (text:EVGText maxWidth:double)
|
|
332
|
+
|
|
333
|
+
; Unit resolution
|
|
334
|
+
fn resolveUnit:double (unit:EVGUnit parentSize:double fontSize:double)
|
|
335
|
+
}
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
### Phase 6: Document and Pages
|
|
339
|
+
|
|
340
|
+
#### 3.6.1 EVGDocument.rgr - Multi-page Document
|
|
341
|
+
|
|
342
|
+
```ranger
|
|
343
|
+
class EVGPage {
|
|
344
|
+
def pageNumber:int 0
|
|
345
|
+
def width:double 0.0
|
|
346
|
+
def height:double 0.0
|
|
347
|
+
def elements:[EVGElement] ; Elements on this page
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
class EVGDocument {
|
|
351
|
+
def pages:[EVGPage]
|
|
352
|
+
def defaultWidth:double 612.0 ; Letter size in points
|
|
353
|
+
def defaultHeight:double 792.0
|
|
354
|
+
def root@(optional):EVGElement
|
|
355
|
+
|
|
356
|
+
fn addPage:EVGPage ()
|
|
357
|
+
fn layoutDocument:void (measurer:ITextMeasurer)
|
|
358
|
+
fn getElementsForPage:array (pageNum:int)
|
|
359
|
+
}
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
## 4. Layout Algorithm Details
|
|
363
|
+
|
|
364
|
+
### 4.1 Flow Layout
|
|
365
|
+
|
|
366
|
+
```
|
|
367
|
+
1. Start at (paddingLeft, paddingTop)
|
|
368
|
+
2. For each child:
|
|
369
|
+
a. Resolve child's units based on parent dimensions
|
|
370
|
+
b. If child has left/top/right/bottom → absolute positioning
|
|
371
|
+
c. Check if child fits in current row
|
|
372
|
+
d. If not, wrap to next row
|
|
373
|
+
e. Position child at (currentX + marginLeft, currentY + marginTop)
|
|
374
|
+
f. Advance currentX by child's total width
|
|
375
|
+
g. Track max row height
|
|
376
|
+
3. After all children, apply horizontal alignment to each row
|
|
377
|
+
4. Apply vertical alignment within rows
|
|
378
|
+
5. Return total content height
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
### 4.2 Page Breaking
|
|
382
|
+
|
|
383
|
+
```
|
|
384
|
+
1. Layout normally until element exceeds page height
|
|
385
|
+
2. When overflow="page-break":
|
|
386
|
+
a. Split element to next page
|
|
387
|
+
b. Mark calculatedPage on each element
|
|
388
|
+
3. Document collects elements per page for rendering
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
## 5. Integration with pdf_writer
|
|
392
|
+
|
|
393
|
+
### 5.1 PDF Renderer Interface
|
|
394
|
+
|
|
395
|
+
```ranger
|
|
396
|
+
class EVGPDFRenderer {
|
|
397
|
+
def writer:PDFWriter
|
|
398
|
+
def document:EVGDocument
|
|
399
|
+
|
|
400
|
+
fn render:buffer ()
|
|
401
|
+
fn renderPage:void (page:EVGPage)
|
|
402
|
+
fn renderElement:void (element:EVGElement)
|
|
403
|
+
fn renderText:void (text:EVGText)
|
|
404
|
+
fn renderImage:void (image:EVGImage)
|
|
405
|
+
fn renderContainer:void (container:EVGContainer)
|
|
406
|
+
|
|
407
|
+
; ITextMeasurer implementation using PDF font metrics
|
|
408
|
+
fn measureText:EVGTextMetrics (text:string fontFamily:string fontSize:double)
|
|
409
|
+
}
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
### 5.2 Usage Example
|
|
413
|
+
|
|
414
|
+
```ranger
|
|
415
|
+
Import "EVGDocument.rgr"
|
|
416
|
+
Import "EVGParser.rgr"
|
|
417
|
+
Import "EVGLayout.rgr"
|
|
418
|
+
Import "EVGPDFRenderer.rgr"
|
|
419
|
+
|
|
420
|
+
main {
|
|
421
|
+
def xml "<div width=\"612\" height=\"792\" padding=\"72\">
|
|
422
|
+
<span font-size=\"24\">Chapter 1</span>
|
|
423
|
+
<div margin-top=\"20\">
|
|
424
|
+
<span font-size=\"12\">Lorem ipsum dolor sit amet...</span>
|
|
425
|
+
</div>
|
|
426
|
+
<img src=\"./image.jpg\" width=\"200\" />
|
|
427
|
+
</div>"
|
|
428
|
+
|
|
429
|
+
def parser (new EVGParser())
|
|
430
|
+
def root:EVGElement (parser.parse(xml))
|
|
431
|
+
|
|
432
|
+
def renderer (new EVGPDFRenderer())
|
|
433
|
+
def document (new EVGDocument())
|
|
434
|
+
document.root = root
|
|
435
|
+
document.layoutDocument(renderer)
|
|
436
|
+
|
|
437
|
+
def pdfData:buffer (renderer.render())
|
|
438
|
+
buffer_write_file "." "output.pdf" pdfData
|
|
439
|
+
}
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
## 6. npm Scripts
|
|
443
|
+
|
|
444
|
+
Add to package.json:
|
|
445
|
+
|
|
446
|
+
```json
|
|
447
|
+
{
|
|
448
|
+
"evg:compile": "cross-env RANGER_LIB=./compiler/Lang.rgr node dist/rgrc.js -es6 ./lib/evg/evg_test.rgr -d=./lib/evg/bin -o=evg_test.js -nodecli",
|
|
449
|
+
"evg:run": "node ./lib/evg/bin/evg_test.js",
|
|
450
|
+
"evg": "npm run evg:compile && npm run evg:run"
|
|
451
|
+
}
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
## 7. Implementation Order
|
|
455
|
+
|
|
456
|
+
### Week 1: Core Types
|
|
457
|
+
|
|
458
|
+
1. [ ] EVGUnit.rgr - Unit parsing and resolution
|
|
459
|
+
2. [ ] EVGColor.rgr - Color parsing (port from original/EVGColor.clj)
|
|
460
|
+
3. [ ] EVGBox.rgr - Box model calculations
|
|
461
|
+
|
|
462
|
+
### Week 2: Elements
|
|
463
|
+
|
|
464
|
+
4. [ ] EVGElement.rgr - Base element class
|
|
465
|
+
5. [ ] EVGText.rgr - Text element
|
|
466
|
+
6. [ ] EVGImage.rgr - Image element
|
|
467
|
+
7. [ ] EVGContainer.rgr - Container with gradients/shadows
|
|
468
|
+
|
|
469
|
+
### Week 3: Parser & Layout
|
|
470
|
+
|
|
471
|
+
8. [ ] EVGParser.rgr - Simple XML parser
|
|
472
|
+
9. [ ] EVGLayout.rgr - Flow layout algorithm
|
|
473
|
+
10. [ ] EVGDocument.rgr - Multi-page support
|
|
474
|
+
|
|
475
|
+
### Week 4: Renderer Integration
|
|
476
|
+
|
|
477
|
+
11. [ ] EVGRenderer.rgr - Abstract interface
|
|
478
|
+
12. [ ] evg_test.rgr - Test CLI
|
|
479
|
+
13. [ ] Integration with pdf_writer (future)
|
|
480
|
+
|
|
481
|
+
## 8. Testing Strategy
|
|
482
|
+
|
|
483
|
+
### 8.1 Unit Tests (in evg_test.rgr)
|
|
484
|
+
|
|
485
|
+
- Unit parsing: "100px", "50%", "2em", "fill"
|
|
486
|
+
- Color parsing: "#FF5733", "rgb(255,87,51)", "rgba(...)", "red"
|
|
487
|
+
- Box model calculations
|
|
488
|
+
- Layout positioning
|
|
489
|
+
|
|
490
|
+
### 8.2 Visual Tests
|
|
491
|
+
|
|
492
|
+
- Generate test PDFs with known layouts
|
|
493
|
+
- Compare coordinates to expected values
|
|
494
|
+
|
|
495
|
+
### 8.3 Example Documents
|
|
496
|
+
|
|
497
|
+
- Simple card layout
|
|
498
|
+
- Multi-column layout
|
|
499
|
+
- Text wrapping test
|
|
500
|
+
- Image with caption
|
|
501
|
+
- Multi-page book chapter
|
|
502
|
+
|
|
503
|
+
## 9. Future Enhancements
|
|
504
|
+
|
|
505
|
+
- [ ] SVG path rendering (port from original/SVGPath.clj)
|
|
506
|
+
- [ ] Gradient parsing and rendering
|
|
507
|
+
- [ ] Component system (reusable templates)
|
|
508
|
+
- [ ] CSS stylesheet support
|
|
509
|
+
- [ ] EPUB output (multi-page HTML)
|
|
510
|
+
- [ ] Canvas renderer for browser
|
|
511
|
+
- [ ] Interactive elements (for browser)
|
|
512
|
+
|
|
513
|
+
## 10. References
|
|
514
|
+
|
|
515
|
+
- [SPEC.md](SPEC.md) - Full EVG format specification
|
|
516
|
+
- [original/EVGColor.clj](original/EVGColor.clj) - Reference color implementation
|
|
517
|
+
- [original/SVGPath.clj](original/SVGPath.clj) - Reference SVG path parser
|
|
518
|
+
- [PDF Reference](https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf)
|