Qml-通过python实现宏功能
2020-08-31
需求:有些情况下,共用代码应用在不同的场景下。例如C/C++可使用#define+#if+#elif+#endif组合方式。交由编译器进行处理。
-- HeadFile.h
...
#define WIN_SC 0
#define LINUX_SC 1
...
-- SourceFlie.cpp
...
#if WIN_SC
printf("WIN say hello\n");
#elif LINUX_SC
printf("LINUX say hello\n");
#endif
...
碰到Qml,解释器可不会处理这些。此时需要人为对文本进行处理。
按上边的需求进行分析,实际是对文本的一种处理。
工具:python
需求:特殊字符串判定开始 关键字符 保留现有(使用 "//" )
用户:python3 sourceFileName destFileName -fk WIN_SC
file1.qml
//<AUCHPY_def WIN_SC>
console.log("there is win_sc"); ... ... //<AUCHPY_elif LINUX_SC>
//console.log("there is linux_sc"); ... ... //<AUCHPY_endif>
defPython.py
#!/usr/bin/python3
# filename:defpython.py
# writer:auchone
# copyright:say "kekesa"
# exp:
# >> python3 defPython.py file1.qml file1_new.qml -fk WIN_SC
import sys
if(len(sys.argv) != 5)"
print("input parament format error,should:\n python3 fileName.py Afile Bfile -fk FILTERKEY")
exit()
elif( ( " ".join(sys.argv) ).find("-fk") == -1):
print("this pythonFile need \"-fk\" to declare")
exit()
print("this pythonScript:",sys.argv[0])
print("deal ... .... ... file:",sys.argv[1])
print("creat ... ... .. file:",sys.argv[2])
print("filter key... .. file:",sys.argv[4])
dealFile = sys.argv[1]
creatFile = sys.argv[2]
filterKey = sys.argv[4]
keyBegin = "//<AUCHIFDEF"
keyMore = "//<AUCHELIF"
#keyElse = "//<AUCHELSE>" #still not clear now-20200831
keyEnd = "//<AUCHENDIF>"
isGoStart = 0 #dealing right now
isFindFilter = 0 #will dele the 1st commit in line
with open(creatFile,'w') as dfile
with open(dealFile, 'r') as sfile
for line in sfile
if(line.find(keyBegin) != -1): #effect judge?
dfile.write(line)
isGoStart = 1 #effect-we can commit something
if(line.find(filterKey) != -1):#effect work-we should free something
isFindFilter = 1
elif(line.find(keyMore) != -1): #still effect judge?
dfile.write(line)
if(line.find(filterKey) != -1):
isFindFilter = 1
else:
isFindFilter = 0 #close the effect work
# elif(line.find(keyElse): #the default
elif(line.find(keyEnd) != -1): #stop the effect
dfile.write(line)
isGoStart = 0
isFindFilter = 0
elif(isFindFilter == 1): #effect working:
theCommit_First = line.find("//")
if(theCommit_First != -1):
idx = 0
while( idx < theCommit_First ):# " only the " //"worked,"abcd//"wont work
if(line.find(" ",idx,idx+1) != -1):
idx+=1
else:
dfile.write(line)
break;
if(idx == theCommit_First):
dfile.write(line.replace("//"," ",1))#dele commit
else:
dfile.write(line)
elif(isGoStart == 1): #effect but to comit
theCommit_First = line.find("//")
if(theCommit_First != -1):
idx = 0
while(idx < theCommit1st):
if(line.find(" ",idx,idx+1) != -1):
idx+=1
else:
dfile.write("//"+line)
break
if(idx == theCommit1st):
dfile.write(line)
else:
dfile.write("//"+line)#add commit
else:
dfile.write(line)
#Regards
#Auch_One
>> python3 defPython.py file1.qml file1_after.qml -fk LINUX_SC
结果:file1_after.qml
//<AUCHPY_def WIN_SC>
//console.log("there is win_sc");
... ...
//<AUCHPY_elif LINUX_SC>
console.log("there is linux_sc");
... ...
//<AUCHPY_endif>
ps:单一嵌套,else 默认, /**/ : 2020-08-31未定,有时间再搞下
浙公网安备 33010602011771号