JavaScript笔记 #05# 用Regex辅助生成文章目录
PS. 用来生成个人笔记的目录
1、输入:html文本
<h2>Notes</h2>
<p>1、小标题1。正文正文正文</p>
<div class="cnblogs_code">
<pre><span style="color: #000000;">ddjlasjdlas
</span><span style="color: #0000ff;">as</span><span style="color: #000000;">
dasdasjda</span></pre>
</div>
<p>2、小标题2</p>
<p>正文正文正文正文正文</p>
<p>3、小标题3</p>
<p>正文正文正文</p>
<p>4、小标题4</p>
<p>正文正文正文</p>
<p> </p>
<h2>Excercises</h2>
<p>① xxxxxx1</p>
<p>正文正文正文</p>
<p>② xxx2</p>
<p>正文正文</p>
<p>③ xx3</p>
<p>正文正文正文</p>
2、输出:含目录的html文本
<div id="diy_right_menu">
<h2>索引</h2>
<ul>
<li>
<p>Notes</p>
<ol>
<li><a href="#a1">标题1</a></li>
<li><a href="#a2">标题2</a></li>
<li><a href="#a4">标题3</a></li>
<li><a href="#a5">标题4</a></li>
</ol></li>
<li>
<p>Excercise</p>
<ol>
<li><a href="#b1">练习1</a></li>
<li><a href="#b2">练习2</a></li>
<li><a href="#b3">练习3</a></li>
</ol></li>
</ul>
</div>
<h2>Notes</h2>
<p><a name="a1"></a>1、小标题1。正文正文正文</p>
<div class="cnblogs_code">
<pre><span style="color: #000000;">ddjlasjdlas
</span><span style="color: #0000ff;">as</span><span style="color: #000000;">
dasdasjda</span></pre>
</div>
<p><a name="a2"></a>2、小标题2</p>
<p>正文正文正文正文正文</p>
<p><a name="a3"></a>3、小标题3</p>
<p>正文正文正文</p>
<p><a name="a4"></a>4、小标题4</p>
<p>正文正文正文</p>
<p> </p>
<h2>Excercises</h2>
<p><a name="b1"></a>① xxxxxx1</p>
<p>正文正文正文</p>
<p><a name="b2"></a>② xxx2</p>
<p>正文正文</p>
<p><a name="b3"></a>③ xx3</p>
<p>正文正文正文</p>
<p> </p>
3、自定义的规则
- “类似1、xx 2、xx”会被转化为目录中的第一类二级标题Notes
- “类似① xxx ② xx”会被转化为目录中的第二类二级标题Excercises
- 第二类二级标题必须全部为英文字符,且1或者①前面都不能有空格,①后面只能是英文空格
- Copy来的标题要先清除格式
4、Javascript代码
<!DOCTYPE html>
<html> <head>
<meta charset="UTF-8">
<title></title>
</head> <body>
<textarea id="big-textarea" placeholder="paste your origin html text here..." rows="30" cols="150"><h2>Notes</h2>
<h2>Exercises</h2></textarea>
<button id="big-button">Generate</button> <script type="text/javascript">
const button = document.querySelector('#big-button');
button.addEventListener('click', handleClick); function handleClick(event) {
const textarea = document.querySelector('#big-textarea');
let inputHtml = textarea.value;
textarea.value = generateDiy_right_menu(inputHtml);
}; function replaceAndRecordSmallTitles(str ,arr) {
const regex = /<p>(\d{1,2})\u3001([\d\w\s\u4e00-\u9fa5]+)/g;
const replaceAndRecordHelper = (_, index, smallTitle) => {
arr.push(smallTitle);
return `<p><a name="a${index}"></a>${index}、${smallTitle}`;
}
return str.replace(regex, replaceAndRecordHelper);
} function replaceAndRecordExercises(str, arr) {
const regex = /<p>([\u2460-\u2469])\s([\w\s]+)/g;
let exerciseCount = 1;
const replaceAndRecordHelper = (_, unicodeIndex, exerciseName) => {
arr.push(exerciseName);
return `<p><a name="b${exerciseCount++}"></a>${unicodeIndex} ${exerciseName}`;
}
return str.replace(regex, replaceAndRecordHelper);
} function htmlMenu(small_titles, exercise_names) {
const htmlMenuHead = '<div id="diy_right_menu">\n' +
'<h2>索引</h2>\n' + '<ul>\n<li>\n' + '<p>Notes</p>\n<ol>\n';
let htmlTitles = "";
for (let i = 0; i != small_titles.length; ++i) {
htmlTitles += `<li><a href="#a${i+1}">${small_titles[i]}</a></li>\n`;
}
let htmlExercise = "</ol></li>\n<li>\n<p>Exercises</p>\n<ol>\n";
for (let i = 0; i != exercise_names.length; ++i) {
htmlExercise += `<li><a href="#b${i+1}">${exercise_names[i]}</a></li>\n`;
}
const htmlMenuTail = '</ol></li>\n</ul>\n</div>\n';
const result = htmlMenuHead + htmlTitles + htmlExercise + htmlMenuTail;
return result;
} function generateDiy_right_menu(inputHtml) {
let result = inputHtml.slice();
// 用replace替换掉原文,顺便记录标题内容
const small_titles = [];
const exercise_names = [];
result = replaceAndRecordSmallTitles(result, small_titles);
result = replaceAndRecordExercises(result, exercise_names);
// 自动生成目录
if (result.slice(0, '<div id="diy'.length) != '<div id="diy') {
// 避免重复生成目录
result = htmlMenu(small_titles, exercise_names) + result;
}
return result;
}
</script>
</body> </html>
JavaScript笔记 #05# 用Regex辅助生成文章目录的更多相关文章
- JavaScript笔记 #08# 用Regex辅助生成文章目录 V2.0
索引 简介 测试用例 代码 简介 * 用Regex辅助生成文章目录 2.0 * 1.提高了功能的通用性(假定的文章格式更加普遍,即按照h2h3h4分级) * 2.改善了代码的可读性(稍微牺牲了一点点性 ...
- CSDN中根据文章自动生成文章目录
概述 CSDN中有根据文件内容中H标签在文章中自动生成文章目录,看起来比较专业,就想把它搬到自己的博客园中.类似下图 提取JS脚本 通过浏览器开发者工具(IE/Chrome)找到产生文章目录javas ...
- 使用autoc js生成文章目录(侧边)导航栏
介绍: autocjs 是一个专门用来生成文章目录(Table of Contents)导航的工具.autocjs 会查找文章指定区域中的所有 h1~h6 的标签,并自动分析文章的层次结构,生成文章的 ...
- WPS生成文章目录
WPS生成文章目录 1.引用–>插入目录...即可!
- 用React实现一个自动生成文章目录的组件
原文地址:小寒的博客 功能介绍 这个组件的效果呐,就是你在浏览这个页面的时候点击右上角的叉叉看到的那个文章目录. 功能很简单,就是根据文章内容自动生成这个目录,可以快速跳转. 需要的知识点 正则 do ...
- javascript笔记05:函数表达式和函数语句的区别
1.首先是函数语句: myfunc(); function myfunc() { //执行一些语句 } 当函数语句被定义的时候,在一个脚本代码被优先考虑,因此,无论该函数是定义之前或者定义之后都可以被 ...
- HelloDjango 第 11 篇:自动生成文章摘要
作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 博客文章的模型有一个 excerpt 字段,这个字段用于存储文章的摘要.目前为止,还只 ...
- 使用office添加文章目录
当我们用word录入完文章,文章里有段落,段落里又有小标题,每一种标题的格式不尽相同,word为我们提供了相当丰富的标题格式,如:正文,无间隔,标题1,标题2,标题3,标题4,副标题,强调,要点... ...
- CSDN添加文章目录
在发表的文章中,系统根据文章中H1到H6标签自动生成文章目录. 一.发表文章的时候合理使用“标题”标签. 二.目录生成.只要在文章中使用了“标题1”这样的功能,就可以在博文开头看到文章的目录.
随机推荐
- [django]详情页列表页
详情页列表页 列表页展示titile--这个模型的部分字段 详情页展示这个模型的所有字段 我想看下related_name这个从主表取子表数据 取数据--官网投票例子 https://docs.dja ...
- (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
在linux环境下配置项目运行环境时,部署的人员都会分配一下内存,以保证程序正常的运行.其实在开发的时候(window系统),就已经涉及到内存分配了,只是这些参数有默认值,因此一直没有去重视它. 以M ...
- Linux下solr集群搭建
第一步:创建四个tomcat实例.每个tomcat运行在不同的端口.8180.8280.8380.8480 第二步:部署solr的war包.把单机版的solr工程复制到集群中的tomcat中. 第三步 ...
- python 类组合
场景:有一辆车违章需要通知到车主 定义两个类车辆类和通知类,车辆类和通知类并没有共同点,但是要通知车主这两个类就有了关联,这时候可以把这两个类组合在一起 #!/usr/bin/python3 # -* ...
- SEO--多领域
1.社交媒体SEO优化,例如:视频,吸引流量 2.电商SEO,很多不是皇冠的商家也可以被搜索到 3.新媒体 微博 和 微信营销 手机端的SEO等.传统的SEO已经渐渐不具备竞争力 SEO盈利:网盟.广 ...
- C++编译变更stlport到使用g++的stl经验总结
. 花了几天时间,需要把经验给记下来. 1. 需要支持C++11的编译器,最方便的方式就是 yum -y install devtoolset-6 在/usr/local/bin中增加gcc6.sh ...
- gcc dynamic load library
Linux下一般都是直接在编译生成时挂接上链接库,运行时,把链接库放到系统环境里就可以了 但是windows出现带来了动态链接的概念,也就兴起了非windows世界的插件的概念的范潮 对应于windo ...
- 第一次使用theos自己遇到的坑
这里自己遇到的一些问题,总结一下: 第一个问题建立好theos工程后make出现 xcrun: error: SDK "iphoneos" cannot be located xc ...
- jquery评分效果Rating精华版
参考:https://blog.csdn.net/bluceyoung/article/details/8573629
- Hello py
https://www.cnblogs.com/AdaminXie/p/8339863.html https://www.cnblogs.com/-clq/p/8340515.html https:/ ...