PandocでDartをシンタックスハイライトしたい時の妥協策

2 min read読了の目安(約2600字

Pandoc

PandocとはMarkdownやHTMLなどのマークアップから、EPUBやPDFなど様々な形式のファイルを出力してくれるやつ。

$ pandoc --version
pandoc 2.13
Compiled with pandoc-types 1.22, texmath 0.12.2, skylighting 0.10.5,
citeproc 0.3.0.9, ipynb 0.1.0.1
User data directory: /Users/tokahana/.local/share/pandoc
Copyright (C) 2006-2021 John MacFarlane. Web:  https://pandoc.org
This is free software; see the source for copying conditions. There is no
warranty, not even for merchantability or fitness for a particular purpose.

サポートされているプログラミング言語

コマンドからサポートされているプログラミング言語一覧を確認することができる。
内部的にはHaskellのライブラリであるskylightingが使われているらしい。

https://github.com/jgm/skylighting
$ pandoc --list-highlight-languages
abc
actionscript
ada
agda
apache
asn1
asp
ats
awk
bash
bibtex
boo
c
changelog
clojure
cmake
coffee
coldfusion
comments
commonlisp
cpp
cs
css
curry
d
default
diff
djangotemplate
dockerfile
dot
doxygen
doxygenlua
dtd
eiffel
elixir
elm
email
erlang
fasm
fortranfixed
fortranfree
fsharp
gcc
glsl
gnuassembler
go
graphql
groovy
hamlet
haskell
haxe
html
idris
ini
isocpp
j
java
javadoc
javascript
javascriptreact
json
jsp
julia
kotlin
latex
lex
lilypond
literatecurry
literatehaskell
llvm
lua
m4
makefile
mandoc
markdown
mathematica
matlab
maxima
mediawiki
metafont
mips
modelines
modula2
modula3
monobasic
mustache
nasm
nim
noweb
objectivec
objectivecpp
ocaml
octave
opencl
pascal
perl
php
pike
postscript
povray
powershell
prolog
protobuf
pure
purebasic
python
qml
r
raku
relaxng
relaxngcompact
rest
rhtml
roff
ruby
rust
scala
scheme
sci
sed
sgml
sml
spdxcomments
sql
sqlmysql
sqlpostgresql
stata
tcl
tcsh
texinfo
toml
typescript
verilog
vhdl
xml
xorg
xslt
xul
yacc
yaml
zsh

Dartがサポートされていない

skylightingのソースコードを確認しても確かにDart用のXMLがない。。。
XMLの中身を見た感じだと自分で作るのも結構難しそうな感じ。。。

https://github.com/jgm/skylighting/tree/master/skylighting-core/xml

なので、諦めて他の言語のXMLを元に <language> を調整して使う。
なんとなく近そうなTypeScriptを元にして↓にしてみる。

<language name="Dart" // ここと
          version="13"
          kateversion="5.53"
          section="Scripts"
          extensions="*.dart" // ここだけ調整
          priority="9"
          mimetype="text/typescript;application/typescript;text/x-typescript;application/x-typescript"
          indenter="cstyle"
          author="Nibaldo González (nibgonz@gmail.com)"
          license="MIT">

作成したXMLをPandocで使う

↓の様にオプションでXMLファイルを指定すればOK

--syntax-definition=dart.xml

そんなに変な感じはしないので、「雰囲気ハイライトされてればOK」な感じであれば、これで使えはする

最後に

Prism.jsのソースコードとかも見てみたけどskylightingで使っているXMLとは違う形式で各言語の定義を行っていた。どうせ、形式の違いだけで書いてある内容は大差ないと思うので、定義ファイルの仕様を統一してしまえば良いのになと🤔