From 815383e849202dbeb12e3cbd7f28d5c72e580a69 Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Mon, 26 Sep 2022 09:52:59 +0800 Subject: [PATCH] chore: init project. --- .gitignore | 23 +++++ README.md | 15 ++- docs/vscode.md | 193 +++++++++++++++++++++++++++++++++++++++ package.json | 27 ++++++ scripts/build.mjs | 43 +++++++++ scripts/create.mjs | 130 ++++++++++++++++++++++++++ scripts/nodes/footer.mjs | 0 scripts/style.css | 152 ++++++++++++++++++++++++++++++ 8 files changed, 581 insertions(+), 2 deletions(-) create mode 100644 .gitignore create mode 100644 docs/vscode.md create mode 100644 package.json create mode 100644 scripts/build.mjs create mode 100644 scripts/create.mjs create mode 100644 scripts/nodes/footer.mjs create mode 100644 scripts/style.css diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4ccddc0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +build +dist +node_modules +package-lock.json + +.DS_Store +.cache +.vscode +.idea +.snap +.env + +*.bak +*.tem +*.temp +#.swp +*.*~ +~*.* + +# IDEA +*.iml +*.ipr +*.iws \ No newline at end of file diff --git a/README.md b/README.md index 8955301..b88309f 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,13 @@ -# reference -为开发人员分享快速参考备忘单(主要是方便自己)。 +Quick Reference +=== + +为开发人员分享快速参考备忘单(主要是方便自己),在看到 [Reference](https://github.com/Randy8080/reference) 快速参考备忘单,感觉非常简单,造轮子使命感突然来了,造个中文版本的,为了方便自己的技术栈查阅,立马撸起来 :)。 + +如果您发现此处的备忘单不合适,您可以通过提交 PR 来修复它或提供更好的备忘单,只针对【中文】用户。 + +以下是开源天使提供的一些备忘单和快速参考。:) + +## License + +MIT © Randy8080 + diff --git a/docs/vscode.md b/docs/vscode.md new file mode 100644 index 0000000..8856676 --- /dev/null +++ b/docs/vscode.md @@ -0,0 +1,193 @@ +VSCode 备忘单 +=== + +这个 VSCode (Visual Studio Code) 快速参考备忘单显示了它的键盘快捷键和命令。 + +## Windows + +### 一般的 + +| - | - | +|-----------------------------|------------------------| +| `Ctrl` `Shift` `P` _/_ `F1` | 显示命令面板 | +| `Ctrl` `P` | 快速打开,转到文件 | +| `Ctrl` `Shift` `N` | 新窗户 | +| `Ctrl` `Shift` `W` | 关闭窗口 | +| `Ctrl` `,` | 用户设置 | +| `Ctrl` `K` `Ctrl` `S` | 键盘快捷键 | + + + +### 基本编辑 + + +| - | - | +|---------------------------|------------------------------------| +| `Ctrl` `X` | 剪切行 | +| `Ctrl` `C` | 复制行 | +| `Alt` `↑` _/_ `↓` | 向上/向下移动行 | +| `Shift` `Alt` `↓` _/_ `↑` | 向上/向下复制行 | +| `Ctrl` `Shift` `K` | 删除行 | +| `Ctrl` `Enter` | 在下面插入行 | +| `Ctrl` `Shift` `Enter` | 在上面插入行 | +| `Ctrl` `Shift` `\` | 跳转到匹配的括号 | +| `Ctrl` `]` _/_ `[` | 缩进/突出行 | +| `Home` _/_ `End` | 转到行首/行尾 | +| `Ctrl` `Home` | 转到文件开头 | +| `Ctrl` `End` | 转到文件末尾 | +| `Ctrl` `↑` _/_ `↓` | 向上/向下滚动行 | +| `Alt` `PgUp` _/_ `PgDn` | 向上/向下滚动页面 | +| `Ctrl` `Shift` `[` | 折叠(折叠)区域 | +| `Ctrl` `Shift` `]` | 展开(展开)区域 | +| `Ctrl` `K` `Ctrl` `[` | 折叠(折叠)所有子区域 | +| `Ctrl` `K` `Ctrl` `]` | 展开(展开)所有子区域 | +| `Ctrl` `K` `Ctrl` `0` | 折叠(折叠)所有区域 | +| `Ctrl` `K` `Ctrl` `J` | 展开(展开)所有区域 | +| `Ctrl` `K` `Ctrl` `C` | 添加行注释 | +| `Ctrl` `K` `Ctrl` `U` | 删除行注释 | +| `Ctrl` `/` | 切换行注释 | +| `Shift` `Alt` `A` | 切换块评论 | +| `Alt` `Z` | 切换自动换行 | + + +### 导航 + +| - | - | +|----------------------|--------------------| +| `Ctrl` `T` | 显示所有符号 | +| `Ctrl` `G` | 去线 | +| `Ctrl` `P` | 转到文件 | +| `Ctrl` `Shift` `O` | 转到符号 | +| `Ctrl` `Shift` `M` | 显示问题面板 | +| `F8` | 转到下一个错误 | +| `Shift` `F8` | 转到上一个错误 | +| `Ctrl` `Shift` `Tab` | 浏览编辑组历史 | +| `Alt` ` ←` _/_ `→` | 后退/前进 | +| `Ctrl` `M` | 切换 Tab 移动焦点 | + + + +### 搜索和替换 + +| - | - | +|---------------------------|---------------------------------| +| `Ctrl` `F` | 寻找 | +| `Ctrl` `H` | 代替 | +| `F3` _/_ `Shift` `F3` | 查找下一个/上一个 | +| `Alt` `Enter` | 选择所有出现的查找匹配项 | +| `Ctrl` `D` | 将选择添加到下一个查找匹配项 | +| `Ctrl` `K` `Ctrl` `D` | 将最后一个选择移动到下一个查找匹配项 | +| `Alt` `C` _/_ `R` _/_ `W` | 切换区分大小写/正则表达式/整个单词 | + + +### 多光标和选择 + +| - | - | +|----------------------------------------|------------------------------| +| `Alt` `Click` | 插入光标 | +| `Ctrl` `Alt` `↑` _/_ `↓` | 在上方/下方插入光标 | +| `Ctrl` `U` | 撤消上一次光标操作 | +| `Shift` `Alt` `I` | 在选定的每一行的末尾插入光标 | +| `Ctrl` `I` | 选择当前行 | +| `Ctrl` `Shift` `L` | 选择当前选择的所有匹配项 | +| `Ctrl` `F2` | 选择当前单词的所有出现 | +| `Shift` `Alt` `→` | 展开选择 | +| `Shift` `Alt` `←` | 收缩选择 | +| `Shift` `Alt` `` | 列(框)选择 | +| `Ctrl` `Shift` `Alt` `` | 列(框)选择 | +| `Ctrl` `Shift` `Alt` `PgUp` _/_ `PgDn` | 列(框)选择页上/下 | + + +### 丰富的语言编辑 + +| - | - | +|-----------------------------|-----------------| +| `Ctrl` `` `Ctrl` `I` | 触发建议 | +| `Ctrl` `Shift` `` | 触发参数提示 | +| `Shift` `Alt` `F` | 格式化文档 | +| `Ctrl` `K` `Ctrl` `F` | 格式选择 | +| `F12` | 转到定义 | +| `Alt` `F12` | 窥视定义 | +| `Ctrl` `K` `F12` | 打开定义到一边 | +| `Ctrl` `.` | 快速解决 | +| `Shift` `F12` | 显示参考 | +| `F2` | 重命名符号 | +| `Ctrl` `K` `Ctrl` `X` | 修剪尾随空格 | +| `Ctrl` `K` `M` | 更改文件语言 | + + + +### 编辑管理 + +| - | - | +|----------------------------------|--------------------------| +| `Ctrl` `F4` `Ctrl` `W` | 关闭编辑器 | +| `Ctrl` `K` `F` | 关闭文件夹 | +| `Ctrl` `\` | 拆分编辑器 | +| `Ctrl` ` 1` _/_ `2` _/_ `3` | 专注于第一、第二或第三编辑组 | +| `Ctrl` `K` `Ctrl` `←` _/_ `→` | 专注于上一个/下一个编辑组 | +| `Ctrl` `Shift` `PgUp` _/_ `PgDn` | 向左/向右移动编辑器 | +| `Ctrl` `K` `←` _/_ `→` | 移动活动编辑器组 | + + + +### 文件管理 + +| - | - | +|-----------------------|-----------------------------| +| `Ctrl` `N` | 新建文件 | +| `Ctrl` `O` | 打开文件 | +| `Ctrl` `S` | 保存 | +| `Ctrl` `Shift` `S` | 另存为 | +| `Ctrl` `K` `S` | 保存所有 | +| `Ctrl` `F4` | 关闭 | +| `Ctrl` `K` `Ctrl` `W` | 关闭松油 | +| `Ctrl` `Shift` `T` | 重新打开关闭的编辑器 | +| `Ctrl` `K` `Enter` | 保持预览模式编辑器打开 | +| `Ctrl` `Tab` | Open next | +| `Ctrl` `Shift` `Tab` | Open previous | +| `Ctrl` `K` `P` | 复制活动文件的路径 | +| `Ctrl` `K` `R` | 在资源管理器中显示活动文件 | +| `Ctrl` `K` `O` | 在新窗口/实例中显示活动文件 | + + +### 展示 + +| - | - | +|--------------------|--------------------------------------------| +| `F11` | 切换全屏 | +| `Shift` `Alt` `0` | 切换编辑器布局(水平/垂直) | +| `Ctrl` `=` _/_ `-` | 放大/缩小 | +| `Ctrl` `B` | 切换侧边栏可见性 | +| `Ctrl` `Shift` `E` | 显示资源管理器/切换焦点 | +| `Ctrl` `Shift` `F` | 显示搜索 | +| `Ctrl` `Shift` `G` | 显示源代码管理 | +| `Ctrl` `Shift` `D` | 显示调试 | +| `Ctrl` `Shift` `X` | 显示扩展 | +| `Ctrl` `Shift` `H` | 在文件中替换 | +| `Ctrl` `Shift` `J` | 切换搜索详细信息 | +| `Ctrl` `Shift` `U` | 显示输出面板 | +| `Ctrl` `Shift` `V` | 打开 Markdown 预览 | +| `Ctrl` `K` `V` | 打开 Markdown 预览到一边 | +| `Ctrl` `K` `Z` | Zen 模式(Esc Esc 退出) | + + + +### 调试 + +| - | - | +|--------------------------------|-------------------------------| +| `F9` | 切换断点 | +| `F5` | 开始/继续 | +| `Shift` `F5` | 停止 | +| `Shift` `F11` _/_ `F11` | 进/出 | +| `F10` | 跨过去 | +| `Ctrl` `K` `Ctrl` `I` | 显示悬停 | +| `Ctrl` \` | 显示综合终端 | +| `Ctrl` `Shift` \` | 创建一个新终端 | +| `Ctrl` `C` | 复制选择 | +| `Ctrl` `V` | 粘贴到活动终端 | +| `Ctrl` `↑` _/_ `↓` | 向上/向下滚动 | +| `Shift` `PgUp` _/_ `PgDn` | 向上/向下滚动页面 | +| `Ctrl` `Home` _/_ `End` | 滚动到顶部/底部 | + diff --git a/package.json b/package.json new file mode 100644 index 0000000..344766a --- /dev/null +++ b/package.json @@ -0,0 +1,27 @@ +{ + "name": "reference", + "version": "1.0.0", + "description": "为开发人员分享快速参考备忘单(主要是方便自己)。", + "private": false, + "scripts": { + "build": "node scripts/build.mjs" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/jaywcjlove/reference.git" + }, + "keywords": [], + "author": "jaywcjlove", + "license": "MIT", + "bugs": { + "url": "https://github.com/jaywcjlove/reference/issues" + }, + "homepage": "https://github.com/jaywcjlove/reference#readme", + "devDependencies": { + "@wcj/markdown-to-html": "^2.0.14", + "fs-extra": "^10.1.0", + "recursive-readdir-files": "^2.3.0", + "rehype-document": "^6.1.0", + "rehype-format": "^4.0.1" + } +} diff --git a/scripts/build.mjs b/scripts/build.mjs new file mode 100644 index 0000000..ab8594d --- /dev/null +++ b/scripts/build.mjs @@ -0,0 +1,43 @@ +import fs from 'fs-extra'; +import path from 'path'; +import recursiveReaddirFiles from 'recursive-readdir-files'; +import { create } from './create.mjs'; + +const OUTOUT = path.resolve(process.cwd(), 'dist'); +const DOCS = path.resolve(process.cwd(), 'docs'); +const CSSPATH = path.resolve(process.cwd(), 'scripts/style.css'); +const CSS_OUTPUT_PATH = path.resolve(OUTOUT, 'style/style.css'); + +async function createHTML(files = [], num = 0) { + const dataFile = files[num]; + if (!dataFile) { + console.log('\ndone!') + return; + } + ++num; + + const mdstr = await fs.readFile(dataFile.path); + const htmlPath = path.relative(DOCS, dataFile.path); + const outputHTMLPath = path.resolve(OUTOUT, 'docs', htmlPath).replace(/README.md$/i, 'index.html').replace(/.md$/, '.html'); + + await fs.ensureDir(path.dirname(outputHTMLPath)); + const html = create(mdstr.toString(), { + css: [path.relative(path.dirname(outputHTMLPath), CSS_OUTPUT_PATH)] + }); + await fs.writeFile(outputHTMLPath, html); + console.log(`♻️ \x1b[32;1m ${path.relative(OUTOUT, outputHTMLPath)} \x1b[0m`) + createHTML(files, num) +} + +;(async () => { + await fs.ensureDir(OUTOUT); + await fs.emptyDir(OUTOUT); + await fs.ensureDir(path.dirname(CSS_OUTPUT_PATH)); + await fs.copyFile(CSSPATH, CSS_OUTPUT_PATH) + const files = await recursiveReaddirFiles(process.cwd(), { + ignored: /\/(node_modules|\.git)/, + exclude: /(\.json|mjs)$/, + filter: (item) => item.ext === 'md', + }); + createHTML(files); +})(); diff --git a/scripts/create.mjs b/scripts/create.mjs new file mode 100644 index 0000000..344c18a --- /dev/null +++ b/scripts/create.mjs @@ -0,0 +1,130 @@ +import markdown from '@wcj/markdown-to-html'; +import rehypeDocument from 'rehype-document'; +import rehypeFormat from 'rehype-format'; + +/** 标记 Number */ +function panelAddNumber(arr = [], result = []) { + let n = 0; + let level = -1; + while (n < arr.length) { + const toc = arr[n]; + const titleNum = Number(toc?.tagName?.replace(/^h/, '')); + if (titleNum && titleNum > -1) { + level = titleNum; + } + if (toc) { + result.push({ ...toc, number: level }) + } + n++; + } + return result +} + +function getChilds(data = [], level, result = []) { + for (let i = 1; i <= data.length; i++) { + const titleNum = Number(data[i]?.tagName?.replace(/^h/, '')); + if (titleNum && titleNum === level) break; + result.push(data[i]); + } + return result; +} +/** 获取 Heading 到下一个 Heading 之间的内容*/ +function getHeader(data = [], level, result = []) { + for (let i = 1; i <= data.length; i++) { + if (/^h\d$/.test(data[i]?.tagName) || data[i]?.number !== level) break; + result.push(data[i]); + } + return result; +} + +/** Markdown 文档转成树形结构 */ +export function getTocsTree(arr = [], result = []) { + const data = panelAddNumber(arr); + + let n = 0; + let level = -1; + + while (n < data.length) { + const toc = data[n]; + + if (level === -1) { + level = toc.number; + } + const titleNum = Number(toc.tagName?.replace(/^h/, '')); + + if (toc.number === level && titleNum === level) { + const header = getHeader(data.slice(n), level); + const warpCls = ['warp']; + const headerCls = ['warp-header', `h${level}warp`]; + + if (level === 1) warpCls.push('max-container'); + + const warpStyle = toc.properties['data-warp-style']; + delete toc.properties['data-warp-style'] + + const panle = { + type: 'element', + tagName: 'div', + properties: { class: warpCls, style: warpStyle }, + children: [ + { + type: 'element', + tagName: level === 1 ? 'header' : 'div', + properties: { class: headerCls }, + children: [ + toc, + { + type: 'element', + tagName: 'div', + properties: { class: 'warp-body' }, + children: [ + ...header + ], + } + ], + } + ], + } + const childs = getChilds([...data.slice(n + 1)], level); + const resultChilds = getTocsTree(childs); + if (resultChilds.length > 0) { + panle.children = panle.children.concat({ + type: 'element', + tagName: 'div', + properties: { class: `h${level}warp-body` }, + children: [...resultChilds] + }); + } + result.push(panle); + } + + n++; + } + return result; +} + +export function create(str = '', options = {}) { + const mdOptions = { + hastNode: false, + remarkPlugins: [], + rehypePlugins: [ + rehypeFormat, + [rehypeDocument, { + title: "Quick Reference", + css: [ ...options.css ], + meta: [ + { description: '为开发人员分享快速参考备忘单。' }, + { keywords: 'Quick,Reference' } + ] + }], + ], + rewrite: (node, index, parent) => { + if (node.type === 'element' && node.tagName === 'body') { + node.children = getTocsTree([ ...node.children ]); + } + } + } + + + return markdown(str, mdOptions); +} \ No newline at end of file diff --git a/scripts/nodes/footer.mjs b/scripts/nodes/footer.mjs new file mode 100644 index 0000000..e69de29 diff --git a/scripts/style.css b/scripts/style.css new file mode 100644 index 0000000..e16e349 --- /dev/null +++ b/scripts/style.css @@ -0,0 +1,152 @@ +body { + -webkit-text-size-adjust: 100%; + tab-size: 4; + margin: 0; + line-height: inherit; + font-family: ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"; +} + +body { + background-color: rgb(15 23 42/1); + color: rgb(203 213 225/1); +} + +*, ::before, ::after { + box-sizing: border-box; + border-width: 0; + border-style: solid; + border-color: #e5e7eb; +} + +blockquote, dl, dd, h1, h2, h3, h4, h5, h6, hr, figure, p, pre { + margin: 0; +} + +.max-container { + max-width: 1320px; + margin-left: auto; + margin-right: auto; + padding: 0.75rem; +} + +.warp-header.h1warp { + text-align: center; + margin-top: 2rem; + margin-bottom: 2rem; +} + +.warp-header.h1warp h1 { + font-size: 3rem; + line-height: 1; + margin-bottom: 1rem; +} + + +.warp-header.h2warp h2 { + margin: 0; + padding: 0; + margin-bottom: 24px; + position: relative; + font-size: 30px; + line-height: 1.2; + font-weight: 200; + font-family: -apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",sans-serif; + margin-top: 0; +} + +.warp-header.h3warp { + z-index: 0; + display: flex; + height: 100%; + width: 100%; + flex-direction: column; +} + +.warp-header.h3warp h3 { + color: rgb(226 232 240/1); + position: absolute; + right: 0px; + top: 0px; + z-index: 10; + border-bottom-left-radius: 0.5rem; + background-color: rgb(16 185 129/1); + padding-left: 0.75rem; + padding-right: 0.75rem; + padding-top: 0.25rem; + padding-bottom: 0.25rem; + font-size: 0.75rem; + line-height: 1rem; + letter-spacing: 0.05em; +} + +.warp-header.h3warp .warp-body { + z-index: 0; + display: flex; + height: 100%; + width: 100%; + flex-direction: column; +} + +.h2warp-body { + display: grid; + gap: 1.75rem; + font-size: 0.925rem; + line-height: 1.325rem; + grid-template-columns: repeat(3,minmax(0,1fr)); + flex-direction: column; +} + +.h2warp-body .warp { + background-color: rgb(30 41 59/1); + color: rgb(203 213 225/1); + position: relative; + display: flex; + flex-direction: column; + overflow: hidden; + border-radius: 0.5rem; + padding-top: 1.5rem; + box-shadow: 0 0 #0000, 0 0 #0000, 0 6px 8px rgba(102,119,136,0.03),0 1px 2px rgba(102,119,136,0.3); + +} + +table { + text-indent: 0; + border-color: inherit; + border-collapse: collapse +} + + +table td:not(:last-child)>code, kbd { + background-color: rgb(51 65 85/0.5); + color: rgb(203 213 225/1); + box-shadow: 0 0 #0000, 0 0 #0000, 0 0 #0000; + letter-spacing: 0.075rem; + padding: 0.1em 0.54em; + border: 1px solid rgb(204,204,204); + border-color: rgb(51 65 85/1); + line-height: 1.6; + font-family: Arial,Helvetica,sans-serif; + font-size: 12px; + display: inline-block; + border-radius: 3px; +} + +table tr+tr { + border-top: solid 1px #ececec94; + border-color: rgb(51 65 85/0.5); +} + +table td:first-child { + white-space: nowrap; +} +table td, table th { + padding: 9px 14px; + text-align: left; +} +table tr th:last-child, table tr td:last-child { + text-align: right; +} + +.table-thead-hide thead { + display: none; +} \ No newline at end of file