[commit] r2699 - trunk/GME/Parser

GMESRC Repository Notifications gme-commit at list.isis.vanderbilt.edu
Fri Oct 13 10:27:02 CDT 2017


Author: ksmyth
Date: Fri Oct 13 10:27:02 2017
New Revision: 2699

Log:
xme_id2guid: add before/after guid sorting for better merging

Modified:
   trunk/GME/Parser/xme_id2guid.py

Modified: trunk/GME/Parser/xme_id2guid.py
==============================================================================
--- trunk/GME/Parser/xme_id2guid.py	Thu Oct 12 14:21:46 2017	(r2698)
+++ trunk/GME/Parser/xme_id2guid.py	Fri Oct 13 10:27:02 2017	(r2699)
@@ -2,7 +2,29 @@
 import os.path
 import sys
 
-def id2guid(input, output, sort_elements=False, omit_default_attributes=False):
+from xml.etree import ElementTree
+
+
+def indent(elem, level=0, parent=None):
+    i = "\n" + level * "  "
+    j = "\n" + (level - 1) * "  "
+    if len(elem):
+        if not elem.text or not elem.text.strip():
+            elem.text = i + "  "
+        if not elem.tail or not elem.tail.strip():
+            elem.tail = i
+        for subelem in elem:
+            indent(subelem, level + 1, elem)
+    else:
+        if level and (not elem.tail or not elem.tail.strip()):
+            if parent is not None and elem == parent[-1]:
+                elem.tail = j
+            else:
+                elem.tail = i
+    return elem
+
+
+def id2guid(input, output, sort_elements=False, omit_default_attributes=False, sort_before_guids=None, sort_after_guids=None):
     from xml.etree import ElementTree
     xme = ElementTree.parse(input)
     id_guid_map = {}
@@ -10,6 +32,11 @@
         if element.get('id') and element.get('guid'):
             id_guid_map[element.get('id')] = element.get('guid')
             del element.attrib['id']
+        elif element.get('guid'):
+            id_guid_map[element.get('guid')] = element.get('guid')
+
+        if element.get('childrelidcntr'):
+            del element.attrib['childrelidcntr']
     for element in xme.iter():
         if element.get('derivedfrom'):
             element.attrib['derivedfrom'] = id_guid_map[element.get('derivedfrom')]
@@ -31,25 +58,54 @@
             parent_map[element].remove(element)
 
     if sort_elements:
-        def sortchildrenby(parent, attr):
-            parent[:] = sorted(parent, key=lambda child: child.get(attr))
+        if sort_before_guids:
+            before_guids = set((g.strip() for g in open(sort_before_guids).readlines()))
+        if sort_after_guids:
+            after_guids = set((g.strip() for g in open(sort_after_guids).readlines()))
+
+        def sortchildrenby(parent, attr, reverse=False):
+            parent[:] = sorted(parent, key=lambda child: child.get(attr), reverse=reverse)
 
         for element in list(xme.iter()):
             sortchildrenby(element, 'name')
             sortchildrenby(element, 'guid')
+            # sortchildrenby(element, 'role')
+            # sortchildrenby(element, 'relid')
+
+            def sort_guids(guids, reverse):
+                def cmp_e(a, b):
+                    if a.get('guid') and b.get('guid'):
+                        return cmp(a.get('guid') in guids, b.get('guid') in guids)
+                    return 0
+                element[:] = sorted(element, cmp=cmp_e, reverse=reverse)
+
+            if sort_before_guids:
+                sort_guids(before_guids, reverse=False)
+            if sort_after_guids:
+                sort_guids(after_guids, reverse=True)
+
+            def get_name(e):
+                name = e.find('./name')
+                return name.text if name is not None else ''
+
+            # element[:] = sorted(element, key=get_name)
 
     # remove all regnode data (useful for diffs):
     # for element in xme.iter('regnode'):
     #    element[:] = []
     output.write('<!DOCTYPE project SYSTEM "mga2.dtd">\n')
+    indent(xme.getroot())
     xme.write(output)
 
+
 if __name__ == '__main__':
     import argparse
 
     parser = argparse.ArgumentParser(description='Convert GME id-style .xme (mga.dtd) to GUID-style .xme (mga2.dtd).')
     parser.add_argument('--sort', action='store_true')
     parser.add_argument('--omit-default-attributes', action='store_true')
+    parser.add_argument('--sort-after-guids')
+    parser.add_argument('--sort-before-guids')
     parser.add_argument('input-xme-file')
     # parser.add_argument('--output-file')
 
@@ -57,7 +113,9 @@
     input = vars(args)['input-xme-file']
     options = {
         "sort_elements": args.sort,
-        "omit_default_attributes": 'omit-default-attributes' in vars(args)
+        "omit_default_attributes": 'omit_default_attributes' in vars(args),
+        "sort_before_guids": args.sort_before_guids,
+        "sort_after_guids": args.sort_after_guids
     }
     if input != '-':
         output_filename = os.path.splitext(input)[0] + "_guids.xme"
@@ -65,4 +123,3 @@
             id2guid(input, output, **options)
     else:
         id2guid(sys.stdin, sys.stdout, **options)
-


More information about the gme-commit mailing list