网页开发中使用highlight.js实现代码高亮 + 行号

一、背景#

笔者在开发这套博客系统时使用 Editormd 作为 Markdown 编辑器,由于不满足其代码高亮的样式,因此选用 highlight.js 插件来实现代码高亮功能。但是,highlight.js 插件不提供行号的设置功能,于是有了该文章。

二、实现原理#

html 的代码块都是通过 <code></code> 进行封装,我们可以将其内容取出封装到 <ol><li></li></ol> 从而实现设置行号的效果。

三、实现方式#

下边提供两种实现方式。

3.1 后端修饰#

笔者使用的是 commonmark 库来实现 markdown 转换成 html。

3.1.1 添加依赖:#
<dependency>
<groupId>com.atlassian.commonmark</groupId>
<artifactId>commonmark</artifactId>
<version>0.11.0</version>
</dependency>
3.1.2 工具类:#
public abstract class MarkdownUtil {

public static List<Extension> extensions = Arrays.asList(TablesExtension.create());
private static final Parser parser = Parser.builder().extensions(extensions).build();
private static final HtmlRenderer renderer = HtmlRenderer.builder().extensions(extensions)
// 修饰代码块内容
.nodeRendererFactory(context -> new NodeRenderer() {

@Override
public Set<Class<? extends Node>> getNodeTypes() {
return Collections.singleton(FencedCodeBlock.class);
}

@Override
public void render(Node node) {

HtmlWriter html = context.getWriter();
FencedCodeBlock codeBlock = (FencedCodeBlock) node;
Map<String,String> attrs = new HashMap<>();
if (!StringUtils.isEmpty(codeBlock.getInfo())) {
attrs.put("class","language-" + codeBlock.getInfo());
}
html.line();
html.tag("pre");
html.tag("code",attrs);
html.tag("ol");
String data = codeBlock.getLiteral();
String[] split = data.split("\n");
for (String s : split) {
html.tag("li");
html.text(s + "\n");
html.tag("/li");
}
html.tag("/ol");
html.tag("/code");
html.tag("/pre");
html.line();

}
}).build();

/**
* markdown 转 html
* @param markdown
* @return
*/
public static String md2html(String markdown) {
Node document = parser.parse(markdown);
String result = renderer.render(document);
return result;
}
}

如果不使用上边的 NodeRendererFactory 对 html 进行修饰,输出的 html 的代码块就只是 <pre><code></code></pre> 的形式。

3.2 前端修饰#

使用 js 代码实现代码修饰:

$("code").each(function(){
$(this).html("<ol><li>" + $(this).html().replace(/\n/g,"\n</li><li>") +"\n</li></ol>");
});

3.3 css 样式#

由于 <ol><li></li></ol> 默认行号效果不友好,我们进行样式设置。

.hljs {
border: 0;
font-size: 12px;
display: block;
padding: 1px;
margin: 0;
width: 100%;
font-weight: 200;
color: #333;
white-space: pre-wrap
}
.hljs ol {
list-style: decimal;
margin: 0px 0px 0 40px !important;
padding: 0px;
}
.hljs ol li {
list-style: decimal-leading-zero;
border-left: 1px solid #ddd !important;
padding: 5px!important;
margin: 0 !important;
white-space: pre;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Vue 使用 highlight.js 设置行号的方法如下: 1. 安装 highlight.js 和 v-highlight.js Vue 插件: ``` npm install highlight.js v-highlight.js --save ``` 2. 在 main.js 引入 highlight.js 并注册 v-highlight.js 插件: ``` import hljs from 'highlight.js' import VueHighlightJS from 'v-highlight.js' Vue.use(VueHighlightJS, { languages: { js: hljs.javascript, html: hljs.xml, css: hljs.css } }) ``` 3. 在组件使用 v-highlight 指令,并设置 line-numbers 类名: ``` <template> <div> <pre v-highlight="code" class="line-numbers">{{ code }}</pre> </div> </template> <script> export default { data () { return { code: '<div>hello world</div>' } } } </script> ``` 4. 在 CSS 设置行号样式: ``` .line-numbers { position: relative; padding-left: 3.8em; counter-reset: linenumber; } .line-numbers > span { pointer-events: none; position: absolute; left: -3.8em; width: 3.2em; text-align: right; padding-right: 0.8em; counter-increment: linenumber; } .line-numbers > span:before { content: counter(linenumber); color: #999; } ``` 注意:如果要支持其它语言需要在第二步引入对应的语言高亮库。 ### 回答2: 在Vue使用highlight.js设置行号相对简单。首先,我们需要在项目安装highlight.js库。可以通过npm或yarn进行安装。安装完成后,我们可以在Vue的组件引入highlight.js。 ```bash npm install highlight.js ``` 然后,在Vue的组件引入highlight.js。 ```javascript import hljs from 'highlight.js'; import 'highlight.js/styles/monokai-sublime.css'; ``` 接下来,在Vue组件的mounted钩子函数进行highlight.js的初始化和设置行号。 ```javascript mounted() { const codes = document.getElementsByTagName('code'); for (let i = 0; i < codes.length; i++) { const highlightCode = codes[i]; hljs.lineNumbersBlock(highlightCode); } } ``` 在HTML,我们可以使用`<code>`标签将需要高亮显示的代码包裹起来。示例代码如下: ```html <template> <div> <pre><code class="javascript">function helloWorld() { console.log('Hello World'); }</code></pre> </div> </template> ``` 最后,在组件的样式,我们需要为highlight.js设置一些样式。 ```css pre { padding: 10px; background-color: #f7f7f7; } code { font-size: 14px; color: #333; } ``` 这样,我们使用highlight.js设置行号的功能就完成了。当组件被渲染时,highlight.js会自动对`<code>`标签代码进行高亮显示,并显示行号。 ### 回答3: 在Vue使用highlight.js设置行号需要进行一下几个步骤: 1. 首先,从highlight.js官方网站(https://highlightjs.org/)下载所需要的highlight.js插件文件。 2. 将下载得到的highlight.js插件文件放置到你的Vue项目的某个目录,比如/src/plugins/。 3. 在Vue项目的入口文件main.js导入highlight.js插件。可以使用import语句将highlight.js插件导入: ``` import hljs from 'path/to/highlight.js'; ``` 4. 接下来,在Vue组件需要使用行号的地方,可以使用`v-highlightjs`指令来设置行号。例如,如果你想要在一个`<pre>`标签代码设置行号,可以像下面这样使用指令: ``` <pre v-highlightjs> <code> // 在这里写你的代码 </code> </pre> ``` 5. 在Vue组件的`mounted`钩子函数调用highlight.js的初始化函数,以便在页面加载完成后自动设置行号。可以使用以下代码: ``` mounted() { hljs.initHighlighting.called = false; hljs.initHighlighting(); } ``` 6. 最后,在Vue组件的样式文件添加一些CSS样式来设置行号的显示。这是可选的,你可以根据自己的需求自定义样式。例如,可以使用以下样式: ``` pre [class*="hljs-line"] { position: relative; padding-left: 3.8em; counter-increment: linenumber; } pre [class*="hljs-line"]::before { content: counter(linenumber); position: absolute; left: 0.5em; color: #999; font-size: 0.8em; } ``` 以上就是在Vue使用highlight.js设置行号的步骤。通过这些步骤,你可以在Vue项目方便地使用highlight.js插件并设置行号高亮显示代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值