-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathSkinXML.py
99 lines (84 loc) · 3.23 KB
/
SkinXML.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import os
import time
import SkinLoader
# noinspection PyPep8Naming
import xml.etree.ElementTree as ET
from xml.etree.ElementTree import Element as XMLElement
XML_SKIN_ELEMENTS = {}
XML_SKIN_TIME = {}
def get_skin_vars(skin_name):
root = load(skin_name)
xml_variables = root.find('variables')
if xml_variables is None:
return {}
rv = {}
for ss in xml_variables:
if ss.tag == 'variablegroup':
xml_var = ss.find('variable')
else:
xml_var = ss
name = xml_var.find('name')
default = xml_var.find('default')
# print(name.text, default.text)
if default is not None and default.text is not None \
and len(str(default.text)) > 0:
rv[name.text] = str(default.text)
return rv
def load(skin_name) -> XMLElement:
"""
xml 을 로드해서 파싱하는 기능.
스킨명을 기준으로 경로를 찾고, 로드하고 모듈 변수에 대입하고 값을 반환한다.
:param skin_name: 스킨이름
:return: xml오브젝트
"""
# xml 의 절대 경로
skin_path = SkinLoader.get_skin_path(skin_name)
xml_path = os.path.join(skin_path, 'index.xml')
# xml 이 존재하지 않을 경우
if not os.path.exists(xml_path):
if skin_name in XML_SKIN_ELEMENTS:
# xml_path가 없어진 skin_name에 한해서 목록에서 삭제
del XML_SKIN_ELEMENTS[skin_name]
# return False
print('index.xml이 존재하지 않습니다. 생성해주세요.')
raise
if skin_name not in XML_SKIN_ELEMENTS:
# XML_ROOT_ELEMENTS 에 없을 경우 XML을 로드한다.
print(f'load skin index.xml..({skin_name}/index.xml)')
XML_SKIN_ELEMENTS[skin_name] = load_by_path(xml_path)
XML_SKIN_TIME[skin_name] = time.time()
else:
# 데이터가 오래된 경우를 비교해서 재생성
if skin_name in XML_SKIN_TIME:
changed_at = os.path.getmtime(xml_path)
if changed_at > XML_SKIN_TIME[skin_name] + 1:
# 재생성
print(f'Detected change in ({skin_name}/index.xml), reloading..')
XML_SKIN_ELEMENTS[skin_name] = load_by_path(xml_path)
XML_SKIN_TIME[skin_name] = changed_at
# print(str(os.path.getmtime(xml_path)) + "index.xml mtime")
# print(str(XML_SKIN_TIME[skin_name]) + "XML_SKIN_TIME mtime")
return XML_SKIN_ELEMENTS[skin_name]
def load_by_path(xml_path: str) -> XMLElement:
"""
xml을 로드하는 기능만 담당하는 기능.
:param xml_path:xml의 절대경로
:return:XMLElement
"""
# print('[SkinXML] Skin XML Load by path')
# 예전 방식으로 file의 내용을 읽는 방식
# with open(xml_path, 'r', encoding='utf-8') as f:
# context = f.read()
# xml.etree.ElementTree 를 이용한 방식. (내장된 패키지임)
tree = ET.parse(xml_path)
root = tree.getroot()
# rv = root.find('skin')
return root
def get_xml_path(skin_name=None) -> str:
# index.xml 의 절대 경로를 생성
skin_path = SkinLoader.get_skin_path(skin_name)
xml_path = os.path.join(skin_path, 'index.xml')
if os.path.exists(xml_path):
return xml_path
else:
return ''