首页 > 其他分享 >引入代码来源:深入分析markdown-it-quote插件的魔法

引入代码来源:深入分析markdown-it-quote插件的魔法

时间:2023-07-24 16:22:05浏览次数:36  
标签:插件 markdown java CACHED quote app && const

引入代码来源:深入分析markdown-it-quote插件的魔法

NPM版本

markdown-it-quote是一个用于markdown-it的插件,支持多种代码围栏功能。

image

这是 SourceCodeTrace 项目之一,提供一种 Markdown Fence 的解析方案,包括对代码块的引用、高亮、链接等功能。

SourceCodeTrace Project 帮助您在博客、文章记录的过程中,引入对应项目以及版本,行号等信息,让后续的读者,通过引用来源,能够进行更加深入的学习,在博客或文章中引入代码块时,尽量提供代码的来源信息。

对于新的Markdown格式,如果你觉得写起来很复杂, 可以用 MarkdownQuote 插件,让你在IDE中高效地复制代码块。
更多细节请参阅 SourceCodeTrace 项目

Markdown 写法

以下是一些用法示例,演示代码块包含的不同信息,方便大家在博客的记录中,引入代码块的来源信息。

  • 代码块归属 第3125到3131行,并且将第3126到3130行标记为高亮,并链接到URL:

    ```java {3125-3131} {3129,3131} (https://github.com/10cl/fwkdev/blob/android-13.0.0_r52/dev/src/frameworks/base/services/core/java/com/android/server/am/OomAdjuster.java#L3125-L3131)
            // 冻结时使用当前调整,解冻时设置调整。
            if (state.getCurAdj() >= ProcessList.CACHED_APP_MIN_ADJ && !opt.isFrozen()
                    && !opt.shouldNotFreeze()) {
                mCachedAppOptimizer.freezeAppAsyncLSP(app);
            } else if (state.getSetAdj() < ProcessList.CACHED_APP_MIN_ADJ) {
                mCachedAppOptimizer.unfreezeAppLSP(app, oomAdjReason);
            }
        }
    
  • 代码块归属 第3125到3131行,并链接到URL:

    ```java {3125-3131} (https://github.com/10cl/fwkdev/blob/android-13.0.0_r52/dev/src/frameworks/base/services/core/java/com/android/server/am/OomAdjuster.java#L3125-L3131)
            // 冻结时使用当前调整,解冻时设置调整。
            if (state.getCurAdj() >= ProcessList.CACHED_APP_MIN_ADJ && !opt.isFrozen()
                    && !opt.shouldNotFreeze()) {
                mCachedAppOptimizer.freezeAppAsyncLSP(app);
            } else if (state.getSetAdj() < ProcessList.CACHED_APP_MIN_ADJ) {
                mCachedAppOptimizer.unfreezeAppLSP(app, oomAdjReason);
            }
        }
    
  • 只链接到URL:

    ```java (https://github.com/10cl/fwkdev/blob/android-13.0.0_r52/dev/src/frameworks/base/services/core/java/com/android/server/am/OomAdjuster.java#L3125-L3131)
            // 冻结时使用当前调整,解冻时设置调整。
            if (state.getCurAdj() >= ProcessList.CACHED_APP_MIN_ADJ && !opt.isFrozen()
                    && !opt.shouldNotFreeze()) {
                mCachedAppOptimizer.freezeAppAsyncLSP(app);
            } else if (state.getSetAdj() < ProcessList.CACHED_APP_MIN_ADJ) {
                mCachedAppOptimizer.unfreezeAppLSP(app, oomAdjReason);
            }
        }
    
  • 仅高亮第1至2行:

    ```java {1-2}
            // 冻结时使用当前调整,解冻时设置调整。
            if (state.getCurAdj() >= ProcessList.CACHED_APP_MIN_ADJ && !opt.isFrozen()
                    && !opt.shouldNotFreeze()) {
                mCachedAppOptimizer.freezeAppAsyncLSP(app);
            } else if (state.getSetAdj() < ProcessList.CACHED_APP_MIN_ADJ) {
                mCachedAppOptimizer.unfreezeAppLSP(app, oomAdjReason);
            }
        }
    
  • 高亮第3行:

    ```java{3}
            // 冻结时使用当前调整,解冻时设置调整。
            if (state.getCurAdj() >= ProcessList.CACHED_APP_MIN_ADJ && !opt.isFrozen()
                    && !opt.shouldNotFreeze()) {
                mCachedAppOptimizer.freezeAppAsyncLSP(app);
            } else if (state.getSetAdj() < ProcessList.CACHED_APP_MIN_ADJ) {
                mCachedAppOptimizer.unfreezeAppLSP(app, oomAdjReason);
            }
        }
    
  • 仅指定语言:

    ```java
            // 冻结时使用当前调整,解冻时设置调整。
            if (state.getCurAdj() >= ProcessList.CACHED_APP_MIN_ADJ && !opt.isFrozen()
                    && !opt.shouldNotFreeze()) {
                mCachedAppOptimizer.freezeAppAsyncLSP(app);
            } else if (state.getSetAdj() < ProcessList.CACHED_APP_MIN_ADJ) {
                mCachedAppOptimizer.unfreezeAppLSP(app, oomAdjReason);
            }
        }
    

