doupoa
一个不甘落后的热血青年!
Ping通途说

软件著作权(软著)源代码整理生成脚本

在申请软著时需要提供自己编写程序的源代码。根据官方要求

源代码文档不应少于60页,前30页和后30页的代码应连续,每页50行。代码中不应有空行和大段注释。

那意思就是可以包含简单注释,而且还是单行注释。我们在写软件时可能会把注释同代码写在一行中,那可以通过脚本快速处理并完成源代码格式要求。

主要功能还是基于正则,例如,

将非独立一行的注释转移到新的一行:content = re.sub(r'(?<!\n)(#[^\n]*)', '\n<1>', content)

清除/替换URL:content = re.sub(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', 'URL_PLACEHOLDER', content)

特殊情况下,清除单行或多行注释:content = re.sub(r"(#[^\n]*)|(\'\'\'.*?\'\'\')|(\"\"\".*?\"\"\")", '', content, flags=re.DOTALL)

来看看完整代码:

# 本文件用于合并软著代码
import re
import os

# 记得用 r"" 包括路径
files_list = [
    r"server\main.py",
]

# 主要逻辑: 读取文件清除代码注释,清除空白行,最后合并文件内容

files_suffix = ["py", "js"]  # 需要合并的文件后缀
pass_files = ["config.toml", "requirements.txt", "README.md", "LICENSE", "index.html"]  # 不需要合并的文件
pass_path = [".venv"] # 无需扫描的文件夹

if not any(files_list):
    print("未自定义文件列表,开始自动搜索")
    for root, dirs, files in os.walk("."):
        if any([pass_dir in root for pass_dir in pass_path]):
            continue
        for file in files:
            if file.endswith(tuple(files_suffix)) and file not in pass_files:
                files_list.append(os.path.join(root, file))
    print(f"共找到 {len(files_list)} 个文件")
exit()
contents = ""
for file in files_list:
    with open(file, "r", encoding="utf-8") as f:
        content = f.read()
        # 将非独立一行的注释转移到新的一行
        content = re.sub(r'(?<!\n)(#[^\n]*)', '\n<1>', content)
        # 清除URL
        content = re.sub(
            r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', 'URL_PLACEHOLDER', content)
        # 清除注释
        # content = re.sub(r"(#[^\n]*)|(\'\'\'.*?\'\'\')|(\"\"\".*?\"\"\")", '', content, flags=re.DOTALL) # 清除单行和多行注释
        print(f"文件 {file} 合并成功,共 {len(content)} 字符")
        contents += content

# 清除空白行
content = re.sub(r'\n\s*\n', '\n', contents)
if os.path.exists("code.txt"):
    os.remove("code.txt")
with open("code.txt", "w", encoding="utf-8") as f:
    f.write(content)  # 将合并后的内容写入文件
lines = content.split("\n")
print(f"总共有 {len("".join(lines))} 字,有 {len(lines)} 行,可写 {len(lines)/50} 页")

可以看到代码开头,files_list 由你自己定义要合并的代码。如果 files_list 为空,就会以脚本为根遍历同级和下级后缀属于 files_suffix 内的所有文件。此外可以通过 pass_path 跳过不想扫描的文件夹。脚本运行后会在脚本根目录生成 code.txt,随后就可以粘贴至源代码中了。

在此提供一个模板,直接粘贴代码即可,记得修改页头和文件名称。

0
0
赞赏

doupoa

文章作者

诶嘿

发表回复

textsms
account_circle
email

Ping通途说

软件著作权(软著)源代码整理生成脚本
在申请软著时需要提供自己编写程序的源代码。根据官方要求: 源代码文档不应少于60页,前30页和后30页的代码应连续,每页50行。代码中不应有空行和大段注释。 那意思就是可以包含…
扫描二维码继续阅读
2025-04-25

Optimized by WPJAM Basic