[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