cn-swcr 1.0.0
Python LibGen helper functions
License: MIT
Requires Python: >=3.6.0

# cn-swcr：中国计算机软件著作权程序鉴别材料（即源代码）生成器

## 安装

```shell script
pip install cn_swcr
```

## 背景

工作中需要申请软件著作权，软件著作权需要提供以下材料：

1. 申请表：可以在官网通过网页生成
2. 身份证明：企业的话一般就是营业执照
3. 程序鉴别材料：一般就是源代码整理出的PDF文件
4. 文档鉴别材料：一般就是该软件的操作手册

申请表身份证明比较好准备，文档鉴别材料则必须手写，`cn-swcr`则用于生成程序鉴别材料。

## 使用

### 注意事项

1. 程序鉴别材料要求超过60页的保留前30页+后30页，本程序把所有代码都输出了，如果有代码多余60页的需要手动删除中间代码。
2. 本程序暂未实现自动页码，请手工生成页眉页码（右侧对齐）
3. 本程序暂未实现页眉横线，请手工生成

### 程序鉴别材料要求

1. 每页至少50行
2. 不能含有注释、空行
3. 页眉部分必须包含软件名称、版本号、页码，
   大概是这样：`         软件名称V1.2         1`，
   即软件名+版本号居中，页码右侧对齐

### 如何实现每页50行

上述3点，第2、3两点比较好实现，第1点我通过测试发现，当：

1. 字号为10.5pt
2. 行间距为10.5pt
3. 段前间距为0
4. 段后间距为2.3pt

时，刚好实现每页50行。

### 参数

```
cn-swcr --help
Usage: cn-swcr [OPTIONS]

Options:
  -t, --title TEXT            软件名称+版本号，默认为软著程序鉴别材料生成器V1.0，此名称用于生成页眉
  -i, --indir PATH            源码所在文件夹，可以指定多个，默认为当前目录
  -e, --ext TEXT              源代码后缀，可以指定多个，默认为Python源代码
  -c, --comment-char TEXT     注释字符串，可以指定多个，默认为#、//
  --font-name TEXT            字体，默认为宋体
  --font-size FLOAT RANGE     字号，默认为五号，即10.5号
  --space-before FLOAT RANGE  段前间距，默认为0
  --space-after FLOAT RANGE   段后间距，默认为2.3
  --line-spacing FLOAT RANGE  行距，默认为固定值10.5
  --exclude PATH              需要排除的文件或路径，可以指定多个
  -o, --outfile PATH          输出文件（docx格式），默认为当前目录的code.docx
  -v, --verbose               打印调试信息
  --help                      Show this message and exit.
```

### 示例

