45 lines
1.3 KiB
Python
45 lines
1.3 KiB
Python
|
|
import re
|
||
|
|
|
||
|
|
snap = '''- heading "Welcome" [level=1, ref=e3]
|
||
|
|
- textbox "Username" [required, ref=e9]
|
||
|
|
- link "Forgot Your Username?" [ref=e4]
|
||
|
|
- button "Next" [ref=e7]
|
||
|
|
- region "SARS AI Assistant Chat" [ref=e1]
|
||
|
|
- button "Open SARS AI Assistant Chat" [expanded=false, ref=e2]'''
|
||
|
|
|
||
|
|
def find_ref(snap, role, name=None):
|
||
|
|
if name is None:
|
||
|
|
pattern = rf"\b{re.escape(role)}\b[^\n]*?[,]?\s*ref=(e\d+)\]"
|
||
|
|
else:
|
||
|
|
pattern = (
|
||
|
|
rf"\b{re.escape(role)}\b[^\n]*?['\"]({re.escape(name)})['\"][^\n]*?"
|
||
|
|
rf"[,]?\s*ref=(e\d+)\]"
|
||
|
|
)
|
||
|
|
m = re.search(pattern, snap, re.MULTILINE)
|
||
|
|
if m:
|
||
|
|
return m.group(2) if m.lastindex and m.lastindex >= 2 else m.group(1)
|
||
|
|
return None
|
||
|
|
|
||
|
|
# Test all
|
||
|
|
cases = [
|
||
|
|
('textbox', 'Username', 'e9'),
|
||
|
|
('button', 'Next', 'e7'),
|
||
|
|
('link', 'Forgot Your Username?', 'e4'),
|
||
|
|
('heading', 'Welcome', 'e3'),
|
||
|
|
('region', 'SARS AI Assistant Chat', 'e1'),
|
||
|
|
('button', 'Open SARS AI Assistant Chat', 'e2'),
|
||
|
|
(None, 'e9'), # role-only
|
||
|
|
]
|
||
|
|
|
||
|
|
for c in cases:
|
||
|
|
if c[0] is None:
|
||
|
|
continue
|
||
|
|
role, name, want = c
|
||
|
|
got = find_ref(snap, role, name)
|
||
|
|
ok = 'OK' if got == want else 'FAIL'
|
||
|
|
print(f'{ok} find_ref({role!r}, {name!r}) = {got!r} (want {want!r})')
|
||
|
|
|
||
|
|
# Role-only
|
||
|
|
got = find_ref(snap, 'button', 'Next') # works
|
||
|
|
print('role+name:', got)
|