Raspbian stretch MonoDevelop Eto.Forms Code Markdown パーサ markdig の拡張 Markdig.SyntaxHighlighting を使ってみた
C#, C++, C, Java, JavaScript, Markdownはハイライトできたが、Python, Bashはできないことを確認した。
成果物
C#, C++, C, Java, JavaScript, Markdownはできてるが、Python, Bashはできないことを確認した。

対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch(9.0) 2018-06-27
- Mono 5.16.0
- MonoDevelop 7.6 build 711
- Eto.Forms 2.4.1 拡張機能, NuGetパッケージ
前回
手順
1. プロジェクト作成
- MonoDevelopを起動する
- メニュー→
ファイル→新しいソリューション

マルチプラットフォーム→アプリ→Eto Application
- 名前などを適当に入力し、
Codeを選択する

場所を入力する

- プロジェクトが作成される

2. NuGetでMarkdownパーサを追加
失敗編
- メニュー→
プロジェクト→NuGet パッケージの追加

パッケージを追加ダイアログから欲しいパッケージを探す

- 検索窓に
markdigと入力して絞り込む

Markdig.SyntaxHighlightingを選択する

パッケージを追加ボタンをクリックする
以下のエラーで失敗する。
/tmp/work/HelloMarkdown/HelloMarkdown/HelloMarkdown/MainForm.cs(75,75): Error CS0012: The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes'. (CS0012) (HelloMarkdown)
こちらによるとMicrosoft.NETCore.Portable.Compatibilityパッケージを導入すれば解決するっぽい。


再びMarkdig.SyntaxHighlightingの導入を試みるも、同様のエラー。もしかして入手したのは異なるコンパイラでビルドしたバイナリだからか?
成功編
GitHubからソースコードを持ってきてコンパイルする作戦。
ダウンロード
- ターミナルを起動する
git clone https://github.com/RichardSlater/Markdig.SyntaxHighlightingを実行する
ビルド
./Markdig.SyntaxHighlighting/src/Markdig.SyntaxHighlighting.slnをダブルクリックする(MonoDevelopで開く)Releaseですべてビルドする
DLLが作成される。
- ./Markdig.SyntaxHighlighting/src/Markdig.SyntaxHighlighting/bin/Release/
参照に追加
Markdig.SyntaxHighlightingを使いたいプロジェクトを作成する- プロジェクトの
依存関係を右クリックする 参照の編集をクリックする

.NETアセンブリタブをクリックする参照ボタンをクリックする
- 参照に先程のビルドで作成されたDLLを追加する



実行すると以下のように怒られる。
/tmp/work/HelloMarkdown/HelloMarkdown/HelloMarkdown/MainForm.cs(75,75): Error CS0012: The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes'. (CS0012) (HelloMarkdown)
先述の失敗編にある通り、Microsoft.NETCore.Portable.Compatibilityパッケージを導入すれば解決する。
3. デフォルトのMarkdownファイル作成
.Desktopでないプロジェクトを右クリック- XMLファイルを追加する
- ファイル名は
Default.mdなどにする - 画面右
プロパティをクリックする ビルドの出力ディレクトリにコピーをクリックし常にコピーまたは新しい場合はコピーするにする

- ファイル内容は以下など任意にする
<feff># タイトル ## 箇条書き * 箇条書き * 箇条書き2 ## 箇条書き(順序付き) 1. [Google](https://www.google.co.jp) 1. https://www.yahoo.co.jp 1. [https://www.yahoo.co.jp] ## テーブル ABC|DEF ---|--- aaa|bbb ccc|ddd ## ソースコード \`\`\`python import pathlib print("ABC") \`\`\` ## 引用 > なんか引用。
Markdown内でソースコード``(バッククォート3つ)を表現できなかったので適当にエスケープ文字としてバックスラッシュ`を埋めといた。\を削除することで正しいコードとなる。
4. ソースコード作成
MainForm.cs
using System;
using System.IO;
using Eto.Forms;
using Eto.Drawing;
using Markdig;
using ColorCode;
using Markdig.SyntaxHighlighting;
namespace HelloMarkdown
{
public partial class MainForm : Form
{
RichTextArea richTextAreaMd;
RichTextArea richTextAreaHtml;
WebView previewer;
Markdig.MarkdownPipeline pipeline;
public MainForm()
{
Title = "Markdown Previewer";
ClientSize = new Size(1024, 768);
Create();
}
private void Create()
{
this.pipeline = new MarkdownPipelineBuilder()
.UseAdvancedExtensions()
.UseSyntaxHighlighting()
.Build();
richTextAreaMd = new RichTextArea() { Width=320, Height=600 };
richTextAreaHtml = new RichTextArea() { Width=320, Height=600 };
previewer = new WebView() { Width=320, Height=600 };
richTextAreaMd.Focus();
richTextAreaMd.TextChanged += (object sender, EventArgs e) =>
{
richTextAreaHtml.Text = Markdig.Markdown.ToHtml((sender as RichTextArea).Text, pipeline);
previewer.LoadHtml(richTextAreaHtml.Text);
};
//richTextAreaMd.Text = new StreamReader(new FileStream("/tmp/work/Projects/HelloMarkdown/HelloMarkdown/HelloMarkdown/DefaultMarkdown.md", FileMode.Open)).ReadToEnd();
//richTextAreaMd.Text = new StreamReader(new FileStream("./DefaultMarkdown.md", FileMode.Open)).ReadToEnd();
richTextAreaMd.Text = new StreamReader(new FileStream(System.IO.Path.Combine(System.AppContext.BaseDirectory, "DefaultMarkdown.md"), FileMode.Open)).ReadToEnd();
Content = new TableLayout
{
Padding = 0,
Spacing = new Size(0, 0),
Rows =
{
new TableRow(richTextAreaMd, richTextAreaHtml, previewer),
}
};
}
}
}
3. 実行
- Ctrl+F5で実行
- 怒られた

- ファイルパスを辿ってexeファイルを直接叩くと実行できた


ソースコード部分のHTMLを抜き出してみると以下。
<div class="lang-python editor-colors">import pathlib
print("ABC")
</div>
あれ、<code>消えた……。<pre><code>にして欲しいんだけど……。<div>は無いわー。マークされている部分がひとつもない。CSSもない。これ本当に使えるのか?
HTMLを見る限り、言語名は認識したようなので使えると思うが……。
追記
C#, C++, C, Java, JavaScript, Markdownはできてるが、Python, Bashはできないことを確認した。

