No Programming, No Life

新しいNPNLです。http://d.hatena.ne.jp/fumokmm/ から引っ越してきました。

GroovyでMarkdownパーサーを作ろう #3「Headers(見出し)の実装」その1

このシリーズの一覧


Groovy! (挨拶)

どうも、ふも(@)です。

はじめに

さて、今回から具体的な変換処理の実装に入っていくわけですが、いざ実際にコードを書いていこうとすると色々と下準備が必要になってきそうです。ゆっくりやっていきたいと思います。
さしあたって、今回から数回に分けて、Header(見出し)の実装に取り掛かりましょう。

見出し(見出し)記法の確認

Headers - 見出し
MarkdownはSetextとatxという、二つの形式をサポートしています。

blog::2310 » Markdown文法の全訳

ということで、見出しの実装でも二種類あるようですね、今回はひとまず簡単な方のatxという方を実装して行きたいと思います。

Atx形式

Atx形式は見出しの行頭に1つから6つまでの#(ハッシュ記号)を用いる方法です。#(ハッシュ記号)の数が見出しレベルと一致します。例えば

# This is an H1
## This is an H2
###### This is an H6

Markdown独自の機能として、atx形式を「閉じる」ことができます。 この表現が好みであれば使うことができますが、単純に見栄えの問題です。 行末の#(ハッシュ記号)の数は行頭と一致する必要もありません。

# This is an H1 #
## This is an H2 ##
### This is an H3 ######
blog::2310 » Markdown文法の全訳

要約すると

  • 行頭を "#" 1つ〜6つで始めると、それは見出しとなる
  • 例えば、"# abc" なら、 <h1>abc</h1> のようになる
  • 見映えのため、行末には好きなだけ "#" を並べられる(そしてそれらは変換結果としては無視される)

という感じでしょうか。

ロジックを考えてみる

  1. 一行ずつ処理する
    1. 前回までは、ファイルから読み取った内容を一気にHTMLのBODYタグに埋め込んでいましたが、今回実装しようとしているAtx形式のヘッダーは行単位で処理してゆくのが適していそうです。そこでまず、ファイルから一行一行取り出して処理するように変更したとして、その一行一行に対する処理を考えてみましょう。
  2. 一行に対する処理
    1. 行の先頭をまず確認します。具体的には "#" で始まっているかどうか?を確認する必要がありますね。そして#の数は1〜6の範囲です。それ以上でも以下でもないです。
    2. "#" が所定の数で始まっているなら、次のステップへ移行します。まず#の数を数えておきます(1〜6のいずれかになるはずですね)。あとでHタグ数値部分として使うためです。次はその行の先頭と末尾の連続する "#" を取り除きます。最後に "#" を取り除いた結果をトリムして、Hタグでくるんであげれば変換完了です。
    3. "#" が所定の数で始まっていなかったり(例えば7個とかね) そもそも "#" で始まっていなかったりした場合はそのままその行は終了。*1

という流れで良さそうですね。

おわりに

ちょっと長くなりそうなので、実際のソースは次回に引き継ぎます。
それではまた。

次の記事:GroovyでMarkdownパーサーを作ろう #3「Headers(見出し)の実装」その2 - No Programming, No Life
前の記事:GroovyでMarkdownパーサーを作ろう #2「HTML出力部分の作成」 - No Programming, No Life

*1:7個以上の場合は、6個までは見出し<H6>として処理してあげた方がいいのかな?