改进博客园Markdown显示功能(加代码行号、显示代码所用编程语言)

本文介绍如何在博客园的Markdown模式下使用highlight.js插件实现代码高亮,并通过highlightjs-line-numbers.js插件添加代码行号及显示编程语言名称。详细步骤包括调整CSS样式、使用JQuery加载脚本及自定义函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

博客园的markdown模式下的代码高亮功能使用的是highlight.js,没有行号和显示相应编程语言的功能,只好自己将其改造了一下(将这两种功能一并实现了)~

先看一下效果,再详细介绍方法~
img

查看博客园markdown所使用的代码高亮插件

先找到一篇markdown模式下写的文章,然后打开Chrome,依次使用 F12 -> network -> filter ".js",可知 代码高亮插件是 highlight.js.
同理可知博客园文章编辑器TinyMCE模式(即 富文本编辑模式)下使用的是SyntaxHighlighter插件.
EditorModes

尝试了很多方法,最后选择了开源的插件 highlightjs-line-numbers.js,其原理是生成一个新的table,增加trtd标签, 并设置bordernone

该插件官方文档中提到的方法为:

<script src="//cdn.jsdelivr.net/npm/highlightjs-line-numbers.js@2.6.0/dist/highlightjs-line-numbers.min.js"></script>

<script>
hljs.initHighlightingOnLoad();
hljs.initLineNumbersOnLoad();
<script>

调整markdown的相关css

接着按需要改进一下markdown的样式,将下面内容贴到页面定制css一栏即可。

.cnblogs-markdown .hljs {
   border: none !important;
}


#cnblogs_post_body th, #cnblogs_post_body td, .cnblogs-post-body th, .cnblogs-post-body td {
   border: none !important;
   padding: 0;
}

.postCon {
   font-size: 15px;
}

.cnblogs-markdown .hljs, .cnblogs-post-body .hljs {
   font-family: "Consolas",sans-serif !important;
   font-size: 15px! important;
}

.cnblogs-markdown .hljs, .cnblogs-post-body .hljs {
   font-family: "Courier New",sans-serif!important;
   font-size: 15px!important;
   line-height: 1.5!important;
   padding: 5px!important;
}

#cnblogs_post_body table, .cnblogs-post-body table {
   border: none !important;
   border-collapse: collapse;
   word-break: break-word;
}

实现加代码行号、显示代码所用语言的具体js代码

然后在页脚HTML中加入如下js代码~

<script>
$(function () {
    if ($(".cnblogs-post-body pre > code").length > 0) setCodeRowWithLang($(".cnblogs-post-body pre"));
    else setCodeRowWithLang($(".cnblogs-markdown pre"));

    /* markdown模式下为代码加入行号, 调用插件highlightjs-line-numbers.js */
    hljs.initHighlightingOnLoad();
    hljs.initLineNumbersOnLoad();
});

function setCodeRowWithLang(pre) {
    /* var pre = $(".cnblogs-post-body pre");  选中需要处理的代码块, 如果不是首页,选择器为 .cnblogs-markdown pre  */
    if (pre && pre.length) {
        pre.each(function () {
            var item = $(this);
            var lang = item[0].className;  /*  获取高亮的语言,得到js/html/cpp等全小写的语言名,下面进行一个转换  */
            var langMap = {
                "html": "HTML",
                "xml": "XML",
                "svg": "SVG",
                "mathml": "MathML",
                "css": "CSS",
                "clike": "C-like",
                "js": "JavaScript",
                "abap": "ABAP",
                "apacheconf": "Apache Configuration",
                "apl": "APL",
                "arff": "ARFF",
                "asciidoc": "AsciiDoc",
                "adoc": "AsciiDoc",
                "asm6502": "6502 Assembly",
                "aspnet": "ASP.NET (C#)",
                "autohotkey": "AutoHotkey",
                "autoit": "AutoIt",
                "shell": "Bash",
                "basic": "BASIC",
                "csharp": "C#",
                "dotnet": "C#",
                "cpp": "C++",
                "cil": "CIL",
                "csp": "Content-Security-Policy",
                "css-extras": "CSS Extras",
                "django": "Django/Jinja2",
                "jinja2": "Django/Jinja2",
                "dockerfile": "Docker",
                "erb": "ERB",
                "fsharp": "F#",
                "gcode": "G-code",
                "gedcom": "GEDCOM",
                "glsl": "GLSL",
                "gml": "GameMaker Language",
                "gamemakerlanguage": "GameMaker Language",
                "graphql": "GraphQL",
                "hcl": "HCL",
                "http": "HTTP",
                "hpkp": "HTTP Public-Key-Pins",
                "hsts": "HTTP Strict-Transport-Security",
                "ichigojam": "IchigoJam",
                "inform7": "Inform 7",
                "javastacktrace": "Java stack trace",
                "json": "JSON",
                "jsonp": "JSONP",
                "latex": "LaTeX",
                "emacs": "Lisp",
                "elisp": "Lisp",
                "emacs-lisp": "Lisp",
                "lolcode": "LOLCODE",
                "markup-templating": "Markup templating",
                "matlab": "MATLAB",
                "mel": "MEL",
                "n1ql": "N1QL",
                "n4js": "N4JS",
                "n4jsd": "N4JS",
                "nand2tetris-hdl": "Nand To Tetris HDL",
                "nasm": "NASM",
                "nginx": "nginx",
                "nsis": "NSIS",
                "objectivec": "Objective-C",
                "ocaml": "OCaml",
                "opencl": "OpenCL",
                "parigp": "PARI/GP",
                "objectpascal": "Object Pascal",
                "php": "PHP",
                "php-extras": "PHP Extras",
                "plsql": "PL/SQL",
                "powershell": "PowerShell",
                "properties": ".properties",
                "protobuf": "Protocol Buffers",
                "q": "Q (kdb+ database)",
                "jsx": "React JSX",
                "tsx": "React TSX",
                "renpy": "Ren'py",
                "rest": "reST (reStructuredText)",
                "sas": "SAS",
                "sass": "Sass (Sass)",
                "scss": "Sass (Scss)",
                "sql": "SQL",
                "soy": "Soy (Closure Template)",
                "tap": "TAP",
                "toml": "TOML",
                "tt2": "Template Toolkit 2",
                "ts": "TypeScript",
                "vbnet": "VB.Net",
                "vhdl": "VHDL",
                "vim": "vim",
                "visual-basic": "Visual Basic",
                "vb": "Visual Basic",
                "wasm": "WebAssembly",
                "wiki": "Wiki markup",
                "xeoracube": "XeoraCube",
                "xojo": "Xojo (REALbasic)",
                "xquery": "XQuery",
                "yaml": "YAML"
            };

            var displayLangText = "";
            if (lang in langMap) displayLangText = langMap[lang];
            else displayLangText = lang;
            item.find('.hljs')
                .prepend(
                    '<div align="right" top="0px" right="10px" position="relative"><a href="javascript:void(0);"></a> <font class="codeLang"  title="当前Code所用语言">' +
                    displayLangText +
                    '</font></div>');
        });
    };
}
</script>

