RAD Studio/Delphi/C++BuilderのIDEで表示中のソースコードをシンタックスハイライト付きでPowerPointにコピペする

※末尾に CnPack Wizard 、GExports 、BoneEdit、TEAD を使った場合の話を追記しています。(2017/1/30 19:15)

# パワーポイントとかの資料にはシンタックスハイライト付きでソースを例示したいですよね。

IDE内のエディタではシンタックスハイライトされた状態で表示されるのに、プレゼン資料に引用すると単色というのはイケてないし、かといってスクリーンショットの貼り付けもイマイチです。

しかし、RAD Studio/Delphi/C++BuilderのIDEには標準機能としては書式付きのコピーの機能がありません。

ここで **TMS IDE Plugin Package に含まれる IDE Rich Clip を使えば「条件付きながら書式付きでコピー」できる**ようになります。
http://www.tmssoftware.com/site/freeideplugins.asp

この条件とは、主に以下３点です。

- 日本語の文字列は全部化ける。
- たまにシンタックスハイライトがおかしい。
- 使えるのは Delphi のコードだけ。

実際の例を挙げてみましょう。まずはRADStudio/C++BuilderのIDEでCのコードをこんなふうに書きます

![image](https://qiita-image-store.s3.amazonaws.com/0/149350/02f3df9a-4a50-8687-e4da-47f4c41c8836.png)


これを IDE Rich Clip でコピーしてパワーポイントに貼ってみたのがこちらの画像です。

![image](https://qiita-image-store.s3.amazonaws.com/0/149350/08a78dbd-bb2a-3fa8-1e08-fe5f1880e363.png)

うーん、これは困りました。**コードは C なのに、{ と } で囲まれた範囲を Delphi/Object Pascal のコメントとして認識しています**。つまり IDE Rich Clip は選択中のコードをクリップボードにコピーする際に、無条件にDelphiのシンタックスハイライトをつけているのですね。だから void とかの C の識別子もスルーする有様です。そしてマルチランゲージのことを考えずに実装したコードにはありがちな話ですが、コード中央部の**日本語の文字列は全く別モノ**に変わってしまいました。さらに Button1Click の引数の型指定のところが中途半端に強調表示されてしまいました。

日本語が化ける時点で利便性に問題があるのに、
シンタックスがDelphi限定では、C++ には使えない……ので、他に何か代替できないかと色々考えたあげく、**ブラウザの拡張機能である Markdown here を使用し、さらにそのCSSカスタマイズするという、どうしてこうなった的な手順で一応は目的が達成できた**ので、その内容をまとめています。

# Markdown here とは？

Markdown here はブラウザの拡張機能なのですが「各種ウェブサービス（ウェブメールとかブログ）の編集画面が書式付きテキストを扱える場合に、そこに入力された markdown を解釈して書式付きに書き換えることができる」ようになります。

たとえば、Gmailでこんなふうに markdown を書いておきます。
![image](https://qiita-image-store.s3.amazonaws.com/0/149350/d6d9203d-c582-594c-b5e9-15fe68629915.png)

このテキストに対して markdown を有効化すると、こんなふうになるんです。
![image](https://qiita-image-store.s3.amazonaws.com/0/149350/cb7d0f1b-4260-8071-2afe-74f5b279b892.png)

さらにこれを PowerPoint に持って行ったのがコレ。
![image](https://qiita-image-store.s3.amazonaws.com/0/149350/a48b891b-9f54-40ca-a819-a1f5df57cda5.png)

これって、けっこうイイ感じに IDE のシンタックスハイライトを再現できていると思いませんか？

というわけで、早速、Markdown here をインストールしてみましょう。

# Markdown here のインストール

Markdown Here はブラウザの拡張機能ですから、お使いのブラウザのアプリストアでインストールできます。各ブラウザのアプリストアへのリンクは以下のURLから辿ることができます。
http://markdown-here.com/get.html
![image](https://qiita-image-store.s3.amazonaws.com/0/149350/b41279f3-b8db-d07a-044e-d01421ab8d7d.png)

Chrome, Firefox, Safari, Opera に対応しているので、開発者の方が普段使うものはほとんど網羅されているといえることでしょう。

そして Markdown here の元々の目的が「メールを Markdown で書いてフォーマッティングされたものを送る」ことにあるので、Thunderbird などのメーラーにも対応しています。

今回の目的はあくまでソースコードをシンタックスハイライト付きでコピペすることにありますが、メール送信やブログ投稿でも使えたりしますので、そういう目的に使うのも十分にアリだと思います。私自身も community.embarcadero.com のブログ投稿時に最近は Markdown here を多用しています。


# Markdown here でハイライトしたコードを PowerPoint に貼る場合の流れ

手元の環境では、以下の手順で PowerPoint に持っていけることを確認しています。

1. Markdown here の設定画面にある「プレビュー」にIDEのコードを貼りつけてシンタックスハイライトの記述（ソースコードをバッククオート３つの行で囲み、最初のバッククオートの塊に続けて C または delphi と書く）をつける。
2. Markdown here を実行して書式化されたテキストを「Google Drive のプレゼンテーション」または「Microsoft Word」に張り付ける。
3. 貼り付けたものを再度選択したのち、PowerPoint に貼る。

本当なら 2. を飛ばして 1. → 3. と行きたいのですが、**2. を飛ばすと改行が抜けおちてしまうのです**。改行が抜けては使い物になりません。ですが Google Drive のプレゼンテーションや Microsoft Word への貼り付けでは改行が抜けないのです。よってこの状態を再選択して PowerPoint に貼るという手順になっています。

ただし 2. で経由するツールによって 3. で貼り付けたときのフォントが微妙に変わってしまうので、この点はご注意ください。


さて実際にやってみると、RAD Studio/Delphi/C++Builder のIDEと同様の色を用いたコピペとはならず、以下のような状態になっていることでしょう。

![image](https://qiita-image-store.s3.amazonaws.com/0/149350/8571baf2-99eb-2433-b9f6-e4ca19dfdbc9.png)

デフォルトのシンタックスハイライト設定は GitHub 相当なので、コピペした結果は当然違うわけですね。これを IDE の表示色に合わせるには CSS のカスタマイズが必要です。

# RADStudio/Delphi/C++BuilderのIDEに似たシンタックスハイライトの設定を作る

以下のCSSを Markdown Here の設定画面の「シンタックスハイライティングCSS」に上書き適用してください。これにより RAD Studio/Delphi/C++Builder 相当の色が付きます。

最初に紹介した Gmail のスクリーンショットは、このカスタマイズを行った後の状態です。

なお、現時点で確認済み、かつ対処できていないのは Delphi のコードで "{$R *.fmx}" などの記述がコメントと同じ色になってしまうことです。

```css
/*

RAD Studio IDE like syntax highlight, by Kazuhiro.inoue.

It is based on "Visual Studio-like style based on original C# coloring by Jason Diamond <jason@diamond.name>"

*/
.hljs {
  display: block;
  overflow-x: auto;
  padding: 0.5em;
  background: white;
  color: black;
  -webkit-text-size-adjust: none;
}

.hljs-comment,
.hljs-annotation,
.hljs-template_comment,
.diff .hljs-header,
.hljs-chunk,
.apache .hljs-cbracket {
  color: #008000;
  font-weight: bold;
}

.hljs-keyword,
.hljs-id,
.hljs-built_in,.css
.smalltalk .hljs-class,
.hljs-winutils,
.bash .hljs-variable,
.tex .hljs-command,
.hljs-request,
.hljs-status,
.nginx .hljs-title,
.xml .hljs-tag,
.xml .hljs-tag .hljs-value {
  color: #000080;
  font-weight: bold;
}

.hljs-string,
.hljs-title,
.hljs-parent,
.hljs-tag .hljs-value,
.hljs-rules .hljs-value,
.ruby .hljs-symbol,
.ruby .hljs-symbol .hljs-string,
.hljs-template_tag,
.django .hljs-variable,
.hljs-addition,
.hljs-flow,
.hljs-stream,
.apache .hljs-tag,
.hljs-date,
.tex .hljs-formula,
.coffeescript .hljs-attribute {
  color: #0000ff;
  font-weight: bold;
}

.ruby .hljs-string,
.hljs-decorator,
.hljs-filter .hljs-argument,
.hljs-localvars,
.hljs-array,
.hljs-attr_selector,
.hljs-pseudo,
.hljs-pi,
.hljs-doctype,
.hljs-deletion,
.hljs-envvar,
.hljs-shebang,
.hljs-preprocessor,
.hljs-pragma,
.userType,
.apache .hljs-sqbracket,
.nginx .hljs-built_in,
.tex .hljs-special,
.hljs-prompt {
  color: #2b91af;
  font-weight: bold;
}

.hljs-phpdoc,
.hljs-dartdoc,
.hljs-javadoc,
.hljs-xmlDocTag {
  color: #808080;
}

.hljs-type,
.hljs-typename { font-weight: bold; }

.vhdl .hljs-string { color: #666666; }
.vhdl .hljs-literal { color: #a31515; }
.vhdl .hljs-attribute { color: #00b0e8; }

.xml .hljs-attribute { color: #f00; }

```

# その他の解決策

twitter でフォローアップを頂いたので4点ほど追記。
https://twitter.com/lynatan/status/825649914419965954

## CnPack Wizard を使う。

[CnPack Wizard](http://www.cnpack.org/) の Export to RTF/HTML の機能を使えば、IDEからRTFまたはHTML形式のファイルに出力できました。これを開いてコピーすれば、日本語が化けずにC++Builderのシンタックスハイライトされたコードをパワーポイントに貼ることができます。

こちらの画像は CnPack Wizard 経由で貼り付けた例です。
![image](https://qiita-image-store.s3.amazonaws.com/0/149350/504755f9-9064-ea2f-89be-0735fb0af925.png)

識別子等の色はIDEの表示と同じというわけにはいかないようですが、これはこれで悪くないですね。なお、CnPack Wizard はクリップボード経由で HTML 形式のコピペも行えるようなのですけど、実際に試してみたら手元の環境ではこれは動作確認がとれませんでした。ファイルに Export する分には確実に動くのですけど……。

## GExports を使う

[GExports](http://www.gexperts.org/) の Source Export 機能で同様のことができます。ただし RADStudio/Delphi/C++Builder 10.1 向けに正式に対応したものは 2017/01/29 時点ではリリースされておらず、experimental なものがリリースされています。このためなのかは不明ですが、Source Export 機能で IDE のシンタックスハイライト設定を取得できないようでした。このためにシンタックスハイライトを適切に効かせるには、色設定を自分で作る必要がありました。

GExports を使った場合のスクリーンショットはこんなカンジです。

![image](https://qiita-image-store.s3.amazonaws.com/0/149350/602c46e6-c469-c031-2057-a56d94d1aac3.png)

初期設定にひと手間かかることを除けば、割といい感じにコピペできます。難点は RADStudio/Delphi/C++Builder 10.1 がリリースされて10か月が経過した時点でも正式版ではないということでしょうか。
 
## EditBone を使う
[EditBone](http://www.bonecode.com/) というエディタでソースコードを開いたのち、これを HTML に変換したものをブラウザで開き、それをコピペする、という方法があるようです。”Document" メニューから "HTML Export" を実行するとHTMLファイルが生成されました。

ブラウザで表示したものをコピペしてみたのがこちら。
![image](https://qiita-image-store.s3.amazonaws.com/0/149350/37bc9308-0e87-327f-55ec-5f81e76cd877.png)

## TEAD を使う
DEKOさんが開発されている[TEAD](http://ht-deko.com/junkbox.html#TEAD_FULL)でソースを開き、リッチテキスト出力したものを貼り付けるという方法があるそうです。

具体的な手順は http://ht-deko.com/tech045.html のページを「シンタックスハイライト」で検索すると出ています。手元の環境で実行した結果はこちら。

![image](https://qiita-image-store.s3.amazonaws.com/0/149350/c4743d2e-229c-817c-75a4-c5a60fab7039.png)