使用方法

要使用markdown-it-quote,首先通过NPM安装该包:

npm i markdown-it-quote

然后,您可以在JavaScript代码中这样使用它:

const MarkdownIt = require('markdown-it');
const markdownQuote = require('markdown-it-quote');

const md = new MarkdownIt();
md.use(markdownQuote);

md.render(markdownString);

请注意,语言名称和左大括号之间的高亮行是可选的。

为了增加自定义样式,您可以使用以下CSS代码为代码引入链接一些自定义样式:

.gist-meta-quote {
  font-size: 12px;
  padding: 10px;
  overflow: hidden;
  color: white;
  border-radius: 0 0 6px 6px;
}

.gist-meta-quote a {
  float: right;
  color: white;
  text-decoration: underline;
}

vurepress 使用详解

  • package.json 中引入依赖
    "markdown-it-quote": "^1.0.3"

/package.json?#L7-L7

  • config.json 里面加入 markdown 拓展
  markdown: {
    extendMarkdown: md => {
      const markdownQuote = require('markdown-it-quote')
      md.use(markdownQuote);
    }
  },

/source/.vuepress/config.js?#L12-L17

  • md 文件中直接用新的形式来写代码
```java {3125-3131} {3126-3130} (https://github.com/10cl/fwkdev/blob/android-13.0.0_r52/dev/src/frameworks/base/services/core/java/com/android/server/am/OomAdjuster.java#L3125-L3131)
        // Use current adjustment when freezing, set adjustment when unfreezing.
        if (state.getCurAdj() >= ProcessList.CACHED_APP_MIN_ADJ && !opt.isFrozen()
                && !opt.shouldNotFreeze()) {
            mCachedAppOptimizer.freezeAppAsyncLSP(app);
        } else if (state.getSetAdj() < ProcessList.CACHED_APP_MIN_ADJ) {
            mCachedAppOptimizer.unfreezeAppLSP(app, oomAdjReason);
        }
    }
```

/source/README.md?#L31-L40

完整的可以参考Vuepress集成的patch
随心定制样式以适合您自己的需要。

原理解析

fence 拓展

