mirror of
https://github.com/jaywcjlove/reference.git
synced 2025-06-19 13:41:21 +08:00
Compare commits
7 Commits
Author | SHA1 | Date | |
---|---|---|---|
d1c9871504 | |||
a478fbb888 | |||
fdcfcb287b | |||
3003e3db66 | |||
ca1f5ad470 | |||
d0d371b165 | |||
54b7faee00 |
7
.github/workflows/ci.yml
vendored
7
.github/workflows/ci.yml
vendored
@ -16,6 +16,13 @@ jobs:
|
|||||||
- run: npm install
|
- run: npm install
|
||||||
- run: npm run build
|
- run: npm run build
|
||||||
|
|
||||||
|
- name: Generate Contributors Images
|
||||||
|
uses: jaywcjlove/github-action-contributors@main
|
||||||
|
with:
|
||||||
|
filter-author: (renovate\[bot\]|renovate-bot|dependabot\[bot\])
|
||||||
|
output: dist/CONTRIBUTORS.svg
|
||||||
|
avatarSize: 42
|
||||||
|
|
||||||
- name: Create Tag
|
- name: Create Tag
|
||||||
id: create_tag
|
id: create_tag
|
||||||
uses: jaywcjlove/create-tag-action@main
|
uses: jaywcjlove/create-tag-action@main
|
||||||
|
10
README.md
10
README.md
@ -105,6 +105,16 @@ Quick Reference
|
|||||||
<!--rehype:style=margin-top:3rem-->
|
<!--rehype:style=margin-top:3rem-->
|
||||||
|
|
||||||
<!--rehype:ignore:start-->
|
<!--rehype:ignore:start-->
|
||||||
|
## 贡献
|
||||||
|
|
||||||
|
请参阅[贡献指南](./CONTRIBUTING.md)了解如何开始。一如既往,感谢我们出色的贡献者!
|
||||||
|
|
||||||
|
<a href="https://github.com/jaywcjlove/reference/graphs/contributors">
|
||||||
|
<img src="https://jaywcjlove.github.io/reference/CONTRIBUTORS.svg" />
|
||||||
|
</a>
|
||||||
|
|
||||||
|
上图贡献者列表,由 [contributors](https://github.com/jaywcjlove/github-action-contributors) 自动生成贡献者图片。
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
MIT © [Kenny Wong](https://github.com/jaywcjlove)
|
MIT © [Kenny Wong](https://github.com/jaywcjlove)
|
||||||
|
244
docs/chmod.md
244
docs/chmod.md
@ -31,10 +31,21 @@ $ chmod -R 755 my_directory
|
|||||||
|
|
||||||
### Chmod 生成器
|
### Chmod 生成器
|
||||||
|
|
||||||
```html
|
```html preview
|
||||||
|
<div>
|
||||||
|
权限:<input type="text" id="num" placeholder="777" maxlength="3" style="padding: 0.3rem 0.3rem;" /> <input type="text" id="let" placeholder="rwxrwxrwx" maxlength="9" style="padding: 0.3rem 0.3rem;" />
|
||||||
|
</div>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
| User | Group | Other
|
||||||
|
:- | :- | :- | :-
|
||||||
|
读 _(Read)_ | <input checked id="1" type="checkbox"></input> | <input checked id="4" type="checkbox"></input> | <input checked id="7" type="checkbox"></input>
|
||||||
|
写 _(Write)_ | <input checked id="2" type="checkbox"></input> | <input checked id="5" type="checkbox"></input> | <input checked id="8" type="checkbox"></input>
|
||||||
|
执行 _(Execute)_ | <input checked id="3" type="checkbox"></input> | <input checked id="6" type="checkbox"></input> | <input checked id="9" type="checkbox"></input>
|
||||||
|
<!--rehype:className=show-header-->
|
||||||
|
|
||||||
Chmod 生成器允许您以数字和符号的形式快速、直观地生成权限。
|
Chmod 生成器允许您以数字和符号的形式快速、直观地生成权限。
|
||||||
|
|
||||||
### 通用权限
|
### 通用权限
|
||||||
@ -264,3 +275,232 @@ $ find /path -type f -exec chmod 644 {} \;
|
|||||||
----
|
----
|
||||||
|
|
||||||
* [使用 chmod 修改文件权限](https://www.linode.com/docs/guides/modify-file-permissions-with-chmod/) _(linode.com)_
|
* [使用 chmod 修改文件权限](https://www.linode.com/docs/guides/modify-file-permissions-with-chmod/) _(linode.com)_
|
||||||
|
|
||||||
|
<!--rehype:ignore:start-->
|
||||||
|
### 以下是 Chmod 生成器 JS 代码(代码用于网站请忽略不要删除)
|
||||||
|
<!--rehype:ignore:end-->
|
||||||
|
|
||||||
|
```html preview
|
||||||
|
<!-- Chmod 生成器 JS 代码 -->
|
||||||
|
<script type="text/javascript">
|
||||||
|
const reg_num = /^[0-7]{3}$/; // 一些正则表达式来检查 num 输入
|
||||||
|
const reg_let = /^([r\-]{1}[w\-]{1}[x\-]{1}){3}$/; // 一些正则表达式来检查文本输入
|
||||||
|
function checkBoxHandle() {
|
||||||
|
change_occured(true, false, false);
|
||||||
|
// get rid of bad input classes
|
||||||
|
document.getElementById('num').classList.remove('bad-input');
|
||||||
|
document.getElementById('let').classList.remove('bad-input');
|
||||||
|
}
|
||||||
|
window.addEventListener("DOMContentLoaded", function () {
|
||||||
|
// loop over all the check boxes
|
||||||
|
for (let i = 1; i < 10; i++) {
|
||||||
|
let checkBox = document.getElementById(`${i}`);
|
||||||
|
checkBox.addEventListener('change', function () {
|
||||||
|
change_occured(true, false, false);
|
||||||
|
|
||||||
|
// get rid of bad input classes
|
||||||
|
document.getElementById('num').classList.remove('bad-input');
|
||||||
|
|
||||||
|
document.getElementById('let').classList.remove('bad-input');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// the octal input
|
||||||
|
let num_input = document.getElementById('num');
|
||||||
|
let num_fn = function () {
|
||||||
|
// check for bad input
|
||||||
|
if (!reg_num.test(this.value)) {
|
||||||
|
this.classList.add('bad-input');
|
||||||
|
} else {
|
||||||
|
this.classList.remove('bad-input');
|
||||||
|
change_occured(false, true, false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
num_input.addEventListener('change', num_fn);
|
||||||
|
num_input.addEventListener('keyup', num_fn);
|
||||||
|
// the let input
|
||||||
|
let let_input = document.getElementById('let');
|
||||||
|
let let_fn = function () {
|
||||||
|
// check for bad input
|
||||||
|
if (!reg_let.test(this.value)) {
|
||||||
|
this.classList.add('bad-input');
|
||||||
|
} else {
|
||||||
|
this.classList.remove('bad-input');
|
||||||
|
change_occured(false, false, true);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let_input.addEventListener('change',let_fn);
|
||||||
|
let_input.addEventListener('keyup',let_fn);
|
||||||
|
});
|
||||||
|
/* SETUP
|
||||||
|
r-4-1 r-4-4 r-4-7
|
||||||
|
w-2-2 w-2-5 w-2-8
|
||||||
|
x-1-3 x-1-6 x-1-9
|
||||||
|
*/
|
||||||
|
// define a function that runs when a change occures
|
||||||
|
function change_occured(caller_was_check, caller_was_num, caller_was_let) {
|
||||||
|
let num1 = 0, num2 = 0, num3 = 0; // these are the three numbers for the octal
|
||||||
|
let perm_string = ''; // holds the permision string ex. rw-x--r--
|
||||||
|
if (caller_was_check) {
|
||||||
|
// loop over all the check boxes and get the permisions
|
||||||
|
for (let i = 1; i < 10; i++) {
|
||||||
|
let checkBox = document.getElementById(`${i}`);
|
||||||
|
if (checkBox.checked) { // if checked
|
||||||
|
let current_perm = check_to_octal_and_text(i);
|
||||||
|
perm_string += `${current_perm.perm_let}`;
|
||||||
|
if (i <= 3) {
|
||||||
|
num1 += current_perm.perm_num;
|
||||||
|
} else if (i <= 6) {
|
||||||
|
num2 += current_perm.perm_num;
|
||||||
|
} else {
|
||||||
|
num3 += current_perm.perm_num;
|
||||||
|
}
|
||||||
|
} else { // if not checked
|
||||||
|
perm_string += '-';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// set the permision input text
|
||||||
|
document.getElementById('let').value = perm_string;
|
||||||
|
document.getElementById('num').value = `${num1}${num2}${num3}`;
|
||||||
|
} else if (caller_was_num) {
|
||||||
|
// get the individual numbers
|
||||||
|
let num_input_val = document.getElementById('num').value;
|
||||||
|
num1 = num_input_val.substring(0, 1);
|
||||||
|
num2 = num_input_val.substring(1, 2);
|
||||||
|
num3 = num_input_val.substring(2, 3);
|
||||||
|
// set the checkboxes and get the perm string
|
||||||
|
perm_string += octal_to_check_and_txt(num1, 0); //Owner
|
||||||
|
perm_string += octal_to_check_and_txt(num2, 1); //Owner
|
||||||
|
perm_string += octal_to_check_and_txt(num3, 2); //Owner
|
||||||
|
// set the permision input text
|
||||||
|
document.getElementById('let').value = perm_string;
|
||||||
|
} else if (caller_was_let) {
|
||||||
|
// get the text input
|
||||||
|
let perm_text = document.getElementById('let').value;
|
||||||
|
num1 = text_to_check_and_octal(perm_text.substring(0, 3), 0)
|
||||||
|
num2 = text_to_check_and_octal(perm_text.substring(3, 6), 3)
|
||||||
|
num3 = text_to_check_and_octal(perm_text.substring(6, 9), 6)
|
||||||
|
// set the octal value
|
||||||
|
document.getElementById('num').value = `${num1}${num2}${num3}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// define a function to converts the checkbox # to the respective permissions
|
||||||
|
// returns perm_num, perm_let
|
||||||
|
function check_to_octal_and_text(check_num) {
|
||||||
|
let perm_num = 0;
|
||||||
|
let perm_let = '-';
|
||||||
|
switch (check_num) {
|
||||||
|
case 1:
|
||||||
|
case 4:
|
||||||
|
case 7:
|
||||||
|
perm_num = 4;
|
||||||
|
perm_let = 'r';
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
case 5:
|
||||||
|
case 8:
|
||||||
|
perm_num = 2;
|
||||||
|
perm_let = 'w';
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
case 6:
|
||||||
|
case 9:
|
||||||
|
perm_num = 1;
|
||||||
|
perm_let = 'x';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
perm_num = 0;
|
||||||
|
perm_let = '-';
|
||||||
|
}
|
||||||
|
// return values
|
||||||
|
return {
|
||||||
|
perm_num,
|
||||||
|
perm_let
|
||||||
|
};
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
Takes a number 1-7 and which class it is in:
|
||||||
|
0 = owner
|
||||||
|
1 = Group
|
||||||
|
2 = Public
|
||||||
|
Returns: perm text (ex. "rwx") and sets the appropriate checkboxes
|
||||||
|
*/
|
||||||
|
function octal_to_check_and_txt(octal_num, class_num) {
|
||||||
|
let perm_text = '';
|
||||||
|
let offset = class_num * 3;
|
||||||
|
switch (octal_num) {
|
||||||
|
case '1':
|
||||||
|
document.getElementById(`${1 + offset}`).checked = false;
|
||||||
|
document.getElementById(`${2 + offset}`).checked = false;
|
||||||
|
document.getElementById(`${3 + offset}`).checked = true;
|
||||||
|
perm_text = '--x';
|
||||||
|
break;
|
||||||
|
case '2':
|
||||||
|
document.getElementById(`${1 + offset}`).checked = false;
|
||||||
|
document.getElementById(`${2 + offset}`).checked = true;
|
||||||
|
document.getElementById(`${3 + offset}`).checked = false;
|
||||||
|
perm_text = '-w-';
|
||||||
|
break;
|
||||||
|
case '3':
|
||||||
|
document.getElementById(`${1 + offset}`).checked = false;
|
||||||
|
document.getElementById(`${2 + offset}`).checked = true;
|
||||||
|
document.getElementById(`${3 + offset}`).checked = true;
|
||||||
|
perm_text = '-wx';
|
||||||
|
break;
|
||||||
|
case '4':
|
||||||
|
document.getElementById(`${1 + offset}`).checked = true;
|
||||||
|
document.getElementById(`${2 + offset}`).checked = false;
|
||||||
|
document.getElementById(`${3 + offset}`).checked = false;
|
||||||
|
perm_text = 'r--';
|
||||||
|
break;
|
||||||
|
case '5':
|
||||||
|
document.getElementById(`${1 + offset}`).checked = true;
|
||||||
|
document.getElementById(`${2 + offset}`).checked = false;
|
||||||
|
document.getElementById(`${3 + offset}`).checked = true;
|
||||||
|
perm_text = 'r-x';
|
||||||
|
break;
|
||||||
|
case '6':
|
||||||
|
document.getElementById(`${1 + offset}`).checked = true;
|
||||||
|
document.getElementById(`${2 + offset}`).checked = true;
|
||||||
|
document.getElementById(`${3 + offset}`).checked = false;
|
||||||
|
perm_text = 'rw-';
|
||||||
|
break;
|
||||||
|
case '7':
|
||||||
|
document.getElementById(`${1 + offset}`).checked = true;
|
||||||
|
document.getElementById(`${2 + offset}`).checked = true;
|
||||||
|
document.getElementById(`${3 + offset}`).checked = true;
|
||||||
|
perm_text = 'rwx';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
document.getElementById(`${1 + offset}`).checked = false;
|
||||||
|
document.getElementById(`${2 + offset}`).checked = false;
|
||||||
|
document.getElementById(`${3 + offset}`).checked = false;
|
||||||
|
perm_text = '---';
|
||||||
|
}
|
||||||
|
return perm_text;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
Takes 3 letters (r, w, x, - ex. 'rw-') and an offset (0,3,6)
|
||||||
|
Returns the octal num and sets the appropriate checkboxes
|
||||||
|
*/
|
||||||
|
function text_to_check_and_octal(letters, offset) {
|
||||||
|
let perm_num = 0; // the octal number to return
|
||||||
|
// add up the oct num and set the check boxes
|
||||||
|
for (let i = 0; i < 3; i++) {
|
||||||
|
current_let = letters.substring(i, i + 1);
|
||||||
|
if (current_let == 'r') {
|
||||||
|
document.getElementById(`${i + 1 + offset}`).checked = true;
|
||||||
|
perm_num += 4;
|
||||||
|
} else if (current_let == 'w') {
|
||||||
|
document.getElementById(`${i + 1 + offset}`).checked = true;
|
||||||
|
perm_num += 2;
|
||||||
|
} else if (current_let == 'x') {
|
||||||
|
document.getElementById(`${i + 1 + offset}`).checked = true;
|
||||||
|
perm_num += 1;
|
||||||
|
} else {
|
||||||
|
document.getElementById(`${i + 1 + offset}`).checked = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return perm_num;
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
```
|
@ -95,7 +95,7 @@ Min Hour Day Mon Weekday
|
|||||||
`L` | 仅允许用于 `月份中的某天` 或 `星期几` 字段,`星期几` 中的 `2L` 表示每个月的最后一个星期二
|
`L` | 仅允许用于 `月份中的某天` 或 `星期几` 字段,`星期几` 中的 `2L` 表示每个月的最后一个星期二
|
||||||
`井号 (#)` | 仅允许用于 `星期几` 字段,后面必须在 1 到 5 的范围内。例如,`4#1` 表示给定月份的“第一个星期四”。
|
`井号 (#)` | 仅允许用于 `星期几` 字段,后面必须在 1 到 5 的范围内。例如,`4#1` 表示给定月份的“第一个星期四”。
|
||||||
`问号(?)` | 可以代替“*”并允许用于月份和星期几。使用仅限于 cron 表达式中的 `月份中的某天` 或 `星期几`。
|
`问号(?)` | 可以代替“*”并允许用于月份和星期几。使用仅限于 cron 表达式中的 `月份中的某天` 或 `星期几`。
|
||||||
<!--rehype:className=show-header -->
|
<!--rehype:className=show-header auto-wrap-->
|
||||||
|
|
||||||
|
|
||||||
## Also see
|
## Also see
|
||||||
|
@ -110,7 +110,7 @@ apk add --update curl # alpine linux 中安装
|
|||||||
`curl --connect-timeout 10 -I -k https://www.baidu.com` | `curl` 默认没有超时
|
`curl --connect-timeout 10 -I -k https://www.baidu.com` | `curl` 默认没有超时
|
||||||
`curl --verbose --header "Host: www.mytest.com:8182" www.baidu.com` | `curl` 得到额外的标题
|
`curl --verbose --header "Host: www.mytest.com:8182" www.baidu.com` | `curl` 得到额外的标题
|
||||||
`curl -k -v https://www.google.com` | `curl` 获取带有标题的响应
|
`curl -k -v https://www.google.com` | `curl` 获取带有标题的响应
|
||||||
|
<!--rehype:class=auto-wrap-->
|
||||||
|
|
||||||
### 多文件上传
|
### 多文件上传
|
||||||
<!--rehype:wrap-class=col-span-2-->
|
<!--rehype:wrap-class=col-span-2-->
|
||||||
@ -136,6 +136,7 @@ $ curl -XGET http://${elasticsearch_ip}:9200/_cluster/nodes | python -m json.too
|
|||||||
:- | :-
|
:- | :-
|
||||||
`curl -d "name=username&password=123456" <URL>` | `curl` 发请求
|
`curl -d "name=username&password=123456" <URL>` | `curl` 发请求
|
||||||
`curl <URL> -H "content-type: application/json" -d "{ \"woof\": \"bark\"}"` | `curl` 发送 json
|
`curl <URL> -H "content-type: application/json" -d "{ \"woof\": \"bark\"}"` | `curl` 发送 json
|
||||||
|
<!--rehype:class=auto-wrap-->
|
||||||
|
|
||||||
### CURL 脚本安装 rvm
|
### CURL 脚本安装 rvm
|
||||||
<!--rehype:wrap-class=col-span-2-->
|
<!--rehype:wrap-class=col-span-2-->
|
||||||
@ -156,6 +157,7 @@ curl -sSL https://get.rvm.io | bash
|
|||||||
`curl -T cryptopp552.zip -u test:test ftp://10.32.99.187/` | curl `ftp` 上传
|
`curl -T cryptopp552.zip -u test:test ftp://10.32.99.187/` | curl `ftp` 上传
|
||||||
`curl -u test:test ftp://10.32.99.187/cryptopp552.zip -o cryptopp552.zip` | curl `ftp` 下载
|
`curl -u test:test ftp://10.32.99.187/cryptopp552.zip -o cryptopp552.zip` | curl `ftp` 下载
|
||||||
`curl -v -u admin:admin123 --upload-file package1.zip http://mysever:8081/dir/package1.zip` | 使用凭证 `curl` 上传
|
`curl -v -u admin:admin123 --upload-file package1.zip http://mysever:8081/dir/package1.zip` | 使用凭证 `curl` 上传
|
||||||
|
<!--rehype:class=auto-wrap-->
|
||||||
|
|
||||||
### 检查网站响应时间
|
### 检查网站响应时间
|
||||||
<!--rehype:wrap-class=col-span-4-->
|
<!--rehype:wrap-class=col-span-4-->
|
||||||
|
@ -110,6 +110,7 @@ RUN true | false # 将脱离管道
|
|||||||
`CMD ["executable","param1","param2"]` | (exec 形式,这是首选形式)
|
`CMD ["executable","param1","param2"]` | (exec 形式,这是首选形式)
|
||||||
`CMD ["param1","param2"]` | (作为 ENTRYPOINT 的默认参数)
|
`CMD ["param1","param2"]` | (作为 ENTRYPOINT 的默认参数)
|
||||||
`CMD command param1 param2` | (shell形式)
|
`CMD command param1 param2` | (shell形式)
|
||||||
|
<!--rehype:class=auto-wrap-->
|
||||||
|
|
||||||
```dockerfile
|
```dockerfile
|
||||||
EXPOSE 5900
|
EXPOSE 5900
|
||||||
@ -185,6 +186,7 @@ temp?
|
|||||||
`*/temp*` | 在根的任何直接子目录中<br />排除名称以 `temp` 开头的文件和目录
|
`*/temp*` | 在根的任何直接子目录中<br />排除名称以 `temp` 开头的文件和目录
|
||||||
`*/*/temp*` | 从根以下两级的任何子目录中<br />排除以 `temp` 开头的文件和目录
|
`*/*/temp*` | 从根以下两级的任何子目录中<br />排除以 `temp` 开头的文件和目录
|
||||||
`temp?` | 排除根目录中名称为<br /> `temp` 的单字符扩展名的文件和目录
|
`temp?` | 排除根目录中名称为<br /> `temp` 的单字符扩展名的文件和目录
|
||||||
|
<!--rehype:class=auto-wrap-->
|
||||||
|
|
||||||
如果此文件存在,排除与其中的模式匹配的文件和目录,有利于避免 `ADD` 或 `COPY` 将敏感文件添加到镜像中。匹配是使用 Go 的 [filepath.Match](https://golang.org/pkg/path/filepath#Match) 规则完成的。
|
如果此文件存在,排除与其中的模式匹配的文件和目录,有利于避免 `ADD` 或 `COPY` 将敏感文件添加到镜像中。匹配是使用 Go 的 [filepath.Match](https://golang.org/pkg/path/filepath#Match) 规则完成的。
|
||||||
|
|
||||||
@ -203,6 +205,7 @@ temp?
|
|||||||
`CMD command param1 param2` | 设置默认命令
|
`CMD command param1 param2` | 设置默认命令
|
||||||
`ENV <key>=<value> ...` | 设置环境变量
|
`ENV <key>=<value> ...` | 设置环境变量
|
||||||
`EXPOSE <port> [<port>/<protocol>...]` | 运行时侦听指定的网络端口
|
`EXPOSE <port> [<port>/<protocol>...]` | 运行时侦听指定的网络端口
|
||||||
|
<!--rehype:class=auto-wrap-->
|
||||||
|
|
||||||
### 服务静态网站的最小 Docker 镜像
|
### 服务静态网站的最小 Docker 镜像
|
||||||
<!--rehype:wrap-class=col-span-2-->
|
<!--rehype:wrap-class=col-span-2-->
|
||||||
|
@ -21,6 +21,7 @@ npm 备忘清单
|
|||||||
| `npm install <package_name>@<tag>` | 使用 dist-tags 安装包 |
|
| `npm install <package_name>@<tag>` | 使用 dist-tags 安装包 |
|
||||||
| `npm install -g <package_name>` | 全局安装包 |
|
| `npm install -g <package_name>` | 全局安装包 |
|
||||||
| `npm uninstall <package_name>` | 卸载包 |
|
| `npm uninstall <package_name>` | 卸载包 |
|
||||||
|
<!--rehype:class=auto-wrap-->
|
||||||
|
|
||||||
`--save` 是 npm@5 的默认值。 以前,使用不带 `--save` 的 `npm install` 不会更新 package.json。
|
`--save` 是 npm@5 的默认值。 以前,使用不带 `--save` 的 `npm install` 不会更新 package.json。
|
||||||
|
|
||||||
@ -40,6 +41,7 @@ npm 备忘清单
|
|||||||
| `npm i /path/to/repo` | 绝对路径 |
|
| `npm i /path/to/repo` | 绝对路径 |
|
||||||
| `npm i ./archive.tgz` | 压缩包 |
|
| `npm i ./archive.tgz` | 压缩包 |
|
||||||
| `npm i https://site.com/archive.tgz` | 通过 HTTP 压缩包 |
|
| `npm i https://site.com/archive.tgz` | 通过 HTTP 压缩包 |
|
||||||
|
<!--rehype:class=auto-wrap-->
|
||||||
|
|
||||||
### 清单
|
### 清单
|
||||||
|
|
||||||
@ -49,6 +51,7 @@ npm 备忘清单
|
|||||||
| `npm list -g --depth 0` | 列出所有全局安装包的安装版本 |
|
| `npm list -g --depth 0` | 列出所有全局安装包的安装版本 |
|
||||||
| `npm view` | 列出此软件中所有依赖项的最新版本 |
|
| `npm view` | 列出此软件中所有依赖项的最新版本 |
|
||||||
| `npm outdated` | 仅列出此软件中已过时的依赖项 |
|
| `npm outdated` | 仅列出此软件中已过时的依赖项 |
|
||||||
|
<!--rehype:class=auto-wrap-->
|
||||||
|
|
||||||
### 更新
|
### 更新
|
||||||
|
|
||||||
|
@ -228,6 +228,16 @@ const school = <div>学校</div>;
|
|||||||
```
|
```
|
||||||
<!--rehype:className=wrap-text -->
|
<!--rehype:className=wrap-text -->
|
||||||
|
|
||||||
|
### HTML 代码预览
|
||||||
|
|
||||||
|
```
|
||||||
|
```html preview
|
||||||
|
这里是你的 HTML 代码
|
||||||
|
\```
|
||||||
|
```
|
||||||
|
|
||||||
|
上面的 `markdown` 代码在 `meta` 位置添加 `preview` 标识,HTML 代码将被执行预览
|
||||||
|
|
||||||
|
|
||||||
布局
|
布局
|
||||||
---
|
---
|
||||||
@ -602,6 +612,17 @@ H2 部分
|
|||||||
|
|
||||||
`<!--rehype:className=style-list-arrow-->`
|
`<!--rehype:className=style-list-arrow-->`
|
||||||
|
|
||||||
|
### 隐藏表头强制小尺寸自动换行
|
||||||
|
|
||||||
|
:- | :-
|
||||||
|
:- | :-
|
||||||
|
`visualEffectState.inactive` | 后台应一直显示为非激活状态。
|
||||||
|
`titleBarStyle` _string_ _(win/mac)_ | 窗口标题栏样式。默认值 _(default)_
|
||||||
|
`titleBarStyle.default` | 分别返回 _mac_ 或者 _win_ 的标准标题栏
|
||||||
|
<!--rehype:className=auto-wrap-->
|
||||||
|
|
||||||
|
`<!--rehype:className=auto-wrap-->`
|
||||||
|
|
||||||
列表
|
列表
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -426,9 +426,9 @@ YAML 参考
|
|||||||
`"` | 环绕内嵌转义标量
|
`"` | 环绕内嵌转义标量
|
||||||
`|` | 块标量指示器
|
`|` | 块标量指示器
|
||||||
`>` | 折叠标量指示器
|
`>` | 折叠标量指示器
|
||||||
`-` | 剥离 chomp 修饰符(`|-` 或 `>-`)
|
`-` | 剥离 chomp 修饰符(`\|-` 或 `>-`)
|
||||||
`+` | 保留 chomp 修饰符(`|+` 或 `>+`)
|
`+` | 保留 chomp 修饰符(`\|+` 或 `>+`)
|
||||||
`1-9` | 显式缩进修饰符(`|1` 或 `>2`)。 <br/> 修饰符可以组合(`|2-`, `>+1`)
|
`1-9` | 显式缩进修饰符(`\|1` 或 `>2`)。 <br/> 修饰符可以组合(`\|2-`, `>+1`)
|
||||||
|
|
||||||
### 标签属性(通常未指定)
|
### 标签属性(通常未指定)
|
||||||
<!--rehype:wrap-class=col-span-2-->
|
<!--rehype:wrap-class=col-span-2-->
|
||||||
@ -441,6 +441,7 @@ YAML 参考
|
|||||||
`!!foo` | 次要的(按照惯例,表示 `tag:yaml.org,2002:foo`)
|
`!!foo` | 次要的(按照惯例,表示 `tag:yaml.org,2002:foo`)
|
||||||
`!h!foo` | 需要 `%TAG !h! <prefix>`(然后表示 `<prefix>foo`)
|
`!h!foo` | 需要 `%TAG !h! <prefix>`(然后表示 `<prefix>foo`)
|
||||||
`!<foo>` | 逐字标记(始终表示“foo”)
|
`!<foo>` | 逐字标记(始终表示“foo”)
|
||||||
|
<!--rehype:class=auto-wrap-->
|
||||||
|
|
||||||
### 杂项指标
|
### 杂项指标
|
||||||
|
|
||||||
@ -515,6 +516,7 @@ YAML 参考
|
|||||||
| `[.inf, -.Inf, .NAN]` | [无穷大(浮点数),负数,不是数字] |
|
| `[.inf, -.Inf, .NAN]` | [无穷大(浮点数),负数,不是数字] |
|
||||||
| `{Y, true, Yes, ON}` | 布尔真 |
|
| `{Y, true, Yes, ON}` | 布尔真 |
|
||||||
| `{n, FALSE, No, off}` | 布尔假 |
|
| `{n, FALSE, No, off}` | 布尔假 |
|
||||||
|
<!--rehype:class=auto-wrap-->
|
||||||
|
|
||||||
另见
|
另见
|
||||||
---
|
---
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wcj/reference",
|
"name": "@wcj/reference",
|
||||||
"version": "1.8.0",
|
"version": "1.9.0",
|
||||||
"description": "为开发人员分享快速参考备忘单(主要是方便自己)。",
|
"description": "为开发人员分享快速参考备忘单(主要是方便自己)。",
|
||||||
"author": "jaywcjlove",
|
"author": "jaywcjlove",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@ -19,7 +19,7 @@
|
|||||||
},
|
},
|
||||||
"keywords": [],
|
"keywords": [],
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@wcj/markdown-to-html": "^2.1.0",
|
"@wcj/markdown-to-html": "^2.1.1",
|
||||||
"chokidar": "^3.5.3",
|
"chokidar": "^3.5.3",
|
||||||
"fs-extra": "^10.1.0",
|
"fs-extra": "^10.1.0",
|
||||||
"recursive-readdir-files": "^2.3.0",
|
"recursive-readdir-files": "^2.3.0",
|
||||||
|
@ -12,6 +12,7 @@ import { homeCardIcons } from './utils/homeCardIcons.mjs';
|
|||||||
import { getTocsTree } from './utils/getTocsTree.mjs';
|
import { getTocsTree } from './utils/getTocsTree.mjs';
|
||||||
import { rehypeTitle } from './utils/rehypeTitle.mjs';
|
import { rehypeTitle } from './utils/rehypeTitle.mjs';
|
||||||
import { anchorPoint } from './utils/anchorPoint.mjs';
|
import { anchorPoint } from './utils/anchorPoint.mjs';
|
||||||
|
import { rehypePreviewHTML } from './utils/rehypePreviewHTML.mjs';
|
||||||
|
|
||||||
const favicon = `data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20height%3D%221em%22%20width%3D%221em%22%3E%20%3Cpath%20d%3D%22m21.66%2010.44-.98%204.18c-.84%203.61-2.5%205.07-5.62%204.77-.5-.04-1.04-.13-1.62-.27l-1.68-.4c-4.17-.99-5.46-3.05-4.48-7.23l.98-4.19c.2-.85.44-1.59.74-2.2%201.17-2.42%203.16-3.07%206.5-2.28l1.67.39c4.19.98%205.47%203.05%204.49%207.23Z%22%20fill%3D%22%23c9d1d9%22%2F%3E%20%3Cpath%20d%3D%22M15.06%2019.39c-.62.42-1.4.77-2.35%201.08l-1.58.52c-3.97%201.28-6.06.21-7.35-3.76L2.5%2013.28c-1.28-3.97-.22-6.07%203.75-7.35l1.58-.52c.41-.13.8-.24%201.17-.31-.3.61-.54%201.35-.74%202.2l-.98%204.19c-.98%204.18.31%206.24%204.48%207.23l1.68.4c.58.14%201.12.23%201.62.27Zm2.43-8.88c-.06%200-.12-.01-.19-.02l-4.85-1.23a.75.75%200%200%201%20.37-1.45l4.85%201.23a.748.748%200%200%201-.18%201.47Z%22%20fill%3D%22%23228e6c%22%20%2F%3E%20%3Cpath%20d%3D%22M14.56%2013.89c-.06%200-.12-.01-.19-.02l-2.91-.74a.75.75%200%200%201%20.37-1.45l2.91.74c.4.1.64.51.54.91-.08.34-.38.56-.72.56Z%22%20fill%3D%22%23228e6c%22%20%2F%3E%20%3C%2Fsvg%3E`;
|
const favicon = `data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20height%3D%221em%22%20width%3D%221em%22%3E%20%3Cpath%20d%3D%22m21.66%2010.44-.98%204.18c-.84%203.61-2.5%205.07-5.62%204.77-.5-.04-1.04-.13-1.62-.27l-1.68-.4c-4.17-.99-5.46-3.05-4.48-7.23l.98-4.19c.2-.85.44-1.59.74-2.2%201.17-2.42%203.16-3.07%206.5-2.28l1.67.39c4.19.98%205.47%203.05%204.49%207.23Z%22%20fill%3D%22%23c9d1d9%22%2F%3E%20%3Cpath%20d%3D%22M15.06%2019.39c-.62.42-1.4.77-2.35%201.08l-1.58.52c-3.97%201.28-6.06.21-7.35-3.76L2.5%2013.28c-1.28-3.97-.22-6.07%203.75-7.35l1.58-.52c.41-.13.8-.24%201.17-.31-.3.61-.54%201.35-.74%202.2l-.98%204.19c-.98%204.18.31%206.24%204.48%207.23l1.68.4c.58.14%201.12.23%201.62.27Zm2.43-8.88c-.06%200-.12-.01-.19-.02l-4.85-1.23a.75.75%200%200%201%20.37-1.45l4.85%201.23a.748.748%200%200%201-.18%201.47Z%22%20fill%3D%22%23228e6c%22%20%2F%3E%20%3Cpath%20d%3D%22M14.56%2013.89c-.06%200-.12-.01-.19-.02l-2.91-.74a.75.75%200%200%201%20.37-1.45l2.91.74c.4.1.64.51.54.91-.08.34-.38.56-.72.56Z%22%20fill%3D%22%23228e6c%22%20%2F%3E%20%3C%2Fsvg%3E`;
|
||||||
|
|
||||||
@ -41,6 +42,7 @@ export function create(str = '', options = {}) {
|
|||||||
}],
|
}],
|
||||||
],
|
],
|
||||||
rewrite: (node, index, parent) => {
|
rewrite: (node, index, parent) => {
|
||||||
|
rehypePreviewHTML(node, parent);
|
||||||
rehypeTitle(node, options.filename);
|
rehypeTitle(node, options.filename);
|
||||||
homeCardIcons(node, parent, options.isHome);
|
homeCardIcons(node, parent, options.isHome);
|
||||||
tooltips(node, index, parent);
|
tooltips(node, index, parent);
|
||||||
|
@ -959,11 +959,14 @@ body:not(.home) .h2wrap-body > .wrap:hover .h3wrap > h3 a::after {
|
|||||||
.footer-wrap {
|
.footer-wrap {
|
||||||
font-size: 0.75rem;
|
font-size: 0.75rem;
|
||||||
}
|
}
|
||||||
table {
|
table.auto-wrap {
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
table td, table th {
|
table.auto-wrap thead {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
table.auto-wrap td, table.auto-wrap th {
|
||||||
display: block;
|
display: block;
|
||||||
text-align: left !important;
|
text-align: left !important;
|
||||||
}
|
}
|
||||||
@ -973,9 +976,6 @@ body:not(.home) .h2wrap-body > .wrap:hover .h3wrap > h3 a::after {
|
|||||||
table td:first-child {
|
table td:first-child {
|
||||||
white-space: initial;
|
white-space: initial;
|
||||||
}
|
}
|
||||||
.wrap-header.h3wrap > .wrap-body {
|
|
||||||
overflow: initial;
|
|
||||||
}
|
|
||||||
.tooltip:hover .tooltiptext {
|
.tooltip:hover .tooltiptext {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
|
@ -3,11 +3,19 @@ import rehypeParse from 'rehype-parse';
|
|||||||
import {unified} from 'unified';
|
import {unified} from 'unified';
|
||||||
import { VFile } from 'vfile';
|
import { VFile } from 'vfile';
|
||||||
|
|
||||||
export function getSVGNode(iconPath) {
|
export function getSVGNode(iconPath, space = 'svg') {
|
||||||
const svgStr = fs.readFileSync(iconPath);
|
const svgStr = fs.readFileSync(iconPath);
|
||||||
const processor = unified().use(rehypeParse,{ fragment: true, space: "svg" })
|
const processor = unified().use(rehypeParse,{ fragment: true, space })
|
||||||
const file = new VFile();
|
const file = new VFile();
|
||||||
file.value = svgStr.toString();
|
file.value = svgStr.toString();
|
||||||
const hastNode = processor.runSync(processor.parse(file), file);
|
const hastNode = processor.runSync(processor.parse(file), file);
|
||||||
return hastNode.children || []
|
return hastNode.children || []
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getVNode(str = '', space = 'html') {
|
||||||
|
const processor = unified().use(rehypeParse,{ fragment: true, space })
|
||||||
|
const file = new VFile();
|
||||||
|
file.value = str.toString();
|
||||||
|
const hastNode = processor.runSync(processor.parse(file), file);
|
||||||
|
return hastNode.children || []
|
||||||
|
}
|
14
scripts/utils/rehypePreviewHTML.mjs
Normal file
14
scripts/utils/rehypePreviewHTML.mjs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
import { getCodeString } from 'rehype-rewrite';
|
||||||
|
import { getVNode } from './getSVGNode.mjs';
|
||||||
|
|
||||||
|
export function rehypePreviewHTML(node, parent) {
|
||||||
|
if (node.type === 'element' && node.tagName === 'pre' && node.properties?.className?.includes('language-html')) {
|
||||||
|
const child = node.children[0];
|
||||||
|
if (child?.tagName === 'code' && child.data?.meta === 'preview') {
|
||||||
|
const code = getCodeString(node.children)
|
||||||
|
const vnode = getVNode(code || '')
|
||||||
|
node.children = vnode
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Reference in New Issue
Block a user