highlight: add option for wrapping vs. scrolling #169

This commit is contained in:
Sören Weber 2023-06-22 01:22:08 +02:00
parent 73fdfb5ea6
commit 83e403ea2e
No known key found for this signature in database
GPG key ID: BEC6D55545451B6D
17 changed files with 435 additions and 95 deletions

View file

@ -25,7 +25,7 @@ The Relearn theme is a fork of the great [Learn theme](https://github.com/matcor
- Predefined light, dark and color variants - Predefined light, dark and color variants
- [User selectable variants](https://mcshelby.github.io/hugo-theme-relearn/basics/customization#multiple-variants) - [User selectable variants](https://mcshelby.github.io/hugo-theme-relearn/basics/customization#multiple-variants)
- [Stylesheet generator](https://mcshelby.github.io/hugo-theme-relearn/basics/generator) - [Stylesheet generator](https://mcshelby.github.io/hugo-theme-relearn/basics/generator)
- [Configurable syntax highlighting](https://mcshelby.github.io/hugo-theme-relearn/cont/syntaxhighlight) - [Configurable syntax highlighting](https://mcshelby.github.io/hugo-theme-relearn/shortcodes/highlight)
- **Unique theme features** - **Unique theme features**
- [Print whole chapters or even the complete site](https://mcshelby.github.io/hugo-theme-relearn/basics/configuration#activate-print-support) - [Print whole chapters or even the complete site](https://mcshelby.github.io/hugo-theme-relearn/basics/configuration#activate-print-support)
- In page search - In page search

View file

@ -47,18 +47,20 @@ title = "Hugo Relearn Documentation"
[markup] [markup]
[markup.highlight] [markup.highlight]
# line numbers in a table layout will shift if code is wrapping, so better
# not use it; visually both layouts have the same look and behavior
lineNumbersInTable = false
# if `guessSyntax = true`, there will be no unstyled code even if no language # if `guessSyntax = true`, there will be no unstyled code even if no language
# was given BUT Mermaid and Math codefences will not work anymore! So this is a # was given BUT Mermaid and Math codefences will not work anymore! So this is a
# mandatory setting for your site if you want to use Mermaid or Math codefences # mandatory setting for your site if you want to use Mermaid or Math codefences
guessSyntax = false guessSyntax = false
# here in this showcase we use our own modified chroma syntax highlightning style # the shipped variants come with their own modified chroma syntax highlightning
# which is imported in theme-relearn-light.css / theme-relearn-dark.css; # style which is imported in theme-relearn-light.css, theme-relearn-dark.css, etc.;
# if you want to use a predefined style instead: # if you want to use a predefined style instead:
# - remove the following `noClasses` # - remove `noClasses` or set `noClasses = true`
# - set the following `style` to a predefined style name # - set `style` to a predefined style name
# - remove the `@import` of the self-defined chroma stylesheet from your CSS files
# (here eg.: theme-relearn-light.css / theme-relearn-dark.css)
noClasses = false noClasses = false
# style = "tango" # style = "tango"

View file

@ -28,7 +28,7 @@ The theme is a fork of the great [Learn theme](https://github.com/matcornic/hugo
- Predefined light, dark and color variants - Predefined light, dark and color variants
- [User selectable variants]({{%relref "basics/customization#multiple-variants" %}}) - [User selectable variants]({{%relref "basics/customization#multiple-variants" %}})
- [Stylesheet generator]({{%relref "basics/generator" %}}) - [Stylesheet generator]({{%relref "basics/generator" %}})
- [Configurable syntax highlighting]({{%relref "cont/syntaxhighlight" %}}) - [Configurable syntax highlighting]({{%relref "shortcodes/highlight" %}})
- **Unique theme features** - **Unique theme features**
- [Print whole chapters or even the complete site]({{%relref "basics/configuration#activate-print-support" %}}) - [Print whole chapters or even the complete site]({{%relref "basics/configuration#activate-print-support" %}})
- In page search - In page search

View file

@ -18,6 +18,14 @@ This document shows you what's new in the latest release. For a detailed list of
--- ---
## 5.17.0 (2023-06-20)
- {{% badge style="info" icon="plus-circle" title=" " %}}New{{% /badge %}} The new [`highlight` shortcode]({{% relref "shortcodes/highlight" %}}) replaces Hugo's default implementation and is fully compatible. So you don't need to change anything.
In addition it offers some extensions. Currently only the `wrap` extension option is provided to control whether a code block should be wrapped or scrolled if to long to fit.
---
## 5.16.0 (2023-06-10) ## 5.16.0 (2023-06-10)
- {{% badge style="note" title=" " %}}Change{{% /badge %}} The theme now provides warnings for deprecated or now unsupported features. The warnings include hints how to fix them and an additional link to the documenation. - {{% badge style="note" title=" " %}}Change{{% /badge %}} The theme now provides warnings for deprecated or now unsupported features. The warnings include hints how to fix them and an additional link to the documenation.

View file

@ -323,7 +323,7 @@ If you want to gain more control of your code block you can enclose your code by
In GFM (GitHub Flavored Markdown) you can also add a language specifier directly after the opening fence, ` ```js `, and syntax highlighting will automatically be applied according to the selected language in the rendered HTML. In GFM (GitHub Flavored Markdown) you can also add a language specifier directly after the opening fence, ` ```js `, and syntax highlighting will automatically be applied according to the selected language in the rendered HTML.
See [Code Highlighting]({{% relref "syntaxhighlight" %}}) for additional documentation. See [Code Highlighting]({{% relref "shortcodes/highlight" %}}) for additional documentation.
````plaintext ````plaintext
```js ```js

View file

@ -1,66 +0,0 @@
+++
title = "Code highlighting"
weight = 4
+++
The Relearn theme uses [Hugo's built-in syntax highlighting](https://gohugo.io/content-management/syntax-highlighting/) for code.
## Markdown syntax
Wrap the code block with three backticks and the name of the language. Highlight will try to auto detect the language if one is not provided.
<!-- markdownlint-disable MD046 -->
````plaintext
```json
[
{
"title": "apples",
"count": [12000, 20000],
"description": {"text": "...", "sensitive": false}
},
{
"title": "oranges",
"count": [17500, null],
"description": {"text": "...", "sensitive": false}
}
]
```
````
<!-- markdownlint-disable MD046 -->
Renders to:
```json
[
{
"title": "apples",
"count": [12000, 20000],
"description": {"text": "...", "sensitive": false}
},
{
"title": "oranges",
"count": [17500, null],
"description": {"text": "...", "sensitive": false}
}
]
```
## Supported languages
Hugo comes with a [remarkable list](https://gohugo.io/content-management/syntax-highlighting/#list-of-chroma-highlighting-languages) of supported languages.
## Recommended configuration
You can choose a color theme from the [list of supported themes](https://xyproto.github.io/splash/docs/all.html) and add it in your `config.toml`
````toml
[markup]
[markup.highlight]
# if `guessSyntax = true`, there will be no unstyled code even if no language
# was given BUT Mermaid and Math codefences will not work anymore! So this is a
# mandatory setting for your site if you want to use Mermaid or Math codefences
guessSyntax = false
# choose a color theme or create your own
style = "base16-snazzy"
````

View file

@ -1,5 +0,0 @@
+++
title = "Code highlight'n"
weight = 4
+++
{{< piratify >}}

View file

@ -0,0 +1,186 @@
+++
description = "Generate diagrams and flowcharts from text"
title = "Highlight"
+++
The `highlight` shortcode renders your code with a syntax highlighter.
{{< highlight lineNos="table" type="py" wrap="true" >}}
print("Hello World!")
{{< /highlight >}}
## Usage
This shortcode is compatible with Hugo's [`highlight` shortcode](https://gohugo.io/content-management/syntax-highlighting/#highlight-shortcode) but offers some extensions.
You can call it interchangeably in the same way as Hugo's own shortcode using positional parameter or by simply using codefences.
You are free to also call this shortcode from your own partials. In this case it somewhat resemble Hugo's [`highlight` function](https://gohugo.io/functions/highlight/) syntax if you call this shortcode as a partial using compatiblity syntax.
While the examples are using shortcodes with named parameter it is recommended to use codefences instead. This is because more and more other software supports codefences (eg. GitHub) and so your markdown becomes more portable.
{{< tabs groupId="shortcode-parameter">}}
{{% tab title="codefence" %}}
````md
```py { lineNos="table" wrap="true" }
print("Hello World!")
```
````
{{% /tab %}}
{{% tab title="shortcode" %}}
````go
{{</* highlight lineNos="table" type="py" wrap="true" */>}}
print("Hello World!")
{{</* /highlight */>}}
````
{{% /tab %}}
{{% tab title="shortcode (positional)" %}}
````go
{{</* highlight py "lineNos=table,wrap=true" */>}}
print("Hello World!")
{{</* /highlight */>}}
````
{{% /tab %}}
{{% tab title="partial" %}}
````go
{{ partial "shortcodes/highlight.html" (dict
"context" .
"content" "print(\"Hello World!\")"
"lineNos" "table"
"type" "py"
"wrap" "true"
)}}
````
{{% /tab %}}
{{% tab title="partial (compat)" %}}
````go
{{ partial "shortcodes/highlight.html" (dict
"context" .
"content" "print(\"Hello World!\")"
"options" "lineNos=table,wrap=true"
"type" "py"
)}}
````
{{% /tab %}}
{{< /tabs >}}
### Parameter
| Name | Default | Notes |
|:----------------------|:-----------------|:------------|
| **type** | _&lt;empty&gt;_ | The language of the code to highlight. Choose from one of the [supported languages](https://gohugo.io/content-management/syntax-highlighting/#list-of-chroma-highlighting-languages). Case-insensitive. |
| **wrap** | see notes | _Extension_. When `true` the content may wrap on long lines otherwise it will be scrollable.<br><br>The default value can be set in your `config.toml` and overwritten via frontmatter. [See below](#configuration). |
| **options** | _&lt;empty&gt;_ | An optional, comma-separated list of zero or more [Hugo supported options](https://gohugo.io/functions/highlight/#options) as well as extension parameter from this table. |
| _**&lt;option&gt;**_ | _&lt;empty&gt;_ | Any of [Hugo's supported options](https://gohugo.io/functions/highlight/#options). |
| _**&lt;content&gt;**_ | _&lt;empty&gt;_ | Your code to highlight. |
## Configuration
Default values for [Hugo's supported options](https://gohugo.io/functions/highlight/#options) can be set via [goldmark settings](https://gohugo.io/getting-started/configuration-markup/#highlight) in your `config.toml`
Default values for extension options can be set via params settings in your `config.toml` or be overwritten by frontmatter for each individual page.
### Global Configuration File
#### Recommended Settings
````toml
[markup]
[markup.highlight]
# line numbers in a table layout will shift if code is wrapping, so better
# use inline; besides that visually both layouts have the same look and behavior
lineNumbersInTable = false
# if `guessSyntax = true`, there will be no unstyled code even if no language
# was given BUT Mermaid and Math codefences will not work anymore! So this is a
# mandatory setting for your site if you want to use Mermaid or Math codefences
guessSyntax = false
# the shipped variants come with their own modified chroma syntax highlightning
# style which is imported in theme-relearn-light.css, theme-relearn-dark.css, etc.;
# if you want to use a predefined style instead:
# - remove `noClasses` or set `noClasses = true`
# - set `style` to a predefined style name
noClasses = false
# style = "tango"
````
#### Optional Settings
````toml
[params]
highlightWrap = true
````
### Page's Frontmatter
````toml
+++
highlightWrap = true
+++
````
## Examples
### Line Numbers
As mentioned above, line numbers in a `table` layout will shift if code is wrapping, so better use `inline`. To make things easier for you, set `lineNumbersInTable = false` in your `config.toml` and add `lineNos = true` when calling the shortcode instead of the specific values `table` or `inline`.
````go
{{</* highlight lineNos="true" type="py" */>}}
# Quicksort Python One-liner
lambda L: [] if L==[] else qsort([x for x in L[1:] if x< L[0]]) + L[0:1] + qsort([x for x in L[1:] if x>=L[0]])
# Some more stuff
{{</* /highlight */>}}
````
{{< highlight lineNos="true" type="py" >}}
# Quicksort Python One-liner
lambda L: [] if L==[] else qsort([x for x in L[1:] if x< L[0]]) + L[0:1] + qsort([x for x in L[1:] if x>=L[0]])
# Some more stuff
{{< /highlight >}}
### With Wrap
````go
{{</* highlight type="py" wrap="true" hl_lines="2" */>}}
# Quicksort Python One-liner
lambda L: [] if L==[] else qsort([x for x in L[1:] if x< L[0]]) + L[0:1] + qsort([x for x in L[1:] if x>=L[0]])
# Some more stuff
{{</* /highlight */>}}
````
{{< highlight type="py" wrap="true" hl_lines="2" >}}
# Quicksort Python One-liner
lambda L: [] if L==[] else qsort([x for x in L[1:] if x< L[0]]) + L[0:1] + qsort([x for x in L[1:] if x>=L[0]])
# Some more stuff
{{< /highlight >}}
### Without Wrap
````go
{{</* highlight type="py" wrap="false" hl_lines="2" */>}}
# Quicksort Python One-liner
lambda L: [] if L==[] else qsort([x for x in L[1:] if x< L[0]]) + L[0:1] + qsort([x for x in L[1:] if x>=L[0]])
# Some more stuff
{{</* /highlight */>}}
````
{{< highlight type="py" wrap="false" hl_lines="2">}}
# Quicksort Python One-liner
lambda L: [] if L==[] else qsort([x for x in L[1:] if x< L[0]]) + L[0:1] + qsort([x for x in L[1:] if x>=L[0]])
# Some more stuff
{{< /highlight >}}

View file

@ -0,0 +1,5 @@
+++
descrption = "Beaut'fl math and chemical formulae"
title = "Highlight"
+++
{{< piratify true >}}

View file

@ -64,7 +64,7 @@ Some preformatted stuff in HTML elements
#### <> #### <>
{{< highlight json "linenos=table,hl_lines=1 2,anchorlinenos=true" >}} {{< highlight json "linenos=true,hl_lines=1 2,anchorlinenos=true" >}}
{ {
"Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World"
} }
@ -95,7 +95,7 @@ Some preformatted stuff in HTML elements
#### <> %% #### <> %%
{{< tab title="json" >}} {{< tab title="json" >}}
{{% highlight html "linenos=table,hl_lines=1 2,anchorlinenos=true" %}} {{% highlight html "linenos=true,hl_lines=1 2,anchorlinenos=true" %}}
{ {
"Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World"
} }
@ -105,7 +105,7 @@ Some preformatted stuff in HTML elements
#### <> <> #### <> <>
{{< tab title="json" >}} {{< tab title="json" >}}
{{< highlight html "linenos=table,hl_lines=1 2,anchorlinenos=true" >}} {{< highlight html "linenos=true,hl_lines=1 2,anchorlinenos=true" >}}
{ {
"Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World"
} }
@ -118,7 +118,7 @@ Some preformatted stuff in HTML elements
{{% tabs %}} {{% tabs %}}
{{% tab title="json" %}} {{% tab title="json" %}}
{{% highlight html "linenos=table,hl_lines=1 2,anchorlinenos=true" %}} {{% highlight html "linenos=true,hl_lines=1 2,anchorlinenos=true" %}}
{ {
"Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World"
} }
@ -130,7 +130,7 @@ Some preformatted stuff in HTML elements
{{% tabs %}} {{% tabs %}}
{{% tab title="json" %}} {{% tab title="json" %}}
{{< highlight html "linenos=table,hl_lines=1 2,anchorlinenos=true" >}} {{< highlight html "linenos=true,hl_lines=1 2,anchorlinenos=true" >}}
{ {
"Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World"
} }
@ -142,7 +142,7 @@ Some preformatted stuff in HTML elements
{{% tabs %}} {{% tabs %}}
{{< tab title="json" >}} {{< tab title="json" >}}
{{% highlight html "linenos=table,hl_lines=1 2,anchorlinenos=true" %}} {{% highlight html "linenos=true,hl_lines=1 2,anchorlinenos=true" %}}
{ {
"Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World"
} }
@ -154,7 +154,7 @@ Some preformatted stuff in HTML elements
{{% tabs %}} {{% tabs %}}
{{< tab title="json" >}} {{< tab title="json" >}}
{{< highlight html "linenos=table,hl_lines=1 2,anchorlinenos=true" >}} {{< highlight html "linenos=true,hl_lines=1 2,anchorlinenos=true" >}}
{ {
"Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World"
} }
@ -166,7 +166,7 @@ Some preformatted stuff in HTML elements
{{< tabs >}} {{< tabs >}}
{{% tab title="json" %}} {{% tab title="json" %}}
{{% highlight html "linenos=table,hl_lines=1 2,anchorlinenos=true" %}} {{% highlight html "linenos=true,hl_lines=1 2,anchorlinenos=true" %}}
{ {
"Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World"
} }
@ -178,7 +178,7 @@ Some preformatted stuff in HTML elements
{{< tabs >}} {{< tabs >}}
{{% tab title="json" %}} {{% tab title="json" %}}
{{< highlight html "linenos=table,hl_lines=1 2,anchorlinenos=true" >}} {{< highlight html "linenos=true,hl_lines=1 2,anchorlinenos=true" >}}
{ {
"Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World"
} }
@ -190,7 +190,7 @@ Some preformatted stuff in HTML elements
{{< tabs >}} {{< tabs >}}
{{< tab title="json" >}} {{< tab title="json" >}}
{{% highlight html "linenos=table,hl_lines=1 2,anchorlinenos=true" %}} {{% highlight html "linenos=true,hl_lines=1 2,anchorlinenos=true" %}}
{ {
"Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World"
} }
@ -202,10 +202,78 @@ Some preformatted stuff in HTML elements
{{< tabs >}} {{< tabs >}}
{{< tab title="json" >}} {{< tab title="json" >}}
{{< highlight html "linenos=table,hl_lines=1 2,anchorlinenos=true" >}} {{< highlight html "linenos=true,hl_lines=1 2,anchorlinenos=true" >}}
{ {
"Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World" "Hello": "World"
} }
{{< /highlight >}} {{< /highlight >}}
{{< /tab >}} {{< /tab >}}
{{< /tabs >}} {{< /tabs >}}
## With Wrap
### LineNo Table
{{< highlight lineNos="table" type="py" wrap="true" hl_lines="2" >}}
# Quicksort Python One-liner
lambda L: [] if L==[] else qsort([x for x in L[1:] if x< L[0]]) + L[0:1] + qsort([x for x in L[1:] if x>=L[0]])
# Some more stuff
{{< /highlight >}}
### LineNo Inline
{{< highlight lineNos="inline" type="py" wrap="true" hl_lines="2" >}}
# Quicksort Python One-liner
lambda L: [] if L==[] else qsort([x for x in L[1:] if x< L[0]]) + L[0:1] + qsort([x for x in L[1:] if x>=L[0]])
# Some more stuff
{{< /highlight >}}
### No LineNo
{{< highlight type="py" wrap="true" hl_lines="2" >}}
# Quicksort Python One-liner
lambda L: [] if L==[] else qsort([x for x in L[1:] if x< L[0]]) + L[0:1] + qsort([x for x in L[1:] if x>=L[0]])
# Some more stuff
{{< /highlight >}}
### No Type
{{< highlight wrap="true" hl_lines="2" >}}
# Quicksort Python One-liner
lambda L: [] if L==[] else qsort([x for x in L[1:] if x< L[0]]) + L[0:1] + qsort([x for x in L[1:] if x>=L[0]])
# Some more stuff
{{< /highlight >}}
## Without Wrap
### LineNo Table
{{< highlight lineNos="table" type="py" wrap="false" hl_lines="2">}}
# Quicksort Python One-liner
lambda L: [] if L==[] else qsort([x for x in L[1:] if x< L[0]]) + L[0:1] + qsort([x for x in L[1:] if x>=L[0]])
# Some more stuff
{{< /highlight >}}
### LineNo Inline
{{< highlight lineNos="inline" type="py" wrap="false" hl_lines="2" >}}
# Quicksort Python One-liner
lambda L: [] if L==[] else qsort([x for x in L[1:] if x< L[0]]) + L[0:1] + qsort([x for x in L[1:] if x>=L[0]])
# Some more stuff
{{< /highlight >}}
### No LineNo
{{< highlight type="py" wrap="false" hl_lines="2" >}}
# Quicksort Python One-liner
lambda L: [] if L==[] else qsort([x for x in L[1:] if x< L[0]]) + L[0:1] + qsort([x for x in L[1:] if x>=L[0]])
# Some more stuff
{{< /highlight >}}
### No Type
{{< highlight wrap="false" hl_lines="2" >}}
# Quicksort Python One-liner
lambda L: [] if L==[] else qsort([x for x in L[1:] if x< L[0]]) + L[0:1] + qsort([x for x in L[1:] if x>=L[0]])
# Some more stuff
{{< /highlight >}}

View file

@ -0,0 +1,7 @@
{{- partial "shortcodes/highlight.html" (dict
"context" .Page
"attributes" .Attributes
"content" .Inner
"options" .Options
"type" .Type
) }}

View file

@ -0,0 +1,60 @@
{{- $context := .context }}
{{- $attributes := dict }}
{{- $otherAttributes := dict }}
{{- $content := "" }}
{{- $options := dict }}
{{- $otherOptions := dict }}
{{- $type := "" }}
{{- range $k, $v := . }}
{{- if eq $k "context" }}
{{- else if eq $k "attributes" }}
{{- $attributes = $v }}
{{- else if eq $k "content" }}
{{- $content = trim $v "\n\r" }}
{{- else if eq $k "options" }}
{{- $options = $v }}
{{- else if eq $k "type" }}
{{- $type = $v }}
{{- else if eq $k "wrap" }}
{{- $otherAttributes = $otherAttributes | merge (dict $k $v) }}
{{- else }}
{{- $otherOptions = $otherOptions | merge (dict $k $v) }}
{{- end }}
{{- end }}
{{- $options = $options | merge $otherOptions }}
{{- $otherOptions := dict }}
{{- range $k, $v := $options }}
{{- if eq $k "wrap" }}
{{- $otherAttributes = (dict $k $v) | merge $otherAttributes }}
{{- else }}
{{- $otherOptions = $otherOptions | merge (dict $k $v) }}
{{- end }}
{{- end }}
{{- $options = $otherOptions }}
{{- $attributes = $attributes | merge $otherAttributes }}
{{- $params := slice }}
{{- range $k, $v := $options }}
{{- $params = $params | append (printf "%s=%s" $k $v) }}
{{- end }}
{{- $params = delimit $params ", " }}
{{- $wrap := true }}
{{- if isset $context.Site.Params "highlightwrap" }}
{{- $wrap = $context.Site.Params.highlightWrap }}
{{- end }}
{{- if isset $context.Params "highlightwrap" }}
{{- $wrap = $context.Params.highlightWrap }}
{{- end }}
{{- range $k, $v := $attributes }}
{{- if eq $k "wrap" }}
{{- $wrap = $v }}
{{- end }}
{{- end }}
{{- if eq (printf "%T" $wrap) "string" }}
{{- $wrap = (eq $wrap "true") }}
{{- end }}
{{- $content = highlight $content $type $params }}
{{- $content = replaceRE "^([\\s\\n\\r]*)(<pre\\s+?[\\s\\S]*)$" "${1}<div class=\"highlight\">${2}</div>" $content }}
{{- if $wrap }}
{{- $content = replaceRE "^([\\s\\n\\r]*<div\\s+class=\")" "${1}wrap-code " $content 1 }}
{{- end }}
{{- $content | safeHTML }}

View file

@ -0,0 +1,39 @@
{{- $version := split hugo.Version "." }}
{{- $major := int (index $version 0) }}
{{- $minor := int (index $version 1) }}
{{- $content := "" }}
{{- if or (and (eq $major 0) (ge $minor 110)) (gt $major 0) }}
{{- $content = .InnerDeindent }}
{{- else }}
{{- $content = .Inner }}
{{- end }}
{{- $attributes := dict }}
{{- $options := dict }}
{{- $stringOptions := "" }}
{{- $otherOptions := dict }}
{{- $type := "" }}
{{- range $k, $v := .Params }}
{{- if eq $k 0 }}
{{- $type = $v }}
{{- else if eq $k 1 }}
{{- $stringOptions = trim $v "\n\r\t " }}
{{- else if eq $k "type" }}
{{- $type = $v }}
{{- else if eq $k "wrap" }}
{{- $attributes = $attributes | merge (dict $k $v) }}
{{- else }}
{{- $otherOptions = $otherOptions | merge (dict $k $v) }}
{{- end }}
{{- end }}
{{- range (split $stringOptions ",") }}
{{- $pair := split . "=" }}
{{- $options = $options | merge (dict (index $pair 0) (index $pair 1)) }}
{{- end }}
{{- $options = $options | merge $otherOptions }}
{{- partial "shortcodes/highlight.html" (dict
"context" .Page
"attributes" $attributes
"content" $content
"options" $options
"type" $type
) }}

View file

@ -524,12 +524,14 @@
} }
div.highlight > div table + .copy-to-clipboard-button, div.highlight > div table + .copy-to-clipboard-button,
div.highlight pre + .copy-to-clipboard-button,
pre .copy-to-clipboard-button { pre .copy-to-clipboard-button {
border-color: rgba( 216, 216, 216, 1 ); /* var(--CODE-BLOCK-BORDER-color) */ border-color: rgba( 216, 216, 216, 1 ); /* var(--CODE-BLOCK-BORDER-color) */
color: rgba( 72, 106, 201, 1 ); /* var(--MAIN-LINK-color) */ color: rgba( 72, 106, 201, 1 ); /* var(--MAIN-LINK-color) */
} }
div.highlight > div table + .copy-to-clipboard-button:hover, div.highlight > div table + .copy-to-clipboard-button:hover,
div.highlight pre + .copy-to-clipboard-button:hover,
pre .copy-to-clipboard-button:hover { pre .copy-to-clipboard-button:hover {
background-color: rgba( 72, 106, 201, 1 ); /* var(--MAIN-LINK-color) */ background-color: rgba( 72, 106, 201, 1 ); /* var(--MAIN-LINK-color) */
border-color: rgba( 72, 106, 201, 1 ); /* var(--MAIN-LINK-color) */ border-color: rgba( 72, 106, 201, 1 ); /* var(--MAIN-LINK-color) */

View file

@ -544,14 +544,19 @@ div.box > .box-content {
#body table th > :last-child, #body table th > :last-child,
#body table th > :last-child :last-child, #body table th > :last-child :last-child,
#body table th > div.highlight:last-child pre,
#body table td > :last-child, #body table td > :last-child,
#body table td > :last-child :last-child, #body table td > :last-child :last-child,
#body table td > div:last-child pre,
#body div.box > .box-content > :last-child, #body div.box > .box-content > :last-child,
#body div.box > .box-content > :last-child :last-child, #body div.box > .box-content > :last-child :last-child,
#body div.box > .box-content > div:last-child pre,
#body div.expand > .expand-content-text > :last-child, #body div.expand > .expand-content-text > :last-child,
#body div.expand > .expand-content-text > :last-child :last-child, #body div.expand > .expand-content-text > :last-child :last-child,
#body div.expand > .expand-content-text > div:last-child pre,
#body div.tab-content > .tab-content-text > :last-child, #body div.tab-content > .tab-content-text > :last-child,
#body div.tab-content > .tab-content-text > :last-child :last-child { #body div.tab-content > .tab-content-text > :last-child :last-child,
#body div.tab-content > .tab-content-text > div:last-child pre {
margin-bottom: 0; margin-bottom: 0;
} }
@ -663,14 +668,15 @@ pre code {
font-size: .9375rem; font-size: .9375rem;
margin: 0; margin: 0;
padding: 0; padding: 0;
white-space: inherit;
} }
div.highlight{
position: relative;
}
/* we may have special treatment if highlight shortcode was used in table lineno mode */ /* we may have special treatment if highlight shortcode was used in table lineno mode */
div.highlight > div{ div.highlight > div{
border-style: solid; border-style: solid;
border-width: 1px; border-width: 1px;
position: relative;
} }
/* remove default style for usual markdown tables */ /* remove default style for usual markdown tables */
div.highlight > div table{ div.highlight > div table{
@ -700,9 +706,15 @@ div.highlight > div table{
display: block; display: block;
overflow: auto; overflow: auto;
} }
div.highlight > div td:not(:first-child):last-child pre code{ div.highlight:not(.wrap-code) pre{
overflow: auto;
}
div.highlight:not(.wrap-code) pre code{
white-space: pre; white-space: pre;
} }
div.highlight.wrap-code pre code{
white-space: pre-wrap;
}
/* remove border from row cells if highlight shortcode was used in table lineno mode */ /* remove border from row cells if highlight shortcode was used in table lineno mode */
div.highlight > div td > pre { div.highlight > div td > pre {
border-radius: 0; border-radius: 0;
@ -1101,12 +1113,14 @@ span > .copy-to-clipboard-button {
} }
div.highlight > div table + .copy-to-clipboard-button > i, div.highlight > div table + .copy-to-clipboard-button > i,
div.highlight pre + .copy-to-clipboard-button > i,
.copy-to-clipboard-code + .copy-to-clipboard-button > i { .copy-to-clipboard-code + .copy-to-clipboard-button > i {
padding-left: 5px; padding-left: 5px;
padding-right: 5px; padding-right: 5px;
} }
div.highlight > div table + .copy-to-clipboard-button, div.highlight > div table + .copy-to-clipboard-button,
div.highlight pre + .copy-to-clipboard-button,
pre > .copy-to-clipboard-button { pre > .copy-to-clipboard-button {
background-color: rgba( 160, 160, 160, .2 ); background-color: rgba( 160, 160, 160, .2 );
border-radius: 2px; border-radius: 2px;

View file

@ -273,12 +273,14 @@ table {
} }
div.highlight > div table + .copy-to-clipboard-button, div.highlight > div table + .copy-to-clipboard-button,
div.highlight pre + .copy-to-clipboard-button,
pre .copy-to-clipboard-button { pre .copy-to-clipboard-button {
border-color: var(--INTERNAL-CODE-BLOCK-BORDER-color); border-color: var(--INTERNAL-CODE-BLOCK-BORDER-color);
color: var(--INTERNAL-MAIN-LINK-color); color: var(--INTERNAL-MAIN-LINK-color);
} }
div.highlight > div table + .copy-to-clipboard-button:hover, div.highlight > div table + .copy-to-clipboard-button:hover,
div.highlight pre + .copy-to-clipboard-button:hover,
pre .copy-to-clipboard-button:hover { pre .copy-to-clipboard-button:hover {
background-color: var(--INTERNAL-MAIN-LINK-color); background-color: var(--INTERNAL-MAIN-LINK-color);
border-color: var(--INTERNAL-MAIN-LINK-color); border-color: var(--INTERNAL-MAIN-LINK-color);

View file

@ -577,6 +577,24 @@ function initCodeClipboard(){
table.dataset[ 'code' ] = text; table.dataset[ 'code' ] = text;
table.parentNode.insertBefore( button, table.nextSibling ); table.parentNode.insertBefore( button, table.nextSibling );
} }
else if( inPre ){
var pre = code.parentNode;
pre.dataset[ 'code' ] = text;
var p = pre.parentNode;
// indented code blocks are missing the div
while( p != document && ( p.tagName.toLowerCase() != 'div' || !p.classList.contains( 'highlight' ) ) ){
p = p.parentNode;
}
if( p == document ){
var clone = pre.cloneNode( true );
var div = document.createElement( 'div' );
div.classList.add( 'highlight' );
div.appendChild( clone );
pre.parentNode.replaceChild( div, pre );
pre = clone;
}
pre.parentNode.insertBefore( button, pre.nextSibling );
}
else{ else{
code.dataset[ 'code' ] = text; code.dataset[ 'code' ] = text;
code.parentNode.insertBefore( button, code.nextSibling ); code.parentNode.insertBefore( button, code.nextSibling );