使用 highlight-line-number.js的前提是已经include进来highlight.js,虽然首页是默认不load highlight.js的,但可使用JQuerygetScript函数去加载之。

上述js函数setCodeRowWithLang()对文章内容和博客首页都是有效的~

转载于:https://www.cnblogs.com/enjoy233/p/10410089.html

下面的代码是干什么用的,请生成说明注释,同时还有什么改进: 【<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>人员信息管理系统</title> <style> :root { --bg-color: #ffffff; --text-color: #333333; --sidebar-bg: #f5f5f5; } .dark { --bg-color: #2d2d2d; --text-color: #ffffff; --sidebar-bg: #1a1a1a; } * { margin: 0; padding: 0; box-sizing: border-box; transition: background 0.4s ease; } body { background-color: var(--bg-color); color: var(--text-color); } .container { display: flex; min-height: 100vh; } .sidebar { width: 170px; background: var(--sidebar-bg); padding: 20px; border-right: 1px solid rgba(0, 0, 0, 0.1); display: flex; flex-direction: column; justify-content: space-between; } .buttons { display: flex; flex-direction: column; gap: 10px; } button { padding: 12px; border: none; background: var(--bg-color); color: var(--text-color); cursor: pointer; border-radius: 4px; text-align: center; } button.active { background: #409eff; color: white; } .content { flex: 1; padding: 20px; } .content-page { display: none; } .content-page.active { display: block; } .theme-switch { margin-top: auto; padding-top: 20px; display: flex; justify-content: center; } /* 隐藏文字并添图标式开关 */ .theme-switch label { display: block; position: relative; width: 60px; height: 30px; } #themeToggle { opacity: 0; width: 0; height: 0; } .slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background: #ccc; transition: .4s; border-radius: 34px; } #themeToggle:checked + .slider { background: #409eff; } #themeToggle:checked + .slider .icon:first-child { opacity: 1; } #themeToggle:checked + .slider .icon:last-child { opacity: 0; } .slider:before { position: absolute; content: ""; height: 22px; width: 22px; left: 4px; bottom: 4px; background: white; transition: .4s; border-radius: 50%; } #themeToggle:checked + .slider:before { transform: translateX(30px); } </style> </head> <body> <div class="container"> <!-- 侧边栏 --> <aside class="sidebar"> <div class="buttons"> <button data-target="staff" class="active">人员情况</button> <button data-target="daily">人员表【日】</button> <button data-target="course">课程情况</button> <button data-target="outside">在外情况</button> <button data-target="task">任务情况</button> </div> <!-- 修改原theme-switch部分 --> <div class="theme-switch"> <label class="toggle-wrapper"> <input type="checkbox" id="themeToggle"> <span class="slider"></span> </label> </div> </aside> <!-- 主内容区 --> <main class="content"> <div id="staff" class="content-page active">人员管理内容...</div> <div id="daily" class="content-page">日报表内容...</div> <div id="course" class="content-page">课程安排...</div> <div id="outside" class="content-page">在外人员追踪...</div> <div id="task" class="content-page">任务分配...</div> </main> </div> <script> // 缓存 DOM 节点 const buttons = document.querySelectorAll('button[data-target]'); const pages = document.querySelectorAll('.content-page'); // 内容切换 buttons.forEach(button => { button.addEventListener('click', () => { if (button.classList.contains('active')) return; // 移除所有激活状态 buttons.forEach(btn => btn.classList.remove('active')); pages.forEach(page => page.classList.remove('active')); // 设置当前激活状态 const targetId = button.dataset.target; button.classList.add('active'); document.getElementById(targetId).classList.add('active'); }); }); // 主题切换 const themeToggle = document.getElementById('themeToggle'); themeToggle.addEventListener('change', () => { document.body.classList.toggle('dark'); try { localStorage.setItem('theme', themeToggle.checked ? 'dark' : 'light'); } catch (e) { console.warn("无法保存主题偏好:localStorage 不可用"); } }); // 初始化主题 const savedTheme = localStorage.getItem('theme') || 'light'; if (savedTheme === 'dark') { document.body.classList.add('dark'); themeToggle.checked = true; } </script> </body> </html> 】
05-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值