WordPress: Adding Prism.js Without a Plugin

After a while I discovered why my blog wasn’t highlighting code as I wanted it to. Plugins are too old and the Markdown plugin in Jetpack is not producing the correct HTML from the Markdown I’m writing.

I’ve spent the last few days trying to update plugins with a recent version of Prism that has the plugins I want to use and the languages I want to use are properly configured.

Instead of creating a plugin (which may be a future project) I’ve chosen to add this to my theme’s functions.php and evaluate how it works and then decide if and how to incorporate it to my production site.

The process takes 3 steps

Upload the Prism CSS and Javascript files to your server

Add the functions to the theme’s functions.php

Edit the content of your database to make the changes to how the languages are written in the HTML

We’ll cover these steps individually.

Upload the Prism files to your server

I won’t tell you how to upload your files. You can use (s)ftp, your control panel, whatever you choose is fine. The important thing is to put it inside your theme under the /prism/ path: /prism/css for style sheets and /prism/js for your stylesheets.

Once that’s done we can move to the next step: Adding the functions to load the script and stylesheet.

Add the functions to the theme’s functions.php

The fuction add_prism registers and enqueues the stylesheet and javascript files for Prism.

The problem is that even after adding these functions we will not get the results I want. It turns out that Jetpack’s Markdown parser does not change the name of the code fence. When I write a Javascript fenced block like this (the closing of the fenced block has a backslash () on purpose, otherwise it will not display)

```jvascript
// code goes here
\```

Jetpack produces the following HTML:

<pre><code class="javascript">
// code goes here
</code></pre>

which is not what I expect to see, I expect to see something that will work with a syntax highlighter like the code below.

I’ve contacted Jetpack support and I hope for a quick resolution moving forward but there is likely no easy way to fix existing posts (over 100 of them) other than editing the database.

Edit the content of your database

Before attempting any changes on the database make sure that you back up your database, ideally both a WordPress export and a SQL backup with phpMyAdmin or similar tool.
If you don’t make backups and your database explodes I am not responsible

There are two ways of updating content in your database.

The first one is to open phpMyAdmin, clicking on your WordPress database, selecting the SQL tab and running the following command where text to find correspond to the existing values column and text to replace with is the new value.

I tried this way and screwed up my development system so I quickly retored from my phpMyAdmin backup and wwent to the drawing board.

Through one of the tutorias I read to figure out how to do this I found a WordPress plugin, Better Search Replace, that will let me do this from within WordPress and hopefully it’ll save me from myself and my own stupidity.

I installed and activated the plugin in my development system and tested it… It worked perfectly.

I did the same thing in production and it worked just as fine 🙂

The table below shows the languages that I searched for and (left column) and what I replaced with (right side). I probably missed some. If you find any code block that is not highlighted, please let me know.

Existing Values

New Values

xml

html

markup

language-markup

css

language-css

scss

sass

language-scss

nginx

language-nginx

apache

language-apacheconf

php

php5

language-php

handlebars

language-handlebars

bash

language-bash

Conclusion

Working with WordPress is not always easy but you can usually get a working solution if you’re willing to put in the work.

Jetpack support got back to me and confirmed that the issue is a bug on their Markdown parser and suggested a solution. When the parser is fixed the solution will stop working, I think, but now I know how to fix these problems 🙂