export default (md) => {
  const fence = md.renderer.rules.fence;
  md.renderer.rules.fence = (...args) => {
    const [tokens, idx, options, , self] = args;
    const token = tokens[idx];

/src/index.js?#L7-L11

markdown-it 的拓展是通过重写 md.renderer.rules.fence 来实现对 fence的重新解析。

关键格式的解析

通过解析得到核心的解析块

java {3125-3131} {3129,3131} (https://github.com/10cl/fwkdev/blob/android-13.0.0_r52/dev/src/frameworks/base/services/core/java/com/android/server/am/OomAdjuster.java#3125-L3131)

从中解析出 代码块所在的起始行、结束行、高亮块、以及链接。
然后通过预定义的模板将其渲染出来。

从用户的角度来说,其中核心的要点就是要支持多种格式,比如原始的格式,以及为了推动代码块来源的可追溯性,还需要支持之前默认的格式。

核心的几块逻辑,就是通过正则表达式来解析出来的。

const regex1 = /(\S+)\s?(\{([\d,-]+)})\s?(\{([\d,-]+)})\s?([\S]+)/i;
const regex2 = /(\S+)\s+(\{\d+-\d+\})?\s+(\S+)/i;
const regex3 = /(\S+)\s?(\{([\d,-]+)})/i;
const regex4 = /(\S+)\s+([^\{]\S+)/i;
const regex5 = /(\S+)/i;

/src/index.js?#L1-L5

image

https://regex101.com/r/osOtEv/1

高亮支持

对于高亮的支持,需要支持两种形式,一种是

  • 起始行-结束行
  • 通过,分割的单行
      lines.map((split, index) => {
        const lineNumber = index + wrapLineNumStart;
        lineNumbersCode += `<span class="line-number">${lineNumber}</span><br>`;

        let inRange = false;
        if (highLightLineNumbers !== undefined) {
          inRange = highLightLineNumbers.some(([start, end]) => {
            if (start && end) {
              return lineNumber >= start && lineNumber <= end;
            }
            return lineNumber === start;
          });

          if (inRange) {
            highlightWrapCode += `<div class="highlighted">&nbsp;</div>`;
          } else {
            highlightWrapCode += `<br>`;
          }
        }
      });

/src/index.js?#L136-L155

链接的定义

      const gistInfo = `<div class="gist-meta-quote"><a href="${linkUrl}" target="_blank">view raw</a></div>`;

/src/index.js?#L168-L169
这里通过解析到 url 转换成html格式,点击 view raw 即新窗口打开原始的代码源链接。

这里如果不通过这种新的markdown格式,也可以仅采用默认代码块,然后加一条链接的形式,指明你的代码来源。

贡献

如果您想为此项目做出贡献,请按照以下步骤进行:

  1. Fork仓库。
  2. 创建您的特性分支:git checkout -b my-new-feature
  3. 提交您的更改:git commit -am 'Add some feature'
  4. 推送到分支:git push origin my-new-feature
  5. 提交拉取请求

    标签:插件,markdown,java,CACHED,quote,app,&&,const
    From: https://www.cnblogs.com/webers/p/markdown-it-quote.html

相关文章

  • 3ds Max动力学插件RayFire图文教程:如何使用RayFire 实现酷炫逼真的爆炸碎裂效果第 1
     这是一个关于使用行业标准插件RayFire在3dsMax中破坏元素的新系列。在本教程的第一部分中,我将向您展示如何在RayFire中使用在3dsMax中拆除元素的最基本操作和方法。 推荐:NSDT场景编辑器助你快速搭建可二次开发的3D应用场景1.准备场景步骤1打开 3dsMax。......
  • .net 2.0插件
    .NET2.0插件介绍什么是.NET2.0插件?在软件开发中,插件是一种可扩展的组件,用于在已有的软件应用中添加特定的功能。.NET2.0插件是基于.NETFramework2.0开发的插件,可以在支持.NETFramework2.0的应用程序中使用。.NETFramework是Microsoft提供的一个开发框架,用于......
  • PR语音转字幕转换插件Speech to Text for Premiere Pro
    在SpeechtoTextforPremierePro(PR语音转字幕转换插件中您可以使用以下各种格式转换:中文(PL/PRC)、英文、日语、韩语、意大利语、葡萄牙语、波兰语、法语、意大利语、荷兰语、英语、西班牙语等。如果您对中文、日语、韩语、葡萄牙语、法语、荷兰语等语言感兴趣,可以在这里找到......
  • SD 插件安装
    1.换脸插件https://github.com/s0md3v/sd-webui-roop安装:直接选择扩展,从网址中安装参考:https://zhuanlan.zhihu.com/p/639577691错误:cmdline:gitfetch-v--originstderr:'fatal:detecteddubiousownershipinrepositoryat'/media/xx/share/projects/stable-diff......
  • 2023年Clion插件推荐
    目录搜素位置插件background-imageplus背景图片插件RainbowBrackets彩虹括号Xcode-DarkTheme界面主题GrepConsole日志颜色配置CodeGlance显示代码缩略图AtomMaterialIcons文件夹图标的样式修改PowerModeII敲打键盘就会有火花效果IndentRainbow代码缩进前的......
  • androidstudio没有gradle插件
    AndroidStudio没有Gradle插件的解决方法作为一名经验丰富的开发者,我将教会你如何解决AndroidStudio没有Gradle插件的问题。首先,让我们来看一下整个解决过程的流程,如下表所示:步骤操作1检查Gradle插件版本2更新或添加Gradle插件3同步项目接下来,我将详细说......
  • vue--day40--plugins插件
    1.main.js/***该文件是整个项目的入口文件*///引入VueimportVuefrom'vue'//引入App组件他是所有组件的父组件importAppfrom'./App.vue'//引入插件importpluginsfrom'./plugins'//关闭vue的生产提示Vue.config.productionTip=false//应用插件Vue.us......
  • go-zero插件goctl-swagger的坑——第二弹
    截至本文发布,直接安装goctl-swagger还无法解决go-zero.api文件引入问题该文主要是记录在使用过程中遇到的问题和解决思路,不做详细教学使用。问题在go-zero插件goctl-swagger的坑的基础上,本文带来新的问题。也就是在开头说到的go-zero的.api文件相互引用问题。在最新的go-zer......
  • vscode插件-快捷键
    插件AutoRenameTagLiveServer快捷键shift+alt+键头向下, 快速复制一行ctrl+d, 选定多个相同的关键词ctrl+alt+键头向上/下, 添加多个光标shift+alt+拖动鼠标, 选择某个区域 ......
  • MarkDown学习
    MarkDown学习一级标题二级标题三级标题...标题:#+空格+标题名(几集标题对应几个井号,最多六级标题字体helloworld!两边一个星号*斜体helloworld!两边两个星号**加粗helloworld!两边三个星号***斜体且加粗helloworld!两边两个~~画横线引用箭头符号>空格接引用的......