robotframework-apex 0.0.0__py3-none-any.whl

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.
@@ -0,0 +1,928 @@
1
+ from parsimonious import Grammar, NodeVisitor
2
+ from BrowserApex.cli.apex import *
3
+ from importlib import resources as impresources
4
+ from BrowserApex.cli import apex
5
+ from pathlib import Path
6
+
7
+
8
+ class RuleNotImplemented(BaseException):
9
+ pass
10
+
11
+
12
+ class ApxNodeVisitor(NodeVisitor):
13
+ def visit_page_object(self, node, visited_children):
14
+ """ Gets the section name. """
15
+ component_id = visited_children[1]
16
+ body_parts = visited_children[4]
17
+ if type(component_id) is list:
18
+ component_id = component_id[0][1]
19
+ else:
20
+ component_id = None
21
+
22
+ page = Page(component_id)
23
+ for item in body_parts:
24
+ if type(item) is tuple:
25
+ if type(item[1]) is dict:
26
+ page.add_group(item[0], item[1])
27
+ else:
28
+ page.add_property(item[0], item[1])
29
+ elif isinstance(item, ApexObject):
30
+ page.add_child(item)
31
+ elif item is None:
32
+ continue
33
+ else:
34
+ raise RuleNotImplemented(f"unprocessed: {item}")
35
+ return page
36
+
37
+ def visit_component_id(self, node, visited_children):
38
+ return node.text
39
+
40
+ def visit_page_body_line(self, node, visited_children):
41
+ return visited_children[0]
42
+
43
+ def visit_page_group_block(self, node, visited_children):
44
+ return visited_children[0]
45
+
46
+ def visit_page_child_component(self, node, visited_children):
47
+ return visited_children[0]
48
+
49
+
50
+ def visit_page_direct_property_line(self, node, visited_children):
51
+ return visited_children[1]
52
+
53
+ def visit_page_direct_property(self, node, visited_children):
54
+ v = visited_children[0]
55
+ title, _, _, value = v
56
+ return (title.text, value)
57
+
58
+
59
+ def visit_page_appearance(self, node, visited_children):
60
+ parts = visited_children[5]
61
+ d = {}
62
+ for item in parts:
63
+ if type(item) is tuple:
64
+ d[item[0]] = item[1]
65
+ else:
66
+ raise RuleNotImplemented()
67
+ return ('appearance', d)
68
+
69
+ def visit_page_appearance_property_line(self, node, visited_children):
70
+ return visited_children[1]
71
+
72
+ def visit_page_appearance_property(self, node, visited_children):
73
+ v = visited_children[0]
74
+ return (v[0].text, v[3])
75
+
76
+
77
+ def visit_page_navigation(self, node, visited_children):
78
+ parts = visited_children[5]
79
+ d = {}
80
+ for item in parts:
81
+ if type(item) is tuple:
82
+ d[item[0]] = item[1]
83
+ else:
84
+ raise RuleNotImplemented()
85
+ return ('navigation', d)
86
+
87
+ def visit_page_navigation_property_line(self, node, visited_children):
88
+ return visited_children[1]
89
+
90
+ def visit_page_navigation_property(self, node, visited_children):
91
+ v = visited_children[0]
92
+ match v[0].text:
93
+ case 'cursorFocus':
94
+ return (v[0].text, v[3][0].text)
95
+ case 'warnOnUnsavedChanges':
96
+ return (v[0].text, v[3])
97
+
98
+
99
+ def visit_page_css(self, node, visited_children):
100
+ parts = visited_children[5]
101
+ d = {}
102
+ for item in parts:
103
+ if type(item) is tuple:
104
+ d[item[0]] = item[1]
105
+ else:
106
+ raise RuleNotImplemented()
107
+ return ('css', d)
108
+
109
+ def visit_page_css_property_line(self, node, visited_children):
110
+ return visited_children[1]
111
+
112
+
113
+ def visit_page_css_property(self, node, visited_children):
114
+ v = visited_children[0]
115
+ match v[0].text:
116
+ case 'inline':
117
+ return (v[0].text, v[-1])
118
+ case 'fileUrls':
119
+ return (v[0].text, v[3])
120
+
121
+ def visit_page_security(self, node, visited_children):
122
+ parts = visited_children[5]
123
+ d = {}
124
+ for item in parts:
125
+ if type(item) is tuple:
126
+ d[item[0]] = item[1]
127
+ else:
128
+ raise RuleNotImplemented()
129
+ return ('security', d)
130
+
131
+ def visit_page_security_property_line(self, node, visited_children):
132
+ return visited_children[1]
133
+
134
+
135
+ def visit_page_security_property(self, node, visited_children):
136
+ v = visited_children[0]
137
+ match v[0].text:
138
+ case 'authentication' | 'pageAccessProtection':
139
+ return (v[0].text, v[3][0].text)
140
+ case 'formAutoComplete':
141
+ return (v[0].text, v[3])
142
+ case _:
143
+ raise RuleNotImplemented()
144
+
145
+ def visit_page_advanced(self, node, visited_children):
146
+ parts = visited_children[5]
147
+ d = {}
148
+ for item in parts:
149
+ if type(item) is tuple:
150
+ d[item[0]] = item[1]
151
+ else:
152
+ raise RuleNotImplemented()
153
+ return ('advanced', d)
154
+
155
+ def visit_page_advanced_property_line(self, node, visited_children):
156
+ return visited_children[1]
157
+
158
+
159
+ def visit_page_advanced_property(self, node, visited_children):
160
+ v = visited_children[0]
161
+ match v[0].text:
162
+ case 'reloadOnSubmit' | 'duplicateSubmissionUrl':
163
+ return (v[0].text, v[3][0].text)
164
+ case 'enableMetaTags' | 'enableDuplicatePageSubmissions':
165
+ return (v[0].text, v[3])
166
+ case _:
167
+ raise RuleNotImplemented()
168
+
169
+
170
+ def visit_region(self, node, visited_children):
171
+ component_id = visited_children[2]
172
+ body_parts = visited_children[6]
173
+ if type(component_id) is list:
174
+ component_id = component_id[0][1]
175
+ else:
176
+ component_id = None
177
+
178
+ region = Region(component_id)
179
+ for item in body_parts:
180
+ if type(item) is tuple:
181
+ if type(item[1]) is dict:
182
+ region.add_group(item[0], item[1])
183
+ else:
184
+ region.add_property(item[0], item[1])
185
+ else:
186
+ raise RuleNotImplemented(f"unprocessed: {item}")
187
+ return region
188
+
189
+ def visit_region_body_line(self, node, visited_children):
190
+ return visited_children[0]
191
+
192
+ def visit_region_direct_property_line(self, node, visited_children):
193
+ return visited_children[1]
194
+
195
+ def visit_region_direct_property(self, node, visited_children):
196
+ v = visited_children[0]
197
+ title, _, _, value = v
198
+ return (title.text, value)
199
+
200
+ def visit_region_group_block(self, node, visited_children):
201
+ return visited_children[0]
202
+
203
+ def visit_region_layout(self, node, visited_children):
204
+ parts = visited_children[5]
205
+ d = {}
206
+ for item in parts:
207
+ if type(item) is tuple:
208
+ d[item[0]] = item[1]
209
+ else:
210
+ raise RuleNotImplemented()
211
+ return ('layout', RegionLayout(d) )
212
+
213
+ def visit_region_layout_property_line(self, node, visited_children):
214
+ return visited_children[1]
215
+
216
+ def visit_region_layout_property(self, node, visited_children):
217
+ v = visited_children[0]
218
+ match v[0].text:
219
+ case 'sequence' | 'slot':
220
+ return (v[0].text, v[3])
221
+ case 'reloadOnSubmit' | 'duplicateSubmissionUrl':
222
+ return (v[0].text, v[3][0].text)
223
+ case 'enableMetaTags' | 'enableDuplicatePageSubmissions':
224
+ return (v[0].text, v[3])
225
+ case _:
226
+ raise RuleNotImplemented()
227
+
228
+ def visit_region_appearance(self, node, visited_children):
229
+ parts = visited_children[5]
230
+ d = {}
231
+ for item in parts:
232
+ if type(item) is tuple:
233
+ d[item[0]] = item[1]
234
+ else:
235
+ raise RuleNotImplemented()
236
+ return ('appearance', RegionAppearance(d))
237
+
238
+ def visit_region_appearance_property_line(self, node, visited_children):
239
+ return visited_children[1]
240
+
241
+ def visit_region_appearance_property(self, node, visited_children):
242
+ v = visited_children[0]
243
+ match v[0].text:
244
+ case 'template':
245
+ return (v[0].text, v[3])
246
+ case 'templateOptions':
247
+ return (v[0].text, v[3][0])
248
+ case 'reloadOnSubmit' | 'duplicateSubmissionUrl':
249
+ return (v[0].text, v[3][0].text)
250
+ case 'enableMetaTags' | 'enableDuplicatePageSubmissions':
251
+ return (v[0].text, v[3])
252
+ case _:
253
+ raise RuleNotImplemented()
254
+
255
+ def visit_region_image(self, node, visited_children):
256
+ parts = visited_children[5]
257
+ d = {}
258
+ for item in parts:
259
+ if type(item) is tuple:
260
+ d[item[0]] = item[1]
261
+ else:
262
+ raise RuleNotImplemented()
263
+ return ('image', d)
264
+
265
+ def visit_region_image_property_line(self, node, visited_children):
266
+ return visited_children[1]
267
+
268
+ def visit_region_image_property(self, node, visited_children):
269
+ v = visited_children[0]
270
+ match v[0].text:
271
+ case 'fileUrl' | 'accessibleDescription' | 'customAttributes':
272
+ return (v[0].text, v[3])
273
+ case _:
274
+ raise RuleNotImplemented()
275
+
276
+ def visit_region_advanced(self, node, visited_children):
277
+ parts = visited_children[5]
278
+ d = {}
279
+ for item in parts:
280
+ if type(item) is tuple:
281
+ d[item[0]] = item[1]
282
+ else:
283
+ raise RuleNotImplemented()
284
+ return ('advanced', d)
285
+
286
+ def visit_region_advanced_property_line(self, node, visited_children):
287
+ return visited_children[1]
288
+
289
+ def visit_region_advanced_property(self, node, visited_children):
290
+ v = visited_children[0]
291
+ match v[0].text:
292
+ case 'htmlDomId':
293
+ return (v[0].text, v[3])
294
+ case _:
295
+ raise RuleNotImplemented()
296
+
297
+
298
+ def visit_page_item(self, node, visited_children):
299
+ component_id = visited_children[2]
300
+ body_parts = visited_children[6]
301
+ if type(component_id) is list:
302
+ component_id = component_id[0][1]
303
+ else:
304
+ component_id = None
305
+
306
+ page_item = PageItem(component_id)
307
+ for item in body_parts:
308
+ if type(item) is tuple:
309
+ if type(item[1]) is dict:
310
+ page_item.add_group(item[0], item[1])
311
+ elif isinstance(item[1], ApexGroup):
312
+ page_item.add_group(item[0], item[1])
313
+ else:
314
+ page_item.add_property(item[0], item[1])
315
+ else:
316
+ raise RuleNotImplemented(f"unprocessed: {item}")
317
+ return page_item
318
+
319
+ def visit_page_item_body_line(self, node, visited_children):
320
+ return visited_children[0]
321
+
322
+ def visit_page_item_direct_property_line(self, node, visited_children):
323
+ return visited_children[1]
324
+
325
+ def visit_page_item_direct_property(self, node, visited_children):
326
+ v = visited_children[0]
327
+ title, _, _, value = v
328
+ return (title.text, value)
329
+
330
+ def visit_page_item_group_block(self, node, visited_children):
331
+ return visited_children[0]
332
+
333
+
334
+ def visit_page_item_label(self, node, visited_children):
335
+ parts = visited_children[5]
336
+ d = {}
337
+ for item in parts:
338
+ if type(item) is tuple:
339
+ d[item[0]] = item[1]
340
+ else:
341
+ raise RuleNotImplemented()
342
+ return ('label', PageItemLabel(d) )
343
+
344
+ def visit_page_item_label_property_line(self, node, visited_children):
345
+ return visited_children[1]
346
+
347
+ def visit_page_item_label_property(self, node, visited_children):
348
+ v = visited_children[0]
349
+ match v[0].text:
350
+ case 'sequence' | 'label':
351
+ return (v[0].text, v[3])
352
+ case 'alignment' | 'duplicateSubmissionUrl':
353
+ return (v[0].text, v[3][0].text)
354
+ case _:
355
+ raise RuleNotImplemented()
356
+
357
+
358
+ def visit_page_item_settings(self, node, visited_children):
359
+ parts = visited_children[5]
360
+ d = {}
361
+ for item in parts:
362
+ if type(item) is tuple:
363
+ d[item[0]] = item[1]
364
+ else:
365
+ raise RuleNotImplemented()
366
+ return ('settings', PageItemSettings(d) )
367
+
368
+ def visit_page_item_settings_property_line(self, node, visited_children):
369
+ return visited_children[1]
370
+
371
+ def visit_page_item_settings_property(self, node, visited_children):
372
+ v = visited_children[0]
373
+ match v[0].text:
374
+ # case 'sequence' | 'label':
375
+ # return (v[0].text, v[3])
376
+ case 'trimSpaces':
377
+ return (v[0].text, v[3][0].text)
378
+ case _:
379
+ raise RuleNotImplemented()
380
+
381
+ def visit_page_item_session_state(self, node, visited_children):
382
+ parts = visited_children[5]
383
+ d = {}
384
+ for item in parts:
385
+ if type(item) is tuple:
386
+ d[item[0]] = item[1]
387
+ else:
388
+ raise RuleNotImplemented()
389
+ return ('sessionState', PageItemSessionState(d) )
390
+
391
+ def visit_page_item_session_state_property_line(self, node, visited_children):
392
+ return visited_children[1]
393
+
394
+ def visit_page_item_session_state_property(self, node, visited_children):
395
+ v = visited_children[0]
396
+ match v[0].text:
397
+ # case 'sequence' | 'label':
398
+ # return (v[0].text, v[3])
399
+ case 'dataType' | 'storage':
400
+ return (v[0].text, v[3][0].text)
401
+ case _:
402
+ raise RuleNotImplemented()
403
+
404
+
405
+ def visit_page_item_layout(self, node, visited_children):
406
+ parts = visited_children[5]
407
+ d = {}
408
+ for item in parts:
409
+ if type(item) is tuple:
410
+ d[item[0]] = item[1]
411
+ else:
412
+ raise RuleNotImplemented()
413
+ return ('layout', PageItemLayout(d) )
414
+
415
+ def visit_page_item_layout_property_line(self, node, visited_children):
416
+ return visited_children[1]
417
+
418
+ def visit_page_item_layout_property(self, node, visited_children):
419
+ v = visited_children[0]
420
+ match v[0].text:
421
+ case 'sequence' | 'slot' | 'region':
422
+ return (v[0].text, v[3])
423
+ case 'alignment':
424
+ return (v[0].text, v[3][0].text)
425
+ case 'enableMetaTags' | 'enableDuplicatePageSubmissions':
426
+ return (v[0].text, v[3])
427
+ case _:
428
+ raise RuleNotImplemented()
429
+
430
+ def visit_page_item_appearance(self, node, visited_children):
431
+ parts = visited_children[5]
432
+ d = {}
433
+ for item in parts:
434
+ if type(item) is tuple:
435
+ d[item[0]] = item[1]
436
+ else:
437
+ raise RuleNotImplemented()
438
+ return ('appearance', PageItemAppearance(d) )
439
+
440
+ def visit_page_item_appearance_property_line(self, node, visited_children):
441
+ return visited_children[1]
442
+
443
+ def visit_page_item_appearance_property(self, node, visited_children):
444
+ v = visited_children[0]
445
+ match v[0].text:
446
+ case 'template' | 'cssClasses' | 'width' | 'valuePlaceholder':
447
+ return (v[0].text, v[3])
448
+ case 'templateOptions':
449
+ return (v[0].text, v[3][0])
450
+ case _:
451
+ raise RuleNotImplemented()
452
+
453
+ def visit_page_item_validation(self, node, visited_children):
454
+ parts = visited_children[5]
455
+ d = {}
456
+ for item in parts:
457
+ if type(item) is tuple:
458
+ d[item[0]] = item[1]
459
+ else:
460
+ raise RuleNotImplemented()
461
+ return ('validation', PageItemValidation(d) )
462
+
463
+ def visit_page_item_validation_property_line(self, node, visited_children):
464
+ return visited_children[1]
465
+
466
+ def visit_page_item_validation_property(self, node, visited_children):
467
+ v = visited_children[0]
468
+ match v[0].text:
469
+ case 'valueRequired' | 'maxLength':
470
+ return (v[0].text, v[3])
471
+ case '?':
472
+ return (v[0].text, v[3][0])
473
+ case _:
474
+ raise RuleNotImplemented()
475
+
476
+ def visit_page_item_advanced(self, node, visited_children):
477
+ parts = visited_children[5]
478
+ d = {}
479
+ for item in parts:
480
+ if type(item) is tuple:
481
+ d[item[0]] = item[1]
482
+ else:
483
+ raise RuleNotImplemented()
484
+ return ('advanced', PageItemAdvanced(d) )
485
+
486
+ def visit_page_item_advanced_property_line(self, node, visited_children):
487
+ return visited_children[1]
488
+
489
+ def visit_page_item_advanced_property(self, node, visited_children):
490
+ v = visited_children[0]
491
+ match v[0].text:
492
+ case 'customAttributes':
493
+ return (v[0].text, v[3])
494
+ case 'postText':
495
+ return (v[0].text, v[3][0])
496
+ case _:
497
+ raise RuleNotImplemented()
498
+
499
+
500
+ def visit_page_item_security(self, node, visited_children):
501
+ parts = visited_children[5]
502
+ d = {}
503
+ for item in parts:
504
+ if type(item) is tuple:
505
+ d[item[0]] = item[1]
506
+ else:
507
+ raise RuleNotImplemented()
508
+ return ('security', PageItemSecurity(d) )
509
+
510
+ def visit_page_item_security_property_line(self, node, visited_children):
511
+ return visited_children[1]
512
+
513
+ def visit_page_item_security_property(self, node, visited_children):
514
+ v = visited_children[0]
515
+ match v[0].text:
516
+ case 'encryptSessionState':
517
+ return (v[0].text, v[3])
518
+ case 'sessionStateProtection' | 'restrictedChars':
519
+ return (v[0].text, v[3][0])
520
+ case _:
521
+ raise RuleNotImplemented()
522
+
523
+ def visit_button(self, node, visited_children):
524
+ component_id = visited_children[2]
525
+ body_parts = visited_children[6]
526
+ if type(component_id) is list:
527
+ component_id = component_id[0][1]
528
+ else:
529
+ component_id = None
530
+
531
+ button = Button(component_id)
532
+ for item in body_parts:
533
+ if type(item) is tuple:
534
+ if type(item[1]) is dict:
535
+ button.add_group(item[0], item[1])
536
+ elif isinstance(item[1], ApexGroup):
537
+ button.add_group(item[0], item[1])
538
+ else:
539
+ button.add_property(item[0], item[1])
540
+ else:
541
+ raise RuleNotImplemented(f"unprocessed: {item}")
542
+ return button
543
+
544
+ def visit_button_body_line(self, node, visited_children):
545
+ return visited_children[0]
546
+
547
+ def visit_button_direct_property_line(self, node, visited_children):
548
+ return visited_children[1]
549
+
550
+ def visit_button_direct_property(self, node, visited_children):
551
+ v = visited_children[0]
552
+ title, _, _, value = v
553
+ return (title.text, value)
554
+
555
+ def visit_button_group_block(self, node, visited_children):
556
+ return visited_children[0]
557
+
558
+ def visit_button_layout(self, node, visited_children):
559
+ parts = visited_children[5]
560
+ d = {}
561
+ for item in parts:
562
+ if type(item) is tuple:
563
+ d[item[0]] = item[1]
564
+ else:
565
+ raise RuleNotImplemented()
566
+ return ('layout', ButtonLayout(d) )
567
+
568
+ def visit_button_layout_property_line(self, node, visited_children):
569
+ return visited_children[1]
570
+
571
+ def visit_button_layout_property(self, node, visited_children):
572
+ v = visited_children[0]
573
+ match v[0].text:
574
+ # case 'sequence' | 'slot' | 'region':
575
+ # return (v[0].text, v[3])
576
+ # case 'alignment':
577
+ # return (v[0].text, v[3][0].text)
578
+ # case 'enableMetaTags' | 'enableDuplicatePageSubmissions':
579
+ # return (v[0].text, v[3])
580
+ case _:
581
+ raise RuleNotImplemented()
582
+
583
+
584
+ def visit_button_appearance(self, node, visited_children):
585
+ parts = visited_children[5]
586
+ d = {}
587
+ for item in parts:
588
+ if type(item) is tuple:
589
+ d[item[0]] = item[1]
590
+ else:
591
+ raise RuleNotImplemented()
592
+ return ('appearance', ButtonAppearance(d) )
593
+
594
+ def visit_button_appearance_property_line(self, node, visited_children):
595
+ return visited_children[1]
596
+
597
+ def visit_button_appearance_property(self, node, visited_children):
598
+ v = visited_children[0]
599
+ match v[0].text:
600
+ case 'buttonTemplate' | 'hot':
601
+ return (v[0].text, v[3])
602
+ # case 'alignment':
603
+ # return (v[0].text, v[3][0].text)
604
+ # case 'templateOptions' | 'enableDuplicatePageSubmissions':
605
+ # return (v[0].text, v[3])
606
+ case 'templateOptions':
607
+ return (v[0].text, v[3][0])
608
+ case _:
609
+ raise RuleNotImplemented()
610
+
611
+ def visit_button_behavior(self, node, visited_children):
612
+ parts = visited_children[5]
613
+ d = {}
614
+ for item in parts:
615
+ if type(item) is tuple:
616
+ d[item[0]] = item[1]
617
+ else:
618
+ raise RuleNotImplemented()
619
+ return ('behavior', ButtonBehavior(d) )
620
+
621
+ def visit_button_behavior_property_line(self, node, visited_children):
622
+ return visited_children[1]
623
+
624
+ def visit_button_behavior_property(self, node, visited_children):
625
+ v = visited_children[0]
626
+ match v[0].text:
627
+ case 'warnOnUnsavedChanges':
628
+ return (v[0].text, v[3])
629
+ # case 'alignment':
630
+ # return (v[0].text, v[3][0].text)
631
+ # case 'enableMetaTags' | 'enableDuplicatePageSubmissions':
632
+ # return (v[0].text, v[3])
633
+ case _:
634
+ raise RuleNotImplemented()
635
+
636
+
637
+ def visit_dynamic_action(self, node, visited_children):
638
+ component_id = visited_children[2]
639
+ body_parts = visited_children[6]
640
+ if type(component_id) is list:
641
+ component_id = component_id[0][1]
642
+ else:
643
+ component_id = None
644
+
645
+ dynact = DynamicAction(component_id)
646
+ for item in body_parts:
647
+ if type(item) is tuple:
648
+ if type(item[1]) is dict:
649
+ dynact.add_group(item[0], item[1])
650
+ elif isinstance(item[1], ApexGroup):
651
+ dynact.add_group(item[0], item[1])
652
+ else:
653
+ dynact.add_property(item[0], item[1])
654
+ else:
655
+ raise RuleNotImplemented(f"unprocessed: {item}")
656
+ return dynact
657
+
658
+ def visit_dynamic_action_body_line(self, node, visited_children):
659
+ return visited_children[0]
660
+
661
+ def visit_dynamic_action_direct_property_line(self, node, visited_children):
662
+ return visited_children[1]
663
+
664
+ def visit_dynamic_action_direct_property(self, node, visited_children):
665
+ v = visited_children[0]
666
+ title, _, _, value = v
667
+ return (title.text, value)
668
+
669
+ def visit_dynamic_action_group_block(self, node, visited_children):
670
+ return visited_children[0]
671
+
672
+ def visit_dynamic_action_execution(self, node, visited_children):
673
+ parts = visited_children[5]
674
+ d = {}
675
+ for item in parts:
676
+ if type(item) is tuple:
677
+ d[item[0]] = item[1]
678
+ else:
679
+ raise RuleNotImplemented()
680
+ return ('execution', DynamicActionExecution(d) )
681
+
682
+ def visit_dynamic_action_execution_property_line(self, node, visited_children):
683
+ return visited_children[1]
684
+
685
+ def visit_dynamic_action_execution_property(self, node, visited_children):
686
+ v = visited_children[0]
687
+ match v[0].text:
688
+ case 'sequence':
689
+ return (v[0].text, v[3])
690
+ # case 'alignment':
691
+ # return (v[0].text, v[3][0].text)
692
+ # case 'enableMetaTags' | 'enableDuplicatePageSubmissions':
693
+ # return (v[0].text, v[3])
694
+ case _:
695
+ raise RuleNotImplemented()
696
+
697
+ def visit_dynamic_action_when(self, node, visited_children):
698
+ parts = visited_children[5]
699
+ d = {}
700
+ for item in parts:
701
+ if type(item) is tuple:
702
+ d[item[0]] = item[1]
703
+ else:
704
+ raise RuleNotImplemented()
705
+ return ('when', DynamicActionWhen(d) )
706
+
707
+ def visit_dynamic_action_when_property_line(self, node, visited_children):
708
+ return visited_children[1]
709
+
710
+ def visit_dynamic_action_when_property(self, node, visited_children):
711
+ v = visited_children[0]
712
+ match v[0].text:
713
+ case 'event':
714
+ return (v[0].text, v[3])
715
+ # case 'alignment':
716
+ # return (v[0].text, v[3][0].text)
717
+ # case 'enableMetaTags' | 'enableDuplicatePageSubmissions':
718
+ # return (v[0].text, v[3])
719
+ case _:
720
+ raise RuleNotImplemented()
721
+
722
+ def visit_dynamic_action_client_side_condition(self, node, visited_children):
723
+ parts = visited_children[5]
724
+ d = {}
725
+ for item in parts:
726
+ if type(item) is tuple:
727
+ d[item[0]] = item[1]
728
+ else:
729
+ raise RuleNotImplemented()
730
+ return ('clientSideCondition', DynamicActionClientSideCondition(d) )
731
+
732
+ def visit_dynamic_action_client_side_condition_property_line(self, node, visited_children):
733
+ return visited_children[1]
734
+
735
+ def visit_dynamic_action_client_side_condition_property(self, node, visited_children):
736
+ v = visited_children[0]
737
+ match v[0].text:
738
+ case 'event' | 'javaScriptExpression':
739
+ return (v[0].text, v[3])
740
+ case 'type':
741
+ return (v[0].text, v[3][0].text)
742
+ # case 'enableMetaTags' | 'enableDuplicatePageSubmissions':
743
+ # return (v[0].text, v[3])
744
+ case _:
745
+ raise RuleNotImplemented()
746
+
747
+ def visit_action_c(self, node, visited_children):
748
+ component_id = visited_children[2]
749
+ body_parts = visited_children[6]
750
+ if type(component_id) is list:
751
+ component_id = component_id[0][1]
752
+ else:
753
+ component_id = None
754
+
755
+ act = Action(component_id)
756
+ for item in body_parts:
757
+ if type(item) is tuple:
758
+ if type(item[1]) is dict:
759
+ act.add_group(item[0], item[1])
760
+ elif isinstance(item[1], ApexGroup):
761
+ act.add_group(item[0], item[1])
762
+ else:
763
+ act.add_property(item[0], item[1])
764
+ else:
765
+ raise RuleNotImplemented(f"unprocessed: {item}")
766
+ return act
767
+
768
+ def visit_action_c_body_line(self, node, visited_children):
769
+ return visited_children[0]
770
+
771
+ def visit_action_c_direct_property_line(self, node, visited_children):
772
+ return visited_children[1]
773
+
774
+ def visit_action_c_direct_property(self, node, visited_children):
775
+ v = visited_children[0]
776
+ title, _, _, value = v
777
+ return (title.text, value)
778
+
779
+ def visit_action_c_group_block(self, node, visited_children):
780
+ return visited_children[0]
781
+
782
+ def visit_action_c_affected_elements(self, node, visited_children):
783
+ parts = visited_children[5]
784
+ d = {}
785
+ for item in parts:
786
+ if type(item) is tuple:
787
+ d[item[0]] = item[1]
788
+ else:
789
+ raise RuleNotImplemented()
790
+ return ('affectedElements', DynamicActionWhen(d) )
791
+
792
+ def visit_action_c_affected_elements_property_line(self, node, visited_children):
793
+ return visited_children[1]
794
+
795
+ def visit_action_c_affected_elements_property(self, node, visited_children):
796
+ v = visited_children[0]
797
+ match v[0].text:
798
+ case 'event':
799
+ return (v[0].text, v[3])
800
+ # case 'alignment':
801
+ # return (v[0].text, v[3][0].text)
802
+ # case 'enableMetaTags' | 'enableDuplicatePageSubmissions':
803
+ # return (v[0].text, v[3])
804
+ case _:
805
+ raise RuleNotImplemented()
806
+
807
+
808
+ def visit_process(self, node, visited_children):
809
+ component_id = visited_children[2]
810
+ body_parts = visited_children[6]
811
+ if type(component_id) is list:
812
+ component_id = component_id[0][1]
813
+ else:
814
+ component_id = None
815
+
816
+ proc = Process(component_id)
817
+ for item in body_parts:
818
+ if type(item) is tuple:
819
+ if type(item[1]) is dict:
820
+ proc.add_group(item[0], item[1])
821
+ elif isinstance(item[1], ApexGroup):
822
+ proc.add_group(item[0], item[1])
823
+ else:
824
+ proc.add_property(item[0], item[1])
825
+ else:
826
+ raise RuleNotImplemented(f"unprocessed: {item}")
827
+ return proc
828
+
829
+ def visit_process_body_line(self, node, visited_children):
830
+ return visited_children[0]
831
+
832
+ def visit_process_direct_property_line(self, node, visited_children):
833
+ return visited_children[1]
834
+
835
+ def visit_process_direct_property(self, node, visited_children):
836
+ v = visited_children[0]
837
+ title, _, _, value = v
838
+ return (title.text, value)
839
+
840
+ def visit_process_group_block(self, node, visited_children):
841
+ return visited_children[0]
842
+
843
+
844
+ def visit_reference(self, node, visited_children):
845
+ return node.text
846
+
847
+
848
+ def visit_code_block(self, node, visited_children):
849
+ return node.text
850
+
851
+ def visit_multiline_string(self, node, visited_children):
852
+ return node.text
853
+
854
+ def visit_array_of_string_like_value(self, node, visited_children):
855
+ values = visited_children[1]
856
+ ret = []
857
+ for v in values:
858
+ ret.append(v[2])
859
+
860
+ return ret
861
+
862
+ def visit_string_like_value(self, node, visited_children):
863
+ t = node.text
864
+ if t[0] == '"' and t[-1] == '"':
865
+ return t[1:-1]
866
+ else:
867
+ return t
868
+
869
+ def visit_identifier(self, node, visited_children):
870
+ return node.text
871
+
872
+ def visit_string(self, node, visited_children):
873
+ return node.text[1:-1]
874
+
875
+ def visit_boolean(self, node, visited_children):
876
+ return node.text == 'true'
877
+
878
+ def visit_number(self, node, visited_children):
879
+ if '.' in node.text:
880
+ return float(node.text)
881
+ else:
882
+ return int(node.text)
883
+
884
+ def visit_required_ws(self, node, visited_children):
885
+ return None
886
+
887
+ def visit_ws(self, node, visited_children):
888
+ return None
889
+
890
+ def visit_blank_lines(self, node, visited_children):
891
+ return None
892
+
893
+
894
+ def generic_visit(self, node, visited_children):
895
+ """ The generic visit method. """
896
+ return visited_children or node
897
+
898
+
899
+
900
+ def parse_apex_file(fn: Path, apex_version : str = "26.1") -> Page:
901
+ inp_file = impresources.files(apex) / f'apexlang-{apex_version}.peg'
902
+ with inp_file.open("rt") as f:
903
+ template = f.read()
904
+
905
+ grammar = Grammar(template)
906
+
907
+ with open(fn, 'r') as f:
908
+ data = f.read()
909
+
910
+ nodes = grammar.parse(data)
911
+
912
+ visitor = ApxNodeVisitor()
913
+ output = visitor.visit(nodes)
914
+ return output
915
+
916
+ if __name__ == '__main__': # pragma: no cover
917
+
918
+ page = Page('A')
919
+
920
+ page_item = PageItem('B')
921
+
922
+ page = parse_apex_file("examples/test.apx")
923
+
924
+
925
+
926
+ print(page)
927
+
928
+ print(page.appearance)