LoginSignup
3
3

More than 5 years have passed since last update.

C#でMarkdownパーサーアプリを作った

Last updated at Posted at 2019-04-10

使い方

コマンドライン引数にmdファイルのパスを渡す

Markdowner.exe mk.md

するとMartkdowner.exeがあるフォルダーにmk.md.htmlファイルができる

ビルド手順

※ターゲットは.NetFrameworkを指定する

  1. ツール->Nugetパッケージマネージャー->パッケージマネージャーコンソールを開く

パッケージマネージャーコンソール

  1. でてきたコンソールに以下のコマンドを打つ
PM> Install-Package javascriptengineswitcher.v8.native.win-x86
PM> Install-Package JavaScriptEngineSwitcher.V8
PM> Install-Package marked

ソースコード


using JavaScriptEngineSwitcher.Core;
using JavaScriptEngineSwitcher.V8;
using System;
using System.IO;
using System.Text;

namespace Markdowner
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                Console.WriteLine("args zero");
                Console.ReadKey();
                return;
            }

            string markdown = "";
            try
            {
                markdown += File.ReadAllText(args[0], Encoding.GetEncoding("sjis"));
                var parser = new MarkdownParser(new V8JsEngine());
                var html = parser.Transform(markdown);
                File.WriteAllText(args[0] + ".html", html, Encoding.GetEncoding("sjis"));
                Console.WriteLine(html);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
            Console.ReadKey();
        }
    }

    public class MarkdownParser : IDisposable
    {
        private IJsEngine _jsEngine;
        private bool _disposed;

        public MarkdownParser(IJsEngine jsEngine)
        {
            _jsEngine = jsEngine ?? throw new ArgumentNullException("jsEngine");
            _jsEngine.ExecuteResource("Scripts.marked.js", GetType());
        }

        public string Transform(string markdown)
        {
            return _jsEngine.CallFunction<string>("marked", markdown);
        }

        public void Dispose()
        {
            if (_disposed) return;
            _disposed = true;

            if (_jsEngine == null) return;
            _jsEngine.Dispose();
            _jsEngine = null;
        }
    }
}

落ち葉ひろい

パーサー部分はライブラリにおまかせ
C#でmarkdownパーサーやろうとしてぐぐったら、出てくる情報が古いらしくそのままでは動かなかった
string markdown="";と分けてるのはここでCSS読み込みとかするかなと思ったから
文字コードはちゃんと指定しないとうまくいかなかった

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3