Skip to content

ADFA-3736 | Ignore canvas metadata and fix attribute parsing#1241

Open
jatezzz wants to merge 2 commits intostagefrom
fix/ADFA-3736-ignore-canvas-metadata-experimental
Open

ADFA-3736 | Ignore canvas metadata and fix attribute parsing#1241
jatezzz wants to merge 2 commits intostagefrom
fix/ADFA-3736-ignore-canvas-metadata-experimental

Conversation

@jatezzz
Copy link
Copy Markdown
Collaborator

@jatezzz jatezzz commented Apr 24, 2026

Description

This PR fixes an issue where margin and layout metadata present in the canvas areas were being incorrectly detected as text and included in the generated XML code, causing attribute mix-ups. It introduces a METADATA_KEYWORDS list to actively filter out these layout properties and updates the regex and validation logic to correctly parse widget tags and array attributes.

Details

Logic updates only. YOLO text detections matching canvas metadata (e.g., layout_width, match_parent, wrap_content) are now successfully filtered out in YoloToXmlConverter.

document_5141153794083523807.mp4

Ticket

ADFA-3736

Observation

In addition to the metadata filtering, AttributeValidator was updated to more aggressively strip various enclosing bracket types (e.g., (, {, <) before standardizing the final string array output to use square brackets [ ]. android:background and app:backgroundTint were also added as pass-through validators in WidgetGrammar.

@jatezzz jatezzz requested review from a team, Daniel-ADFA and avestaadfa April 24, 2026 15:07
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 24, 2026

📝 Walkthrough

Release Notes - ADFA-3736: Canvas Metadata Filtering & Attribute Parsing

Features

  • Canvas metadata filtering: Non-YOLO text detections containing canvas layout keywords (layout_width, layout_height, match_parent, wrap_content) are now excluded from XML generation to prevent layout metadata from being misinterpreted as content
  • Enhanced tag parsing: Updated regex pattern in WidgetAnnotationMatcher to support tag text with additional content trailing the digit/ordinal portion
  • Improved attribute normalization: EntriesValidator now aggressively strips enclosing bracket-like delimiters ([, (, {, <) and always returns standardized square-bracket-wrapped format for consistency
  • Additional ImageView validators: Added support for android:background and app:backgroundTint style properties in ImageViewGrammar using pass-through validation
  • Simplified margin annotation parsing: Explicit margin blocks with extracted tags are now unconditionally added to annotation map without membership validation

Risks & Best Practice Violations

  • ⚠️ Substring matching for metadata detection: The isCanvasMetadata() method uses case-insensitive .contains() matching against hardcoded keywords, which could produce false positives if legitimate text contains these keywords (e.g., "layout_width" appearing in user-visible content)
  • ⚠️ Limited metadata keyword coverage: Only 4 layout-related keywords are defined; other potential metadata values may not be filtered, requiring future maintenance
  • ⚠️ Removed validation check: MarginAnnotationParser no longer validates explicit blocks against canvasTags membership before adding to annotation map, potentially allowing unintended blocks to be included
  • ⚠️ Aggressive bracket stripping: EntriesValidator now strips any opening [({< at the start and closing )}]> at the end regardless of actual structure, which could corrupt legitimate attribute values containing these characters
  • ⚠️ Hardcoded configuration: Metadata keywords list is embedded in code without externalization, making future updates require code changes

Testing Recommendations

  • Validate that legitimate text containing "layout", "width", "match", or "wrap" keywords is not incorrectly filtered
  • Test edge cases with nested brackets or mixed bracket types in attribute values
  • Verify margin annotation behavior with canvas layouts containing explicit tags
  • Confirm ImageView background attributes render correctly in generated XML

Walkthrough

Six domain-layer files updated: margin annotation now unconditionally records explicit-tag blocks; tag extraction regex broadened; UI-candidate selection filters canvas metadata; entries validator always normalizes bracketed lists; ImageView grammar accepts two new attributes; TextCleaner gains canvas-metadata detection.

Changes

Cohort / File(s) Summary
Annotation & Matching
cv-image-to-xml/.../MarginAnnotationParser.kt, cv-image-to-xml/.../WidgetAnnotationMatcher.kt
Always add explicit margin blocks with extracted tags to the annotation map (remove canvasTags membership check); broaden tag-extraction regex to allow optional trailing suffix after ordinal/digit capture.
UI Candidate Filtering
cv-image-to-xml/.../YoloToXmlConverter.kt
Narrow uiCandidates by excluding non-YOLO detections whose text matches canvas metadata via TextCleaner.isCanvasMetadata.
Validation & Grammar
cv-image-to-xml/.../grammar/AttributeValidator.kt, cv-image-to-xml/.../grammar/WidgetGrammar.kt
EntriesValidator.validate now strips surrounding bracket-like delimiters and always returns a bracketed, comma-separated value; ImageViewGrammar adds android:background and app:backgroundTint entries validated by PassThroughValidator.
Utilities
cv-image-to-xml/.../utils/TextCleaner.kt
Add fun isCanvasMetadata(text: String): Boolean that detects canvas-related metadata via case-insensitive keyword matching.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested reviewers

  • avestaadfa
  • Daniel-ADFA

Poem

🐰 I nibbled at tags by moonlight's glow,
Brackets straightened in a tidy row,
Metadata chased from canvas fields,
Margins marked where order yields,
Hooray—now XML hops to and fro!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely summarizes the main changes: ignoring canvas metadata and fixing attribute parsing.
Description check ✅ Passed The description is well-detailed and directly related to the changeset, explaining the problem, solution, and specific logic updates.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/ADFA-3736-ignore-canvas-metadata-experimental

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/domain/WidgetAnnotationMatcher.kt (1)

74-85: ⚠️ Potential issue | 🔴 Critical

The metadata filtering does not protect against tag misclassification at line 44.

Line 44 extracts widgetTags from the original unfiltered detections list using isTag(), while metadata filtering via TextCleaner.isCanvasMetadata() is only applied to uiCandidates (line 25). This means canvas metadata strings that happen to start with a tag letter + digit (e.g., "B 1 layout_width", "C 3 wrap_content") can pass the isTag() check—because normalizeTagText("B 1 layout_width") returns "B-1"—and incorrectly be classified as widget tags. The metadata filter should also be applied when extracting widgetTags from the original detections, or widgetTags should be filtered to exclude metadata after extraction.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/domain/WidgetAnnotationMatcher.kt`
around lines 74 - 85, The widget tag extraction currently uses isTag() on the
raw detections, allowing canvas metadata (e.g., "B 1 layout_width") to be
misclassified; update the extraction to apply the same metadata filter used for
uiCandidates—use TextCleaner.isCanvasMetadata(...) to skip metadata strings when
building widgetTags from detections or, after computing widgetTags, filter out
any entries where TextCleaner.isCanvasMetadata(originalDetection) is true;
ensure the change touches the code that builds widgetTags and preserves use of
normalizeTagText/isTag for validation.
cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/domain/grammar/AttributeValidator.kt (1)

56-80: ⚠️ Potential issue | 🟠 Major

Behavior change causes silent data loss: [...] array format generated by validator is discarded by parseStringArray downstream.

The validator now returns "[$finalString]" for all non-@resource inputs, but parseStringArray() in basicParseUtils.kt does not parse this format. The function only handles @reference strings or empty inputs; for any other string (including "[red]" or "[]"), it returns the default emptyArray(). This means OCR'd literals like red become [red], then silently convert to empty arrays downstream instead of being validated as text entries. For genuinely empty inputs, [] will also become empty arrays—but if the goal is to represent empty entry arrays with a canonical format, the current approach loses that distinction. Either: (1) modify parseStringArray() to actually parse the [...] format, or (2) return null from the validator when the result would be empty so the attribute is omitted entirely.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/domain/grammar/AttributeValidator.kt`
around lines 56 - 80, The validator now emits bracketed arrays
(AttributeValidator.validate) but parseStringArray in basicParseUtils.kt doesn't
handle that format, causing silent data loss; update parseStringArray to detect
strings that start with "[" and end with "]", strip the brackets, split on
commas (respecting trimming and empty cases), return an array of the trimmed
items (empty array for "[]"), and still continue to support the existing
`@reference` and empty-input behavior so bracketed values like "[red]" are parsed
correctly instead of being dropped.
🧹 Nitpick comments (4)
cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/domain/WidgetAnnotationMatcher.kt (1)

8-8: Nit: make the trailing-suffix group non-capturing.

normalizeTagText only reads groupValues[1] and groupValues[2]; the new third group (.+) is captured but never used. Switching it to a non-capturing group communicates intent (we only want to tolerate/discard OCR noise after the ordinal) and avoids allocating the extra match group.

♻️ Proposed tweak
-        private val TAG_EXTRACT_REGEX = Regex("^(?i)(SW|S\\s*8|8\\s*W|[BPDTCRS8]\\s*W?)[^a-zA-Z0-9]*([\\dlIoO!]+)(?:\\s+(.+))?$")
+        private val TAG_EXTRACT_REGEX = Regex("^(?i)(SW|S\\s*8|8\\s*W|[BPDTCRS8]\\s*W?)[^a-zA-Z0-9]*([\\dlIoO!]+)(?:\\s+.+)?$")
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/domain/WidgetAnnotationMatcher.kt`
at line 8, The TAG_EXTRACT_REGEX currently captures a trailing suffix with a
third group "(.+)" even though normalizeTagText only uses groupValues[1] and
groupValues[2]; change that trailing group to non-capturing (?:.+) so the regex
still tolerates/discards OCR noise but doesn't allocate an unused capture.
Update the Regex literal assigned to TAG_EXTRACT_REGEX in
WidgetAnnotationMatcher (and ensure normalizeTagText remains unchanged).
cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/utils/TextCleaner.kt (2)

37-40: Optional: use ignoreCase flag to avoid the lowercase allocation.

String.contains accepts an ignoreCase parameter, which avoids allocating a lowercased copy of text for each call. On hot paths (YOLO detections can be numerous), this is a small but free win.

🔧 Suggested change
     fun isCanvasMetadata(text: String): Boolean {
-        val lowerText = text.lowercase()
-        return METADATA_KEYWORDS.any { keyword -> lowerText.contains(keyword) }
+        return METADATA_KEYWORDS.any { keyword -> text.contains(keyword, ignoreCase = true) }
     }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/utils/TextCleaner.kt`
around lines 37 - 40, The isCanvasMetadata function currently allocates a
lowercase copy of text before checking keywords; change the check to call
lowerText.contains(keyword) replacement by using text.contains(keyword,
ignoreCase = true) inside the METADATA_KEYWORDS.any lambda so you avoid the
lowercase allocation. Locate isCanvasMetadata and METADATA_KEYWORDS in
TextCleaner.kt and update the predicate to use String.contains with ignoreCase
rather than creating lowerText.

6-11: Minor: naming convention inconsistency.

The existing private val nonAlphanumericRegex uses camelCase, while the new METADATA_KEYWORDS uses UPPER_SNAKE_CASE. Both are private val properties on the same object, so consider picking one style for consistency (Kotlin conventions allow UPPER_SNAKE_CASE for const val / compile-time constants; for runtime vals, camelCase is typical).

🔧 Suggested change
-    private val METADATA_KEYWORDS = listOf(
+    private val metadataKeywords = listOf(
         "layout_width",
         "layout_height",
         "match_parent",
         "wrap_content"
     )

(and update the reference in isCanvasMetadata accordingly)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/utils/TextCleaner.kt`
around lines 6 - 11, Rename METADATA_KEYWORDS to follow the same camelCase style
as nonAlphanumericRegex (e.g., metadataKeywords) since it's a private runtime
val, and update any usages such as in isCanvasMetadata to reference the new
name; ensure you only change the identifier (not the list contents) so behavior
remains the same.
cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/domain/grammar/WidgetGrammar.kt (1)

29-30: Consider centralizing common View attributes.

android:background and app:backgroundTint are inherited by every View subclass, so as more widget grammars need them you'll end up duplicating these entries in each grammar object. Consider extracting a shared commonViewAttributes: Map<String, AttributeValidator> and merging it into each widget's attributes map to avoid drift.

private val commonViewAttributes = mapOf(
    "android:background" to PassThroughValidator,
    "app:backgroundTint" to PassThroughValidator,
    // ...layout_width/height, id, etc.
)

Not blocking for this PR; just flagging for the next iteration.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/domain/grammar/WidgetGrammar.kt`
around lines 29 - 30, The android:background and app:backgroundTint entries are
duplicated across widget grammars; extract those shared keys into a single
reusable Map (e.g., private val commonViewAttributes) and merge it into each
widget's attributes map when building grammar objects (merge
commonViewAttributes with each widget's specific attributes in the widget
grammar initializers), ensuring keys like "android:background" and
"app:backgroundTint" are removed from individual maps and referenced only via
commonViewAttributes.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In
`@cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/domain/grammar/AttributeValidator.kt`:
- Around line 60-63: The trailing-character class in the content normalization
(in AttributeValidator -> the content = trimmed... chain using
Regex("[)}\\]>7]$")) incorrectly removes the digit '7'; remove '7' from that
character class and instead perform a targeted OCR-fix step: add a separate
normalization before trimming that only replaces a trailing '7' when it clearly
looks like an OCR artifact (e.g., when the char before it is a non-digit or when
a matching opening delimiter was present), so update the Regex call used to
strip closing delimiters to Regex("[)}\\]>]$") and implement a conditional
replacement for stray trailing '7' tied to that artifact detection within the
same method so EntriesValidator and other callers retain legitimate numeric
digits.

---

Outside diff comments:
In
`@cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/domain/grammar/AttributeValidator.kt`:
- Around line 56-80: The validator now emits bracketed arrays
(AttributeValidator.validate) but parseStringArray in basicParseUtils.kt doesn't
handle that format, causing silent data loss; update parseStringArray to detect
strings that start with "[" and end with "]", strip the brackets, split on
commas (respecting trimming and empty cases), return an array of the trimmed
items (empty array for "[]"), and still continue to support the existing
`@reference` and empty-input behavior so bracketed values like "[red]" are parsed
correctly instead of being dropped.

In
`@cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/domain/WidgetAnnotationMatcher.kt`:
- Around line 74-85: The widget tag extraction currently uses isTag() on the raw
detections, allowing canvas metadata (e.g., "B 1 layout_width") to be
misclassified; update the extraction to apply the same metadata filter used for
uiCandidates—use TextCleaner.isCanvasMetadata(...) to skip metadata strings when
building widgetTags from detections or, after computing widgetTags, filter out
any entries where TextCleaner.isCanvasMetadata(originalDetection) is true;
ensure the change touches the code that builds widgetTags and preserves use of
normalizeTagText/isTag for validation.

---

Nitpick comments:
In
`@cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/domain/grammar/WidgetGrammar.kt`:
- Around line 29-30: The android:background and app:backgroundTint entries are
duplicated across widget grammars; extract those shared keys into a single
reusable Map (e.g., private val commonViewAttributes) and merge it into each
widget's attributes map when building grammar objects (merge
commonViewAttributes with each widget's specific attributes in the widget
grammar initializers), ensuring keys like "android:background" and
"app:backgroundTint" are removed from individual maps and referenced only via
commonViewAttributes.

In
`@cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/domain/WidgetAnnotationMatcher.kt`:
- Line 8: The TAG_EXTRACT_REGEX currently captures a trailing suffix with a
third group "(.+)" even though normalizeTagText only uses groupValues[1] and
groupValues[2]; change that trailing group to non-capturing (?:.+) so the regex
still tolerates/discards OCR noise but doesn't allocate an unused capture.
Update the Regex literal assigned to TAG_EXTRACT_REGEX in
WidgetAnnotationMatcher (and ensure normalizeTagText remains unchanged).

In
`@cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/utils/TextCleaner.kt`:
- Around line 37-40: The isCanvasMetadata function currently allocates a
lowercase copy of text before checking keywords; change the check to call
lowerText.contains(keyword) replacement by using text.contains(keyword,
ignoreCase = true) inside the METADATA_KEYWORDS.any lambda so you avoid the
lowercase allocation. Locate isCanvasMetadata and METADATA_KEYWORDS in
TextCleaner.kt and update the predicate to use String.contains with ignoreCase
rather than creating lowerText.
- Around line 6-11: Rename METADATA_KEYWORDS to follow the same camelCase style
as nonAlphanumericRegex (e.g., metadataKeywords) since it's a private runtime
val, and update any usages such as in isCanvasMetadata to reference the new
name; ensure you only change the identifier (not the list contents) so behavior
remains the same.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 1393e72a-75ce-4692-9c2e-6bd6c7e221a7

📥 Commits

Reviewing files that changed from the base of the PR and between 88d2f4a and ba4ecbf.

📒 Files selected for processing (6)
  • cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/domain/MarginAnnotationParser.kt
  • cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/domain/WidgetAnnotationMatcher.kt
  • cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/domain/YoloToXmlConverter.kt
  • cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/domain/grammar/AttributeValidator.kt
  • cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/domain/grammar/WidgetGrammar.kt
  • cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/utils/TextCleaner.kt

Copy link
Copy Markdown
Contributor

@Daniel-ADFA Daniel-ADFA left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, but please check code rabbits comment.

@jatezzz jatezzz force-pushed the fix/ADFA-3736-ignore-canvas-metadata-experimental branch from d86d1db to fee9d2f Compare April 24, 2026 17:59
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/domain/WidgetAnnotationMatcher.kt (1)

8-8: Optional: make the trailing segment non-capturing.

The broader regex is fine and aligns with MarginAnnotationParser.extractTag's pattern. However, group 3 ((.+)) is never consumed by normalizeTagText — only groupValues[1] and groupValues[2] are used at lines 78–82. You can drop the capture to make intent explicit and avoid giving future readers the impression that trailing text is retained:

♻️ Proposed tweak
-        private val TAG_EXTRACT_REGEX = Regex("^(?i)(SW|S\\s*8|8\\s*W|[BPDTCRS8]\\s*W?)[^a-zA-Z0-9]*([\\dlIoO!]+)(?:\\s+(.+))?$")
+        private val TAG_EXTRACT_REGEX = Regex("^(?i)(SW|S\\s*8|8\\s*W|[BPDTCRS8]\\s*W?)[^a-zA-Z0-9]*([\\dlIoO!]+)(?:\\s+.+)?$")
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/domain/WidgetAnnotationMatcher.kt`
at line 8, Change TAG_EXTRACT_REGEX to make the trailing segment non-capturing
since normalizeTagText only uses the first two capture groups; update the regex
in the WidgetAnnotationMatcher.kt declaration (TAG_EXTRACT_REGEX) to replace the
third capture group "(.+)" with a non-capturing group "(?:.+)" so the pattern
still matches trailing text but does not create an unused capture, keeping
behavior consistent with MarginAnnotationParser.extractTag and the uses of
groupValues[1] and groupValues[2] in normalizeTagText.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In
`@cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/domain/WidgetAnnotationMatcher.kt`:
- Line 8: Change TAG_EXTRACT_REGEX to make the trailing segment non-capturing
since normalizeTagText only uses the first two capture groups; update the regex
in the WidgetAnnotationMatcher.kt declaration (TAG_EXTRACT_REGEX) to replace the
third capture group "(.+)" with a non-capturing group "(?:.+)" so the pattern
still matches trailing text but does not create an unused capture, keeping
behavior consistent with MarginAnnotationParser.extractTag and the uses of
groupValues[1] and groupValues[2] in normalizeTagText.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 6081ff6c-a68c-4cb7-b30f-915c64417e6a

📥 Commits

Reviewing files that changed from the base of the PR and between ba4ecbf and fee9d2f.

📒 Files selected for processing (6)
  • cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/domain/MarginAnnotationParser.kt
  • cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/domain/WidgetAnnotationMatcher.kt
  • cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/domain/YoloToXmlConverter.kt
  • cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/domain/grammar/AttributeValidator.kt
  • cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/domain/grammar/WidgetGrammar.kt
  • cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/utils/TextCleaner.kt
✅ Files skipped from review due to trivial changes (2)
  • cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/utils/TextCleaner.kt
  • cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/domain/grammar/WidgetGrammar.kt
🚧 Files skipped from review as they are similar to previous changes (2)
  • cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/domain/YoloToXmlConverter.kt
  • cv-image-to-xml/src/main/java/org/appdevforall/codeonthego/computervision/domain/grammar/AttributeValidator.kt

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants