注释提取及回滚

目的:iOS SDK 开发,代码不应带有注释,但是为方便后续开发,注释还是需要的。(还有点问题,主要是正则问题,待我正则有所小成再来搞定它(这个问题已针对我自身代码搞定了)

目标:将代码中注释内容提取写入txt文件,将原注释位置用特定标识替换,待打包完成后再将注释内容回滚。

提取注释:注释方式包括 “//注视著是” 、“#pragma mark - 注释注释”、“/*注视著是*/” 三种

大体步骤:

  提取注释

  1、获取指定文件路径下的所有 .h 和 .m 和.mm 文件

  2、提取 1 中的所有文件的注释并替换为uuid

  3、格式化成json写入txt文件

  回滚

  1、获取指定文件路径下的所有 .h 和 .m和.mm 文件

  2、获取回滚文件内容,遍历回滚文件和工程文件,将特定字符串替换为原注释内容

 具体体现:

  替换前:

    // 加载pop

    /** 展示Pop 推荐使用链式语法 */

    #pragma mark - 颜色转换

  替换后:

    //e295ea66-cf58-11e7-bff7-a860b63b7bbf

    /*e295d9cf-cf58-11e7-b8d3-a860b63b7bbf*/

    //e295e1ba-cf58-11e7-bd21-a860b63b7bbf

使用:

  提取

  

  回滚

  

代码:

#!/usr/bin/env python
#coding=utf8
import os
import re
import json
import sys
import uuid

reload(sys)
sys.setdefaultencoding('utf8')

#获取路径下的所有文件
def get_all_files():
path = raw_input('工程路径:')

try:
all_files = []
for root, dirs, files in os.walk(path):
for file in files:
if os.path.splitext(file)[1] == '.m' or os.path.splitext(file)[1] == '.h' or os.path.splitext(file)[1] == '.mm':
all_files.append(os.path.join(root, file))
except:
print '获取文件失败'

return all_files

#提取注释写入文件
def get_all_content():
files = get_all_files()
re_before_contents = []

rollback_path = raw_input('写入文件路径:')

for index_pag, file_path in enumerate(files):

print '进度',index_pag + 1,'/',len(files)

with open(file_path,'r') as file:

#全部内容
content = file.read()

#多行注释
mlines_mth = re.findall("\/\*[^(;q=0.8)].*?\*\/",content,re.S)

for item in mlines_mth:

re_content = '/*' + str(uuid.uuid1()) + '*/'
save_arr = [re_content, item]
re_before_contents.append(save_arr)
content = content.replace(item,re_content,1)

#正常注释
normal_mth = re.findall("//[^\n(mclient)(sdktest)].*?$",content, flags=re.DOTALL+re.MULTILINE)

for item in normal_mth:

re_content = '//' + str(uuid.uuid1())
save_arr = [re_content, item]
re_before_contents.append(save_arr)
content = content.replace(item,re_content,1)

#mark 注释
mark_mth = re.findall("#pragma mark.*?\n", content)

for item in mark_mth:

re_content = '//' + str(uuid.uuid1()) + '\n'
save_arr = [re_content, item]
re_before_contents.append(save_arr)
content = content.replace(item,re_content,1)

with open(file_path, 'w') as new_file:
new_file.write(content)

with open(rollback_path,'w') as file:
JsonStr = json.dumps(re_before_contents)
file.write(JsonStr)

def get_annotation():
files = get_all_files()

rollback_path = raw_input('回滚文件路径:')

with open(rollback_path, 'r') as file:
content = file.read()
content_list = list(json.loads(content))

for re_index, file_path in enumerate(files):

with open(file_path, 'r') as file:
content = file.read()

print '回滚进度:', re_index + 1, '/', len(files)

index = 0

while True:

if index < len(content_list):

re_content = content_list[index]

if re_content[0] in content:

content = content.replace(re_content[0], re_content[1])
content_list.remove(re_content)
content_list = content_list

else:
index += 1

else:
break

with open(file_path, 'w') as new_file:
new_file.write(content)


if __name__ == "__main__":

select_method = raw_input('1 or "空" -> 替换注释 2 -> 回滚注释\n')

if select_method == '1' or select_method == '':#提取注释内容
get_all_content()
elif select_method == '2':#还原
get_annotation()
else:
print '结束'

#/Users/jb-mac/Desktop/JBSDK_webpay_commit
#/Users/jb-mac/Desktop/content.txt
 

 

posted @ 2017-11-17 10:40  zzlei  阅读(591)  评论(0编辑  收藏  举报