#!/usr/bin/env python
# encoding: utf-8
import sys
import os
import re
import hashlib
import uuid
import weakref
reload(sys)
# PBX解析类
class PBXProjectHelper (object) :
def __init__(self, path) :
super (PBXProjectHelper, self).__init__()
if os.path.exists (path) :
self.path = path
# print "开始解析PBX路径 = %s" %path
pbxprojFile = open(path, 'r')
pbxprojData = pbxprojFile.read()
# print "项目数据 = %s" %pbxprojData
# 解释项目数据
self.__parseDocument (pbxprojData)
# 构造Project
projectId = self.root ["rootObject"]
self.project = PBXProject(weakref.proxy(self), projectId, self.root ["objects"][projectId])
else :
print "无效的PBX路径 = %s" %path
# 解析文档
def __parseDocument (self, projData) :
pos = 0
# 取得头描述,
if len (projData) > 2 and projData [0] == "/" and projData [1] == "/" :
start = pos = 2
while len (projData) > pos and projData[pos] != "\n":
pos += 1
self.header = projData [start : pos].strip()
# print "pbx header = %s" %self.header
projData = projData[pos:]
# 去除所有注释内容
(projData, num) = re.subn ("\/\*.*?\*\/", "", projData)
# 获取带引号值
self.__quotValues = []
for match in re.finditer("((\".*?\")\s*=\s*)?(\".*?\")[;|,]", projData) :
if match :
matchGroups = match.groups();
if matchGroups[1] != None :
# print "++++ quot key = %s" %matchGroups[1]
self.__quotValues.append(matchGroups[1])
if matchGroups[2] != None :
# print "++++ quot value = %s" %matchGroups[2]
self.__quotValues.append(matchGroups[2])
# 过滤空白字符
(projData, num) = re.subn ("\s+", "", projData)
# print "projData = %s" %projData
pos = 0
if projData [pos] == "{" :
(self.root, pos) = self.__parseDictionary (projData, pos + 1)
# print "解析成功! root = %s" %self.root
else :
print "无效的PBX数据!"
self.header = None
self.root = None
# 解析数据
def __parseData (self, projData, start) :
data = None
datatype = 0
c = projData[start]
if c == "{" :
# 字典
datatype = 1
(data, end) = self.__parseDictionary (projData, start + 1)
elif c == "(" :
# 数组
datatype = 2
(data, end) = self.__parseArray (projData, start + 1)
else :
# 单值
datatype = 3
(data, end) = self.__parseSimpleValue (projData, start)
return data, datatype, end
# 解析字典数据
def __parseDictionary (self, projData, start) :
dictValue = {}
end = start
# print "++++++++++start dict"
while len (projData) > end and projData [end] != "}" :
(key, value, end) = self.__parseKeyValuePair (projData, end)
if key :
# print "key = %s, value = %s" %(key, value)
dictValue [key] = value
if len (projData) > end + 1 and (projData [end + 1] == ";" or projData [end + 1] == ",") :
end += 1
# print "++++++++++end dict"
return dictValue, end + 1
# 解析字典的键值对
def __parseKeyValuePair (self, projData, start) :
key = None
value = None
end = start
isQuotStart = False
if projData[end] == "\"" :
end += 1
isQuotStart = True
while len (projData) > end :
hasFindKey = False
if isQuotStart :
if projData[end] == "\"" :
end += 1
hasFindKey = True
elif projData [end] == "=" :
hasFindKey = True
if hasFindKey :
key = projData [start : end]
# print "find key = %s" %key
if isQuotStart :
key = self.__quotValues [0]
# print "==== quot key = %s" %(key)
del self.__quotValues [0]
# 获取值
(value, datatype, end) = self.__parseData (projData, end + 1)
break
else :
end += 1
return (key, value, end)
# 解析数组数据
def __parseArray (self, projData, start) :
arrayValue = []
end = start
# print "================start array"
while len (projData) > end and projData [end] != ")" :
(elm, datatype, end) = self.__parseData (projData, end)
if elm :
# print "elm = %s" %elm
arrayValue.append (elm)
if len (projData) > end + 1 and (projData [end + 1] == ";" or projData [end + 1] == ",") :
end += 1
# print "================end array"
return arrayValue, end + 1
# 解析一个简单值
def __parseSimpleValue (self, projData, start):
value = None
end = start
isQuotStart = False
if projData [end] == "\"" :
end += 1
isQuotStart = True
while len (projData) > end :
if isQuotStart :
if projData[end] == "\"" and (projData[end + 1] == ";" or projData[end + 1] == ","):
end += 1
break
else :
end += 1
elif projData[end] == ";" or projData[end] == "," :
break
else :
end += 1
if end > start :
value = projData [start : end]
if isQuotStart :
value = self.__quotValues [0]
# print "==== quot value = %s" %(value)
del self.__quotValues [0]
return value, end + 1
# 转换值为字符串
def __valueToString(self, value, indent):
if isinstance (value, dict) :
return self.__dictToString (value, indent)
elif isinstance (value, list) :
return self.__listToString (value, indent)
else :
return self.__simpleValueToString (value, indent)
# 转换简单值为字符串
def __simpleValueToString(self, data, indent):
return data
# 转换数组为字符串
def __listToString(self, data, indent):
text = "(\n"
indent += "\t"
for value in data :
text += indent + self.__valueToString (value, indent) + ",\n"
indent = indent [0 : len (indent) - 1]
text += indent + ")"
return text
# 转换字典为字符串
def __dictToString(self, data, indent) :
text = "{\n"
indent += "\t"
for (k,v) in data.items() :
text += indent + k + " = " + self.__valueToString (v, indent) + ";\n"
indent = indent [0 : len (indent) - 1]
text += indent + "}"
return text
# 创建唯一ID
def genObjectId(self):
examplehash = "D04218DC1BA6CBB90031707C"
# uniquehash = hashlib.sha224(name).hexdigest().upper()
# uniquehash = uniquehash[:len(examplehash) - 4]
# return '365' + uniquehash
uid = str(uuid.uuid1 ())
(uid, num) = re.subn ("-", "", uid)
uid = uid.upper ()
return uid [:len(examplehash)]
# 保存修改
def save (self) :
indent = ""
projData = "// " + self.header + "\n"
projData += self.__dictToString (self.root, indent)
# print projData
# 写入到文件
project_file = open(self.path, 'w')
project_file.write(projData)
# 获取字符串值,主要提取字符串中带有双引号问题括住内容问题
def getStringValue(self, value):
for match in re.finditer("^\"?([^\"]*)\"?$", value) :
if match :
return match.groups()[0]
return value
# 转换为字符串,如果输入字符串中包含空白字符或者+特殊字符,则需要添加双引号
def converToString(self, value):
pattern = re.compile('[\s+]')
match = pattern.search(value)
if match :
return ''.join(["\"", value, "\""])
return value
# 获取对象
# @param objId 对象标识
# @param project 项目对象
def getObject(self, objId):
if objId in self.root["objects"] :
obj = self.root["objects"][objId]
isa = obj["isa"]
if isa == "PBXProject" :
return PBXProject(weakref.proxy(self), objId, obj)
elif isa == "PBXGroup" :
return PBXGroup(weakref.proxy(self), objId, obj)
elif isa == "PBXFileReference" :
return PBXFileReference(weakref.proxy(self), objId, obj)
elif isa == "PBXVariantGroup" :
return PBXVariantGroup(weakref.proxy(self), objId, obj)
elif isa == "PBXBuildFile" :
return PBXBuildFile(weakref.proxy(self), objId, obj)
elif isa == "PBXNativeTarget" :
return self.project._createTarget(objId)
elif isa == "PBXSourcesBuildPhase" :
return PBXSourcesBuildPhase(weakref.proxy(self), objId, obj)
elif isa == "PBXFrameworksBuildPhase" :
return PBXFrameworksBuildPhase(weakref.proxy(self), objId, obj)
elif isa == "PBXResourcesBuildPhase" :
return PBXResourc
一个用Python脚本实现的操作PBXProj文件(XCode项目配置文件)的工具类库
版权申诉
127 浏览量
2023-06-09
10:52:12
上传
评论
收藏 14KB ZIP 举报
Java程序员-张凯
- 粉丝: 1w+
- 资源: 6656
最新资源
- sony 索尼IMX334摄像头模组电路板AD版硬件PCB图(6层板).zip
- 基于flask和echarts融合交易策略的bitfinex可视化微服务.zip
- 包含了wvp-assist.tar wvp-talk.tar zlmediakit.tar .
- 3r4efgh53wgrf43tw
- 2024新版Java基础从入门到精通全套视频+资料下载
- Spring AI大模型视频教程+ChatGPT视频教程+OpenAI大模型视频教程(资料+视频教程)
- ABB工业机器人教程PDF版本
- 123321123323211
- yolov8实战第八天-pyqt5-yolov8实现车牌识别系统(论文(8700+字+数据集+完整部署代码+代码使用说明)
- 三相桥式全桥整流电路MATALB Simulink仿真文件
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