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(