Crayon Syntax Highlighterに言語を追加してみる

  |   2015/09/04 ( 2019/01/05 ) | 231 views
 0

お知らせ

シンタックスハイライトプラグインの切り替えにより、この記事は近日公開を終了します。

Nia-TN-SDF-A2

こんにちはー!ニアです。

WordPressで記事に載せたソースコードの色分けに、皆さんは何を使っていますか?

このブログでは、WordPressのプラグイン「Crayon Syntax Highlighter」を使って、ソースコードを色分けしています。

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

対応するプログラミング言語は多めですが、F#やTypeScriptは未対応です(※Ver. 2.7.1の時点)。特にF#はミョウガがよく使っているので・・・。

1. ユーザーフォルダに定義ファイルを置けば、言語を追加できます

Crayon Syntax Highlighterをインストールすると、「[WordPressのルート]\wp-content\plugins」フォルダだけでなく、「[WordPressのルート]\wp-content\uploads」フォルダの中にも「crayon-syntax-highlighter」フォルダが作成されます。

cshup

uploads側のフォルダの中身を見ると、「fonts」と「langs」、「themes」の3つのフォルダが作成されています。

「langs」フォルダはソースコード色分けするための定義ファイルを入れる場所なので、そこにアップロードすれば、ソースコードを色分けするプログラミング言語を追加できます。

2. 試行錯誤で定義ファイルを作り、言語を追加してみる

Crayon Language FilesにあるReadme.mdを読みつつ、今回は

  • F#
  • TypeScript
  • HSP
  • XAML

の4言語の定義ファイルを作成し、「langs」フォルダにアップロードします。

2.1. F#

F#では、「キーワード リファレンス (F#) | MSDN」に載っているキーワードを中心に色が付くようにします。

open System
[<EntryPoint>]
let main argv =
    
    // 現在の日付を取得し、当月1日の曜日と末日を求めます。
    DateTime.Now |> fun now -> ( now.AddDays( float( 1 - now.Day ) ).DayOfWeek |> int, DateTime.DaysInMonth( now.Year, now.Month ) )
    
    // 範囲を[( - 1日の曜日 + 1 )..末日]にし、要素が負の時に空白を、そうでなければ日付を文字列に変換します。
    // こうすることで1日の曜日に合わせてオフセットすることができます。
    // また、要素の位置が7の倍数なら、改行記号も付け足します。
    |> fun( prePad, lastDay ) -> [ for curDay in -prePad + 1..lastDay -> if curDay < 1 then "   " else sprintf ( if ( curDay + prePad ) % 7 = 0 || curDay = lastDay then "%3dn" else "%3d" ) curDay ]
   
    // イテレーターで各要素を出力します。
    |> Seq.iter( fun cal -> printf "%s" cal )

    0

また文字列ではVerbatim文字列、三連引用符にも対応させます。

// 文字列、Verbatim文字列、三連引用符文字列
let str = "ab\"c"
let verbstr = @"ab\c"
let str2 = """a\"b"c"""

2.2. TypeScript

TypeScriptでは、Visual StuioのIntelliSenseに登録されているキーワードを中心に色が付くようにします。

function GetCal() {
    var now = new Date();
    var prePad = new Date(now.getFullYear(), now.getMonth(), 1).getDay();
    var lastDay = new Date(now.getFullYear(), now.getMonth() + 1, 0).getDate();

    var ans = now.toDateString() + "\n";

    for (var curDay = -prePad + 1; curDay <= lastDay; curDay++) {
        ans += " " + (curDay < 1 ? "  " : (curDay < 10 ? " " : "") + curDay.toString() + (((prePad + curDay) % 7 == 0) ? "\n" : ""));
    }

    return ans;
}

var cal = GetCal();

console.log(cal);

ちなみに、CoffeeScriptは標準で対応しています。

2.3. HSP

HSPでは、HSP付属のエディタの色分けをもとに、標準で定義されているキーワードと、拡張マクロの中でforやswitchなど他の言語でもよく使うものに色が付くようにします。

#packopt name "Sample"

#module TestMod

#defcfunc local Sum int a, int b
	if a < 0 || b < 0 || a > b : return -1
	sum = 0
	repeat b - a + 1, a
		sum += cnt
	loop
	return sum
	
#defcfunc local SumArray array a
	switch vartype( a )
	case 2 : sum = "" : swbreak		; 文字列の場合、各要素の文字列を結合します
	case 3 : sum = 0.0 : swbreak
	case 4 : sum = 0 : swbreak
	swend
	
	foreach a
		sum += a( cnt )
	loop
	
	return sum

#global

	screen 0, 320, 160
	title "総和を求めるプログラム"
	a = 0 : b = 0
	pos 20, 30 : mes "Sum ("
	pos 70, 30 : input a, 50, 23
	pos 125, 30 : mes "to"
	pos 150, 30 : input b, 50, 23
	pos 210, 30 : mes ")"
	pos 230, 30 : button "計算", *calc
	
	wait 0
	stop

// 計算
*calc
	; aとbのは正の数かつ、a <= b を満たす必要があります。
	if a < 0 || b < 0 || a > b {
		dialog "正しくない値が入力されています", 1, "エラー"
	}
	else {
		; 総和の計算
		dialog strf( "%d から %d までの総和は %d です。", a, b, Sum@TestMod( a, b ) ), 0, "計算結果"
	}
	
	stop

2.4. XAML

WPFやユニバーサルWindowsアプリで使うXAMLを、デフォルトで用意されているXHTMLで色分けすると、<Style>要素を含んだコードが正しく色分けできない問題があります。

<Window x:Class="WPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="{Binding DisplayDate, ElementName=cal, StringFormat=\{0:d\}, ConverterCulture=ja-jp}"
	Height="207" Width="200" ResizeMode="NoResize">
    <Window.Resources>
        <Style x:Key="Calstyle" TargetType="{x:Type Calendar}">
			<Setter Property="Background" Value="Azure"/>
        </Style>
    </Window.Resources>
	<Calendar x:Name="cal" Style="{StaticResource Calstyle}"/>
</Window>

Crayon Syntax HighlighterにはMixed Hilightingという機能があり、XHTMLの中にある<style>(<Style>)要素を検出し、その中をCSSとして色分けすることができます。しかし、XAMLの<Style>要素はただのXMLの要素なので、Mixed Hilighting機能は不要です。

ということでXHTML用の定義ファイルをもとに、<Style>要素をHTMLの<style>要素として認識しないように改造します。

<Window x:Class="WPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="{Binding DisplayDate, ElementName=cal, StringFormat=\{0:d\}, ConverterCulture=ja-jp}"
	Height="207" Width="200" ResizeMode="NoResize">
    <Window.Resources>
        <Style x:Key="Calstyle" TargetType="{x:Type Calendar}">
			<Setter Property="Background" Value="Azure"/>
        </Style>
    </Window.Resources>
	<Calendar x:Name="cal" Style="{StaticResource Calstyle}"/>
</Window>

これなら<Style>をたくさん使っても大丈夫です!

3. おわりに

今回作成したF#、TypeScript、HSP、XAMLの定義ファイルは、OneDriveに置いてあります。ぜひ、ダウンロードして使ってみてくださいね。

Down

それでは、See you next!

この記事をシェアする
Chronoir.netのRSSフィードを購読する

ニア(Nia)

サーバー・フロント・DB・インフラ(クラウド)エンジニア(目指すはフルスタック)。主にC#/PHPを使っています。最近はDockerやWebアプリ、モバイルアプリ開発(Xamarin)を探求中。好物は紅茶とコーヒー、シラス丼、趣味は写真撮影と音ゲーです

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください