一. 内容简介
软著代码整理工具(针对cpp代码),python实现
二. 软件环境
2.1vsCode
2.2Anaconda
version: conda 22.9.0
2.3代码链接
https://gitee.com/JJW_1601897441/csdn
三.主要流程
3.1 格式要求
-
代码语法要求
对软件著作权提交源代码是提供原始的代码(不是关键代码)语法上要求代码具备完整性。而且要求提交者提供的源代码是对应的代码文件的最原始文本信息。
例如:C++代码应该是以include之类作为开头,而不能以函数开头;
C#代码应该是using之类作为开头,而不能以函数开头;
-
首页要求
对软件著作权提交源代码的首页应该具备以下至少一种情况所在的页面的原始代码;
a.主函数
b.程序的入口(比如登录函数)
c.主页(比如index default页面)
-
避免因素
对软件著作权提交的源代码尽量少提供或者不提供设计器生成的代码;
例如:以C#语言设计器生成的代码语言文件一般为XXXt.designer.cs
-
提交数量要求
对软件著作权申请都要提供软件60页的源代码,超出60页的应至少提交最前和最后的各连续30页源程序文本,不足60页的,应当将所有的源程序文本全部提交,程序要有比较鲜明的开始段落和结尾的段落,还注意去掉一些注释性的内容。
例如: 要求是50行一页,如果你的源程序文件有59页,那就要提交全部的文件,即59页;如果你的源程序文件有个100页,那只需要提交前30页和最后的30页(70-100页),当中的不用提交。
-
程序数量要求
对软件著作权提交源代码的源程序要求每页有50行程序代码,并要求前30页是程序的前半部分有开头并具有连续性,后30页是程序的后半部分包括结尾也要具有连续性。30和31页之间可以不连续。
-
注意事项
源程序和文档都应当在页眉上标注相应的软件名称和版本号,在每页的右上角通过电脑以阿拉伯数字连续标注页码。除第60页外,每页不能出现只有半页代码的情况。
软件著作权对提交源代码的格式要求:
字号不大于13,除第60页外,每页不少于50行,纯空白行不算;
包含人名、地址、时间、版权的注释全部删掉,大段乱码、描述性的注释删掉;
第1页第一行必须是软件或模块开头,第60页一行必须是软件或模块结尾。
官网找的,官网只写了这个
4.软件鉴别材料
一般交存:
源程序的连续的前30页和连续的后30页;
提交任何一种文档的连续的前30页和连续的后30页。
整个程序和文档不到60页的,应当提交整个源程序和文档。除特定情况外,程序每页不少于50行,文档每页不少于30行。
例外交存,选择下列方式之一:
a.提交源程序的前、后各连续的30页,其中的机密部分用黑色宽斜线覆盖,但覆盖部分不得超过交存源程序的50%;
b.提交源程序连续的前10页和任何部分的连续的50页;
c.提交目标程序的前、后连续的30页和源程序的任何部分的连续的20页。
3.2 格式处理
python读出目录的所有文件
import os
def get_files_by_extensions(extensions):
current_directory = os.getcwd()
files = []
for file_name in os.listdir(current_directory):
if os.path.isfile(file_name) and any(file_name.endswith(ext) for ext in extensions):
files.append(file_name)
return files
if __name__ == "__main__":
# 让用户输入文件类型,可以输入多个类型,以空格分隔,例如:cpp h txt
extensions = ['cpp', 'h']
files = get_files_by_extensions(extensions)
print(files)
读出clang-format.exe应用位置,用于格式化c++代码
import os
def get_files_by_extensions(extensions):
current_directory = os.getcwd()
files = []
for file_name in os.listdir(current_directory):
file_path = os.path.join(current_directory, file_name)
if os.path.isfile(file_path) and any(file_name.endswith(ext) for ext in extensions):
files.append(file_path)
return files
if __name__ == "__main__":
# 让用户输入文件类型,可以输入多个类型,以空格分隔,例如:cpp h txt
extensions = ["exe"]
files = get_files_by_extensions(extensions)
print(files)
然后对读出来的代码进行格式化处理
import subprocess
def format_cpp_file(file_path):
try:
# Run clang-format command to format the C++ file
subprocess.run([clang_format_path, '-i', file_path], check=True)
print(f"{file_path} formatted successfully.")
except subprocess.CalledProcessError as e:
print(f"Error occurred while formatting {file_path}: {e}")
# Example usage:
# 批量格式化
for element in files:
print(element)
format_cpp_file(element)
格式要求,在.clang-format文件中设置
BasedOnStyle: Microsoft
IndentWidth: 4
UseTab: Never
TabWidth: 4
ColumnLimit: 120
BraceWrapping:
AfterControlStatement: true
PreserveBlocks: true
SpaceBeforeParens:
ControlStatements: true
Always: true
CommentPragmas: '^ MY_PRAGMA'
AllowAllParametersOfDeclarationOnNextLine: true
PointerAlignment: Left
ContinuationIndentWidth: 4
然后就是清除注释
import re
def clearCcomment(file_path):
# 读取文件内容
with open(file_path, 'r') as file:
content = file.read()
# 使用正则表达式删除C++注释
# 删除多行注释 /* ... */
content = re.sub(r'/\*.*?\*/', '', content, flags=re.DOTALL)
# 删除单行注释 // ...
content = re.sub(r'//.*', '', content)
# 将修改后的内容写回文件
with open(file_path, 'w') as file:
file.write(content)
for element in files:
print(element)
clearCcomment(element)
print(element+"formatted successfully")
清除空格
def clearSpaces(file_path ):
# 以读写模式打开C++或H文件
# 读取文件内容
with open(file_path, 'r') as file:
lines = file.readlines()
# 删除空白行
non_empty_lines = [line for line in lines if line.strip()]
# 将修改后的内容写回文件
with open(file_path, 'w') as file:
file.write(''.join(non_empty_lines))
for element in files:
print(element)
clearSpaces(element)
print(element+"formatted successfully")
然后统计代码行数
def count_lines_in_cpp_file(file_path):
try:
# 打开C++文件并读取内容
with open(file_path, 'r') as file:
lines = file.readlines()
return len(lines)
except FileNotFoundError:
print(f"文件 '{file_path}' 未找到。")
return -1
sum = 0
for element in files:
print(element)
line_count = count_lines_in_cpp_file(element)
sum = sum + line_count
print(element+"formatted successfully")
if line_count >= 0:
print(f"文件 '{element}' 共有 {line_count} 行。")
print(f"总行数 '{sum}' 行")
3.3 自己处理
看要求,自己整理一下哪些代码放前面,哪些放后面,感觉直接批量生成的可能不太符合要求,自己手动选一下代码把,
3.4 读入代码,按要求生成文档
选完代码以后,把代码放入code.txt,写入的是按一页五十行代码写入的,代码都在上面那个链接里面,我演示的代码就不放了
然后拷贝一下模板文件
import shutil
def copy_docx(original_docx_file_path, new_docx_file_path):
shutil.copyfile(original_docx_file_path, new_docx_file_path)
if __name__ == "__main__":
original_docx_file_path = "code_copy.docx"
new_docx_file_path = "code.docx"
copy_docx(original_docx_file_path, new_docx_file_path)
把txt中的代码写入docx中
from docx import Document
from docx.shared import Pt
def read_txt_file(file_path):
with open(file_path, 'r', encoding='utf-8') as file:
return file.read().strip() # 使用 strip() 方法去除首尾空白字符
def add_text_to_docx(text, docx_file_path):
document = Document(docx_file_path)
paragraph = document.add_paragraph()
run = paragraph.add_run(text)
font = run.font
font.name = '宋体'
font.size = Pt(11)
document.save(docx_file_path)
if __name__ == "__main__":
txt_file_path = "code.txt"
docx_file_path = "code.docx"
txt_content = read_txt_file(txt_file_path)
add_text_to_docx(txt_content, docx_file_path)
写入完成以后,把第一行的空格删掉(没解决),然后把页眉改一下就好了
四.参考
【手把手教你申请软件著作权系列教程(基于本人2021年申请软件著作权一次性顺利通过后录制)】 https://www.bilibili.com/video/BV1U3411B7GJ/?share_source=copy_web&vd_source=7b377d4a833a67013df5f95f32b390f8
【软件设计说明书模版(申请软件著作权可供参考)】
http://t.csdn.cn/jJqZl
【vscode之软著代码格式整理】
http://t.csdn.cn/4qy8o