# mkdocs-statistics-plugin
一个用于 mkdocs 文档统计的插件,包括全局页面数、字数、代码块行数,单页字数、代码行数、图片张数以及预计阅读时间等。
预览:<https://note.tonycrane.cc/>(只有带评论的页面有单页统计)
## 安装
可以通过 pypi 直接安装:
```shell
$ pip install mkdocs-statistics-plugin
```
也可以从源码安装
```shell
$ git clone https://github.com/TonyCrane/mkdocs-statistics-plugin.git
$ cd mkdocs-statistics-plugin
$ pip install . # or pip install -e .
```
## 使用
- 在 mkdocs.yml 中启用插件:
```yaml
plugins:
- statistics
```
配置选项及解释:
| 选项 | 类型 | 默认值 | 解释 |
|:----|:----|:----|:----|
|`pages_placeholder`|str|`\{\{\s*pages\s*\}\}`|全局统计页面中页面数占位符(正则)|
|`words_placeholder`|str|`\{\{\s*words\s*\}\}`|全局统计页面中字数占位符(正则)|
|`codes_placeholder`|str|`\{\{\s*codes\s*\}\}`|全局统计页面中代码行数占位符(正则)|
|`images_placeholder`|str|`\{\{\s*images\s*\}\}`|全局统计页面中图片张数占位符(正则)|
|`page_statistics`|bool|`True`|是否在单页中显示统计信息|
|`page_check_metadata`|str||如果为空,则所有页面都显示;否则包含指定 metadata 才显示单页统计信息|
|`page_read_time`|bool|`True`|是否显示单页预计阅读时间|
|`page_images`|bool|`True`|是否显示单页图片张数|
|`page_template`|str||单页统计信息模板相对路径(相对 docs)|
|`words_per_minute`|int|`300`|每分钟预计阅读字数|
|`codelines_per_minute`|int|`80`|每分钟预计阅读代码行数|
|`ignore_languages`|list|`["mermaid", "math"]`|不计入代码行数的语言列表|
|`include_path`|str|` `|只统计匹配的路径(正则,路径相对 docs,为空则不启用)|
|`exclude_path`|str|` `|不统计匹配的路径(正则,路径相对 docs,为空则不启用)|
### 几种使用方式
#### 全局统计页
例如在首页显示全局统计信息。需要在该页面的元数据中添加:
```yaml
---
statistics: True
---
```
然后在该页中需要的部分添加占位符,例如:
```markdown
本站共有 {{ pages }} 个页面,{{ words }} 个字,{{ codes }} 行代码,{{ images }} 张图片。
```
#### 单页统计
需要按照上述选项填写好配置(默认开启单页统计,且~~应该可以~~适配 material 主题)。
如果 `page_check_metadata` 为空,则所有页面都显示单页统计信息;否则包含指定 metadata 才显示单页统计信息。例如在我自己的设置中,包含 `comment` 的页面才显示单页统计信息(且包含 `nostatistics` 的页面不显示统计信息):
```yaml
plugins:
- statistics:
page_check_metadata: comment
```
### 高级用法
#### 自定义单页统计模板
可以通过 `page_template` 选项指定单页统计模板的相对路径(相对 docs)。这个模板会被插入到 markdown 源码的一级标题下方,会传入 `words` `code_lines` `images` `page_images` `read_time` `page_read_time` 六个模板参数。
自定义的话可以参考提供的模板。
#### 阅读时间
可以通过 `page_read_time` 选项控制是否显示单页预计阅读时间。默认开启。
可以通过 `page_images` 选项控制是否显示单页图片张数。默认开启。
阅读时间的计算方式是分别计算字数和代码行数的阅读时间,然后取二者之和,图片不计入阅读时间。可以通过 `words_per_minute` 和 `codelines_per_minute` 选项分别设置每分钟预计阅读字数和代码行数。默认情况下分别为 300 和 80,对于技术类文章这样的设置基本合理,对于其他类型例如文学类文章每分钟阅读字数应该提高到 400~600 左右较为合理。
~~计划添加页面元信息选项来为单页设置特定的阅读时间。(咕咕咕)~~
#### 字数统计细节
本插件的字数统计细节为:一个英文单词(包括数字)算一个字,一个中文汉字算一个字,标点都不算字;代码块(带语言的篱笆型语法)中所有内容都不计入字数,而是计入代码块行数统计,可以通过设置 `ignore_languages` 选项来指定不计入代码行数的语言列表(默认不计 `mermaid` 和 `math`),自定义配置写法如下:
```yaml
plugins:
- statistics:
ignore_languages:
- mermaid
- markdown
```
具体细节见 plugin.py 中的 \_clean\_markdown 方法。
#### 主题可用变量
如果需要在模板中包含本页的统计信息或希望对统计信息进行更多控制,则可以在主题(模板)中使用保存于 `page.meta` 中的变量。
| 变量 | 描述 |
| --------------------------------------- | ---------- |
| `page.meta.statistics_page_words` | 本页预估字数 |
| `page.meta.statistics_page_codes_lines` | 本页代码行数 |
| `page.meta.statistics_page_images` | 本页图片张数 |
| `page.meta.statistics_page_read_time` | 本页预估阅读时间 |
## 开发
可能很不稳定(反正至少我能跑起来),有任何问题欢迎 issue 提出。同时页欢迎任何 PR,尽管提就好。
Raw data
{
"_id": null,
"home_page": "https://github.com/TonyCrane/mkdocs-statistics-plugin",
"name": "mkdocs-statistics-plugin",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.5",
"maintainer_email": null,
"keywords": "mkdocs python markdown statistics",
"author": "TonyCrane",
"author_email": "me@tonycrane.cc",
"download_url": "https://files.pythonhosted.org/packages/23/a2/e6f9030046354cddd99318a49a73a4aa510b6ac82854bc177e108ce20e5b/mkdocs_statistics_plugin-0.1.4.tar.gz",
"platform": null,
"description": "# mkdocs-statistics-plugin\n\n\u4e00\u4e2a\u7528\u4e8e mkdocs \u6587\u6863\u7edf\u8ba1\u7684\u63d2\u4ef6\uff0c\u5305\u62ec\u5168\u5c40\u9875\u9762\u6570\u3001\u5b57\u6570\u3001\u4ee3\u7801\u5757\u884c\u6570\uff0c\u5355\u9875\u5b57\u6570\u3001\u4ee3\u7801\u884c\u6570\u3001\u56fe\u7247\u5f20\u6570\u4ee5\u53ca\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\u7b49\u3002\n\n\u9884\u89c8\uff1a<https://note.tonycrane.cc/>\uff08\u53ea\u6709\u5e26\u8bc4\u8bba\u7684\u9875\u9762\u6709\u5355\u9875\u7edf\u8ba1\uff09\n\n## \u5b89\u88c5\n\u53ef\u4ee5\u901a\u8fc7 pypi \u76f4\u63a5\u5b89\u88c5\uff1a\n```shell\n$ pip install mkdocs-statistics-plugin\n```\n\n\u4e5f\u53ef\u4ee5\u4ece\u6e90\u7801\u5b89\u88c5\n\n```shell\n$ git clone https://github.com/TonyCrane/mkdocs-statistics-plugin.git\n$ cd mkdocs-statistics-plugin\n$ pip install . # or pip install -e .\n```\n\n## \u4f7f\u7528\n- \u5728 mkdocs.yml \u4e2d\u542f\u7528\u63d2\u4ef6\uff1a\n ```yaml\n plugins:\n - statistics\n ```\n\n\u914d\u7f6e\u9009\u9879\u53ca\u89e3\u91ca\uff1a\n\n| \u9009\u9879 | \u7c7b\u578b | \u9ed8\u8ba4\u503c | \u89e3\u91ca |\n|:----|:----|:----|:----|\n|`pages_placeholder`|str|`\\{\\{\\s*pages\\s*\\}\\}`|\u5168\u5c40\u7edf\u8ba1\u9875\u9762\u4e2d\u9875\u9762\u6570\u5360\u4f4d\u7b26\uff08\u6b63\u5219\uff09|\n|`words_placeholder`|str|`\\{\\{\\s*words\\s*\\}\\}`|\u5168\u5c40\u7edf\u8ba1\u9875\u9762\u4e2d\u5b57\u6570\u5360\u4f4d\u7b26\uff08\u6b63\u5219\uff09|\n|`codes_placeholder`|str|`\\{\\{\\s*codes\\s*\\}\\}`|\u5168\u5c40\u7edf\u8ba1\u9875\u9762\u4e2d\u4ee3\u7801\u884c\u6570\u5360\u4f4d\u7b26\uff08\u6b63\u5219\uff09|\n|`images_placeholder`|str|`\\{\\{\\s*images\\s*\\}\\}`|\u5168\u5c40\u7edf\u8ba1\u9875\u9762\u4e2d\u56fe\u7247\u5f20\u6570\u5360\u4f4d\u7b26\uff08\u6b63\u5219\uff09|\n|`page_statistics`|bool|`True`|\u662f\u5426\u5728\u5355\u9875\u4e2d\u663e\u793a\u7edf\u8ba1\u4fe1\u606f|\n|`page_check_metadata`|str||\u5982\u679c\u4e3a\u7a7a\uff0c\u5219\u6240\u6709\u9875\u9762\u90fd\u663e\u793a\uff1b\u5426\u5219\u5305\u542b\u6307\u5b9a metadata \u624d\u663e\u793a\u5355\u9875\u7edf\u8ba1\u4fe1\u606f|\n|`page_read_time`|bool|`True`|\u662f\u5426\u663e\u793a\u5355\u9875\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4|\n|`page_images`|bool|`True`|\u662f\u5426\u663e\u793a\u5355\u9875\u56fe\u7247\u5f20\u6570|\n|`page_template`|str||\u5355\u9875\u7edf\u8ba1\u4fe1\u606f\u6a21\u677f\u76f8\u5bf9\u8def\u5f84\uff08\u76f8\u5bf9 docs\uff09|\n|`words_per_minute`|int|`300`|\u6bcf\u5206\u949f\u9884\u8ba1\u9605\u8bfb\u5b57\u6570|\n|`codelines_per_minute`|int|`80`|\u6bcf\u5206\u949f\u9884\u8ba1\u9605\u8bfb\u4ee3\u7801\u884c\u6570|\n|`ignore_languages`|list|`[\"mermaid\", \"math\"]`|\u4e0d\u8ba1\u5165\u4ee3\u7801\u884c\u6570\u7684\u8bed\u8a00\u5217\u8868|\n|`include_path`|str|` `|\u53ea\u7edf\u8ba1\u5339\u914d\u7684\u8def\u5f84\uff08\u6b63\u5219\uff0c\u8def\u5f84\u76f8\u5bf9 docs\uff0c\u4e3a\u7a7a\u5219\u4e0d\u542f\u7528\uff09|\n|`exclude_path`|str|` `|\u4e0d\u7edf\u8ba1\u5339\u914d\u7684\u8def\u5f84\uff08\u6b63\u5219\uff0c\u8def\u5f84\u76f8\u5bf9 docs\uff0c\u4e3a\u7a7a\u5219\u4e0d\u542f\u7528\uff09|\n\n### \u51e0\u79cd\u4f7f\u7528\u65b9\u5f0f\n#### \u5168\u5c40\u7edf\u8ba1\u9875\n\u4f8b\u5982\u5728\u9996\u9875\u663e\u793a\u5168\u5c40\u7edf\u8ba1\u4fe1\u606f\u3002\u9700\u8981\u5728\u8be5\u9875\u9762\u7684\u5143\u6570\u636e\u4e2d\u6dfb\u52a0\uff1a\n```yaml\n---\nstatistics: True\n---\n```\n\u7136\u540e\u5728\u8be5\u9875\u4e2d\u9700\u8981\u7684\u90e8\u5206\u6dfb\u52a0\u5360\u4f4d\u7b26\uff0c\u4f8b\u5982\uff1a\n```markdown\n\u672c\u7ad9\u5171\u6709 {{ pages }} \u4e2a\u9875\u9762\uff0c{{ words }} \u4e2a\u5b57\uff0c{{ codes }} \u884c\u4ee3\u7801\uff0c{{ images }} \u5f20\u56fe\u7247\u3002\n```\n\n#### \u5355\u9875\u7edf\u8ba1\n\u9700\u8981\u6309\u7167\u4e0a\u8ff0\u9009\u9879\u586b\u5199\u597d\u914d\u7f6e\uff08\u9ed8\u8ba4\u5f00\u542f\u5355\u9875\u7edf\u8ba1\uff0c\u4e14~~\u5e94\u8be5\u53ef\u4ee5~~\u9002\u914d material \u4e3b\u9898\uff09\u3002\n\n\u5982\u679c `page_check_metadata` \u4e3a\u7a7a\uff0c\u5219\u6240\u6709\u9875\u9762\u90fd\u663e\u793a\u5355\u9875\u7edf\u8ba1\u4fe1\u606f\uff1b\u5426\u5219\u5305\u542b\u6307\u5b9a metadata \u624d\u663e\u793a\u5355\u9875\u7edf\u8ba1\u4fe1\u606f\u3002\u4f8b\u5982\u5728\u6211\u81ea\u5df1\u7684\u8bbe\u7f6e\u4e2d\uff0c\u5305\u542b `comment` \u7684\u9875\u9762\u624d\u663e\u793a\u5355\u9875\u7edf\u8ba1\u4fe1\u606f\uff08\u4e14\u5305\u542b `nostatistics` \u7684\u9875\u9762\u4e0d\u663e\u793a\u7edf\u8ba1\u4fe1\u606f\uff09\uff1a\n```yaml\nplugins:\n - statistics:\n page_check_metadata: comment\n```\n\n### \u9ad8\u7ea7\u7528\u6cd5\n#### \u81ea\u5b9a\u4e49\u5355\u9875\u7edf\u8ba1\u6a21\u677f\n\u53ef\u4ee5\u901a\u8fc7 `page_template` \u9009\u9879\u6307\u5b9a\u5355\u9875\u7edf\u8ba1\u6a21\u677f\u7684\u76f8\u5bf9\u8def\u5f84\uff08\u76f8\u5bf9 docs\uff09\u3002\u8fd9\u4e2a\u6a21\u677f\u4f1a\u88ab\u63d2\u5165\u5230 markdown \u6e90\u7801\u7684\u4e00\u7ea7\u6807\u9898\u4e0b\u65b9\uff0c\u4f1a\u4f20\u5165 `words` `code_lines` `images` `page_images` `read_time` `page_read_time` \u516d\u4e2a\u6a21\u677f\u53c2\u6570\u3002\n\n\u81ea\u5b9a\u4e49\u7684\u8bdd\u53ef\u4ee5\u53c2\u8003\u63d0\u4f9b\u7684\u6a21\u677f\u3002\n\n#### \u9605\u8bfb\u65f6\u95f4\n\u53ef\u4ee5\u901a\u8fc7 `page_read_time` \u9009\u9879\u63a7\u5236\u662f\u5426\u663e\u793a\u5355\u9875\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\u3002\u9ed8\u8ba4\u5f00\u542f\u3002\n\u53ef\u4ee5\u901a\u8fc7 `page_images` \u9009\u9879\u63a7\u5236\u662f\u5426\u663e\u793a\u5355\u9875\u56fe\u7247\u5f20\u6570\u3002\u9ed8\u8ba4\u5f00\u542f\u3002\n\n\u9605\u8bfb\u65f6\u95f4\u7684\u8ba1\u7b97\u65b9\u5f0f\u662f\u5206\u522b\u8ba1\u7b97\u5b57\u6570\u548c\u4ee3\u7801\u884c\u6570\u7684\u9605\u8bfb\u65f6\u95f4\uff0c\u7136\u540e\u53d6\u4e8c\u8005\u4e4b\u548c\uff0c\u56fe\u7247\u4e0d\u8ba1\u5165\u9605\u8bfb\u65f6\u95f4\u3002\u53ef\u4ee5\u901a\u8fc7 `words_per_minute` \u548c `codelines_per_minute` \u9009\u9879\u5206\u522b\u8bbe\u7f6e\u6bcf\u5206\u949f\u9884\u8ba1\u9605\u8bfb\u5b57\u6570\u548c\u4ee3\u7801\u884c\u6570\u3002\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u5206\u522b\u4e3a 300 \u548c 80\uff0c\u5bf9\u4e8e\u6280\u672f\u7c7b\u6587\u7ae0\u8fd9\u6837\u7684\u8bbe\u7f6e\u57fa\u672c\u5408\u7406\uff0c\u5bf9\u4e8e\u5176\u4ed6\u7c7b\u578b\u4f8b\u5982\u6587\u5b66\u7c7b\u6587\u7ae0\u6bcf\u5206\u949f\u9605\u8bfb\u5b57\u6570\u5e94\u8be5\u63d0\u9ad8\u5230 400~600 \u5de6\u53f3\u8f83\u4e3a\u5408\u7406\u3002\n\n~~\u8ba1\u5212\u6dfb\u52a0\u9875\u9762\u5143\u4fe1\u606f\u9009\u9879\u6765\u4e3a\u5355\u9875\u8bbe\u7f6e\u7279\u5b9a\u7684\u9605\u8bfb\u65f6\u95f4\u3002\uff08\u5495\u5495\u5495\uff09~~\n\n#### \u5b57\u6570\u7edf\u8ba1\u7ec6\u8282\n\u672c\u63d2\u4ef6\u7684\u5b57\u6570\u7edf\u8ba1\u7ec6\u8282\u4e3a\uff1a\u4e00\u4e2a\u82f1\u6587\u5355\u8bcd\uff08\u5305\u62ec\u6570\u5b57\uff09\u7b97\u4e00\u4e2a\u5b57\uff0c\u4e00\u4e2a\u4e2d\u6587\u6c49\u5b57\u7b97\u4e00\u4e2a\u5b57\uff0c\u6807\u70b9\u90fd\u4e0d\u7b97\u5b57\uff1b\u4ee3\u7801\u5757\uff08\u5e26\u8bed\u8a00\u7684\u7bf1\u7b06\u578b\u8bed\u6cd5\uff09\u4e2d\u6240\u6709\u5185\u5bb9\u90fd\u4e0d\u8ba1\u5165\u5b57\u6570\uff0c\u800c\u662f\u8ba1\u5165\u4ee3\u7801\u5757\u884c\u6570\u7edf\u8ba1\uff0c\u53ef\u4ee5\u901a\u8fc7\u8bbe\u7f6e `ignore_languages` \u9009\u9879\u6765\u6307\u5b9a\u4e0d\u8ba1\u5165\u4ee3\u7801\u884c\u6570\u7684\u8bed\u8a00\u5217\u8868\uff08\u9ed8\u8ba4\u4e0d\u8ba1 `mermaid` \u548c `math`\uff09\uff0c\u81ea\u5b9a\u4e49\u914d\u7f6e\u5199\u6cd5\u5982\u4e0b\uff1a\n\n```yaml\nplugins:\n - statistics:\n ignore_languages:\n - mermaid\n - markdown\n```\n\n\u5177\u4f53\u7ec6\u8282\u89c1 plugin.py \u4e2d\u7684 \\_clean\\_markdown \u65b9\u6cd5\u3002\n\n#### \u4e3b\u9898\u53ef\u7528\u53d8\u91cf\n\u5982\u679c\u9700\u8981\u5728\u6a21\u677f\u4e2d\u5305\u542b\u672c\u9875\u7684\u7edf\u8ba1\u4fe1\u606f\u6216\u5e0c\u671b\u5bf9\u7edf\u8ba1\u4fe1\u606f\u8fdb\u884c\u66f4\u591a\u63a7\u5236\uff0c\u5219\u53ef\u4ee5\u5728\u4e3b\u9898\uff08\u6a21\u677f\uff09\u4e2d\u4f7f\u7528\u4fdd\u5b58\u4e8e `page.meta` \u4e2d\u7684\u53d8\u91cf\u3002\n| \u53d8\u91cf | \u63cf\u8ff0 |\n| --------------------------------------- | ---------- |\n| `page.meta.statistics_page_words` | \u672c\u9875\u9884\u4f30\u5b57\u6570 |\n| `page.meta.statistics_page_codes_lines` | \u672c\u9875\u4ee3\u7801\u884c\u6570 |\n| `page.meta.statistics_page_images` | \u672c\u9875\u56fe\u7247\u5f20\u6570 |\n| `page.meta.statistics_page_read_time` | \u672c\u9875\u9884\u4f30\u9605\u8bfb\u65f6\u95f4 |\n\n## \u5f00\u53d1\n\u53ef\u80fd\u5f88\u4e0d\u7a33\u5b9a\uff08\u53cd\u6b63\u81f3\u5c11\u6211\u80fd\u8dd1\u8d77\u6765\uff09\uff0c\u6709\u4efb\u4f55\u95ee\u9898\u6b22\u8fce issue \u63d0\u51fa\u3002\u540c\u65f6\u9875\u6b22\u8fce\u4efb\u4f55 PR\uff0c\u5c3d\u7ba1\u63d0\u5c31\u597d\u3002\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "A MkDocs plugin that generate statistic data of a site",
"version": "0.1.4",
"project_urls": {
"Homepage": "https://github.com/TonyCrane/mkdocs-statistics-plugin"
},
"split_keywords": [
"mkdocs",
"python",
"markdown",
"statistics"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "2a39a838aa0e1247560469fdc0f56f40fa94d7bf5172f2aa16952cfbe814174a",
"md5": "4c1392c72d27e8c394d79754ad497ff3",
"sha256": "d5b02a951ebf908959611fe4c6e2772aecdd25c299f70690d3e08b4dd9182c3a"
},
"downloads": -1,
"filename": "mkdocs_statistics_plugin-0.1.4-py3-none-any.whl",
"has_sig": false,
"md5_digest": "4c1392c72d27e8c394d79754ad497ff3",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.5",
"size": 8112,
"upload_time": "2024-10-23T17:34:08",
"upload_time_iso_8601": "2024-10-23T17:34:08.529206Z",
"url": "https://files.pythonhosted.org/packages/2a/39/a838aa0e1247560469fdc0f56f40fa94d7bf5172f2aa16952cfbe814174a/mkdocs_statistics_plugin-0.1.4-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "23a2e6f9030046354cddd99318a49a73a4aa510b6ac82854bc177e108ce20e5b",
"md5": "ab2a1a15431e29eb1faecab794d8a462",
"sha256": "c5cfa6ef263c03986d773a336c7cf3a12f9b367574eb9a87ace98c9f3543a68f"
},
"downloads": -1,
"filename": "mkdocs_statistics_plugin-0.1.4.tar.gz",
"has_sig": false,
"md5_digest": "ab2a1a15431e29eb1faecab794d8a462",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.5",
"size": 7757,
"upload_time": "2024-10-23T17:34:10",
"upload_time_iso_8601": "2024-10-23T17:34:10.495682Z",
"url": "https://files.pythonhosted.org/packages/23/a2/e6f9030046354cddd99318a49a73a4aa510b6ac82854bc177e108ce20e5b/mkdocs_statistics_plugin-0.1.4.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-10-23 17:34:10",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "TonyCrane",
"github_project": "mkdocs-statistics-plugin",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "mkdocs-statistics-plugin"
}