xml_processor.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. from xml.dom import minidom
  2. import os
  3. import shutil
  4. import process_atlas
  5. import process_font
  6. import process_starling_atlas
  7. import oxygine_helper
  8. class XmlProcessor:
  9. def __init__(self, args):
  10. self.src_data = args.src_data + "/"
  11. self.dest_data = args.dest_data + "/"
  12. self.compression = args.compression.lower()
  13. #self.etc1tool = args.android_sdk + "\\tools\\etc1tool.exe "
  14. #if self.compression == "etc1":
  15. # if not os.path.exists(self.etc1tool):
  16. # raise Exception("can't find etc1tool. please pass correct path to android_sdk")
  17. self.path_xml = args.xml
  18. self.xml_name = os.path.split(self.path_xml)[1]
  19. self.atlas_group_id = 0
  20. self.args = args
  21. self.verbosity = args.verbosity
  22. self.warnings = 0
  23. self.errors = 0
  24. self.scale_factor = 1.0
  25. self.scale_quality = 1.0
  26. self.scale = args.scale
  27. self.debug = args.debug
  28. self.processors = {}
  29. self.path_current = ""
  30. self._meta_doc = None
  31. self._meta_element = None
  32. self.helper = oxygine_helper.helper(os.path.split(__file__)[0] + "/../../")
  33. self.register_processor(process_font.bmfc_font_Processor())
  34. self.register_processor(process_font.font_Processor())
  35. self.register_processor(process_atlas.atlas_Processor())
  36. self.register_processor(process_starling_atlas.starling_atlas_Processor())
  37. self._current_processor = None
  38. def register_processor(self, processor):
  39. self.processors[processor.node_id] = processor
  40. def get_apply_scale(self, applyScaleFactor, scale_quality = 1.0):
  41. """
  42. returns scale should be applied to image
  43. """
  44. v = self.scale * self.scale_quality * scale_quality
  45. if applyScaleFactor:
  46. v *= self.scale_factor
  47. return v
  48. def add_meta(self):
  49. meta = self._meta_doc.createElement(self._current_processor.node_id)
  50. self._meta_element.appendChild(meta)
  51. return meta
  52. def get_meta_doc(self):
  53. return self._meta_doc
  54. def _process_set(self, el):
  55. path = el.getAttribute("path")
  56. if path:
  57. if path.startswith(".\\") or path.startswith("./"):
  58. path = self.path_current + path
  59. path = os.path.normpath(path) + "/"
  60. self.path_current = path
  61. scale_factor = el.getAttribute("scale_factor")
  62. if scale_factor:
  63. self.scale_factor = float(scale_factor)
  64. scale_quality = el.getAttribute("scale_quality")
  65. if scale_quality:
  66. self.scale_quality = float(scale_quality)
  67. def _open_xml(self, path):
  68. with open(path, "r") as file:
  69. font_doc = minidom.parse(file)
  70. return font_doc.documentElement
  71. def _get_src_path(self, local_path):
  72. return self.src_data + local_path
  73. def _get_dest_path(self, local_path):
  74. return self.dest_data + local_path
  75. def _get_meta_xml_path(self, local_path):
  76. return self._get_dest_path(self.xml_name) + ".ox" + "/" + local_path
  77. def get_current_src_path(self, local = ""):
  78. return self._get_src_path(self.path_current + local)
  79. def get_inner_dest(self, inner_local_path = ""):
  80. return self._get_meta_xml_path(self._current_processor.node_id + "/" + inner_local_path)
  81. def log(self, st):
  82. print st
  83. def warning(self, st):
  84. if self.args.warnings:
  85. print "warning: " + st
  86. def error(self, st):
  87. print "error: " + st
  88. def process(self):
  89. #print self.path_data
  90. #print self.path_xml
  91. #print self.path_atlasses
  92. try:
  93. nm = self._get_src_path(self.path_xml)
  94. file = open(nm, "r")
  95. except IOError:
  96. print "can't open file: " + nm
  97. return
  98. doc = minidom.parse(file)
  99. del file
  100. self._meta_doc = minidom.Document()
  101. self._meta_element = self._meta_doc.createElement("resources")
  102. self._meta_doc.appendChild(self._meta_element)
  103. totalAtlasses = 0
  104. folder = self._get_meta_xml_path("")
  105. shutil.rmtree(folder, True)
  106. try:
  107. os.makedirs(folder)
  108. except OSError:
  109. pass
  110. for el in doc.documentElement.childNodes:
  111. name = el.nodeName
  112. if name in self.processors:
  113. proc = self.processors[name]
  114. self._current_processor = proc
  115. try:
  116. if proc.create_folder:
  117. os.makedirs(self.get_inner_dest(""))
  118. except OSError:
  119. pass
  120. proc.process(self, el)
  121. if name == "set":
  122. self._process_set(el)
  123. if name == "sdfont":
  124. self._process_sdf_font(el)
  125. path_ox_dest = self._get_meta_xml_path("meta.xml")
  126. file = open(path_ox_dest, "w")
  127. if self.verbosity > 1:
  128. print "saving ox file: \n" + os.path.normpath(path_ox_dest)
  129. if self.args.debug:
  130. self._meta_element.writexml(file, "\t", "\t", "\n")
  131. else:
  132. self._meta_element.writexml(file)
  133. #if self.verbosity > 1:
  134. # print "created %d atlasses" % (totalAtlasses, )
  135. if self.warnings or self.errors:
  136. print "warnings %d, errors %d" % (self.warnings, self.errors)