39Si

プログラミング関連の勉強した内容を簡単にまとめておきます

自分用Markdownエディタを作ってみた【Windows用】

作ったもの

Windows 環境で動作する Markdownエディタ。
使い方はシンプルでテキストボックスに文章を入力し、ボタンを押すとHTMLが表示されるだけのプログラム。(保存機能はつけてない。)
見た目は以下のような感じ ↓↓

f:id:inner2:20150302011507p:plain

環境

Windows 8.1 Pro
Visual studio 2012 for Windows Desktop
Python 3.3.1

大まかな流れ

Windows用に作るため UI はVisual C# を使い、markdownファイルを HTML に変換する部分は Python で作成した。
Visual C# には markdownsharp というものがあるらしいが、Python を使ったのは手軽そうなのと好みの問題です。

markdown の導入

Markdownで書かれたファイルを HTML に変換するために今回は Python の markdown のモジュールを使用した。
markdown は以下のページよりダウンロードし、解凍したのちにインストールした。

http://docs.python.jp/2.7/install/index.html

インストール。

$ python setup.py build
$ python setup.py install

HTML に変換する

使い方は以下のページを参考にした。
ここでは、input.txt を output.html に変換している。

Markup Language「Markdown」をPythonで使う - ctrlshiftの日記

pythonでmarkdownを扱う - Qiita

makehtml.py

import markdown

md = markdown.Markdown()
md.convertFile(input="input.txt", output="output.html", encoding="shift_jis")

エディタを作る

Markdown エディタの UI の部分は Visual C# で作っていく。
大まかな流れは、 まず、新しくWindowsフォームアプリケーションを作成し、以下のようにテキストボックス、ウェブブラウザー、ボタンを配置した。

f:id:inner2:20150302010032p:plain

次に、ボタンをクリックしたときにテキストボックスの内容を HTML に変換し、ウェブブラウザで表示するプログラムを作成した。
C#からPythonを動かすために以前書いた記事を参考にした。

コマンドプロンプトを使う[Visual C#] - プログラミングノート

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace markdowneditor
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void makehtml(string cmd)
        {
            //Processオブジェクトを作成
            System.Diagnostics.Process p = new System.Diagnostics.Process();
            //ComSpec(cmd.exe)のパスを取得して、FileNameプロパティに指定
            p.StartInfo.FileName = System.Environment.GetEnvironmentVariable("ComSpec");
            //出力を読み取れるようにする
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardInput = false;
            //ウィンドウを表示しないようにする
            p.StartInfo.CreateNoWindow = true;
            //コマンドラインを指定("/c"は実行後閉じるために必要)
            p.StartInfo.Arguments = @"/c " + cmd + " /w";
            //起動
            p.Start();
            //プロセス終了まで待機する
            //WaitForExitはReadToEndの後である必要がある
            //(親プロセス、子プロセスでブロック防止のため)
            p.WaitForExit();
            p.Close();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //Shift JISで書き込む
            //書き込むファイルが既に存在している場合は、上書きする
            System.IO.StreamWriter sw = new System.IO.StreamWriter(@"input.txt",false,System.Text.Encoding.GetEncoding("shift_jis"));
            //TextBox1.Textの内容を書き込む
            sw.Write(textBox1.Text);
            //閉じる
            sw.Close();

            makehtml("python makehtml.py");
            System.Threading.Thread.Sleep(500);

            // カレントディレクトリを取得する
            string stCurrentDir = System.IO.Directory.GetCurrentDirectory();
            // ナビゲート 
            this.webBrowser1.Navigate(stCurrentDir + @"\output.html");
        }
    }
}

参考ページ

10 行でズバリ!! 簡単 WebBrowser の作成 (C#) in C#

VB.NET - カレントディレクトリを取得する