xml_processor.py 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  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 XmlWalker:
  9. def __init__(self, src, folder, scale_factor, node, meta_node, scale_quality):
  10. self.base = folder
  11. self.path = folder
  12. self.scale_factor = scale_factor
  13. self.root = node
  14. self.last = None
  15. self.root_meta = meta_node
  16. self.last_meta = None
  17. self.src = src
  18. self.scale_quality = scale_quality
  19. self.checkSetAttributes()
  20. def getType(self):
  21. return self.root
  22. def getPath(self, attr):
  23. path = self.root.getAttribute(attr)
  24. if path.startswith("./") or path.startswith(".\\"):
  25. path = path[2:len(path)]
  26. return self.path + path
  27. def setSrcFullPath(self, path):
  28. return self.src + path
  29. def checkSetAttributes(self):
  30. self._checkSetAttributes(self.root)
  31. def _checkSetAttributes(self, node):
  32. path = node.getAttribute("path")
  33. if path:
  34. if 0:
  35. path = ""
  36. if path.startswith("./") or path.startswith(".\\"):
  37. path = self.base + path[2:len(path)]
  38. self.path = path + "/"
  39. scale_factor = node.getAttribute("scale_factor")
  40. if scale_factor:
  41. self.scale_factor = float(scale_factor)
  42. scale_quality = node.getAttribute("scale_quality")
  43. if scale_quality:
  44. self.scale_quality = float(scale_quality)
  45. def next(self):
  46. while True:
  47. if not self.last:
  48. if len(self.root.childNodes) == 0:
  49. return None
  50. self.last = self.root.childNodes[0]
  51. else:
  52. self.last = self.last.nextSibling
  53. if not self.last:
  54. return None
  55. if self.last.nodeType == self.last.TEXT_NODE:
  56. continue
  57. if self.last.nodeType == self.last.COMMENT_NODE:
  58. continue
  59. meta = self.root_meta.ownerDocument.createElement(self.last.nodeName)
  60. self.root_meta.appendChild(meta)
  61. self.last_meta = meta
  62. if self.last.nodeName == "set":
  63. self._checkSetAttributes(self.last)
  64. continue
  65. break
  66. return XmlWalker(self.src, self.path, self.scale_factor, self.last, self.last_meta, self.scale_quality)
  67. class XmlProcessor:
  68. def __init__(self, args):
  69. self.src_data = args.src_data + "/"
  70. self.dest_data = args.dest_data + "/"
  71. self.compression = args.compression.lower()
  72. #self.etc1tool = args.android_sdk + "\\tools\\etc1tool.exe "
  73. #if self.compression == "etc1":
  74. # if not os.path.exists(self.etc1tool):
  75. # raise Exception("can't find etc1tool. please pass correct path to android_sdk")
  76. self.path_xml = args.xml
  77. self.xml_name = os.path.split(self.path_xml)[1]
  78. self.atlas_group_id = 0
  79. self.args = args
  80. self.verbosity = args.verbosity
  81. self.warnings = 0
  82. self.errors = 0
  83. #self.scale_factor = 1.0
  84. #self.scale_quality = 1.0
  85. self.scale = args.scale
  86. self.debug = args.debug
  87. self.processors = {}
  88. #self.path_current = ""
  89. self._meta_doc = None
  90. #self._meta_element = None
  91. self.helper = oxygine_helper.helper(os.path.split(__file__)[0] + "/../../")
  92. self.register_processor(process_font.bmfc_font_Processor())
  93. self.register_processor(process_font.font_Processor())
  94. self.register_processor(process_atlas.atlas_Processor())
  95. self.register_processor(process_starling_atlas.starling_atlas_Processor())
  96. self._current_processor = None
  97. def register_processor(self, processor):
  98. self.processors[processor.node_id] = processor
  99. def get_apply_scale(self, applyScaleFactor, walker):
  100. """
  101. returns scale should be applied to image
  102. """
  103. v = self.scale * walker.scale_quality
  104. if applyScaleFactor:
  105. v *= walker.scale_factor
  106. return v
  107. """
  108. def add_meta(self, node_id = ""):
  109. if not node_id:
  110. node_id = self._current_processor.node_id
  111. meta = self._meta_doc.createElement(node_id)
  112. self._meta_element.appendChild(meta)
  113. return meta
  114. def get_meta_doc(self):
  115. return self._meta_doc
  116. """
  117. """
  118. def _process_set(self, el):
  119. path = el.getAttribute("path")
  120. if path:
  121. if path.startswith(".\\") or path.startswith("./"):
  122. path = self.path_current + path
  123. path = os.path.normpath(path) + "/"
  124. self.path_current = path
  125. scale_factor = el.getAttribute("scale_factor")
  126. if scale_factor:
  127. self.scale_factor = float(scale_factor)
  128. scale_quality = el.getAttribute("scale_quality")
  129. if scale_quality:
  130. self.scale_quality = float(scale_quality)
  131. self.add_meta("set");
  132. """
  133. def _open_xml(self, path):
  134. with open(path, "r") as file:
  135. font_doc = minidom.parse(file)
  136. return font_doc.documentElement
  137. def _get_src_path(self, local_path):
  138. return self.src_data + local_path
  139. def _get_dest_path(self, local_path):
  140. return self.dest_data + local_path
  141. def _get_meta_xml_path(self, local_path):
  142. return self._get_dest_path(self.xml_name) + ".ox" + "/" + local_path
  143. """
  144. def get_current_src_path(self, local = ""):
  145. return self._get_src_path(self.path_current + local)
  146. """
  147. def get_inner_dest(self, inner_local_path = ""):
  148. return self._get_meta_xml_path(self._current_processor.node_id + "/" + inner_local_path)
  149. def log(self, st):
  150. print st
  151. def warning(self, st):
  152. if self.args.warnings:
  153. print "warning: " + st
  154. def error(self, st):
  155. print "error: " + st
  156. def process(self):
  157. #print self.path_data
  158. #print self.path_xml
  159. #print self.path_atlasses
  160. try:
  161. nm = self._get_src_path(self.path_xml)
  162. file = open(nm, "r")
  163. except IOError:
  164. print "can't open file: " + nm
  165. return
  166. doc = minidom.parse(file)
  167. del file
  168. self._meta_doc = minidom.Document()
  169. meta_element = self._meta_doc.createElement("resources")
  170. self._meta_doc.appendChild(meta_element)
  171. totalAtlasses = 0
  172. folder = self._get_meta_xml_path("")
  173. shutil.rmtree(folder, True)
  174. try:
  175. os.makedirs(folder)
  176. except OSError:
  177. pass
  178. xml_folder = os.path.split(self.path_xml)[0] + "/"
  179. walker = XmlWalker(self.src_data, xml_folder, 1.0, doc.documentElement, meta_element, 1.0)
  180. while True:
  181. next = walker.next();
  182. if not next:
  183. break
  184. name = next.root.nodeName
  185. if name in self.processors:
  186. proc = self.processors[name]
  187. self._current_processor = proc
  188. try:
  189. if proc.create_folder:
  190. os.makedirs(self.get_inner_dest(""))
  191. except OSError:
  192. pass
  193. proc.process(self, next)
  194. """
  195. for el in doc.documentElement.childNodes:
  196. name = el.nodeName
  197. if name in self.processors:
  198. proc = self.processors[name]
  199. self._current_processor = proc
  200. try:
  201. if proc.create_folder:
  202. os.makedirs(self.get_inner_dest(""))
  203. except OSError:
  204. pass
  205. proc.process(self, el)
  206. if name == "set":
  207. self._process_set(el)
  208. if name == "sdfont":
  209. self._process_sdf_font(el)
  210. """
  211. path_ox_dest = self._get_meta_xml_path("meta.xml")
  212. file = open(path_ox_dest, "w")
  213. if self.verbosity > 1:
  214. print "saving ox file: \n" + os.path.normpath(path_ox_dest)
  215. if self.args.debug:
  216. meta_element.writexml(file, "\t", "\t", "\n")
  217. else:
  218. meta_element.writexml(file)
  219. #if self.verbosity > 1:
  220. # print "created %d atlasses" % (totalAtlasses, )
  221. if self.warnings or self.errors:
  222. print "warnings %d, errors %d" % (self.warnings, self.errors)