如何阻止Kramdown移除Jekyll站点代码块中的缩进?
问题核心原因是Kramdown默认会解析块级HTML标签内部的Markdown语法,手写<pre><code>包裹代码时,代码前的缩进会被识别为Markdown嵌套层级标记,最终被清理,不需要更换渲染器,按以下优先级选择方案即可:
方案1:使用原生围栏代码块(零配置,最推荐)
不要手写HTML的pre/code标签,直接用Markdown三反引号围栏编写代码块,指定对应语言,Kramdown会完整保留所有原始缩进,完全兼容GitHub Pages默认构建环境,不需要修改任何配置:from sort.AbstractSort import AbstractSort class BubbleSort(AbstractSort): @staticmethod def swap(arr, i, j): arr[i], arr[j] = arr[j], arr[i] def _sort(self, arr): for i in range(len(arr) - 1): for j in range(len(arr) - 1): if arr[j] > arr[j + 1]: BubbleSort.swap(arr, j, j + 1) return arr该写法兼容所有主流Markdown渲染器,也不会和当前使用的prettyprint高亮插件冲突。
方案2:给手写HTML代码块添加Kramdown控制属性
如果需要兼容历史内容、必须保留手写pre标签的写法,只需要给pre标签添加parse="false"属性,显式告诉Kramdown不要解析该标签内部的任何内容,缩进就会原样输出:<pre class="lang-py prettyprint-override" parse="false"><code>from sort.AbstractSort import AbstractSort class BubbleSort(AbstractSort): @staticmethod def swap(arr, i, j): arr[i], arr[j] = arr[j], arr[i] def _sort(self, arr): for i in range(len(arr) - 1): for j in range(len(arr) - 1): if arr[j] > arr[j + 1]: BubbleSort.swap(arr, j, j + 1) return arr </code></pre>方案3:全局修改Kramdown配置
如果不想逐个调整存量代码块,可以修改站点根目录_config.yml中的Kramdown配置项,全局关闭块级HTML内容解析,之前切换GFM模式未生效就是缺少这个核心配置:kramdown: input: GFM parse_block_html: false syntax_highlighter: rouge hard_wrap: false配置修改后需要重启本地Jekyll服务、或者等GitHub Pages重新构建全站才能生效。
不建议更换其他Markdown渲染器,GitHub Pages对第三方渲染器的支持有限,更换后大概率出现现有Markdown语法、主题组件不兼容的问题,上述三个方案完全可以解决缩进丢失的问题。
内容的提问来源于stack exchange,提问作者matwasilewski

