From 77e1e6fb7df00d6832f671f359dd53a2f7a10ec4 Mon Sep 17 00:00:00 2001 From: Toddelismyname <116207910+Toddelismyname@users.noreply.github.com> Date: Sat, 15 Feb 2025 15:21:26 +0100 Subject: [PATCH] Implement attribute sorting with 'name' first example input 1: And example input 2: should both return: --- format.py | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/format.py b/format.py index a66ca92..9208b28 100644 --- a/format.py +++ b/format.py @@ -100,13 +100,55 @@ def __init__(self, def print(self, text=''): self.stream.write(text + '\n') + def sort_attributes(self, element): + """ + Sort attributes with 'name' always first, then alphabetically. + + Args: + element (etree._Element): XML element whose attributes to sort + + Returns: + list of tuples: Sorted list of (key, value) attribute pairs + """ + # Separate 'name' attribute if it exists + name_attr = [('name', element.get('name'))] if element.get('name') is not None else [] + + # Get remaining attributes, sorted alphabetically + other_attrs = sorted( + [(k, v) for k, v in element.items() if k != 'name'], + key=lambda x: x[0] + ) + + # Combine name attribute (if exists) with sorted other attributes + return name_attr + other_attrs + def fmtAttrH(self, element): - return " ".join(['{}="{}"'.format(k, v) for k, v in element.items()]) + """ + Format attributes horizontally with sorted order. + + Args: + element (etree._Element): XML element to format + + Returns: + str: Formatted attribute string + """ + return " ".join(['{}="{}"'.format(k, v) for k, v in self.sort_attributes(element)]) def fmtAttrV(self, element, level): + """ + Format attributes vertically with sorted order. + + Args: + element (etree._Element): XML element to format + level (int): Indentation level + + Returns: + str: Formatted attribute string + """ prefix = self.indent * (level + 1) return "\n".join( - ['{}{}="{}"'.format(prefix, k, v) for k, v in element.items()]) + ['{}{}="{}"'.format(prefix, k, v) for k, v in self.sort_attributes(element)] + ) def printXMLDeclaration(self, root): self.print(''.format(