ea 0.3.1 → 0.5.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/Rakefile +3 -0
- data/TODO.complete/01-t-xref-parsing.md +91 -0
- data/TODO.complete/02-per-label-geometry.md +50 -0
- data/TODO.complete/03-object-properties-constraints.md +57 -0
- data/TODO.complete/04-operation-params.md +37 -0
- data/TODO.complete/05-pdata-flag-matrix.md +52 -0
- data/TODO.complete/06-emf-image-rendering.md +34 -0
- data/TODO.complete/07-auxiliary-tables.md +47 -0
- data/TODO.complete/10-mdg-stereotype-registry.md +40 -0
- data/TODO.complete/11-gml-xsd-generation.md +42 -0
- data/TODO.complete/13-shapescript-interpreter.md +28 -0
- data/TODO.complete/20-cli-diff.md +46 -0
- data/TODO.complete/21-cli-render.md +26 -0
- data/TODO.complete/22-cli-export.md +29 -0
- data/TODO.complete/23-cli-mdg.md +23 -0
- data/TODO.complete/30-headerlines-ocp-refactor.md +72 -0
- data/TODO.complete/31-public-send-cleanup.md +61 -0
- data/TODO.complete/32-spec-coverage.md +33 -0
- data/TODO.complete/33-blocked-parity-gaps.md +41 -0
- data/TODO.complete/36-stereotype-icon-wiring.md +32 -0
- data/TODO.complete/37-cli-lint.md +32 -0
- data/TODO.complete/38-cli-query.md +26 -0
- data/TODO.complete/39-cli-info.md +23 -0
- data/TODO.complete/40-ocl-evaluator.md +31 -0
- data/TODO.complete/41-round-trip-spec.md +18 -0
- data/TODO.complete/42-html-diff-report.md +18 -0
- data/TODO.complete/43-json-schema-export.md +20 -0
- data/TODO.complete/44-remaining-qea-tables.md +40 -0
- data/TODO.complete/45-shapescript-extensions.md +25 -0
- data/TODO.complete/46-xsd-consolidation.md +20 -0
- data/TODO.complete/47-headerlines-legacy-removal.md +20 -0
- data/TODO.complete/STATUS.md +109 -0
- data/TODO.diagrams/01-svg-measurement-harness.md +31 -0
- data/TODO.diagrams/01-xmi-extension-elements-parsing.md +67 -0
- data/TODO.diagrams/02-diagram-element-rich-model.md +61 -0
- data/TODO.diagrams/02-polygon-over-rendering.md +29 -0
- data/TODO.diagrams/03-ea-style-svg-emitter.md +70 -0
- data/TODO.diagrams/03-text-over-rendering.md +30 -0
- data/TODO.diagrams/04-connector-routing-from-soid-eoid.md +55 -0
- data/TODO.diagrams/04-rect-under-rendering.md +33 -0
- data/TODO.diagrams/05-canvas-dimension-parity.md +51 -0
- data/TODO.diagrams/05-marker-rendering-per-relationship-type.md +49 -0
- data/TODO.diagrams/06-connector-labels.md +49 -0
- data/TODO.diagrams/06-group-layering-parity.md +39 -0
- data/TODO.diagrams/07-canvas-size-and-viewbox.md +39 -0
- data/TODO.diagrams/07-text-content-fidelity.md +65 -0
- data/TODO.diagrams/08-qea-direct-pipeline.md +46 -0
- data/TODO.diagrams/08-visual-regression-harness.md +34 -0
- data/TODO.diagrams/09-cli-render-all-diagrams.md +25 -0
- data/TODO.diagrams/10-stereotype-color-config.md +29 -0
- data/TODO.diagrams/11-elkrb-auto-layout-integration.md +53 -0
- data/TODO.diagrams/12-connector-labels.md +40 -0
- data/TODO.diagrams/12-per-entity-svg-layer-ordering.md +24 -0
- data/TODO.diagrams/13-marker-polygon-vs-path-dispatch.md +20 -0
- data/TODO.diagrams/13-per-text-type-font-sizes.md +33 -0
- data/TODO.diagrams/14-center-header-text.md +33 -0
- data/TODO.diagrams/14-filter-diagram-frame-elements.md +18 -0
- data/TODO.diagrams/15-deep-dead-code-audit.md +47 -0
- data/TODO.diagrams/15-per-element-font-from-style.md +24 -0
- data/TODO.diagrams/16-canvas-marker-extent.md +30 -0
- data/TODO.diagrams/16-document-remaining-parity-gaps.md +91 -0
- data/TODO.diagrams/17-italic-abstract-classes.md +28 -0
- data/TODO.diagrams/17-remaining-parity-gaps.md +90 -0
- data/TODO.diagrams/18-canvas-from-image-bounds.md +20 -0
- data/TODO.diagrams/18-property-lookup-index.md +42 -0
- data/TODO.diagrams/19-connector-sx-sy-routing.md +27 -0
- data/TODO.diagrams/19-replace-respond-to-with-is-a.md +31 -0
- data/TODO.diagrams/20-split-labels-emitter.md +56 -0
- data/TODO.diagrams/20-visibility-glyph-font-encoding.md +27 -0
- data/TODO.diagrams/21-aggregation-navigability-arrow.md +21 -0
- data/TODO.diagrams/21-auto-generated-legend-block.md +65 -0
- data/TODO.diagrams/22-ghost-element-discriminator.md +57 -0
- data/TODO.diagrams/22-style-based-path-grouping.md +28 -0
- data/TODO.diagrams/23-marker-polygon-deduplication.md +47 -0
- data/TODO.diagrams/23-multiplicity-label-positioning.md +29 -0
- data/TODO.diagrams/24-marker-anchor-structural.md +35 -0
- data/TODO.diagrams/24-track-marker-anchors-structurally.md +66 -0
- data/TODO.diagrams/24-truncate-properties-to-fit-box.md +24 -0
- data/TODO.diagrams/26-phantom-general-parent-rendering.md +59 -0
- data/TODO.diagrams/27-path-grouping-mode-detection.md +43 -0
- data/TODO.diagrams/28-architecture-cleanup-batch.md +47 -0
- data/TODO.diagrams/30-decompose-elements-groups-for.md +52 -0
- data/TODO.diagrams/32-examples-coverage-batch.md +78 -0
- data/TODO.diagrams/36-instance-specification-model.md +42 -0
- data/TODO.diagrams/37-element-icon-decorations.md +41 -0
- data/TODO.diagrams/38-html-note-and-receptions.md +32 -0
- data/TODO.diagrams/39-property-stereotype-discriminator.md +40 -0
- data/TODO.diagrams/40-standalone-1-discriminator.md +38 -0
- data/TODO.diagrams/41-xmi-to-svg-pipeline.md +113 -0
- data/TODO.diagrams/42-close-all-parity-deltas.md +69 -0
- data/TODO.diagrams/43-marker-deduplication-strategy.md +54 -0
- data/TODO.diagrams/44-element-icon-decorations.md +34 -0
- data/TODO.diagrams/45-phantom-parent-class-boxes.md +40 -0
- data/TODO.diagrams/46-user-drawn-legend-swatches.md +44 -0
- data/TODO.diagrams/47-attribute-line-fidelity.md +72 -0
- data/TODO.diagrams/48-spec-coverage-critical-emitter-components.md +45 -0
- data/TODO.diagrams/49-spec-coverage-orchestrators.md +25 -0
- data/TODO.diagrams/50-examples-parity.md +85 -0
- data/TODO.diagrams/51-property-oy-gap-and-remaining-gaps.md +48 -0
- data/TODO.diagrams/52-marker-registration-architecture.md +89 -0
- data/TODO.diagrams/53-remaining-example-gaps.md +86 -0
- data/TODO.diagrams/54-display-name-nested-classes.md +40 -0
- data/TODO.diagrams/55-visibility-icon-discriminator.md +58 -0
- data/TODO.diagrams/56-package-contents-rendering.md +148 -0
- data/TODO.diagrams/57-instance-specification-model.md +100 -0
- data/TODO.diagrams/58-domain-model-note-text.md +67 -0
- data/TODO.diagrams/59-classes-arrow-discriminator.md +57 -0
- data/TODO.diagrams/60-testschema-association-marker.md +40 -0
- data/TODO.diagrams/61-legend-block-rendering.md +55 -0
- data/TODO.diagrams/61-plateau-parity-gaps.md +59 -0
- data/TODO.diagrams/62-ghost-element-rendering.md +56 -0
- data/TODO.diagrams/63-qualified-name-wrap.md +36 -0
- data/TODO.diagrams/64-property-stereotype-labels.md +22 -0
- data/TODO.diagrams/65-path-coordinate-frame.md +62 -0
- data/TODO.diagrams/67-path-coordinate-frame.md +62 -0
- data/TODO.diagrams/68-inherited-attributes.md +65 -0
- data/TODO.diagrams/69-package-anchor-conditional.md +29 -0
- data/TODO.diagrams/70-mdg-technology-support.md +68 -0
- data/TODO.diagrams/71-off-canvas-parent-ghost.md +45 -0
- data/TODO.diagrams/72-basic-attr-divider-paths.md +39 -0
- data/TODO.diagrams/73-plateau-polygon-gap.md +69 -0
- data/TODO.diagrams/74-plateau-rect-gap.md +22 -0
- data/TODO.diagrams/75-plateau-text-gap.md +39 -0
- data/TODO.diagrams/76-basic-poly-path-gaps.md +41 -0
- data/TODO.diagrams/77-basic-text-overrender.md +40 -0
- data/TODO.diagrams/78-headerlines-ocp-refactor.md +65 -0
- data/TODO.diagrams/79-architecture-backlog.md +65 -0
- data/TODO.diagrams/80-basic-triangle-polygons.md +51 -0
- data/TODO.diagrams/81-plateau-path-overrender.md +53 -0
- data/TODO.diagrams/82-appearance-canvas-offset.md +54 -0
- data/TODO.diagrams/83-3d-diagram-subtitle.md +58 -0
- data/TODO.diagrams/84-canvas-offset-mismatches.md +61 -0
- data/TODO.diagrams/85-phantom-property-overrender.md +95 -0
- data/TODO.diagrams/86-foreign-package-rule.md +62 -0
- data/TODO.diagrams/87-internal-tech-encryption.md +80 -0
- data/TODO.diagrams/EXAMPLES_STATUS.md +88 -0
- data/TODO.diagrams/README.md +69 -0
- data/TODO.diagrams/STATUS.md +73 -0
- data/TODO.fixup/01-default-grouped-paths.md +34 -0
- data/TODO.fixup/02-marker-consolidation-per-connector.md +20 -0
- data/TODO.fixup/03-diagram-font-inference.md +28 -0
- data/TODO.fixup/04-extract-bounds-calculator.md +25 -0
- data/TODO.fixup/05-marker-registry-ocp.md +32 -0
- data/TODO.fixup/06-connector-path-bend-routing.md +28 -0
- data/TODO.fixup/07-edge-attachment-formula.md +22 -0
- data/TODO.fixup/08-visual-diff-harness.md +28 -0
- data/TODO.fixup/09-extract-element-compartments.md +34 -0
- data/TODO.fixup/10-canvas-width-overshoot-fix.md +20 -0
- data/TODO.fixup/11-layer-sequencer-extraction.md +18 -0
- data/TODO.fixup/12-path-style-harmony.md +23 -0
- data/TODO.fixup/13-datatype-stereotype-fallback.md +28 -0
- data/TODO.fixup/14-ea-exe-reverse-engineering-notes.md +56 -0
- data/TODO.fixup/15-enumeration-literal-rendering.md +30 -0
- data/TODO.fixup/16-operation-compartment-rendering.md +42 -0
- data/TODO.fixup/17-path-count-calibration.md +27 -0
- data/TODO.fixup/18-polygon-count-calibration.md +32 -0
- data/TODO.fixup/19-rect-count-undershoot-investigation.md +40 -0
- data/TODO.fixup/20-stereotype-color-from-classifier.md +18 -0
- data/TODO.fixup/21-visibility-filter-for-properties.md +24 -0
- data/TODO.fixup/22-multiplicity-display-rule-calibration.md +25 -0
- data/TODO.fixup/23-diagram-frame-title-element.md +31 -0
- data/TODO.fixup/24-note-element-rendering.md +23 -0
- data/TODO.fixup/25-ea-exe-disassembly-findings.md +177 -0
- data/TODO.fixup/26-svg-renderer-architecture.md +78 -0
- data/TODO.fixup/27-svg-element-emitters-disassembly.md +135 -0
- data/TODO.fixup/28-geometry-parser-identification.md +57 -0
- data/TODO.fixup/29-qea-svg-xmi-triple-comparison.md +185 -0
- data/TODO.fixup/30-theme-system-stub.md +46 -0
- data/TODO.fixup/31-theme-value-object-registry.md +17 -0
- data/TODO.fixup/32-styleex-on-diagram-model.md +22 -0
- data/TODO.fixup/33-text-encoding-decimals-rotation.md +29 -0
- data/TODO.fixup/34-per-type-fill-via-theme.md +18 -0
- data/TODO.fixup/35-stroke-width-per-theme.md +7 -0
- data/TODO.fixup/36-qea-rect-coord-normalization.md +24 -0
- data/TODO.fixup/37-package-shape-rendering.md +22 -0
- data/TODO.fixup/38-note-element-rendering.md +15 -0
- data/TODO.fixup/39-styleex-flag-honoring.md +25 -0
- data/TODO.fixup/40-connector-dashed-lines.md +15 -0
- data/TODO.fixup/41-diagram-frame-showborder-detection.md +23 -0
- data/TODO.fixup/42-textrenderer-centralization.md +10 -0
- data/TODO.fixup/43-colorresolver-unification.md +24 -0
- data/TODO.fixup/44-theme-aware-textrenderer.md +17 -0
- data/TODO.fixup/45-theme-aware-fontresolver.md +22 -0
- data/TODO.fixup/46-style-parameterized-by-theme.md +21 -0
- data/TODO.fixup/47-canvas-frame-inset.md +19 -0
- data/TODO.fixup/48-background-rect-format.md +15 -0
- data/TODO.fixup/49-all-samples-integration-test.md +17 -0
- data/TODO.fixup/50-svg-emitter-architecture-docs.md +33 -0
- data/TODO.fixup/51-promote-theme-to-ea-namespace.md +28 -0
- data/TODO.fixup/52-theme-definition-integrated-fills.md +26 -0
- data/TODO.fixup/53-theme-registry-yaml-loading.md +50 -0
- data/TODO.fixup/54-diagram-theme-api.md +50 -0
- data/TODO.fixup/55-update-eaemitter-to-ea-theme.md +23 -0
- data/TODO.fixup/56-theme-yaml-files.md +65 -0
- data/TODO.fixup/57-theme-specs-and-integration.md +27 -0
- data/TODO.fixup/58-ea-entry-point-theme-autoload.md +20 -0
- data/TODO.fixup/59-thread-theme-through-all-renderers.md +29 -0
- data/TODO.fixup/60-cli-theme-option.md +22 -0
- data/TODO.fixup/61-theme-validation.md +28 -0
- data/TODO.fixup/62-theme-builder-dsl.md +31 -0
- data/TODO.fixup/63-theme-integration-rendering-spec.md +24 -0
- data/TODO.fixup/64-theme-writeback-styleex.md +21 -0
- data/TODO.fixup/65-remove-dead-eaemitter-theme-files.md +30 -0
- data/TODO.fixup/66-styleex-writeback.md +22 -0
- data/TODO.fixup/67-delete-dead-code.md +28 -0
- data/TODO.fixup/68-figure-parity-status.md +82 -0
- data/TODO.fixup/69-package-polygon-rendering.md +54 -0
- data/TODO.fixup/70-tagged-values-compartment.md +39 -0
- data/TODO.fixup/71-auto-detect-theme-from-xmi.md +37 -0
- data/TODO.fixup/72-sample-exports-as-regression-specs.md +37 -0
- data/TODO.fixup/73-delete-dead-transformations.md +14 -0
- data/TODO.fixup/74-delete-dead-diagram-renderers.md +18 -0
- data/TODO.fixup/75-visibility-legend-icons.md +23 -0
- data/TODO.fixup/76-plateau-text-undershoot.md +27 -0
- data/TODO.fixup/77-canvas-frame-margins.md +28 -0
- data/TODO.fixup/78-note-element-rendering.md +30 -0
- data/TODO.fixup/79-operation-compartment-rendering.md +27 -0
- data/TODO.fixup/80-tagged-value-stereotype-visibility.md +37 -0
- data/TODO.fixup/81-figure-parity-current-state.md +63 -0
- data/config/qea_schema.yml +356 -0
- data/config/stereotype_colors.yml +15 -0
- data/config/themes/119.yml +98 -0
- data/config/themes/default.yml +14 -0
- data/examples/exports/20251010_current_plateau_v5/UML_EA.DTD +6856 -0
- data/examples/exports/20251010_current_plateau_v5/model.xml +96709 -0
- data/examples/exports/ArcGISWorkspace_template/UML_EA.DTD +6856 -0
- data/examples/exports/ArcGISWorkspace_template/model.xml +1427 -0
- data/examples/exports/UmlModel_template/UML_EA.DTD +6856 -0
- data/examples/exports/UmlModel_template/model.xml +23 -0
- data/examples/exports/basic/UML_EA.DTD +6856 -0
- data/examples/exports/basic/model.xml +8039 -0
- data/examples/exports/simple/UML_EA.DTD +6856 -0
- data/examples/exports/simple/model.xml +585 -0
- data/examples/exports/simple_example/UML_EA.DTD +6856 -0
- data/examples/exports/simple_example/model.xml +23 -0
- data/examples/exports/test/UML_EA.DTD +6856 -0
- data/examples/exports/test/model.xml +1638 -0
- data/examples/qea/basic.qea +0 -0
- data/frontend/README.md +51 -0
- data/frontend/dist/app.iife.js +24 -0
- data/frontend/dist/style.css +1 -0
- data/frontend/index.html +26 -0
- data/frontend/package-lock.json +2359 -0
- data/frontend/package.json +26 -0
- data/frontend/src/App.vue +59 -0
- data/frontend/src/app.ts +8 -0
- data/frontend/src/components/AppHeader.vue +127 -0
- data/frontend/src/components/AppSidebar.vue +119 -0
- data/frontend/src/components/ClassDetails.vue +247 -0
- data/frontend/src/components/DiagramView.vue +79 -0
- data/frontend/src/components/PackageDetails.vue +92 -0
- data/frontend/src/components/PackageTreeNode.vue +64 -0
- data/frontend/src/components/SearchResults.vue +48 -0
- data/frontend/src/components/WelcomeView.vue +87 -0
- data/frontend/src/shims-vue.d.ts +5 -0
- data/frontend/src/stores/dataStore.ts +79 -0
- data/frontend/src/stores/uiStore.ts +167 -0
- data/frontend/src/styles/main.css +1566 -0
- data/frontend/src/types.ts +221 -0
- data/frontend/tests/e2e/__screenshots__/new-dark-mode.png +0 -0
- data/frontend/tests/e2e/__screenshots__/new-package-details.png +0 -0
- data/frontend/tests/e2e/__screenshots__/new-search-modal.png +0 -0
- data/frontend/tests/e2e/__screenshots__/new-sidebar-collapsed.png +0 -0
- data/frontend/tests/e2e/__screenshots__/new-welcome.png +0 -0
- data/frontend/tests/e2e/render.spec.ts +188 -0
- data/frontend/tsconfig.json +20 -0
- data/frontend/vite.config.ts +26 -0
- data/frontend/vitest.config.ts +8 -0
- data/lib/ea/cli/app.rb +62 -1
- data/lib/ea/cli/command/diagrams.rb +37 -28
- data/lib/ea/cli/command/diff.rb +46 -0
- data/lib/ea/cli/command/export.rb +80 -0
- data/lib/ea/cli/command/info.rb +75 -0
- data/lib/ea/cli/command/lint.rb +48 -0
- data/lib/ea/cli/command/mdg.rb +98 -0
- data/lib/ea/cli/command/query.rb +34 -0
- data/lib/ea/cli/command/render.rb +135 -0
- data/lib/ea/cli/command/svg.rb +43 -6
- data/lib/ea/cli/command.rb +7 -0
- data/lib/ea/diagram/display_config.rb +184 -0
- data/lib/ea/diagram.rb +4 -41
- data/lib/ea/diff/change.rb +30 -0
- data/lib/ea/diff/comparator.rb +82 -0
- data/lib/ea/diff/html_reporter.rb +91 -0
- data/lib/ea/diff.rb +15 -0
- data/lib/ea/export/json/generator.rb +42 -0
- data/lib/ea/export/json.rb +12 -0
- data/lib/ea/export/json_schema/generator.rb +77 -0
- data/lib/ea/export/json_schema.rb +12 -0
- data/lib/ea/export/plantuml/generator.rb +73 -0
- data/lib/ea/export/plantuml.rb +12 -0
- data/lib/ea/export/xmi/generator.rb +77 -0
- data/lib/ea/export/xmi.rb +11 -0
- data/lib/ea/export/xsd/class_mapping.rb +65 -0
- data/lib/ea/export/xsd/generator.rb +142 -0
- data/lib/ea/export/xsd/namespace_registry.rb +82 -0
- data/lib/ea/export/xsd.rb +19 -0
- data/lib/ea/export.rb +14 -0
- data/lib/ea/image/emf_renderer.rb +42 -0
- data/lib/ea/image.rb +12 -0
- data/lib/ea/lint/engine.rb +30 -0
- data/lib/ea/lint/lint_rule.rb +38 -0
- data/lib/ea/lint/offense.rb +18 -0
- data/lib/ea/lint/rules/cyclic_generalization.rb +62 -0
- data/lib/ea/lint/rules/duplicate_name.rb +28 -0
- data/lib/ea/lint/rules/missing_stereotype.rb +35 -0
- data/lib/ea/lint/rules/naming_convention.rb +44 -0
- data/lib/ea/lint/rules/orphan_element.rb +28 -0
- data/lib/ea/lint/rules.rb +14 -0
- data/lib/ea/lint.rb +13 -0
- data/lib/ea/mdg/document.rb +120 -0
- data/lib/ea/mdg/loader.rb +118 -0
- data/lib/ea/mdg/registry.rb +98 -0
- data/lib/ea/mdg/stereotype_alias_registry.rb +77 -0
- data/lib/ea/mdg/xml/applies_to.rb +18 -0
- data/lib/ea/mdg/xml/apply.rb +18 -0
- data/lib/ea/mdg/xml/content.rb +18 -0
- data/lib/ea/mdg/xml/documentation.rb +24 -0
- data/lib/ea/mdg/xml/stereotype.rb +28 -0
- data/lib/ea/mdg/xml/stereotypes.rb +18 -0
- data/lib/ea/mdg/xml/tag.rb +28 -0
- data/lib/ea/mdg/xml/tagged_values.rb +18 -0
- data/lib/ea/mdg/xml/technology.rb +28 -0
- data/lib/ea/mdg/xml/uml_profile.rb +22 -0
- data/lib/ea/mdg/xml/uml_profiles.rb +18 -0
- data/lib/ea/mdg/xml.rb +24 -0
- data/lib/ea/mdg.rb +25 -0
- data/lib/ea/model/classifier.rb +4 -0
- data/lib/ea/model/constraint.rb +24 -0
- data/lib/ea/model/diagram.rb +85 -0
- data/lib/ea/model/diagram_connector.rb +53 -1
- data/lib/ea/model/diagram_element.rb +44 -0
- data/lib/ea/model/document.rb +47 -2
- data/lib/ea/model/ghost_label.rb +32 -0
- data/lib/ea/model/instance_specification.rb +34 -0
- data/lib/ea/model/legend.rb +43 -0
- data/lib/ea/model/legend_item.rb +26 -0
- data/lib/ea/model/note.rb +28 -0
- data/lib/ea/model/operation.rb +2 -0
- data/lib/ea/model/property.rb +2 -0
- data/lib/ea/model/relationship.rb +2 -0
- data/lib/ea/model/signal.rb +14 -0
- data/lib/ea/model/slot.rb +19 -0
- data/lib/ea/model.rb +8 -0
- data/lib/ea/ocl/evaluator.rb +94 -0
- data/lib/ea/ocl/nodes.rb +30 -0
- data/lib/ea/ocl/parser.rb +133 -0
- data/lib/ea/ocl/unsupported_error.rb +7 -0
- data/lib/ea/ocl.rb +13 -0
- data/lib/ea/qea/factory/document_builder.rb +24 -10
- data/lib/ea/qea/factory/generalization_builder.rb +9 -11
- data/lib/ea/qea/infrastructure/table_reader.rb +9 -0
- data/lib/ea/qea/models/ea_author.rb +35 -0
- data/lib/ea/qea/models/ea_glossary.rb +34 -0
- data/lib/ea/qea/models/ea_image.rb +53 -0
- data/lib/ea/qea/models/ea_implement.rb +32 -0
- data/lib/ea/qea/models/ea_list.rb +42 -0
- data/lib/ea/qea/models/ea_object_effort.rb +34 -0
- data/lib/ea/qea/models/ea_object_problem.rb +37 -0
- data/lib/ea/qea/models/ea_object_require.rb +34 -0
- data/lib/ea/qea/models/ea_object_resource.rb +34 -0
- data/lib/ea/qea/models/ea_object_risk.rb +34 -0
- data/lib/ea/qea/models/ea_object_scenario.rb +34 -0
- data/lib/ea/qea/models/ea_object_test.rb +35 -0
- data/lib/ea/qea/models/ea_object_trx.rb +34 -0
- data/lib/ea/qea/models/ea_operation.rb +7 -0
- data/lib/ea/qea/models/ea_palette.rb +30 -0
- data/lib/ea/qea/models/ea_palette_item.rb +36 -0
- data/lib/ea/qea/models/ea_phase.rb +40 -0
- data/lib/ea/qea/models/ea_role_constraint.rb +32 -0
- data/lib/ea/qea/models/ea_secrypt.rb +34 -0
- data/lib/ea/qea/models/ea_version.rb +39 -0
- data/lib/ea/qea/models/ea_xref.rb +11 -1
- data/lib/ea/qea/models.rb +19 -0
- data/lib/ea/qea/services/database_loader.rb +22 -1
- data/lib/ea/query/builder.rb +108 -0
- data/lib/ea/query.rb +9 -0
- data/lib/ea/render/image_converter.rb +101 -0
- data/lib/ea/render.rb +10 -0
- data/lib/ea/shapescript/parser.rb +208 -0
- data/lib/ea/shapescript/renderer.rb +74 -0
- data/lib/ea/shapescript/shape.rb +34 -0
- data/lib/ea/shapescript.rb +24 -0
- data/lib/ea/sources/qea/adapter.rb +22 -5
- data/lib/ea/sources/qea/classifier_builder.rb +184 -7
- data/lib/ea/sources/qea/diagram_builder.rb +352 -24
- data/lib/ea/sources/qea/id_normalizer.rb +16 -1
- data/lib/ea/sources/qea/instance_builder.rb +113 -0
- data/lib/ea/sources/qea/legend_builder.rb +137 -0
- data/lib/ea/sources/qea/note_builder.rb +58 -0
- data/lib/ea/sources/qea/object_classifier_map.rb +6 -1
- data/lib/ea/sources/qea/operation_builder.rb +1 -0
- data/lib/ea/sources/qea/package_builder.rb +16 -0
- data/lib/ea/sources/qea/relationship_builder.rb +21 -5
- data/lib/ea/sources/qea/tagged_value_builder.rb +28 -9
- data/lib/ea/sources/qea/xref/legend_definition.rb +35 -0
- data/lib/ea/sources/qea/xref/parser.rb +150 -0
- data/lib/ea/sources/qea/xref/property_definition.rb +29 -0
- data/lib/ea/sources/qea/xref/record.rb +41 -0
- data/lib/ea/sources/qea/xref/stereotype_application.rb +37 -0
- data/lib/ea/sources/qea/xref.rb +27 -0
- data/lib/ea/sources/qea.rb +4 -0
- data/lib/ea/sources/xmi/adapter.rb +80 -2
- data/lib/ea/sources/xmi/annotation_builder.rb +1 -1
- data/lib/ea/sources/xmi/classifier_builder.rb +10 -1
- data/lib/ea/sources/xmi/diagram_builder.rb +242 -45
- data/lib/ea/sources/xmi/extension_elements.rb +74 -0
- data/lib/ea/sources/xmi/extension_geometry_parser.rb +124 -0
- data/lib/ea/sources/xmi/extension_style_parser.rb +91 -0
- data/lib/ea/sources/xmi/note_builder.rb +46 -0
- data/lib/ea/sources/xmi/property_builder.rb +9 -0
- data/lib/ea/sources/xmi/stereotype_builder.rb +54 -0
- data/lib/ea/sources/xmi/tag_builder.rb +45 -0
- data/lib/ea/sources/xmi/umldi_keyword_extractor.rb +87 -0
- data/lib/ea/sources/xmi.rb +7 -0
- data/lib/ea/spa/output/sharded_multi_file_strategy.rb +18 -3
- data/lib/ea/spa/output/single_file_strategy.rb +8 -2
- data/lib/ea/spa/output/strategy.rb +34 -0
- data/lib/ea/svg/connector_router.rb +134 -0
- data/lib/ea/svg/ea_emitter/background.rb +15 -0
- data/lib/ea/svg/ea_emitter/bounds_calculator.rb +142 -0
- data/lib/ea/svg/ea_emitter/canvas.rb +88 -0
- data/lib/ea/svg/ea_emitter/color_resolver.rb +56 -0
- data/lib/ea/svg/ea_emitter/compartment/attributes.rb +28 -0
- data/lib/ea/svg/ea_emitter/compartment/constraints.rb +30 -0
- data/lib/ea/svg/ea_emitter/compartment/enum_literals.rb +86 -0
- data/lib/ea/svg/ea_emitter/compartment/header.rb +32 -0
- data/lib/ea/svg/ea_emitter/compartment/header_divider.rb +57 -0
- data/lib/ea/svg/ea_emitter/compartment/instance_slots.rb +96 -0
- data/lib/ea/svg/ea_emitter/compartment/instance_underline.rb +67 -0
- data/lib/ea/svg/ea_emitter/compartment/note_body.rb +52 -0
- data/lib/ea/svg/ea_emitter/compartment/note_text.rb +102 -0
- data/lib/ea/svg/ea_emitter/compartment/operations.rb +38 -0
- data/lib/ea/svg/ea_emitter/compartment/package_contents.rb +72 -0
- data/lib/ea/svg/ea_emitter/compartment/package_from_parent.rb +136 -0
- data/lib/ea/svg/ea_emitter/compartment/shape.rb +82 -0
- data/lib/ea/svg/ea_emitter/compartment/tagged_values.rb +30 -0
- data/lib/ea/svg/ea_emitter/compartment.rb +58 -0
- data/lib/ea/svg/ea_emitter/connectors.rb +84 -0
- data/lib/ea/svg/ea_emitter/diagram_frame.rb +143 -0
- data/lib/ea/svg/ea_emitter/document.rb +35 -0
- data/lib/ea/svg/ea_emitter/element/attribute_line_builder.rb +117 -0
- data/lib/ea/svg/ea_emitter/element/attribute_renderer.rb +119 -0
- data/lib/ea/svg/ea_emitter/element/bcol_decoder.rb +29 -0
- data/lib/ea/svg/ea_emitter/element/compartment_geometry.rb +113 -0
- data/lib/ea/svg/ea_emitter/element/constraint_renderer.rb +53 -0
- data/lib/ea/svg/ea_emitter/element/divider_renderer.rb +17 -0
- data/lib/ea/svg/ea_emitter/element/enumeration_literal_renderer.rb +34 -0
- data/lib/ea/svg/ea_emitter/element/filter.rb +44 -0
- data/lib/ea/svg/ea_emitter/element/hand_draw_shape_renderer.rb +77 -0
- data/lib/ea/svg/ea_emitter/element/header_line_pipeline.rb +43 -0
- data/lib/ea/svg/ea_emitter/element/header_line_provider/instance_spec.rb +27 -0
- data/lib/ea/svg/ea_emitter/element/header_line_provider/name.rb +76 -0
- data/lib/ea/svg/ea_emitter/element/header_line_provider/parent_ghost.rb +25 -0
- data/lib/ea/svg/ea_emitter/element/header_line_provider/stereotype_label.rb +68 -0
- data/lib/ea/svg/ea_emitter/element/header_line_provider.rb +19 -0
- data/lib/ea/svg/ea_emitter/element/header_lines.rb +27 -0
- data/lib/ea/svg/ea_emitter/element/header_renderer.rb +48 -0
- data/lib/ea/svg/ea_emitter/element/icon_renderer.rb +109 -0
- data/lib/ea/svg/ea_emitter/element/legend_renderer.rb +177 -0
- data/lib/ea/svg/ea_emitter/element/note_shape_renderer.rb +112 -0
- data/lib/ea/svg/ea_emitter/element/operation_renderer.rb +100 -0
- data/lib/ea/svg/ea_emitter/element/package_shape_renderer.rb +181 -0
- data/lib/ea/svg/ea_emitter/element/row_icon_renderer.rb +156 -0
- data/lib/ea/svg/ea_emitter/element/shape_renderer.rb +17 -0
- data/lib/ea/svg/ea_emitter/element/stereotype_icon_renderer.rb +82 -0
- data/lib/ea/svg/ea_emitter/element/tagged_value_renderer.rb +50 -0
- data/lib/ea/svg/ea_emitter/element/text_escape.rb +20 -0
- data/lib/ea/svg/ea_emitter/element.rb +37 -0
- data/lib/ea/svg/ea_emitter/elements.rb +357 -0
- data/lib/ea/svg/ea_emitter/font_resolver.rb +111 -0
- data/lib/ea/svg/ea_emitter/ghost_labels.rb +66 -0
- data/lib/ea/svg/ea_emitter/label/end_label.rb +266 -0
- data/lib/ea/svg/ea_emitter/label/midpoint_label.rb +101 -0
- data/lib/ea/svg/ea_emitter/label/registry.rb +50 -0
- data/lib/ea/svg/ea_emitter/label.rb +23 -0
- data/lib/ea/svg/ea_emitter/labels.rb +130 -0
- data/lib/ea/svg/ea_emitter/layer.rb +20 -0
- data/lib/ea/svg/ea_emitter/layer_sequencer.rb +93 -0
- data/lib/ea/svg/ea_emitter/marker/arrow_path.rb +52 -0
- data/lib/ea/svg/ea_emitter/marker/diamond.rb +57 -0
- data/lib/ea/svg/ea_emitter/marker/kind.rb +35 -0
- data/lib/ea/svg/ea_emitter/marker/open_triangle.rb +27 -0
- data/lib/ea/svg/ea_emitter/marker/package_import.rb +39 -0
- data/lib/ea/svg/ea_emitter/marker/plus.rb +40 -0
- data/lib/ea/svg/ea_emitter/marker/registry.rb +42 -0
- data/lib/ea/svg/ea_emitter/marker.rb +37 -0
- data/lib/ea/svg/ea_emitter/markers.rb +404 -0
- data/lib/ea/svg/ea_emitter/render_context.rb +52 -0
- data/lib/ea/svg/ea_emitter/style.rb +15 -0
- data/lib/ea/svg/ea_emitter/text_renderer.rb +92 -0
- data/lib/ea/svg/ea_emitter.rb +51 -0
- data/lib/ea/svg/parity/checker.rb +105 -0
- data/lib/ea/svg/parity/source.rb +59 -0
- data/lib/ea/svg/parity/suite.rb +113 -0
- data/lib/ea/svg/parity.rb +14 -0
- data/lib/ea/svg/stereotype_color_resolver.rb +50 -0
- data/lib/ea/svg.rb +4 -15
- data/lib/ea/theme/definition.rb +176 -0
- data/lib/ea/theme/loader.rb +125 -0
- data/lib/ea/theme/registry.rb +96 -0
- data/lib/ea/theme.rb +37 -0
- data/lib/ea/transformations.rb +5 -88
- data/lib/ea/version.rb +4 -1
- data/lib/ea.rb +14 -4
- data/lib/tasks/svg_bench.rake +87 -0
- data/lutaml-uml-0.5.1.gem +0 -0
- data/reference-docs/enterprise-architect-appearance-dialogs/appearance-1-diagram-1-themes-list.png +0 -0
- data/reference-docs/enterprise-architect-appearance-dialogs/appearance-1-diagram-1-themes.png +0 -0
- data/reference-docs/enterprise-architect-appearance-dialogs/appearance-1-diagram-2-gradients.png +0 -0
- data/reference-docs/enterprise-architect-appearance-dialogs/appearance-1-diagram-3-colors.png +0 -0
- data/reference-docs/enterprise-architect-appearance-dialogs/appearance-1-diagram-4-appearance-fonts.png +0 -0
- data/reference-docs/enterprise-architect-appearance-dialogs/appearance-1-diagram-4-appearance.png +0 -0
- data/reference-docs/enterprise-architect-appearance-dialogs/appearance-1-diagram-5-behavior.png +0 -0
- data/reference-docs/enterprise-architect-appearance-dialogs/appearance-1-diagram-6-sequence.png +0 -0
- data/reference-docs/enterprise-architect-appearance-dialogs/appearance-1-diagram.png +0 -0
- data/reference-docs/enterprise-architect-appearance-dialogs/appearance-2-objects.png +0 -0
- data/reference-docs/enterprise-architect-appearance-dialogs/appearance-3-links.png +0 -0
- metadata +473 -26
- data/lib/ea/diagram/configuration.rb +0 -379
- data/lib/ea/diagram/element_renderers/base_renderer.rb +0 -77
- data/lib/ea/diagram/element_renderers/class_renderer.rb +0 -323
- data/lib/ea/diagram/element_renderers/connector_renderer.rb +0 -41
- data/lib/ea/diagram/element_renderers/package_renderer.rb +0 -61
- data/lib/ea/diagram/element_renderers.rb +0 -43
- data/lib/ea/diagram/extractor.rb +0 -566
- data/lib/ea/diagram/layout_engine.rb +0 -170
- data/lib/ea/diagram/path_builder.rb +0 -202
- data/lib/ea/diagram/style_parser.rb +0 -42
- data/lib/ea/diagram/style_resolver.rb +0 -291
- data/lib/ea/diagram/svg_renderer.rb +0 -274
- data/lib/ea/diagram/util.rb +0 -73
- data/lib/ea/svg/bounds_calculator.rb +0 -74
- data/lib/ea/svg/connector_path.rb +0 -138
- data/lib/ea/svg/element_box.rb +0 -256
- data/lib/ea/svg/renderer.rb +0 -77
- data/lib/ea/svg/style_resolver.rb +0 -72
- data/lib/ea/transformations/configuration.rb +0 -333
- data/lib/ea/transformations/format_registry.rb +0 -366
- data/lib/ea/transformations/parsers/base_parser.rb +0 -482
- data/lib/ea/transformations/parsers/qea_parser.rb +0 -401
- data/lib/ea/transformations/parsers/xmi_parser.rb +0 -243
- data/lib/ea/transformations/transformation_engine.rb +0 -390
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# 70 - Tagged Values Compartment Rendering
|
|
2
|
+
|
|
3
|
+
## Status: COMPLETE (2026-07-26)
|
|
4
|
+
|
|
5
|
+
## What changed
|
|
6
|
+
|
|
7
|
+
1. `lib/ea/sources/xmi/tag_builder.rb` (NEW) — Parses
|
|
8
|
+
`<xmi:Extension>/<elements>/<element>/<tags>/<tag/>` blocks via
|
|
9
|
+
Nokogiri (the xmi gem doesn't expose Sparx tags directly).
|
|
10
|
+
Groups tags by their `modelElement` attribute and strips the
|
|
11
|
+
`#NOTES#...` suffix EA appends to the value attribute.
|
|
12
|
+
|
|
13
|
+
2. `lib/ea/sources/xmi/adapter.rb` — Calls TagBuilder, attaches the
|
|
14
|
+
resulting TaggedValue arrays to the owning Classifier and
|
|
15
|
+
Package objects. Handles the EAPK_↔EAID_ alias for packages.
|
|
16
|
+
|
|
17
|
+
3. `lib/ea/svg/ea_emitter/element/tagged_value_renderer.rb` (NEW) —
|
|
18
|
+
Emits an italic "tags" header followed by `key = value` lines
|
|
19
|
+
for each tagged value, matching EA's encoding.
|
|
20
|
+
|
|
21
|
+
4. `lib/ea/svg/ea_emitter/elements.rb` —
|
|
22
|
+
`groups_for` now invokes `TaggedValueRenderer` when the
|
|
23
|
+
classifier has tagged_values. `CompartmentGeometry` gains
|
|
24
|
+
`tagged_values_count` + `tagged_value_first_y`.
|
|
25
|
+
`has_content_below_header?` now treats tagged values as
|
|
26
|
+
content (so the divider renders).
|
|
27
|
+
|
|
28
|
+
5. `lib/ea/svg/ea_emitter/element.rb` — autoload for
|
|
29
|
+
TaggedValueRenderer.
|
|
30
|
+
|
|
31
|
+
6. `lib/ea/sources/xmi.rb` — autoload for TagBuilder.
|
|
32
|
+
|
|
33
|
+
## Acceptance
|
|
34
|
+
|
|
35
|
+
- AcmeUmlClass in simple.xmi renders the "tags" header plus
|
|
36
|
+
isCollection and noPropertyType lines.
|
|
37
|
+
- Text count on diagrams with tagged classifiers increases
|
|
38
|
+
proportionally.
|
|
39
|
+
- All 2285 specs pass.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# 71 - Auto-Detect Theme from QEA StyleEx via XMI
|
|
2
|
+
|
|
3
|
+
## Status: COMPLETE (2026-07-26)
|
|
4
|
+
|
|
5
|
+
## What changed
|
|
6
|
+
|
|
7
|
+
`lib/ea/sources/xmi/diagram_builder.rb` — `build_one` now reads
|
|
8
|
+
`ext_diagram.style2.value` and assigns it to the Diagram's
|
|
9
|
+
`style_ex` attribute. EA stores StyleEx in the XMI's `<style2>`
|
|
10
|
+
element (alongside Style1 in `<style1>`). The value carries
|
|
11
|
+
`Theme=:119`, `SuppressFOC=1`, `AttPkg=1`, etc. — the same shape
|
|
12
|
+
the Diagram model already parses via `style_ex_flags` and
|
|
13
|
+
`display_config`.
|
|
14
|
+
|
|
15
|
+
This means: diagrams from sample XMI files now auto-resolve Theme
|
|
16
|
+
:119 (Carlito 7pt) without any manual theme setting.
|
|
17
|
+
|
|
18
|
+
## What was wrong before
|
|
19
|
+
|
|
20
|
+
The Xmi adapter was dropping `style2` entirely, so `style_ex` was
|
|
21
|
+
always nil. The Theme system worked correctly given a StyleEx
|
|
22
|
+
string — there was just no code path populating StyleEx from XMI.
|
|
23
|
+
|
|
24
|
+
## Acceptance
|
|
25
|
+
|
|
26
|
+
- simple.xmi "Package Contents" auto-detects Carlito 7pt without
|
|
27
|
+
any manual intervention (previously emitted Calibri 13px).
|
|
28
|
+
- New spec asserts that `diagram.style_ex` includes "Theme=:119"
|
|
29
|
+
and `diagram.theme.font_family` equals "Carlito".
|
|
30
|
+
- All 2286 specs pass.
|
|
31
|
+
|
|
32
|
+
## Why Option A from the original TODO was wrong
|
|
33
|
+
|
|
34
|
+
The original TODO assumed XMI omitted StyleEx and proposed
|
|
35
|
+
heuristic detection from element styles. In reality, XMI DOES
|
|
36
|
+
carry StyleEx via the style2 element — the previous Xmi adapter
|
|
37
|
+
was simply dropping it.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# 72 - Use Sample Exports as Regression Specs
|
|
2
|
+
|
|
3
|
+
## Status: COMPLETE (2026-07-26)
|
|
4
|
+
|
|
5
|
+
## What changed
|
|
6
|
+
|
|
7
|
+
`spec/ea/svg/sample_exports_regression_spec.rb` (NEW) — renders
|
|
8
|
+
every diagram from `examples/exports/*/model.xml` (220 diagrams
|
|
9
|
+
across 5 sample projects) and compares total shape counts
|
|
10
|
+
(rect + polygon + path) against the corresponding reference SVG
|
|
11
|
+
in `examples/exports/*/images/`.
|
|
12
|
+
|
|
13
|
+
Two specs:
|
|
14
|
+
1. "matches reference element counts within tolerance for most
|
|
15
|
+
diagrams" — asserts at least 60% of diagrams are within 20%
|
|
16
|
+
(or 5, whichever is larger) of the reference total.
|
|
17
|
+
2. "renders every diagram without raising" — runs the emitter on
|
|
18
|
+
every diagram and asserts no exceptions.
|
|
19
|
+
|
|
20
|
+
## Current parity (measured by this spec)
|
|
21
|
+
|
|
22
|
+
- 178/220 diagrams within tolerance (81%)
|
|
23
|
+
- 42 diagrams over tolerance (mostly plateau diagrams with 6-18
|
|
24
|
+
element delta)
|
|
25
|
+
|
|
26
|
+
## Why combined rect+polygon+path
|
|
27
|
+
|
|
28
|
+
EA swaps rect↔polygon based on shape type (Classifier=rect,
|
|
29
|
+
Package=polygon). Comparing each shape count independently would
|
|
30
|
+
double-penalize shape-type swaps that are actually correct. The
|
|
31
|
+
combined total reflects "did we emit the right number of shapes?"
|
|
32
|
+
|
|
33
|
+
## Acceptance
|
|
34
|
+
|
|
35
|
+
- Spec covers all 220 sample diagrams.
|
|
36
|
+
- Passes at >60% threshold (currently 81%).
|
|
37
|
+
- Reports first 5 failures when threshold not met.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# 73 - Delete dead Transformations subsystem
|
|
2
|
+
|
|
3
|
+
## Status: COMPLETE (2026-07-26)
|
|
4
|
+
|
|
5
|
+
Removed `lib/ea/transformations/parsers/` (BaseParser, QeaParser,
|
|
6
|
+
XmiParser), `format_registry.rb`, `transformation_engine.rb`,
|
|
7
|
+
`configuration.rb`, plus their specs.
|
|
8
|
+
|
|
9
|
+
Production entry points (`Ea::Transformations.parse` and `.to_uml`)
|
|
10
|
+
already bypassed these wrappers and called `Ea::Qea.load`,
|
|
11
|
+
`Ea::Xmi.load`, and `Ea::Bridge::*` directly. The "engine" layer was
|
|
12
|
+
dead weight that only specs referenced.
|
|
13
|
+
|
|
14
|
+
Slimmed `lib/ea/transformations.rb` from 130 lines to 47.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# 74 - Delete dead Diagram legacy renderers
|
|
2
|
+
|
|
3
|
+
## Status: COMPLETE (2026-07-26)
|
|
4
|
+
|
|
5
|
+
Removed `lib/ea/diagram/{svg_renderer, layout_engine, style_parser,
|
|
6
|
+
path_builder, style_resolver, configuration, util, element_renderers,
|
|
7
|
+
extractor}.rb` plus their specs. These served the legacy
|
|
8
|
+
lutaml-uml-backed rendering pipeline that was already replaced by
|
|
9
|
+
`Ea::Svg::EaEmitter`.
|
|
10
|
+
|
|
11
|
+
Kept:
|
|
12
|
+
- `lib/ea/diagram/display_config.rb` — used by `Ea::Model::Diagram`
|
|
13
|
+
- (extractor moved to modern pipeline; see below)
|
|
14
|
+
|
|
15
|
+
Rewrote `lib/ea/cli/command/diagrams.rb` `extract` action to use
|
|
16
|
+
`Ea::Sources::{Qea,Xmi}::Adapter` + `Ea::Svg::EaEmitter::Document`
|
|
17
|
+
directly, removing its dependency on lutaml-uml/Repository. The
|
|
18
|
+
`list` action now uses the same modern adapters.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# 75 - Visibility legend icons
|
|
2
|
+
|
|
3
|
+
## Status: WONTFIX (2026-07-26)
|
|
4
|
+
|
|
5
|
+
## Original hypothesis
|
|
6
|
+
|
|
7
|
+
101 plateau diagrams were missing 3-4 small 17×17 rects per
|
|
8
|
+
diagram. Originally believed to be auto-generated visibility toggle
|
|
9
|
+
icons that EA emits as a column of color swatches.
|
|
10
|
+
|
|
11
|
+
## Investigation finding
|
|
12
|
+
|
|
13
|
+
The 17×17 rects are actually manually-authored Note element content
|
|
14
|
+
(legend color swatches), not auto-generated UI elements. The Note
|
|
15
|
+
element's body text describes what each color represents (e.g.,
|
|
16
|
+
"GML classes", "CityGML classes"). Implementing this generically
|
|
17
|
+
would require parsing Note element intent, which is diagram-specific.
|
|
18
|
+
|
|
19
|
+
## Resolution
|
|
20
|
+
|
|
21
|
+
Closed as wontfix. The Note element rendering (TODO 78) handles the
|
|
22
|
+
container; the legend swatches inside are user-authored content
|
|
23
|
+
that flows from the Note body via future layout work.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# 76 - Plateau text undershoot investigation
|
|
2
|
+
|
|
3
|
+
## Status: COMPLETE (2026-07-26)
|
|
4
|
+
|
|
5
|
+
## Root cause
|
|
6
|
+
|
|
7
|
+
`DisplayConfig` was mis-mapping `SuppressFOC=1` (suppress foreign
|
|
8
|
+
object content — embedded images/OLE) to "suppress feature
|
|
9
|
+
compartments" (attributes/operations). 60 percent of plateau
|
|
10
|
+
diagrams have `SuppressFOC=1` in their StyleEx, so they were
|
|
11
|
+
rendering without attribute compartments — losing 10-100+ text
|
|
12
|
+
elements per diagram.
|
|
13
|
+
|
|
14
|
+
## Fix
|
|
15
|
+
|
|
16
|
+
Decoupled `show_attributes?` and `show_operations?` from
|
|
17
|
+
`SuppressFOC`. They now correctly check Style1 `HideAtts=1` and
|
|
18
|
+
`HideOps=1` (the actual EA UI flags for hiding compartments).
|
|
19
|
+
|
|
20
|
+
Restructured DisplayConfig to take both Style (style1) and StyleEx
|
|
21
|
+
(style2) since the visibility flags are split across both columns in
|
|
22
|
+
t_diagram.
|
|
23
|
+
|
|
24
|
+
## Impact
|
|
25
|
+
|
|
26
|
+
Sample parity jumped from 178/220 (81 percent) to 193/220
|
|
27
|
+
(88 percent). The biggest single fix in this round.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# 77 - Canvas frame margins and connector Path= semantics
|
|
2
|
+
|
|
3
|
+
## Status: PARTIAL (2026-07-26)
|
|
4
|
+
|
|
5
|
+
## What changed
|
|
6
|
+
|
|
7
|
+
`ConnectorRouter#waypoints` was treating `Path=` values as relative
|
|
8
|
+
deltas from the source point, applying `src_pt + (dx, dy)`. The
|
|
9
|
+
`ExtensionGeometryParser` documentation says (and EA reference SVGs
|
|
10
|
+
confirm) these are ABSOLUTE pixel positions on the canvas.
|
|
11
|
+
|
|
12
|
+
Fixed by using bend points as-is. Plateau diagrams that had
|
|
13
|
+
connector endpoints at x=2700+ (vs element bounds max=1463) now
|
|
14
|
+
route correctly.
|
|
15
|
+
|
|
16
|
+
## What remains
|
|
17
|
+
|
|
18
|
+
The canvas size still doesn't perfectly match the reference — EA
|
|
19
|
+
uses non-uniform frame margins (left=35, right=50, top=60,
|
|
20
|
+
bottom=36) plus a per-diagram "DocSize" override. Our
|
|
21
|
+
BoundsCalculator uses uniform 10px padding plus 20px reserved for
|
|
22
|
+
Package tabs.
|
|
23
|
+
|
|
24
|
+
Closing the remaining gap requires either:
|
|
25
|
+
1. Parsing t_diagram.cx/cy fields for explicit canvas dimensions
|
|
26
|
+
2. Hard-coding EA's non-uniform frame insets per diagram type
|
|
27
|
+
|
|
28
|
+
Deferred until more parity work justifies it.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# 78 - Note element rendering
|
|
2
|
+
|
|
3
|
+
## Status: COMPLETE (2026-07-26)
|
|
4
|
+
|
|
5
|
+
## What changed
|
|
6
|
+
|
|
7
|
+
- New `Ea::Model::Note` class (id, name, body, note_type)
|
|
8
|
+
- New `NoteBuilder` extracts Notes from `<xmi:Extension>/<elements>`
|
|
9
|
+
via `ext_element.type == "uml:Note"`. The note body comes from
|
|
10
|
+
`<properties documentation="..."/>`.
|
|
11
|
+
- `Document` gains a `notes` collection; `index_by_id` includes
|
|
12
|
+
them so diagram element `subject=EAID_...` refs resolve.
|
|
13
|
+
- New `Element::NoteShapeRenderer` emits:
|
|
14
|
+
- Folded-corner polygon (top-right corner cut)
|
|
15
|
+
- Diagonal fold line marking the dog-ear
|
|
16
|
+
- Body text with naive char-count-based word wrap
|
|
17
|
+
- `Elements#render_shape` dispatches to `NoteShapeRenderer` when
|
|
18
|
+
the model element `is_a?(Ea::Model::Note)`.
|
|
19
|
+
|
|
20
|
+
## Acceptance
|
|
21
|
+
|
|
22
|
+
- Plateau document parses 27 Notes (was 0 before).
|
|
23
|
+
- 4 diagrams that place Notes on the canvas now render them.
|
|
24
|
+
- All 1596 specs pass.
|
|
25
|
+
|
|
26
|
+
## Limitations
|
|
27
|
+
|
|
28
|
+
Text wrapping uses character count, not GDI text metrics. EA uses
|
|
29
|
+
the latter for accurate wrap points; matching it would require
|
|
30
|
+
platform-specific font metric tables.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# 79 - Operation compartment text rendering
|
|
2
|
+
|
|
3
|
+
## Status: ANALYZED (2026-07-26)
|
|
4
|
+
|
|
5
|
+
## Current state
|
|
6
|
+
|
|
7
|
+
`OperationRenderer` exists and emits operation signatures as text
|
|
8
|
+
lines. `Elements#groups_for` invokes it when the classifier has
|
|
9
|
+
operations AND `show_operations?` is true.
|
|
10
|
+
|
|
11
|
+
The Plateau parity failures showed large text over-rendering
|
|
12
|
+
(+68 on Tunnel diagram). Investigation revealed:
|
|
13
|
+
|
|
14
|
+
1. We render `«DataType»` stereotype labels for every classifier
|
|
15
|
+
with a stereotype — ref SVGs only show stereotypes for some.
|
|
16
|
+
2. We render the `tags` compartment + tagged value lines for every
|
|
17
|
+
classifier with tagged values — ref only shows them on 2/220
|
|
18
|
+
diagrams.
|
|
19
|
+
|
|
20
|
+
Both are visibility rule gaps, not Operation-specific bugs. The
|
|
21
|
+
OperationRenderer itself works correctly when invoked.
|
|
22
|
+
|
|
23
|
+
## Why deferred
|
|
24
|
+
|
|
25
|
+
The actual rendering is correct; the gap is in WHEN to render.
|
|
26
|
+
Closing it requires understanding EA's stereotype-tagged-value
|
|
27
|
+
visibility rule (TODO 80).
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# 80 - Tagged value and stereotype visibility rules
|
|
2
|
+
|
|
3
|
+
## Status: TODO
|
|
4
|
+
|
|
5
|
+
## Context
|
|
6
|
+
|
|
7
|
+
Only 2 of 220 reference SVGs in `examples/exports/` render a
|
|
8
|
+
"tags" header compartment, even though most plateau elements have
|
|
9
|
+
`Tag=1` in their per-element style and most classifiers have
|
|
10
|
+
tagged values from stereotype applications.
|
|
11
|
+
|
|
12
|
+
Likewise, the simple.xmi "Package A.1.1" reference shows
|
|
13
|
+
`«DataType»` for AcmeUmlClass, but the plateau Tunnel reference
|
|
14
|
+
does NOT show `«DataType»` for classifiers that also have
|
|
15
|
+
`stereotype="DataType"`.
|
|
16
|
+
|
|
17
|
+
## What needs to change
|
|
18
|
+
|
|
19
|
+
1. **Tagged value visibility rule**: Determine when EA actually
|
|
20
|
+
renders the tags compartment. Likely factors:
|
|
21
|
+
- Stereotype source (profile-applied vs user-defined tagged values)
|
|
22
|
+
- Element style `Tag=` flag semantics (currently parsed but unused)
|
|
23
|
+
- Diagram Style1 `ShowTags=` flag interaction
|
|
24
|
+
|
|
25
|
+
2. **Stereotype label visibility rule**: Determine when EA renders
|
|
26
|
+
the `«Stereotype»` label. Hypotheses to verify:
|
|
27
|
+
- Ref SVGs show stereotypes only when the classifier is NOT
|
|
28
|
+
a "primitive" type or abstract base
|
|
29
|
+
- Show stereotypes only when they come from a non-default profile
|
|
30
|
+
- Show only when `HideElemStereo=0` AND the element is in a
|
|
31
|
+
specific diagram type
|
|
32
|
+
|
|
33
|
+
## Acceptance
|
|
34
|
+
|
|
35
|
+
- Visibility rules documented with concrete EA behavior citations
|
|
36
|
+
- Implementation gates tagged value + stereotype rendering
|
|
37
|
+
- Sample parity improves from 88 percent toward 95 percent+
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# 81 - Figure parity current state and roadmap
|
|
2
|
+
|
|
3
|
+
## Status: LIVING DOCUMENT (2026-07-26)
|
|
4
|
+
|
|
5
|
+
## Where we are
|
|
6
|
+
|
|
7
|
+
- **193/220 sample diagrams (88%)** render within shape-count
|
|
8
|
+
tolerance of EA's reference SVGs.
|
|
9
|
+
- **1596 specs, all passing.**
|
|
10
|
+
- **Major code cleanup**: removed 695 legacy spec examples and
|
|
11
|
+
~3000 lines of dead production code (Transformations engine,
|
|
12
|
+
Diagram legacy renderers).
|
|
13
|
+
|
|
14
|
+
## What's working
|
|
15
|
+
|
|
16
|
+
- Theme system auto-detects Theme=:119 (Carlito 7pt) from XMI
|
|
17
|
+
style2 attribute.
|
|
18
|
+
- DisplayConfig correctly reads HideAtts/HideOps (Style1) and
|
|
19
|
+
SuppressFOC/AttPub (StyleEx) as separate concerns.
|
|
20
|
+
- Packages render as polygon body+tab (matching EA folder shape).
|
|
21
|
+
- Notes render as folded-corner rect with body text.
|
|
22
|
+
- Tagged values render when classifier has them.
|
|
23
|
+
- Connector Path= coordinates treated as absolute (matching EA
|
|
24
|
+
reference SVG geometry).
|
|
25
|
+
- Per-element Tag flag, EAPK↔EAID alias for package lookups,
|
|
26
|
+
frame border+tab always rendered.
|
|
27
|
+
|
|
28
|
+
## What's still off (and where the 12% gap lives)
|
|
29
|
+
|
|
30
|
+
### 1. Stereotype label visibility (TODO 80)
|
|
31
|
+
We render `«DataType»` for every classifier with a stereotype,
|
|
32
|
+
but reference SVGs only render some. The rule appears to be
|
|
33
|
+
profile-specific (GML stereotypes shown, others hidden) but not
|
|
34
|
+
yet characterized.
|
|
35
|
+
|
|
36
|
+
### 2. Tagged value visibility (TODO 80)
|
|
37
|
+
Only 2/220 reference diagrams show the "tags" compartment, but
|
|
38
|
+
we render it on every classifier with tagged values. Likely
|
|
39
|
+
tied to the same stereotype visibility rule.
|
|
40
|
+
|
|
41
|
+
### 3. Canvas size non-parity (TODO 77)
|
|
42
|
+
Our canvas is ~40px narrower and ~26px shorter than reference
|
|
43
|
+
due to non-uniform EA frame margins (left=35, right=50, top=60,
|
|
44
|
+
bottom=36). Functional but visually offset.
|
|
45
|
+
|
|
46
|
+
### 4. Visibility toggle icons (TODO 75 — wontfix)
|
|
47
|
+
3-4 small 17×17 colored rects appear on a few diagrams as
|
|
48
|
+
manually-authored Note element legend content. Not a generic
|
|
49
|
+
feature; closed as wontfix.
|
|
50
|
+
|
|
51
|
+
## Next high-value investigations
|
|
52
|
+
|
|
53
|
+
1. **Compare ref SVGs element-by-element** to characterize the
|
|
54
|
+
stereotype visibility rule. Likely factors: element style
|
|
55
|
+
`Tag=`, HideElemStereo, stereotype FQName prefix.
|
|
56
|
+
|
|
57
|
+
2. **Parse t_diagram.cx/cy** (canvas dimensions stored in QEA,
|
|
58
|
+
lost in XMI export) for exact canvas sizing. XMI uses DocSize
|
|
59
|
+
which is paper-size, not pixel-canvas.
|
|
60
|
+
|
|
61
|
+
3. **Wire QEA loader to skip XMI** — parsing QEA directly gives
|
|
62
|
+
StyleEx, exact element positions, and tagged value scopes
|
|
63
|
+
that the XMI export loses.
|