From b73300595b679c4b6532107b955f30c3195c0ba3 Mon Sep 17 00:00:00 2001 From: PLanCompS <18308236+pdmosses@users.noreply.github.com> Date: Mon, 6 Jul 2020 15:07:53 +0200 Subject: [PATCH] Simplified the use of fix_linenos Now using an include parameter. Enhanced to support Markdown with code fences. --- _includes/fix_linenos.html | 68 ++++++++++++++++++++++++++++---------- 1 file changed, 50 insertions(+), 18 deletions(-) diff --git a/_includes/fix_linenos.html b/_includes/fix_linenos.html index bf60027..6243fb0 100644 --- a/_includes/fix_linenos.html +++ b/_includes/fix_linenos.html @@ -1,33 +1,65 @@ -{% comment -%} -Fixes the HTML for highlighted code with linenos. +{%- comment -%} +This file can be used to fix the HTML produced by Jekyll for highlighted +code with line numbers. -Derived from the workaround provided by Dmitry Hrabrov (DeXP) at +It works with `{% highlight some_language linenos %}...{% endhighlight %}` +and with the Kramdown option to add line numbers to fenced code. + +The implementation was derived from the workaround provided by +Dmitry Hrabrov (DeXP) at https://github.com/penibelst/jekyll-compress-html/issues/71#issuecomment-188144901 -Explanation: +EXPLANATION -The HTML produced by Rouge with the linenos option matches CSS `code table`. -Jekyll (<= 4.1.1) always wraps the highlighted HTML with `pre`, which is -unnecessary and non-conforming, and leads to validation error reports. -The fix removes the `pre` tags around `_code` whenever it contains the pattern -``. This change avoids validation errors, and -allows the use of [Jekyll layout for compressing HTML](http://jch.penibelst.de), -which relies on `pre` tags not being nested. +The HTML produced by Rouge highlighting with lie numbers is of the form +`code table`. Jekyll (<= 4.1.1) always wraps the highlighted HTML +with `pre`. This wrapping is not only unnecessary, but also transforms +the conforming HTML produced by Rouge to non-conforming HTML, which +results in HTML validation error reports. -Usage: +The fix removes the outer `pre` tags whenever they contain the pattern +`
`. + +Apart from avoiding HTML validation errors, the fix allows the use of +the [Jekyll layout for compressing HTML](http://jch.penibelst.de), +which relies on `pre` tags not being nested, according to +https://github.com/penibelst/jekyll-compress-html/issues/71#issuecomment-172069842 -{% capture fix_linenos_code %}{% highlight AnyLanguage linenos %} +USAGE + +(Any names can be used for `some_var` and `some_language`.) + +{% capture some_var %} +{% highlight some_language linenos %} Some code -{% endhighlight %}{% endcapture %}{% include fix_linenos.html %}{{ fix_linenos_code }} +{% endhighlight %} +{% endcapture %} +{% include fix_linenos.html code=some_var %} -Caveats: +For code fences: + +{% capture some_var %} +```some_language +Some code +``` +{% endcapture %} +{% assign some_var = some_var | markdownify %} +{% include fix_linenos.html code=some_var %} + +CAVEATS The above does not work when `Some code` happens to contain the matched string `
`. -{%- endcomment %} +The use of this file overwrites the variable `fix_linenos_code` with `nil`. +{%- endcomment -%} + +{% assign fix_linenos_code = include.code %} {% if fix_linenos_code contains '
' %} - {% assign fix_linenos_code = fix_linenos_code | replace: "
", "" %} + {% assign fix_linenos_code = fix_linenos_code | replace: '
', '
' %}
+  {% assign fix_linenos_code = fix_linenos_code | replace: "
", "" %} {% endif %} +{{ fix_linenos_code }} +{% assign fix_linenos_code = nil %}