DartでMarkdownを扱う
Dart本体には付属していませんが、Dart公式のパッケージとして、その名もずばりなmarkdownとういパッケージが提供されています。
このパッケージを利用することで非常にお手軽にMarkdownをHTMLにパースすることが出来るようになります。
導入方法
どうやらOSでそのままmarkdown
というコマンドで利用することも出来るようですが、今回は普通にDartコードから利用できるようにします。
Dartのパッケージマネージャであるpub
を利用しますが、Dartでのプロジェクトの雛形を作るのにはstagehandを利用します。
[koji:dart]$ mkdir mymarkdown
[koji:dart]$ cd mymarkdown
[koji:mymarkdown]$ stagehand console-full
Creating console-full application `mymarkdown`:
/home/koji/code/dart/mymarkdown/.gitignore
/home/koji/code/dart/mymarkdown/CHANGELOG.md
/home/koji/code/dart/mymarkdown/README.md
/home/koji/code/dart/mymarkdown/analysis_options.yaml
/home/koji/code/dart/mymarkdown/bin/main.dart
/home/koji/code/dart/mymarkdown/lib/mymarkdown.dart
/home/koji/code/dart/mymarkdown/pubspec.yaml
/home/koji/code/dart/mymarkdown/test/mymarkdown_test.dart
8 files written.
--> to provision required packages, run 'pub get'
--> run your app using `dart bin/main.dart`.
[koji:mymarkdown]$
コレで雛形が出来ました。
次に、pubspec.yaml
に以下を追加します。
dependencies:
markdown: ^2.0.2
追加したらpub get
をプロジェクトトップディレクトリで実行すれば準備完了です。
使い方
特に難しいことはありません。
今回はmain.dart
内に実際にMarkdownを記述してHTMLに変換してみました。
import 'package:mymarkdown/mymarkdown.dart' as mymarkdown;
import 'package:markdown/markdown.dart';
main(List<String> arguments) {
// print('Hello world: ${mymarkdown.calculate()}!');
String markdown = '''
# Hello world
## headline 1
## headline 2
### headline3
# テストだよ
**太字**で*italic*
`print('Hello World');`
\```
void main () {
print('Hello World');
}
\```
普通のMarkdownなので、
改行するにはスペース2つ入れだけだよー
[リンク](https://doitu.info/)

''';
print(markdownToHtml(markdown));
}
実行すると、ちゃんと以下のようにHTMLに変換されて出力されることが分かります。
<h1>Hello world</h1>
<h2>headline 1</h2>
<h2>headline 2</h2>
<h3>headline3</h3>
<h1>テストだよ</h1>
<p><strong>太字</strong>で<em>italic</em>
<code>print('Hello World');</code></p>
<pre><code>void main () {
print('Hello World');
}
</code></pre>
<p>普通のMarkdownなので、<br />
改行するにはスペース2つ入れだけだよー<br />
<a href="https://doitu.info/">リンク</a><br />
<img alt="画像だよ" src="https://doitu.info/images/logo.png" /></p>
Dart自体がMarkdownパーサを用意してくれているので、AngularDartなどではこのパッケージを利用してクライアントにMarkdownを入力してもらってそれをHTMLに変換して表示する、ということが簡単にできそうです。
おまけ
単純にHTMLは文字列なので、以下のようにすればヘッダーだけ取得したり出来ます。
final _headerPattern = RegExp(r'^<h[1-6]>.*</h[1-6]>$');
String html = markdownToHtml(markdown);
html.split('\n').where((String line) => _headerPattern.hasMatch(line)).forEach((String line) {
print(line);
print("---");
});
公開日:2019/04/11