cleanschem.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import getopt, sys, os, os.path, re, xml.dom.minidom, xml.dom
  2. def usage():
  3. print """
  4. usage:
  5. cleanschem.py -d [svg folder]
  6. cleans files with multiple copies of internal rects and labels
  7. """
  8. def main():
  9. try:
  10. opts, args = getopt.getopt(sys.argv[1:], "hd:", ["help", "directory"])
  11. except getopt.GetoptError, err:
  12. # print help information and exit:
  13. print str(err) # will print something like "option -a not recognized"
  14. usage()
  15. return
  16. dir = None
  17. for o, a in opts:
  18. #print o
  19. #print a
  20. if o in ("-d", "--directory"):
  21. dir = a
  22. elif o in ("-h", "--help"):
  23. usage()
  24. return
  25. else:
  26. print "unhandled option", o
  27. usage()
  28. return
  29. if dir == None:
  30. print "missing directory argument"
  31. usage()
  32. return
  33. for root, dirs, files in os.walk(dir, topdown=False):
  34. for filename in files:
  35. if not filename.endswith(".svg"):
  36. continue
  37. svgFilename = os.path.join(root, filename)
  38. handlesvg(svgFilename)
  39. def handlesvg(svgFilename):
  40. try:
  41. dom = xml.dom.minidom.parse(svgFilename)
  42. except xml.parsers.expat.ExpatError, err:
  43. print str(err), svgFilename
  44. return
  45. #print svgFilename
  46. rcount = 0
  47. toDelete = []
  48. svg = dom.documentElement
  49. rectNodes = svg.getElementsByTagName("rect")
  50. for rect in rectNodes:
  51. if rect.getAttribute("class") == "interior rect":
  52. rcount += 1
  53. if rcount > 1:
  54. toDelete.append(rect)
  55. print "\t", rect.toxml("UTF-8")
  56. #print rcount, toDelete
  57. textNodes = svg.getElementsByTagName("text")
  58. labels = []
  59. fix = False
  60. for text in textNodes:
  61. id = text.getAttribute("id")
  62. if id.startswith("label"):
  63. labels.append(text)
  64. if "_" in id:
  65. #fix = True
  66. #text.setAttribute("id", id.replace("_", ""))
  67. #print "id", id
  68. pass
  69. if len(labels) > 0:
  70. for ix in range(len(labels)):
  71. labeli = labels[ix]
  72. for jx in range(ix + 1, len(labels)):
  73. labelj = labels[jx]
  74. if labeli.toxml("UTF-8") == labelj.toxml("UTF-8"):
  75. toDelete.append(labeli)
  76. print "\t", labeli.toxml("UTF-8")
  77. break
  78. for node in toDelete:
  79. node.parentNode.removeChild(node)
  80. if len(toDelete) > 0 or fix:
  81. print "fixing", svgFilename
  82. outfile = open(svgFilename, 'wb')
  83. s = dom.toxml("UTF-8")
  84. outfile.write(s)
  85. outfile.close()
  86. if __name__ == "__main__":
  87. main()