ぽにょろん

思いついたこととメモ

AvalonEditを使って、SQL文にSyntaxHighlightつけたい

自作ツールにFirebirdSQL文を入力した際に、SyntaxHighlightできるようにしたい!
ということで、AvalonEditを使ってみました。

目次

環境

AvalonEditとは

AvalonEdit by icsharpcode

WPFベースのテキストエディタコンポーネントです。
SharpDevelop というOSSIDEテキストエディタとして使われているものです。
そのため、SyntaxHighlight のみならずコード補完等も出来るようです。

AvalonEditの詳しい解説は下記のDocumentを参照。
* AvalonEdit - Table of Content

実装

ライブラリの取得

公式ページにあるように nuget から Install 可能です。

Install-Package AvalonEdit

エディタの配置

名前空間設定して、TextEditorを配置すればよし。

<Window x:Class="AvalonEditSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:avalon="http://icsharpcode.net/sharpdevelop/avalonedit"
        xmlns:local="clr-namespace:AvalonEditSample"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <avalon:TextEditor />
</Window>

SyntaxHighlight の設定

AvalonEdit では、SyntaxHighlightingプロパティで指定できる言語がいくつかあります。
C#, PowerShell, HTML, CSS, VB, C++, Java ,その他諸々が対応しています。
以下のコードを確認すると、対応状況が分かります。

AvalonEdit/Resources.cs at master · icsharpcode/AvalonEdit · GitHub

AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Resources at master · icsharpcode/AvalonEdit · GitHub

C#の設定をする場合はこんな感じでOKです。

<avalon:TextEditor SyntaxHighlighting="C#"/>  

SyntaxHighlight のカスタマイズ

下記に従って、任意の設定が可能です。
AvalonEdit - Table of Content

適当にFirebirdのキーワードを突っ込んだ xshdファイルを作成します。

<SyntaxDefinition name="SQL" extensions=".sql" xmlns="http://icsharpcode.net/sharpdevelop/syntaxdefinition/2008">
  ...
  <Color name="Keyword" foreground="#FF0000FF" fontWeight="bold" exampleText="SELECT" />
    <Keywords color="Keyword">
      ...
      <Word>INDEX</Word>
      <Word>INNER</Word>
      <Word>INPUT_TYPE</Word>
      <Word>INSENSITIVE</Word>
      <Word>INSERT</Word>
      <Word>INSERTING</Word>
      <Word>INT</Word>
      <Word>INTEGER</Word>
      <Word>INTO</Word>
      <Word>IS</Word>
      <Word>ISOLATION</Word>
      <Word>JOIN</Word>
      <Word>KEY</Word>
      <Word>LAST</Word>
      ...

長いのでGistに上げました。
Firebird 用xshd · GitHub

SyntaxHighlight のカスタマイズ2

コードビハインドに、読み込み処理を書いておきます。

public MainWindow()
{
    InitializeComponent();
    using (var reader = new XmlTextReader("sql.xshd"))
    {
        Editor.SyntaxHighlighting = HighlightingLoader.Load(reader, HighlightingManager.Instance);
    }
}

結果

f:id:kowill:20160613130128p:plain

上記の通り、概ね思った通りになります。