下面以[django项目](https://github.com/django/django)为例来说明`cn-swcr`的用法。

首先，克隆代码：

```shell script
git clone git@github.com:django/django.git
```

生成文档：

```shell script
cn-swcr \
    -t 'Django V3.1.3' \
    -i django/ \
    -e py -e js -e html -e css \
    -c '#' -c '//' \
    --exclude django/docs/ \
    --exclude django/tests/ \
    --exclude django/js_tests/ \
    --exclude django/scripts/ \
    --exclude django/extras/ \
    --exclude django/django/conf/ \
    --exclude django/django/contrib/ \
    --exclude django/django/forms/ \
    -o django.docx
```

1. `-t 'Django V3.1.3'`：指定页眉部分为`Django V3.1.3`
2. `-i django/`：指定源代码目录为当前目录下的`django`目录
3. `-e py -e js -e html -e css`：`py`、`js`、`html`、`css`4中格式为源码文件。
4. `-c '#' -c '//'`：指定以`#`、`//`开头的都是注释行，应该删掉
5. `--exclude`：指定哪些文件或文件夹下的代码会被排除（当然也可以指定文件），本例中:

    * `django/docs/`
    * `django/tests/`
    * `django/js_tests/`
    * `django/scripts/`
    * `django/extras/`
    * `django/django/conf/`
    * `django/django/contrib/`
    * `django/django/forms/`
    
    这些文件夹下的所有文件都被排除。
6. `-o`：指定生成的文件保存到`django.docx`中。

也可以指定多个源代码文件目录，例如：

```shell script
cn-swcr \
    -t 'Django V3.1.3' \
    -i django/django/core/ \
    -i django/django/utils/ \
    -e py -e js -e html -e css \
    -c '#' -c '//' \
    -o django.docx
```

还可以通过`-v`参数打印更多信息，例如：

```shell script
cn-swcr \
    -t 'Django V3.1.3' \
    -i django/ \
    -e py -e js -e html -e css \
    -c '#' -c '//' \
    --exclude django/docs/ \
    --exclude django/tests/ \
    --exclude django/js_tests/ \
    --exclude django/scripts/ \
    --exclude django/extras/ \
    --exclude django/django/conf/ \
    --exclude django/django/contrib/ \
    --exclude django/django/forms/ \
    -o django.docx \
    -v
```

输出：

```
...
DEBUG:cn_swcr:在/Users/dev/Temp/django/django/utils/translation目录下找到5个代码文件.
DEBUG:cn_swcr:在/Users/dev/Temp/django/django/utils目录下找到47个代码文件.
DEBUG:cn_swcr:在/Users/dev/Temp/django/django/http目录下找到5个代码文件.
DEBUG:cn_swcr:在/Users/dev/Temp/django/django/urls目录下找到7个代码文件.
DEBUG:cn_swcr:在/Users/dev/Temp/django/django/db/migrations/operations目录下找到6个代码文件.
DEBUG:cn_swcr:在/Users/dev/Temp/django/django/db/migrations目录下找到20个代码文件.
DEBUG:cn_swcr:在/Users/dev/Temp/django/django/db/backends/postgresql目录下找到8个代码文件.
DEBUG:cn_swcr:在/Users/dev/Temp/django/django/db/backends/dummy目录下找到3个代码文件.
DEBUG:cn_swcr:在/Users/dev/Temp/django/django/db/backends/oracle目录下找到11个代码文件.
DEBUG:cn_swcr:在/Users/dev/Temp/django/django/db/backends/sqlite3目录下找到8个代码文件.
DEBUG:cn_swcr:在/Users/dev/Temp/django/django/db/backends/mysql目录下找到10个代码文件.
DEBUG:cn_swcr:在/Users/dev/Temp/django/django/db/backends/base目录下找到9个代码文件.
DEBUG:cn_swcr:在/Users/dev/Temp/django/django/db/backends目录下找到53个代码文件.
DEBUG:cn_swcr:在/Users/dev/Temp/django/django/db/models/functions目录下找到7个代码文件.
DEBUG:cn_swcr:在/Users/dev/Temp/django/django/db/models/fields目录下找到9个代码文件.
DEBUG:cn_swcr:在/Users/dev/Temp/django/django/db/models/sql目录下找到7个代码文件.
DEBUG:cn_swcr:在/Users/dev/Temp/django/django/db/models目录下找到39个代码文件.
DEBUG:cn_swcr:在/Users/dev/Temp/django/django/db目录下找到115个代码文件.
DEBUG:cn_swcr:在/Users/dev/Temp/django/django/views/decorators目录下找到9个代码文件.
DEBUG:cn_swcr:在/Users/dev/Temp/django/django/views/templates目录下找到3个代码文件.
DEBUG:cn_swcr:在/Users/dev/Temp/django/django/views/generic目录下找到6个代码文件.
DEBUG:cn_swcr:在/Users/dev/Temp/django/django/views目录下找到24个代码文件.
DEBUG:cn_swcr:在/Users/dev/Temp/django/django/apps目录下找到3个代码文件.
DEBUG:cn_swcr:在/Users/dev/Temp/django/django目录下找到354个代码文件.
DEBUG:cn_swcr:在/Users/dev/Temp/django目录下找到356个代码文件.
```