【WordPress】highlight.jsで人気プログラミング言語2020のコードを表示してみた

WordPressで技術系ブログやプログラミングについての記事を書く場合、コードの埋め込みやコードの表示をしたいという場面が多くあるかと思います。

今回は「プログラミング言語人気ランキング2020」をテーマにhighlight.jsを使ったシンタックスハイライトで各言語のコードを紹介してみます。

MEMO
  • シンタックスハイライト」とは
    ソースコードの可読性を上げるために色をつけること。
  • highlight.js」とは
    Webページでプログラムコードを強調&色付け表示させるためのJavaScript。
    対応言語やスタイル種類が多く(189 言語・94 スタイル)、軽量なことが特徴。

結果

どの言語もhighlight.jsのデモ通り、正常に表示できました。

※各言語のコードはhighlight.jsのデモから引用しました。

プログラミング言語 人気ランキング 2020年(highlight.jsで表示)

1位 C/C++

#include 

int main(int argc, char *argv[]) {

  /* An annoying "Hello World" example */
  for (auto i = 0; i < 0xFFFF; i++)
    cout << "Hello, World!" << endl;

  char c = '\n';
  unordered_map <string, vector > m;
  m["key"] = "\\\\"; // this is an error

  return -2e3 + 12l;
}

2位 Python

@requires_authorization
def somefunc(param1='', param2=0):
    r'''A docstring'''
    if param1 > param2: # interesting
        print 'Gre\'ater'
    return (param2 - param1 + 1 + 0b10l) or None

class SomeClass:
    pass

>>> message = '''interpreter
... prompt'''

3位 JavaScript

function $initHighlight(block, cls) {
  try {
    if (cls.search(/\bno\-highlight\b/) != -1)
      return process(block, true, 0x0F) +
             ` class="${cls}"`;
    } catch (e) {
    /* handle exception */
  }
  for (var i = 0 / 2; i < classes.length; i++) {
    if (checkCondition(classes[i]) === undefined)
      console.log('undefined');
  }
  return (
  <div>
    <web-component>{block}</web-component>
  </div>
  )
}
export $initHighlight;

4位 SQL

CREATE TABLE "topic" (
    "id" serial NOT NULL PRIMARY KEY,
    "forum_id" integer NOT NULL,
    "subject" varchar(255) NOT NULL
);
ALTER TABLE "topic"
ADD CONSTRAINT forum_id FOREIGN KEY ("forum_id")
REFERENCES "forum" ("id");

-- Initials
insert into "topic" ("forum_id", "subject")
values (2, 'D''artagnian');

5位 C#

using System.IO.Compression;

#pragma warning disable 414, 3021

namespace MyApplication
{
    [Obsolete("...")]
    class Program : IInterface
    {
        public static List JustDoIt(int count)
        {
            Console.WriteLine($"Hello {Name}!");
            return new List(new int[] { 1, 2, 3 })
        }
    }
}

6位 Java

/**
 * @author John Smith <john.smith@example.com>
*/
package l2f.gameserver.model;

public abstract strictfp class L2Char extends L2Object {
  public static final Short ERROR = 0x0001;

  public void moveTo(int x, int y, int z) {
    _ai = null;
    log("Should not be called");
    if (1 > 5) { // wtf!?
      return;
    }
  }
}

7位 VBA(VBScript)

highlight.jsの言語リストにはVBAはなかったので、VBScriptのJSを読み込んで表示させてます。

' creating configuration storage and initializing with default values
Set cfg = CreateObject("Scripting.Dictionary")

' reading ini file
for i = 0 to ubound(ini_strings)
    s = trim(ini_strings(i))

    ' skipping empty strings and comments
    if mid(s, 1, 1) <> "#" and len(s) > 0 then
      ' obtaining key and value
      parts = split(s, "=", -1, 1)

      if ubound(parts)+1 = 2 then
        parts(0) = trim(parts(0))
        parts(1) = trim(parts(1))

        ' reading configuration and filenames
        select case lcase(parts(0))
          case "uncompressed""_postfix" cfg.item("uncompressed""_postfix") = parts(1)
          case "f"
                    options = split(parts(1), "|", -1, 1)
                    if ubound(options)+1 = 2 then
                      ' 0: filename,  1: options
                      ff.add trim(options(0)), trim(options(1))
                    end if
        end select
      end if
    end if
next

8位 HTML/CSS

HTML

<!DOCTYPE html>
<title>Title</title>

<style>body {width: 500px;}</style>

<script type="application/javascript">
  function $init() {return true;}
</script>

<body>
  <p checked class="title" id='title'>Title</p>
  <!-- here goes the rest of the page -->
