だるろぐ

明日できることは、今日しない。

Google Chart を使った数式ツールを作ってみた(2)

f:id:daruyanagi:20130115205240p:plain

Google Chart を使った数式ツールを作ってみた - だるろぐ の続き。さすがにもう少し完成度を上げようと思って、

  • 数式テキストの新規作成・開く・保存
  • 編集機能(切り取り・コピー・貼り付けなど)
  • 数式イメージのファイル保存・クリップボードへコピー

なんかを、ちびちびと実装。そのうち欲が出てきて、[Tab]キーでブラケット移動なんかもしたいなぁ、と思い始めた。で、とりあえず考えたのかこんなの。

private void FormulaText_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Tab)
    {
        e.Handled = true; // 握りつぶす!

        var text = FormulaText.Text;
        int start = FormulaText.SelectionStart;
        int end = -1;
        FormulaText.SelectionLength = 0;

        if ((Keyboard.Modifiers & ModifierKeys.Shift) != ModifierKeys.Shift)
        {
            start = text.IndexOf('{', start);
            if (start < 0) return;
            FormulaText.SelectionStart = start + 1;

            end = text.IndexOf('}', FormulaText.SelectionStart);
            if (end < 0) return;
            FormulaText.SelectionLength = end - start - 1;
        }
        else // Shift + Tab キー
        {
            
        }
    }
}

f:id:daruyanagi:20130115205746p:plain

適当に書いたのだけど、これでも案外使える感じになった。ただ、

f:id:daruyanagi:20130115205946p:plain

ネスト(入れ子)が認識できない。あと、[Shift]+[Tab]キーで逆向きに移動したいけれど、これがなかなかめんどくさい。{} だけじゃなくて () にも対応させたい、なんて考えだすと破たんするのが目に見えてるし。

というわけで、解決策は正規表現か、構文解析かって感じなんだけど。正規表現も大変だし、しかも限界が見えているので、ここは頑張って簡単な構文解析をするべきかと思っている。