Typora 是一款由 Abner Lee 开发的轻量级 Markdown 编辑器,与其他 Markdown 编辑器不同的是,Typora 没有采用源代码和预览双栏显示的方式,而是采用所见即所得的编辑方式,实现了即时预览的功能,但也可切换至源代码编辑模式。

一个遗憾是不支持,代码块的折叠,当代码块中代码行数过多,会显得臃肿

代码块添加折叠按钮

image-20230613220158516

Typora实际就是一个浏览器

通过修改Typora安装目录如下 的 frame.js文件,来实现这个功能

1
D:\NotesRead\Typora\resources\appsrc\window\frame.js

image-20230613215619674

  • 在文件 frame.js的末尾添加如下代码
1
var content = document.getElementsByTagName("content")[0];

1. 在单个代码块添加代码收缩按钮

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 添加代码收缩功能
content.addEventListener("mouseover", function () {
window.setTimeout(function () {
codeDivs.forEach((div, index) => {
if (div.firstChild.nodeName != "BUTTON") {
var button = document.createElement("button");
button.className = "contract-code-button";
button.innerText = "代码收缩";
button.onclick = (e) => {
if (div.style.height != "2.9em") {
button.innerText = "代码展开";
div.style.height = "2.9em";
} else {
button.innerText = "代码收缩";
div.style.height = "inherit";
}
}
div.insertBefore(button, div.firstChild)
}
});
}, 1000);
}, true);

2.添加收缩文件全部代码块按钮

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// 添加收缩全部按钮
var isAdd = false;
content.addEventListener("load", function () {
window.setTimeout(function () {
if (!isAdd) {
var footer = document.getElementsByTagName("footer")[0];

// 全部收缩按钮
var contractButton = document.createElement("button");
contractButton.innerText = "全部收缩";
contractButton.name = "contarctAllButton";
contractButton.className = "contract-all-button";
contractButton.onclick = (e) => {
var buttons = document.getElementsByClassName("contract-code-button");
buttons.forEach((button, index) => {
var div = button.parentNode;
button.innerText = "代码展开";
div.style.height = "2.9em";
});
}

// 全部展开按钮
var expandButton = document.createElement("button");
expandButton.innerText = "全部展开";
expandButton.name = "expandAllButton";
expandButton.className = "expand-all-button";
expandButton.onclick = (e) => {
var buttons = document.getElementsByClassName("contract-code-button");
buttons.forEach((button, index) => {
var div = button.parentNode;
button.innerText = "代码收缩";
div.style.height = "inherit";
});
}

footer.append(contractButton);
footer.append(expandButton);
isAdd = true;
}
}, 1000);
}, true);

实现效果

  1. image-20230625221126253
    image-20230625221322980

  2. image-20230625221247195

参考

  1. Typora
  2. Typora官方中文站
  3. CSDN-jo尼jo斯达博客