diff --git a/.claude/skills/cfe-borrow/scripts/cfe-borrow.py b/.claude/skills/cfe-borrow/scripts/cfe-borrow.py index 72c4e39c..04c828f0 100644 --- a/.claude/skills/cfe-borrow/scripts/cfe-borrow.py +++ b/.claude/skills/cfe-borrow/scripts/cfe-borrow.py @@ -652,7 +652,6 @@ def main(): form_version = src_form_el.get("version", "2.17") src_auto_cmd = None - src_child_items = None form_props = [] reached_visual = False for fc in src_form_el: @@ -663,9 +662,8 @@ def main(): reached_visual = True src_auto_cmd = fc continue - if ln == "ChildItems" and src_child_items is None: + if ln in ("ChildItems", "Events", "Attributes", "Commands", "Parameters"): reached_visual = True - src_child_items = fc continue if not reached_visual: # Form-level properties before AutoCommandBar (WindowOpeningMode, AutoFillCheck, etc.) @@ -673,27 +671,15 @@ def main(): ns_strip_pattern = re.compile(r'\s+xmlns(?::\w+)?="[^"]*"') + # AutoCommandBar: copy only properties (Autofill etc.), strip ChildItems auto_cmd_xml = "" if src_auto_cmd is not None: auto_cmd_xml = etree.tostring(src_auto_cmd, encoding="unicode") auto_cmd_xml = ns_strip_pattern.sub("", auto_cmd_xml) - auto_cmd_xml = re.sub(r'[^<]*', '0', auto_cmd_xml) + # Strip ChildItems from AutoCommandBar (buttons will appear from base form at runtime) + auto_cmd_xml = re.sub(r'\s*.*?', '', auto_cmd_xml, flags=re.DOTALL) + # Replace Autofill true -> false auto_cmd_xml = auto_cmd_xml.replace('true', 'false') - # Strip DataPath (references base form attributes not present in extension) - auto_cmd_xml = re.sub(r'\s*[^<]*', '', auto_cmd_xml) - # Strip element-level Events (base form event handlers not present in extension) - auto_cmd_xml = re.sub(r'\s*.*?', '', auto_cmd_xml, flags=re.DOTALL) - - child_items_xml = "" - if src_child_items is not None: - child_items_xml = etree.tostring(src_child_items, encoding="unicode") - child_items_xml = ns_strip_pattern.sub("", child_items_xml) - child_items_xml = re.sub(r'[^<]*', '0', child_items_xml) - # Strip DataPath and element-level Events - child_items_xml = re.sub(r'\s*[^<]*', '', child_items_xml) - child_items_xml = re.sub(r'\s*.*?', '', child_items_xml, flags=re.DOTALL) - else: - child_items_xml = "" # Extract source form opening tag xml_decl = '' @@ -712,16 +698,15 @@ def main(): parts.append(form_tag) parts.append("\r\n") - # Form properties (WindowOpeningMode, AutoFillCheck, etc.) + # Part 1: form properties + AutoCommandBar (no ChildItems — they come from base form at runtime) for prop_xml in form_props: prop_xml_clean = ns_strip_pattern.sub("", prop_xml) parts.append(f"\t{prop_xml_clean}\r\n") if auto_cmd_xml: parts.append(f"\t{auto_cmd_xml}\r\n") - parts.append(f"\t{child_items_xml}\r\n") parts.append("\t\r\n") - # BaseForm + # BaseForm: same properties + AutoCommandBar (no ChildItems) parts.append(f'\t\r\n') for prop_xml in form_props: @@ -736,14 +721,6 @@ def main(): parts.append(f"\t{line}") parts.append("\r\n") - ci_lines = child_items_xml.split("\n") - for li, line in enumerate(ci_lines): - if li == 0: - parts.append(f"\t\t{line}") - else: - parts.append(f"\t{line}") - parts.append("\r\n") - parts.append("\t\t\r\n") parts.append("\t\r\n") parts.append("")