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未定,有时间再搞下

 

posted on 2020-08-31 17:11  xiubeizi  阅读(323)  评论(0)    收藏  举报

导航