Skip to main content

Add Prism.js code highlighting to Ghost

Table of Contents

Prism.js is a wonderful little javascript library for highlighting code at runtime. It support various themes + a ton of languages and is really easy to implement in Ghost.

#include <stdio.h>
 
int main()
{
  printf("Hello world\n");
  return 0;
}

Setup #

All you have to do is go to prismjs.com and build a version that suits you and upload the css and javascript files into your theme assets folder. And finally add them to the code injection settings in Ghost.

<!-- Add the css in the header -->
<link href="/assets/css/prism.css" rel="stylesheet" />

<!-- And the javascript in the footer -->
<script  type="text/javascript" src="/assets/js/prism.js"></script>

After that all code blocks will be highlighted automatically if you add a language class to your code block in markdown.

```language-javascript
//code here

The code above add a language-javascript class to the generated <code> block which prism.js will pick up on later and highlight its content.

Line numbers #

There is a really nice plugin available for prism.js which adds line numbers to your code block. Unfortunately it requires you to add a second class to the code block called line-numbers and markdown only supports one class per code block.

I solved it by adding a small bit of javascript code that go through all <code> tags and add the line number class. It will also check if the class starts with no-numbers- and in that case won’t show line numbers.

You can add this snippet in the footer part on code injections.

<script>
    //Small fix to activate line numbers in prism
    var codes = document.getElementsByTagName('code');
    for (var i = 0; i < codes.length; i++) {
        if (codes[i].className.indexOf('no-numbers-') === 0) {
            codes[i].className = codes[i].className.substring(11);
        }
        else {
            codes[i].className += ' line-numbers'; 
        }
    }
</script>

It’s not the cleanest solution perhaps and it could break some themes that might use the code tag. There are other ways of solving it as well but this was a simple solution that seems to work for now at least.