Add collapsable code shortcode
This commit is contained in:
parent
d5b7eefa20
commit
409741f42c
5 changed files with 147 additions and 1 deletions
25
README.md
25
README.md
|
@ -43,6 +43,31 @@
|
||||||
- **`imgproc`** Hugo shortcode for image processing, plus additional **`position`** param [ left | center | right ] (optional).
|
- **`imgproc`** Hugo shortcode for image processing, plus additional **`position`** param [ left | center | right ] (optional).
|
||||||
- eg: `{{< imgproc "img/hello.png" Resize "250x" center />}}`
|
- eg: `{{< imgproc "img/hello.png" Resize "250x" center />}}`
|
||||||
- More detailed info on processing commands at [https://gohugo.io/content-management/image-processing/](https://gohugo.io/content-management/image-processing/)
|
- More detailed info on processing commands at [https://gohugo.io/content-management/image-processing/](https://gohugo.io/content-management/image-processing/)
|
||||||
|
- **`code`** (prop required: **`language`**; props optional: **`title`**, **`id`**, **`expand`** (default "△"), **`collapse`** (default "▽"), **`isCollapsed`**)
|
||||||
|
- eg:
|
||||||
|
```go
|
||||||
|
{{< code language="css" title="Really cool snippet" id="1" expand="Show" collapse="Hide" isCollapsed="true" >}}
|
||||||
|
pre {
|
||||||
|
background: #1a1a1d;
|
||||||
|
padding: 20px;
|
||||||
|
border-radius: 8px;
|
||||||
|
font-size: 1rem;
|
||||||
|
overflow: auto;
|
||||||
|
|
||||||
|
@media (--phone) {
|
||||||
|
white-space: pre-wrap;
|
||||||
|
word-wrap: break-word;
|
||||||
|
}
|
||||||
|
|
||||||
|
code {
|
||||||
|
background: none !important;
|
||||||
|
color: #ccc;
|
||||||
|
padding: 0;
|
||||||
|
font-size: inherit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{{< /code >}}
|
||||||
|
```
|
||||||
|
|
||||||
#### Code highlighting
|
#### Code highlighting
|
||||||
|
|
||||||
|
|
15
layouts/shortcodes/code.html
Normal file
15
layouts/shortcodes/code.html
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
{{ $id := delimit (shuffle (seq 1 9)) "" }}
|
||||||
|
|
||||||
|
{{ if .Get "language" }}
|
||||||
|
<div class="collapsable-code">
|
||||||
|
<input id="{{ .Get "id" | default $id }}" type="checkbox" {{ if ( eq ( .Get "isCollapsed" ) "true" ) -}} checked {{- end }} />
|
||||||
|
<label for="{{ .Get "id" | default $id }}">
|
||||||
|
<span class="collapsable-code__language">{{ .Get "language" }}</span>
|
||||||
|
{{ if .Get "title" }}<span class="collapsable-code__title">{{ .Get "title" | markdownify }}</span>{{ end }}
|
||||||
|
<span class="collapsable-code__toggle" data-label-expand="{{ .Get "expand" | default "△" }}" data-label-collapse="{{ .Get "collapse" | default "▽" }}"></span>
|
||||||
|
</label>
|
||||||
|
<pre {{ if .Get "language" }}class="language-{{ .Get "language" }}" {{ end }}><code>{{ .Inner | string }}</code></pre>
|
||||||
|
</div>
|
||||||
|
{{ else }}
|
||||||
|
{{ errorf "If you want to use the \"collapsable code\" shortcode, you need to pass a mandatory \"language\" param. The issue occured in %q (%q)" .Page.File .Page.Permalink }}
|
||||||
|
{{ end }}
|
105
source/css/code.css
Normal file
105
source/css/code.css
Normal file
|
@ -0,0 +1,105 @@
|
||||||
|
.collapsable-code {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
margin: 40px 0;
|
||||||
|
|
||||||
|
input[type="checkbox"] {
|
||||||
|
position: absolute;
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="checkbox"]:checked {
|
||||||
|
~ pre,
|
||||||
|
~ .code-toolbar pre {
|
||||||
|
height: 0;
|
||||||
|
padding: 0;
|
||||||
|
border-top: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
~ .code-toolbar {
|
||||||
|
padding: 0;
|
||||||
|
border-top: none;
|
||||||
|
|
||||||
|
.toolbar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
~ label {
|
||||||
|
border-radius: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
~ label .collapsable-code__toggle:after {
|
||||||
|
content: attr(data-label-expand);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
background: hsla(0, 0%, 10%, 10%);
|
||||||
|
padding: 10px;
|
||||||
|
border-top-left-radius: 10px;
|
||||||
|
border-top-right-radius: 10px;
|
||||||
|
min-width: 30px;
|
||||||
|
min-height: 30px;
|
||||||
|
margin: 0;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
.dark-theme & {
|
||||||
|
background: hsla(0, 0%, 10%, 40%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&__title {
|
||||||
|
flex: 1;
|
||||||
|
color: var(--accent);
|
||||||
|
padding: 3px 10px;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__language {
|
||||||
|
background: hsl(0, 0%, 100%);
|
||||||
|
color: var(--accent);
|
||||||
|
border-radius: 10px;
|
||||||
|
text-transform: uppercase;
|
||||||
|
padding: 3px 10px;
|
||||||
|
|
||||||
|
.dark-theme & {
|
||||||
|
background: hsla(0, 0%, 100%, 10%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&__toggle {
|
||||||
|
color: var(--accent);
|
||||||
|
font-size: 16px;
|
||||||
|
padding: 3px 10px;
|
||||||
|
|
||||||
|
&:after {
|
||||||
|
content: attr(data-label-collapse);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
margin-top: 0;
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
|
||||||
|
&::first-line {
|
||||||
|
line-height: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
code {
|
||||||
|
&::first-line {
|
||||||
|
line-height: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.code-toolbar {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
}
|
|
@ -15,7 +15,7 @@ pre[class*="language-"] {
|
||||||
word-spacing: normal;
|
word-spacing: normal;
|
||||||
word-break: normal;
|
word-break: normal;
|
||||||
word-wrap: normal;
|
word-wrap: normal;
|
||||||
line-height: 1.5;
|
/* line-height: 1.5; */
|
||||||
|
|
||||||
-moz-tab-size: 4;
|
-moz-tab-size: 4;
|
||||||
-o-tab-size: 4;
|
-o-tab-size: 4;
|
||||||
|
|
|
@ -14,3 +14,4 @@
|
||||||
@import 'archive';
|
@import 'archive';
|
||||||
|
|
||||||
@import 'prism';
|
@import 'prism';
|
||||||
|
@import 'code';
|
||||||
|
|
Loading…
Reference in a new issue