mirror of
https://github.com/johndoe6345789/SDL3CPlusPlus.git
synced 2026-04-24 21:55:09 +00:00
91 lines
3.6 KiB
Python
91 lines
3.6 KiB
Python
#!/usr/bin/env python
|
|
'''
|
|
Reformat a folder of MaterialX documents in place, optionally upgrading
|
|
the documents to the latest version of the standard.
|
|
'''
|
|
|
|
import argparse
|
|
import os
|
|
import xml.etree.ElementTree as ET
|
|
|
|
import MaterialX as mx
|
|
|
|
def is_well_formed(xml_string):
|
|
error = ''
|
|
try:
|
|
ET.fromstring(xml_string)
|
|
except ET.ParseError as e:
|
|
error = str(e)
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description="Reformat a folder of MaterialX documents in place.")
|
|
parser.add_argument('-y', '--yes', dest='yes', action="store_true", help="Proceed without asking for confirmation from the user.")
|
|
parser.add_argument('-u', '--upgrade', dest='upgrade', action="store_true", help='Upgrade documents to the latest version of the standard.')
|
|
parser.add_argument('-v', '--validate', dest='validate', action="store_true", help='Perform MaterialX validation on documents after reformatting.')
|
|
parser.add_argument('-x', '--xml_syntax', dest='xml_syntax', action="store_true", help='Check XML syntax after reformatting.')
|
|
parser.add_argument(dest="inputFolder", help="An input folder to scan for MaterialX documents.")
|
|
opts = parser.parse_args()
|
|
|
|
validDocs = dict()
|
|
for root, dirs, files in os.walk(opts.inputFolder):
|
|
for filename in files:
|
|
fullpath = os.path.join(root, filename)
|
|
if fullpath.endswith('.mtlx'):
|
|
doc = mx.createDocument()
|
|
try:
|
|
readOptions = mx.XmlReadOptions()
|
|
readOptions.readComments = True
|
|
readOptions.readNewlines = True
|
|
readOptions.upgradeVersion = opts.upgrade
|
|
try:
|
|
mx.readFromXmlFile(doc, fullpath, mx.FileSearchPath(), readOptions)
|
|
except Exception as err:
|
|
print('Skipping "' + filename + '" due to exception: ' + str(err))
|
|
continue
|
|
validDocs[fullpath] = doc
|
|
except mx.Exception:
|
|
pass
|
|
|
|
if not validDocs:
|
|
print('No MaterialX documents were found in "%s"' % (opts.inputFolder))
|
|
return
|
|
|
|
print('Found %s MaterialX files in "%s"' % (len(validDocs), opts.inputFolder))
|
|
|
|
mxVersion = mx.getVersionIntegers()
|
|
|
|
if not opts.yes:
|
|
if opts.upgrade:
|
|
question = 'Would you like to upgrade all %i documents to MaterialX v%i.%i in place (y/n)?' % (len(validDocs), mxVersion[0], mxVersion[1])
|
|
else:
|
|
question = 'Would you like to reformat all %i documents in place (y/n)?' % len(validDocs)
|
|
answer = input(question)
|
|
if answer != 'y' and answer != 'Y':
|
|
return
|
|
|
|
validate = opts.validate
|
|
if validate:
|
|
print(f'- Validate documents')
|
|
xml_syntax = opts.xml_syntax
|
|
if xml_syntax:
|
|
print(f'- Check XML syntax')
|
|
for (filename, doc) in validDocs.items():
|
|
if xml_syntax:
|
|
xml_string = mx.writeToXmlString(doc)
|
|
errors = is_well_formed(xml_string)
|
|
if errors:
|
|
print(f'- Warning: Document {filename} is not well-formed XML: {errors}')
|
|
if validate:
|
|
is_valid, errors = doc.validate()
|
|
if not is_valid:
|
|
print(f'- Warning: Document {filename} is invalid. Errors {errors}.')
|
|
mx.writeToXmlFile(doc, filename)
|
|
|
|
if opts.upgrade:
|
|
print('Upgraded %i documents to MaterialX v%i.%i' % (len(validDocs), mxVersion[0], mxVersion[1]))
|
|
else:
|
|
print('Reformatted %i documents ' % len(validDocs))
|
|
|
|
if __name__ == '__main__':
|
|
main()
|