(作成中・記述は未完成です。)
NoraMarkは、EPUBで利用するXHTMLを生成するためのマークアップとしてデザインされました。次のような特徴があります。
Gemfileに次のように書きます
gem 'nora_mark'
そして、
$ bundle
gem install nora_mark
$ nora2html < source.nora > output.xhtml
入力はutf-8のみ受け付けます。日本語のテキストであれば、kconvオプションでうまくうごくかもしれません。
$ nora2html --kconv < source.nora > output.xhtml
nora2htmlは、newpageコマンドを<hr />
タグに置き換え、すべてのページをひとつのxhtmlとして出力します
require 'nora_mark'
document = NoraMark::Document.parse(string_or_io, lang: 'ja')
document.html.write_as_files
Emacs用のメジャーモードを提供するnoramark-mode.elを用意しています。現在のところ、font-lockによるsyntax highlight機能と、outline-minor-modeのサポートを提供しています。
~/.emacs.d/init.el
に次の記述をしてください。(require 'noramark-mode)
(setq auto-mode-alist (cons '("\\.nora$" . noramark-mode) auto-mode-alist))
(setq auto-mode-alist (cons '("-nora\\.txt$" . noramark-mode) auto-mode-alist))
単なるテキストもHTMLに変換されます。
原稿
吾輩は猫である。名前はまだ無い。 どこで生れたかとんと見当けんとうがつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。 <中略> この書生の掌の裏うちでしばらくはよい心持に坐っておったが、しばらくすると非常な速力で運転し始めた。 ふと気が付いて見ると書生はいない。たくさんおった兄弟が一疋ぴきも見えぬ。
変換結果
<div class='pgroup'>
<p>吾輩は猫である。名前はまだ無い。</p>
<p>どこで生れたかとんと見当けんとうがつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。</p>
<p><中略></p>
<p>この書生の掌の裏うちでしばらくはよい心持に坐っておったが、しばらくすると非常な速力で運転し始めた。</p>
</div>
<div class='pgroup'>
<p>ふと気が付いて見ると書生はいない。たくさんおった兄弟が一疋ぴきも見えぬ。</p>
</div>
改行ごとに<p>
要素がつくられます。空行で区切られると<div class='pgroup'>
がつくられます。
言語が日本語(ja)以外の場合は、次のようになります。
原稿
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation
変換結果
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, <br />sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. </p>
<p>Ut enim ad minim veniam, quis nostrud exercitation</p>
後述のparagraph_styleでもこの振る舞いを切り替えることができます。
NoraMarkでは、<コマンド> {
ではじまり、}
のみの行で終わる範囲を明示的なブロックとみなします。
原稿
d.column { この部分は、divで囲まれます。 }
変換結果
<div class="column">
<div class="pgroup">
<p>この部分は、divで囲まれます。</p>
</div>
</div>
このように、コマンドにはclassを指定することができます。
同じように、idの指定も可能です。
原稿
d#the_column.column { この部分は、divで囲まれます。 }
変換結果
<div id="the_column" class="column">
<div class="pgroup">
<p>この部分は、divで囲まれます。</p>
</div>
</div>
クラス・IDの指定は、多くのコマンドで同じように利用できます。
定義済みの明示的ブロックのコマンドは、次のものがあります。
このほかに、後述のpreformatブロックがあります。
未定義のコマンドの場合は、対応する名前のタグを生成します。
原稿
blockquote { 山路を登りながら、こう考えた。 智に働けば角が立つ。情に棹させば流される。意地を通せば窮屈だ。とかくに人の世は住みにくい }
変換結果
<blockquote>
<div class='pgroup'>
<p>山路を登りながら、こう考えた。</p>
<p>智に働けば角が立つ。情に棹させば流される。意地を通せば窮屈だ。とかくに人の世は住みにくい</p>
</div>
</blockquote>
整形済みブロックは、次のように指定します。
形式1
pre {
format 1 : 整形済みの内容
}
形式2
pre {//
format 2: 整形済みの内容
//}
変換結果
<pre>
format 1 : 整形済みの内容
</pre>
<pre>
format 2 : 整形済みの内容
</pre>
また、次のように書くことで整形済みコードを作ることもできます。
形式1
code {
整形済みコード
}
形式2
code {//
整形済みコード
//}
形式3
```
整形済みコード
```
変換結果
<pre></code>
整形済みコード
</code></pre>
code languageの指定をすることができます。
形式1
code {//ruby
puts "Hello, World."
//}
形式2
```ruby
puts "Hello, World."
```
変換結果
<pre class='code-ruby' data-code-language='ruby'><code>
puts "Hello, World."
</code></pre>
原稿
code(ソースコードはこちら) { puts 'Hello, World' }
または、こんな書き方もできます。
原稿
```(ソースコードはこちら) puts 'Hello, World' ```
こんな風になります。
変換結果
<div class='pre'>
<p class='caption'>原稿はこちら</p>
<pre><code>
puts 'Hello, World'
</code></pre>
</div>
インラインコマンドは、原則として次の形式をしています。
[<コマンド>{内容}]
定義済みのインラインコマンドには、次のものがあります。
リンクを定義します。
[l(http://github.com/skoji/noramark){NoraMarkのレポジトリ}]
変換結果
<a href='http://github.com/skoji/noramark'>NoraMarkのレポジトリ</a>
spanを定義します。
[sp.note{spanの中にはいる}]
変換結果
<span class='note">spanの中に入る</span>
画像を定義します。このコマンドにはブレースのセクションがありません。
[img(img/some_image.jpg,alternate text)]
変換結果
<img src='img/some_image.jpg' alt='alternate text' />
class tcyのspanを定義します。縦書きにおける縦中横のスタイルをあてることを想定しています。
FM TOWNSが登場してからすでに[tcy{25}]年がたった。
変換結果
<p>FM TOWNSが登場してからすでに<span class='tcy'>25</span>年がたった。</p>
ルビをマークアップします。
[ruby(とんぼ){蜻蛉}]の[ruby(めがね){眼鏡}]はみずいろめがね
変換結果
<p><ruby>蜻蛉<rp>(</rp><rt>とんぼ</rt><rp>)</rp></ruby>の<ruby>眼鏡<rp>(</rp><rt>めがね</rt><rp>)</rp></ruby>はみずいろめがね</p>
インラインでコードをマークアップします。中はMarkupとして解釈しません。`
(バッククオート)で囲む方法と、[code{}]
を使う方法があります。
`puts "Hello, World."` and [code{puts "Hello, World."}]
変換結果
<p><code>puts "Hello, World.</code> and <code>puts "Hello, World.</code> </p>
ただし[code{}]
の形式ではたとえば
[code{ [ruby(とんぼ){蜻蛉}] }]
と書くと、蜻蛉の後ろにある}]
でcodeコマンドは終了してしまうため、次のような変換結果となります。
<p><code>[ruby(とんぼ){蜻蛉</code>}]</p>
行コマンドは1行を占有し、次の形式をしています。
<コマンド>:内容
定義済みの行コマンドには、次のものがあります。
;: p {
パラグラフをマークアップします。クラスやIDを付加する目的で使うことを想定しています。
p.caution: 用量に注意してご利用ください。
変換結果
<p class='caution'>用量に注意してご利用ください。</p>
figureでラップされたimgをマークアップします。
image(path-to-image/img.jpg, 代替テキスト): イメージのキャプション
変換結果
<figure class='img-wrap'>
<img src='path-to-image/img.jpg' alt='代替テキスト' />
<figcaption>イメージのキャプション</figcaption>
</figure>
新規ページを作成します。この位置XHTMLファイルが区切られ、新たなXHTMLが生成されます。
newpage:
原稿
* *ではじまる行は、箇条書きになります * 空行があくまで、箇条書きがつづきます。 * 空行があくと、あらたな箇条書きになります。 * さらに、 ** *を続けるとネストされます。
変換結果
<ul><li>*ではじまる行は、箇条書きになります。</li>
<li>空行があくまで、箇条書きがつづきます。。</li>
</ul>
<ul><li>空行があくと、あらたな箇条書きになります。</li>
<li>さらに、
<ul> <li>*を続けるとネストされます。</li></ul>
</li>
</ul>
原稿
1. 数字.ではじまる行は、番号つきリストになる。 2. 空行があくまで、リストがつづく。 3. 空行があくと、あらたなリストになる。 10. 先頭の数字にかかわらず、1から順に番号がふられる。
変換結果
<ol><li>数字.ではじまる行は、番号つきリストになる。 </li>
<li>空行があくまで、リストがつづく。</li>
</ol>
<ol><li>空行があくと、あらたなリストになる。</li>
<li>先頭の数字にかかわらず、1から順に番号がふられる。</li>
</ol>
番号つきリストのネストはサポートしていませんが、どうしてもやりたい場合は次のような方法もあります。
原稿
ol {
li: 第一の要素
li {
ここはネストしたい。
ol {
li: ネストします。
}
li: 第三の要素
}
}
定義リストには、二種類の書き方があります。
原稿
;: それがし : 名前がわからない,または名前を隠して人や物事をさす語。 ;: それがしかれがし : 不定称。二人以上の人に対し,名を知らなかったり,名を省略していうときに用いる語。
変換結果
<dl>
<dt>それがし</dt>
<dd>名前がわからない,または名前を隠して人や物事をさす語。</dd>
<dt>それがしかれがし</dt>
<dd>不定称。二人以上の人に対し,名を知らなかったり,名を省略していうときに用いる語。</dd>
</dl>
説明が長い場合は、複数行の形式で書けます。この場合、説明部分は段落になります。
原稿
;: それがし { 名前がわからない,または名前を隠して人や物事をさす語。 } ;: それがしかれがし { 不定称。二人以上の人に対し,名を知らなかったり,名を省略していうときに用いる語。 }
変換結果
<dl>
<dt>それがし</dt>
<dd><div class="pgroup"><p>名前がわからない,または名前を隠して人や物事をさす語。</p></div></dd>
<dt>それがしかれがし</dt>
<dd><div class="pgroup"><p>不定称。二人以上の人に対し,名を知らなかったり,名を省略していうときに用いる語。</p></div></dd>
</dl>
h1からh6が用意されています。そのまま、<h1> タグに変換されます。
原稿
h1: 単独の見出し ここに本文
変換結果
<h1>単独の見出し</h1>
<div class='pgroup'>
<p>ここに本文</p>
</div>
Markdown風の # をつかった見出しも使えます。この見出しは、sectionを生成します。
原稿
# 見出し 本文
変換結果
<section>
<h1>見出し</h1>
<div class='pgroup'>
<p>本文</p>
</div>
</section>
入れ子にもできます。sectionの範囲は適切に判断されます。
原稿
# 見出し 本文 ## 小見出し 次の本文 # 新しい章 新しい章の本文
変換結果
<section>
<h1>見出し</h1>
<div class='pgroup'>
<p>本文</p>
</div>
<section>
<h2>小見出し</h2>
<div class='pgroup'>
<p>次の本文</p>
</div>
</section>
</section>
<section>
<h1>新しい章</h1>
<div class='pgroup'>
<p>新しい章の本文</p>
</div>
</section>
明示的に範囲を指定したセクションをつくることもできます。
原稿
# 第一のセクション ここは第一のセクション ## 第二のセクション { ここは第二のセクション } ここは再び第一のセクション
変換結果
<section>
<h1>第一のセクション</h1>
<div class='pgroup'>
<p>ここは第一のセクション</p>
</div>
<section>第二のセクション</h1>
<div class='pgroup'>
<p>ここは第二のセクション</p>
</div>
</section>
<div class='pgroup'>
<p>ここは再び第一のセクション</p>
</div>
</section>
各ページごとにYAML frontmatterでメタデータを記載できます。
Frontmatterの例
---
title: ページのタイトル
stylesheets: [reset.css, default.css]
lang: ja
paragraph_style: default
---
title
, stylesheets
, lang
はそれぞれXHTMLのheaderにかかれます。paragraph_style
は、HTML生成時の段落スタイル指示ができます。
(加筆修正予定)
コマンド
コマンド名[id][class][パラメータ][名前付きパラメータ]
具体的には、たとえば次のような形をしています。
具体例
div#id1#id2.class1.class2(parameter1, parameter2)[named_parameter: 1, named_parameter 2]
()
で囲まれています。カンマで区切られた領域ごとに、独立したパラメータになります。[]
で囲まれていて、カンマで区切られた次の形式をしています。