how to add syntax highlighting, ln number, clipboard js in go hugo website
Installing Pygmentation
first you have to download python Pygments in your machine. In mac you can easily download by pip install Pygments
. If you use ubuntu sudo apt-get install python3-pygments
adding pygmentsUseClasses in config.toml
file
pygmentsUseClasses=true
generate chroma style using hugo gen
command
hugo gen chromastyles --style=monokai > static/css/syntax.css
// for more info run following command
hugo gen chromastyles -h
I have used monokai theme. There are a lot of themes available. all themes are available here to check. Add generated css in your html file
<link rel='stylesheet' href='{{.Site.BaseURL}}css/syntax.css'/>
writing your code in between highlight shortcode in your markdown file
{{< highlight go "linenos=table,hl_lines=8 15-17,linenostart=199" >}}
// ... code
{{< / highlight >}}
for the php highlight
In case of of php
highlight, your code block should be start with <?php
. otherwise Pygments didn’t guess your language for syntax highlighting. I feel like its a bug. I am a php developer. So my most of the code snippet will be in php.
adding clipboard js in your html
I have added cdn you can download and added to your path
<script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js"></script>
add copy to clipboard button in js programmatically
following code will only work if you pass linenos=table
param in highlight
shortcode
var tables = document.querySelectorAll('table.lntable');
tables.forEach(function (table) {
var tds = table.querySelectorAll('td');
if (tds.length > 1) {
var codeTd = tds[1];
var pre = codeTd.querySelector('pre');
var button = document.createElement('button');
button.className = 'copy-button';
button.textContent = 'Copy';
pre.appendChild(button);
}
})
When we set linenos=table
params it will generate table with 2 td
. first td
hold line number 2nd td
hold actual code. So we targeted 2nd td
and append button.copy-button
.
add style for clipboard button
following style make button.copy-button
top right corner of code block.
table.lntable {
position: relative;
}
.copy-button {
position: absolute;
top: 0px;
right: 0px;
display: inline-block;
color: maroon;
border: 1px solid maroon;
cursor: pointer;
}
.copy-button:hover {
background-color: maroon;
color: white;
}
adding click handler to copy from clipboard
// setting up target for copy
var copyCode = new ClipboardJS('.copy-button', {
target: function(trigger) {
return trigger.previousElementSibling;
}
});
// success message
copyCode.on('success', function(event) {
event.clearSelection();
event.trigger.textContent = 'Copied';
window.setTimeout(function() {
event.trigger.textContent = 'Copy';
}, 2000);
});
// error message
copyCode.on('error', function(event) {
event.trigger.textContent = 'Press "Ctrl + C" to copy';
window.setTimeout(function() {
event.trigger.textContent = 'Copy';
}, 2000);
});
Using highlightjs
alongside Pygments
. - not necessary at all
If you want to add highlightjs
alongside this Pygments
first add css and js of highlights js
<link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css'/>
<script src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js'></script>
instantiate highlightjs
hljs.initHighlightingOnLoad();
adding copy button by filtering already added copy-button
in pygments
block
var pres = document.querySelectorAll('pre');
pres.forEach(function (pre, i) {
if (pre.parentNode.nodeName !== 'TD') {
var isLanguage = pre.children[0].className.indexOf('language-');
if ( isLanguage === 0 ) {
var button = document.createElement('button');
button.className = 'copy-button';
button.textContent = 'Copy';
pre.appendChild(button);
}
}
})
Thats all. Thank you