一键生成CSDN文章的思维导图目录
简 介: 本文给出了直接将CSDN文章一键生成对应的思维导图目录的程序。将目录增加在博文的最开始,可以更好地显示博文的内部结构,作为原来CSDN网页中目录的补充,丰富博文的表达能力。
关键词
: CSDN,思维导图,目录
Contents
§01 思维导图目录
一、MARKDOWN目录
在CSDN中,如果使用MarkDown编辑器,可以直接利器其中目录命令生成文章的目录。
1、目录命令
加入本文一开始具有如下目录:
@[TOC](这里写目录标题)
# 一级目录
## 二级目录
### 三级目录
对应的目录结构如下图所示:
▲ 图1.1.1 Markdown文中的目录
2、优缺点
- 优点: 上述目录在结构上符合通常文章的目录结构,并且允许直接跳转。
但是使用起来还有如下问题:
- 在CSDN网页中已经具有文章的目录子窗口,如果在文章开始再添加上述目录结构实际上有点重复了;
- 如果文章中目录层级比较多,实际上生成的上述目录树的结构很大,对于读者跳跃这部分还是不太方便;
如何改进呢?
二、思维导图
作为Markdown文档传统的目录,如果利用其内置的MERMARD流程图可以生成思维导图的目录结构。
1、几个示例
比如下面就是博文 大红包高阻值电阻 对应的目录结构。
下图是 基于MM32F3273的MicroPython实验电路板 - 工作并不是正常 对应的目录。
如下是 利用TLD2131组成LED矩阵显示实验电路板 三级思维导图目录形式。
2、优缺点
利用上述思维导图作为CSDN文章的目录,是原来CSDN网页中目录的一个补充,从结构上可以形成文章更加整体的目录结构。
特别是,可以通过参数来选择显示文章的子目录的层次,对于大型文章,可以节省目录所占的篇幅。
但是,这种方式还有一定的缺点,现在还无法直接完成页内的跳转。这一点如果CSDN的网页功能如果能够改进就非常好了。在原来的MERMAID流程图中是允许增加跳转的功能的。
§02 一键生成程序
一、程序代码
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# CDM.PY -- by Dr. ZhuoQing 2021-11-09
#
# Usage: cdm * # Process clipboard
# cdm ** # Process clipboard and copy clipboard
# cdm ++ # Process clipboard and copy clipboard, equal
# cdm | # Left and right, maxnum=2
# cdm / # Left and right, maxnum=3
# cdm :maxnum # Left and right equal
# cdm :: # == cdm :3
# cdm ; # Left and right equal,zl 在第一层目录中增加序号
# cdm -,=, # 等效| /:只是在第一层目录中增加序号。
#
# Note:
#============================================================
from head import *
csdn_title = '写文章-CSDN博客'
#------------------------------------------------------------
firststr = clipboard.paste()
dopstr = tspgetdopstring()
#------------------------------------------------------------
insertstr = '```mermaid\ngraph LR\n'
keystr = ''
orderstr1 = "零一二三四五六七八九十"
orderstr2 = '①②③④⑤⑥⑦⑧⑨⑩⑾⑿⒀⒁⒂⒃⒄⒅'
orderstr3 = 'ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ'
#------------------------------------------------------------
maxnum = 6
leftnum = 0
titlenumflag = 0
clipboardflag = 0
equalflag = 0
#------------------------------------------------------------
firsttitle = "文章目录"
for s in sys.argv[1:]:
# printf(s)if s.isdigit():maxnum = int(s)elif s.find('||') >= 0:ss = s.split('||')if len(ss[0]) > 0:maxnum = int(ss[0])if len(ss[1]) > 0:leftnum = int(ss[1])else: leftnum = -1else:if len(ss[1]) > 0:maxnum = int(ss[1])else: maxnum = 3leftnum = -1elif s.find('|') >=0:ss = s.split('|')if len(ss[0]) > 0:maxnum = int(ss[0])if len(ss[1]) > 0:leftnum = int(ss[1])else: leftnum = -1else:if len(ss[1]) > 0:maxnum = int(ss[1])else: maxnum = 2leftnum = -1elif s.find('-') >=0:ss = s.split('-')if len(ss[0]) > 0:maxnum = int(ss[0])if len(ss[1]) > 0:leftnum = int(ss[1])else: leftnum = -1else:if len(ss[1]) > 0:maxnum = int(ss[1])else: maxnum = 2leftnum = -1titlenumflag = 1elif s.find('=') >=0:ss = s.split('=')if len(ss[0]) > 0:maxnum = int(ss[0])if len(ss[1]) > 0:leftnum = int(ss[1])else: leftnum = -1else:if len(ss[1]) > 0:maxnum = int(ss[1])else: maxnum = 3leftnum = -1titlenumflag = 1elif s.find('/') >=0:ss = s.split('/')if len(ss[0]) > 0:maxnum = int(ss[0])if len(ss[1]) > 0:leftnum = int(ss[1])else: leftnum = -1else:if len(ss[1]) > 0:maxnum = int(ss[1])else: maxnum = 3leftnum = -1elif s == '::':maxnum = 3leftnum = -1equalflag = 1elif s == '::':maxnum = 3leftnum = -1equalflag = 1elif s[0] == ':':maxnum = 2leftnum = -1equalflag = 1if len(s[1:]) > 0:maxnum = int(s[1:])elif s[0] == ':':maxnum = 2leftnum = -1equalflag = 1if len(s[1:]) > 0:maxnum = int(s[1:])elif s[0] == ';':maxnum = 2leftnum = -1equalflag = 1titlenumflag = 1if len(s[1:]) > 0:maxnum = int(s[1:])elif s == '.':titlenumflag = 0else:firsttitle = s
#------------------------------------------------------------
pasteflag = 0
if firsttitle == '*':if len(firststr) == 0:printf("No clipboard string.\a")exit()allstr = [s.replace(' ', '#').strip('\r') for s in firststr.split('\n') if len(s) > 0]pasteflag = 1
elif firsttitle == '**':clipboardflag = 1allstr = [s.replace(' ', '#').strip('\r') for s in firststr.split('\n') if len(s) > 0]firsttitle = "文章目录"maxnum = 2leftnum = -1
elif firsttitle == '++':clipboardflag = 1allstr = [s.replace(' ', '#').strip('\r') for s in firststr.split('\n') if len(s) > 0]firsttitle = "文章目录"maxnum = 2leftnum = -1equalflag = 1
else:#--------------------------------------------------------tspsendwindowkey(csdn_title, 'c', control=1,noreturn=1)time.sleep(.1)originstr = clipboard.paste()if len(originstr) == 0:tspsendwindowkey(csdn_title, ' ')tspsendwindowkey(csdn_title, "ac", control=1, noreturn=1)tspsendwindowkey(csdn_title, "z", control=1, noreturn=1)allstr = clipboard.paste().split('\n')
#------------------------------------------------------------
title2num = []
title2total = 0
title3total = 0
if leftnum < 0:for s in allstr:if s[:1] == '#':if s.count('-') > 5: continueif s.count('=') > 5: continueif pasteflag == 0:if s.count('<') < 2: continueif s.count('>') < 2: continuesharpnum = len(s) - len(s.lstrip('#'))if sharpnum == 1:title2num.extend([0])elif sharpnum == 2:if maxnum >= 2:title2total += 1if len(title2num) > 0:title2num[-1] += 1elif sharpnum == 3:title3total += 1if title2total > 0:for i in range(len(title2num)):if sum(title2num[:i+1]) > title2total//2:leftnum = iif abs(sum(title2num[:i+1]) - title2total/2) - 0.1 * (len(title2num) / 2 - i) < abs(sum(title2num[:i]) - title2total/2):leftnum = i + 1if leftnum == 0 and len(title2num) > 2:leftnum = 1breakelse: leftnum = len(title2num)//2if len(title2num) < 3 and title2total < 3:if maxnum == 2: maxnum = 3
#------------------------------------------------------------
#printff(firsttitle, leftnum, maxnum)
titlenumber = [0]*6
#------------------------------------------------------------
for s in allstr:if s[:1] == '#':if s.count('-') > 5: continueif s.count('=') > 5: continueif pasteflag == 0:if s.count('<') < 2: continueif s.count('>') < 2: continuesharpnum = len(s) - len(s.lstrip('#'))startid = s.find('、')if startid < 0: startid = s.find(')')if startid < 0: startid = s.find(')')if startid < 0 and sharpnum > 1: startid = s.find('.')if startid < 0:if sharpnum == 1:startid = s.find('=red>')if startid < 0:s = s.replace('</font>', '')else:s = s[startid+5:].replace('</font>', '')else:startid = s.find('>')if startid >= 0: s = s[startid+1:].replace('</font>','')else:s = s[startid+1:].replace('</font>','')s = s.replace('※</center>', '').replace('</center>', '')#----------------------------------------------------s = s.replace(':', ':').replace('■ ', '').replace('○ ', '').replace('□ ', '').replace('● ', '')s = s.replace('☆ ', ':').replace('★ ', '').replace('○ ', '').replace('△ ', '').replace('▲ ', '')s = s.replace('◇ ', ':').replace('◆ ', '').replace('→', '-').replace('▓ ', '').replace('※ ', '')s = s.replace('# ', ':').replace('◎ ', '').replace('§ ', '').replace('√ ', '').replace('。 ', '.')s = s.replace(',', ',').replace('、', ',').replace('×', '*').replace('?', '?').replace('!', '!')s = s.replace('(', '').replace(')', '').replace('—', '-').replace('【', '').replace('】', '')s = s.replace('(', '').replace(')', '').replace('~', '-').replace('#', '').replace('||', '<br>')s = s.replace('“', '').replace('”', "").replace(" ",' ')startid = s.find('[^')if startid > 0: s = s[:startid]printff(sharpnum, s)#----------------------------------------------------if sharpnum > maxnum: continueaddstr = ''if sharpnum == 1:titlenumber[0] += 1titlenum = [n for n in titlenumber if n > 0]if len(titlenum) < 6: titlenum.extend([0]*(6-len(titlenum)))titlestr = ''if titlenumflag > 0:titlestr = '%02d.'%titlenum[0]if titlenum[0] <= leftnum:addstr = 'A%d(%s%s) === A((%s))'%(titlenum[0], titlestr, s, firsttitle)else:addstr = 'A((%s)) === A%d(%s%s)'%(firsttitle, titlenum[0], titlestr, s)if titlenum[0] == 1:addstr = addstr + '\n' + 'style A fill:#39f,stroke:#ccc,stroke-width:5px,color:#FFF'addstr = addstr + '\n' + 'style A%d fill:#9f9,stroke:#3a3,stroke-width:2px'%titlenum[0]titlenumber[1:] = [0]*len(titlenumber[1:])elif sharpnum == 2:titlenumber[1] += 1titlenum = [n for n in titlenumber if n > 0]if len(titlenum) < 6: titlenum.extend([0]*(6-len(titlenum)))if titlenum[0] <= leftnum:addstr = 'B%d%d(%s) --- A%d'%(titlenum[0], titlenum[1], s, titlenum[0])else:addstr = 'A%d --- B%d%d(%s)'%(titlenum[0], titlenum[0], titlenum[1], s)titlenumber[2:] = [0]*len(titlenumber[2:])elif sharpnum == 3:titlenumber[2] += 1titlenum = [n for n in titlenumber if n > 0]if len(titlenum) < 6: titlenum.extend([0]*(6-len(titlenum)))if titlenum[0] <= leftnum:addstr = 'C%d%d%d(%s) --- B%d%d'%(titlenum[0], titlenum[1], titlenum[2], s,titlenum[0], titlenum[1])else:addstr = 'B%d%d --- C%d%d%d(%s)'%(titlenum[0], titlenum[1],titlenum[0], titlenum[1], titlenum[2], s)addstr = addstr + '\n' + 'style C%d%d%d fill:#ffffff,stroke:#777,stroke-width:1px'%(titlenum[0],titlenum[1], titlenum[2])titlenumber[3:] = [0]*len(titlenumber[3:])elif sharpnum == 4:titlenumber[3] += 1titlenum = [n for n in titlenumber if n > 0]if len(titlenum) < 6: titlenum.extend([0]*(6-len(titlenum)))if titlenum[0] <= leftnum:addstr = 'D%d%d%d%d(%s) --- C%d%d%d'%(titlenum[0], titlenum[1], titlenum[2], titlenum[3], s,titlenum[0], titlenum[1], titlenum[2])else:addstr = 'C%d%d%d --- D%d%d%d%d(%s)'%(titlenum[0], titlenum[1], titlenum[2],titlenum[0], titlenum[1], titlenum[2], titlenum[3], s)addstr = addstr + '\n' + 'style D%d%d%d%d fill:#ffff,stroke:#999,stroke-width:1px,color:#0,stroke-dasharray: 5 5'%(titlenum[0],titlenum[1], titlenum[2], titlenum[3])titlenumber[4:] = [0]*len(titlenumber[4:])elif sharpnum == 5:titlenumber[4] += 1titlenum = [n for n in titlenumber if n > 0]if len(titlenum) < 6: titlenum.extend([0]*(6-len(titlenum)))if titlenum[0] <= leftnum:addstr = 'E%d%d%d%d%d(%s) -.- D%d%d%d%d'%(titlenum[0], titlenum[1], titlenum[2], titlenum[3], titlenum[4], s,titlenum[0], titlenum[1], titlenum[2], titlenum[3])else:addstr = 'D%d%d%d%d -.- E%d%d%d%d%d(%s)'%(titlenum[0], titlenum[1], titlenum[2], titlenum[3],titlenum[0], titlenum[1], titlenum[2], titlenum[3], titlenum[4], s)addstr = addstr + '\n' + 'style E%d%d%d%d%d fill:#ffffff,stroke:#333,stroke-width:0px'%(titlenum[0],titlenum[1], titlenum[2], titlenum[3], titlenum[4])titlenumber[5:] = [0]*len(titlenumber[5:])elif sharpnum == 6:titlenumber[5] += 1titlenum = [n for n in titlenumber if n > 0]if len(titlenum) < 6: titlenum.extend([0]*(6-len(titlenum)))if titlenum[0] <= leftnum:addstr = 'F%d%d%d%d%d(%s) -.- E%d%d%d%d%d'%(titlenum[0], titlenum[1], titlenum[2], titlenum[3], titlenum[4], titlenum[5], s,titlenum[0], titlenum[1], titlenum[2], titlenum[3], titlenum[4])else:addstr = 'E%d%d%d%d%d -.- F%d%d%d%d%d(%s)'%(titlenum[0], titlenum[1], titlenum[2], titlenum[3], titlenum[4],titlenum[0], titlenum[1], titlenum[2], titlenum[3], titlenum[4], titlenum[5], s)addstr = addstr + '\n' + 'style F%d%d%d%d%d%d fill:#ffffff,stroke:#333,stroke-width:0px'%(titlenum[0],titlenum[1], titlenum[2], titlenum[3], titlenum[4], titlenum[5])if len(addstr) > 0: insertstr = insertstr + addstr + '\n'else:if s.find('**``关键词``**') > 0:startid = s.find('</font>')if startid > 0:keystr = s[startid+7:]elif pasteflag > 0:firsttitle = s.replace('||', "<br>")
#------------------------------------------------------------
insertstr = insertstr + '```\n'
#------------------------------------------------------------
if equalflag > 0:printf("Title2:%d"%title2total)if maxnum >= 2:isdim = insertstr.split('\n')title2count = 0title3count = 0for id,i in enumerate(isdim):if i.count(' --- ') == 1:ii = i.split(' --- ')if len(ii) == 2:titleflag = 0if ii[0].count('(') == 0:if ii[0].count('A') == 1:title2count += 1titleflag = 1else:if ii[1].count('A') == 1:title2count += 1titleflag = 1if ii[0].count('(') == 0:if ii[0].count('B') == 1:title3count += 1titleflag = 2else:if ii[1].count('B') == 1:title3count += 1titleflag = 2if titleflag != 2:if title2count <= (title2total + 1)//2:if ii[0].count('(') == 0:isdim[id] = ii[1] + ' --- ' + ii[0]else:if ii[0].count('(') > 0:isdim[id] = ii[1] + ' --- ' + ii[0]else:if title3count <= (title3total + 1)//2 or title3count <= 2:if ii[0].count('(') == 0:isdim[id] = ii[1] + ' --- ' + ii[0]else:if ii[0].count('(') > 0:isdim[id] = ii[1] + ' --- ' + ii[0]insertstr = '\n'.join(isdim)
# printf(insertstr)
# exit()
#------------------------------------------------------------
clipboard.copy(insertstr)
if clipboardflag > 0:printf(insertstr)exit()
#------------------------------------------------------------
time.sleep(.1)
tspsendwindowkey(csdn_title, "v", control=1,noreturn=1)
clipboard.copy(keystr)
#------------------------------------------------------------
printf('\a')
#------------------------------------------------------------
# END OF FILE : CDM.PY
#============================================================
※ 博文总结 ※
本文给出了直接将CSDN文章一键生成对应的思维导图目录的程序。将目录增加在博文的最开始,可以更好地显示博文的内部结构,作为原来CSDN网页中目录的补充,丰富博文的表达能力。
■ 相关文献链接:
- 大红包高阻值电阻
- 基于MM32F3273的MicroPython实验电路板 - 工作并不是正常
● 相关图表链接:
- 图1.1.1 Markdown文中的目录
一键生成CSDN文章的思维导图目录相关推荐
- 生产力工具推荐,思维导图测评 #CSDN博文精选##思维导图##系统化学习#
大家好~我是小C,全名是CSDN高校俱乐部,我的职责之一是担任"文章过滤器",精选大咖干货.助力学习之路. 你是否曾面对海量信息而无从下手? 你是否曾苦恼学习效果不佳.事倍功半? ...
- 【MarkDown】CSDN Markdown之思维导图mindmap详解
文章目录 思维导图(Mindmap) 一个思维导图的例子 语法 形状 矩形 圆角矩形 圆形 爆炸 云朵 六边形 默认 图标和类 图标 类 不清晰的缩进 Markdown字符串 与库或网站资源集成 思维 ...
- TF之DD:利用Inception模型+GD算法生成带背景的大尺寸、高质量的Deep Dream图片——五个架构设计思维导图
TF之DD:利用Inception模型+GD算法生成带背景的大尺寸.高质量的Deep Dream图片--五个架构设计思维导图 目录 TF中的Deep Dream实践:利用Inception模型+GD算 ...
- 思维导图 基础篇(11)应用-文章分析-框架法
系列文章解读&说明: 本系列文章主要内容是 思维导图 基础课,旨在帮助更多 热爱学习的伙伴 更具体的了解思维导图,同时也会让 更多的伙伴从 思维导图 认知 误区中走出. 系列文章总纲链接为:专 ...
- CV之IE之Inception:基于TF框架利用Inception模型+GD算法的某层网络图像生成不同尺寸和质量的Deep Dream幻觉梦境图片(特征可视化实现图像可解释性)—五个架构设计思维导图
CV之IE之Inception:基于TF框架利用Inception模型+GD算法的某层网络图像生成不同尺寸和质量的Deep Dream幻觉梦境图片(特征可视化实现图像可解释性)-五个架构设计思维导图 ...
- 如何把思维导图秒变成幻灯?
场景 有一天给研究生上课,几个学生分别上讲台展示仿真建模作业. 我打开笔记本电脑,一边开着仿真工具验证他们的代码,一边用思维导图软件记录他们讲解中出现的问题. 问题过多的时候,我示意学生下来.走上讲台 ...
- HTML、CSS的思维导图
目录 前言 HTML.CSS的思维导图 HTML的思维导图 编辑CSS的思维导图 总结 前言 前端开发的基础的基础. 虽然常用,但是也有可能由遗漏的知识点. 拿思维导图镇一下. HTML.CSS的思 ...
- ChatGpt2步制作流程图与思维导图,你确定不来看一下吗?
目录 建议收藏,以备不时之需 一.流程图 1.输入神奇指令 效果展示 神奇指令: 过程展示 2.代码导入diagrams生成流程图 二.思维导图 1.输入神奇的指令 神奇的指令 过程展示 2.使用Xm ...
- XMind思维导图2022下载激活安装超详细教程
XMind思维导图2022是发布的一款全功能的思维导图软件,拥有专业实用的功能,包括思维管理.商务演示.与办公软件协同工作等功能,让您的办公更有效,还加入了演讲模式,在演说模式可自动生成转场动画和布局 ...
最新文章
- ssh远程执行多个命令
- 自己编译redhat 9.0内核心得
- python安装requests
- Android项目实战视频教程_快递轨迹查询应用开发
- 满汉全席(洛谷-P4171)
- 异步与延迟加载JavaScript的方法
- C语言,使用结构体读入两个在同一年的日期,判断日期是否合法,并计算两个日期之间相差的天数。结构体定义如下:...
- 印度神曲之五(Ayka dajiba)
- vb.net 教程6-8 线程优先级
- 公众号快速注册并认证小程序
- 误码率matlab,关于误码率的问题 急!!!!!
- Swift游戏实战-跑酷熊猫 07 平台的移动
- audiosever耗电_audio服务自动停止 - 卡饭网
- 4种常见分支模式解析及优劣对比 | 研发效能提升36计
- Python在命令行模式下如何退出命令行
- 虚拟自动取款机ATM设计(C语言)
- 百度云盘功能需求分析
- python随机生成IP地址
- 关于木马Autoit
- JavaBean 和 pojo类区别
热门文章
- 关于xshell连接虚拟机和虚拟机连网
- 201621123069 《Java程序设计》第十一周学习总结
- Postfix的bcc邮件备份
- centos6.5报错:checking filesystems failed问题处理
- 详谈jsp和servlet的区别
- mac svn 返回svn upgrade等出错
- python--复习之路的目录
- 构建dubbo分布式平台-maven构建ant-framework框架的pom.xml文件配置
- 环境变量方式使用 Secret - 每天5分钟玩转 Docker 容器技术(158)
- SSRS 2012 仪表 -- 关键绩效指标