</body>

CSS

@font-face {
  font-family: Chunkfive; src: url('Chunkfive.otf');
}

body, .usertext {
  color: #F0F0F0; background: #600;
  font-family: Chunkfive, sans;
  --heading-1: 30px/32px Helvetica, sans-serif;
}

@import url(print.css);
@media print {
  a[href^=http]::after {
    content: attr(href)
  }
}

9位 PHP

require_once 'Zend/Uri/Http.php';

namespace Location\Web;

interface Factory
{
    static function _factory();
}

abstract class URI extends BaseURI implements Factory
{
    abstract function test();

    public static $st1 = 1;
    const ME = "Yo";
    var $list = NULL;
    private $var;

    /**
     * Returns a URI
     *
     * @return URI
     */
    static public function _factory($stats = array(), $uri = 'http')
    {
        echo __METHOD__;
        $uri = explode(':', $uri, 0b10);
        $schemeSpecific = isset($uri[1]) ? $uri[1] : '';
        $desc = 'Multi
line description';

        // Security check
        if (!ctype_alnum($scheme)) {
            throw new Zend_Uri_Exception('Illegal scheme');
        }

        $this->var = 0 - self::$st;
        $this->list = list(Array("1"=> 2, 2=>self::ME, 3 => \Location\Web\URI::class));

        return [
            'uri'   => $uri,
            'value' => null,
        ];
    }
}

echo URI::ME . URI::$st1;

__halt_compiler () ; datahere
datahere
datahere */
datahere

10位 VB.NET(Visual Basic.NET)

Import System
Import System.IO
#Const DEBUG = True

Namespace Highlighter.Test
  ''' <summary>This is an example class.</summary>
  Public Class Program
    Protected Shared hello As Integer = 3
    Private Const ABC As Boolean = False

#Region "Code"
    ' Cheers!
    <STAThread()> _
    Public Shared Sub Main(ByVal args() As String, ParamArray arr As Object) Handles Form1.Click
      On Error Resume Next
      If ABC Then
        While ABC : Console.WriteLine() : End While
        For i As Long = 0 To 1000 Step 123
          Try
            System.Windows.Forms.MessageBox.Show(CInt("1").ToString())
          Catch ex As Exception       ' What are you doing? Well...
            Dim exp = CType(ex, IOException)
            REM ORZ
            Return
          End Try
        Next
      Else
        Dim l As New System.Collections.List<String>()
        SyncLock l
          If TypeOf l Is Decimal And l IsNot Nothing Then
            RemoveHandler button1.Paint, delegate
          End If
          Dim d = New System.Threading.Thread(AddressOf ThreadProc)
          Dim a = New Action(Sub(x, y) x + y)
          Static u = From x As String In l Select x.Substring(2, 4) Where x.Length > 0
        End SyncLock
        Do : Laugh() : Loop Until hello = 4
      End If
    End Sub
#End Region
  End Class
End Namespace

シンタックスハイライトの設定について

大まかな設定などは以下の通りです。

設定メモ
  • highlight.js を選んだ理由
    色々試してみた中で不具合もなくきれいに表示できたからです。
    ※他にも「Prism.js」や、WordPressプラグイン「Crayon Syntax Highlighter」「Prism For WP」などを試してみましたが、
     WordPressやテーマとの相性なのか、表示がずれたりするのが気になりました。

  • Style(コードの背景や色などの見た目)
    Atom One Dark」を選びました。
    ※「Ir Black」や「Tomorrow Night」もいい感じです。

  • highlight.jsのJSの読み込み
    コンテンツ配信ネットワーク(CDN)を利用してます。
    ※WordPressのfunctions.phpにコードを追記。

  • highlight.jsのCSSの読み込み
    本サイトで使っているSANGOの子テーマのstyle.cssに追記してます。

  • SANGOとの競合
    highlight.jsを導入するとSANGOの機能と競合したので、SANGOのコード表示に関するCSS設定を無効にしました。

  • コード表示が正しくできているかについて
    目視ですが、https://highlightjs.org/static/demo/ のデモを見ながら本サイトで紹介するコードが正しく表示されているか確認しました。

  • ‘<‘や’>’の表示について
    HTMLやCSSでよく使われる山かっこ(<, >)はテキストエディタ上で以下のように変換してあげる必要があります。
     '<‘ → ’&lt;’
     ’>’ → ’&gt;’

まとめ

  • highlight.jsで人気プログラミング言語を表示させたところ、人気言語にも対応しており表示も見やすくきれいでした。
  • 表示するにあたり、CDNからの読み込み、CSSの追記、SANGOのカスタマイズなどを行いました。