2016-04-08 9 views
0

私の目標は、目次を目次にしてマークダウン文書をhtmlに変換することです。私はRedcarpetにHTML_TOCオプションがあることを見ました。これは本当にいいです。しかし、私はそれを使用すると、TOCをレンダリングするだけで、残りのドキュメントは含まれません。Redcarpetを使用して目次でmarkdownをhtmlに変換する

renderer = Redcarpet::Render::HTML_TOC.new(with_toc_data: true) 
markdown = Redcarpet::Markdown.new(renderer) 
html = markdown.render(File.read(input_file)) 

TOCとドキュメントの両方を同じHTMLページにレンダリングするにはどうすればよいですか?

私が考えることができるのは、2つの別々のhtmlオブジェクトをレンダリングしてから組み合わせることだけです。しかし、これは少し混乱します。なぜなら、それらを組み合わせる前にhead/bodyタグを正しく解析しなければならないからです。より良い方法がありますか?

答えて

1

私が考えることができるのは、2つの別々のhtmlオブジェクトをレンダリングしてから組み合わせることだけです。

これはまさにあなたがする必要があります。 Markdownは、とにかく完全なHTMLドキュメントをレンダリングしません。あなたはHTML断片だけを取得します。例えば、単純な値下げ文書:あなたは(少なくとも)以下のものが必要、完全な、有効なHTML文書のために、

<p>A simple Markdown document.</p> 

しかし:

A simple Markdown document. 

は、次のHTMLフラグメントとしてレンダリングされる

<!DOCTYPE html> 
<html> 
    <head> 
    <title>Page Title</title> 
    </head> 
    <body> 
    <p>A simple Markdown document.</p> 
    </body> 
</html> 

とにかくすべてを生成する必要があることを考慮すると、TOCと本体を別々に取得するのはどのように「乱雑」ですか?

実際、より洗練されたシステムでは、TOCはサイドバーなどにある可能性があります。したがって、テンプレートシステムを使用すると、TOCはテンプレートとは別にテンプレートに渡すことができます。このテンプレートは、CSSの配置とスタイリングのためにドキュメントボディから分離するコンテナに配置されます。

正確なテンプレート構文は、使用するツールをによって異なりますが、おそらくこのようなものかもしれません。もちろん

<!DOCTYPE html> 
<html> 
    <head> 
    <title>{{ page.title }}</title> 
    </head> 
    <body> 
    <aside> 
     {{ page.toc }} 
    </aside> 
    <div id="body"> 
     {{ page.body }} 
    </div> 
    </body> 
</html> 

、テンプレートを使用する必要はありませんが、確かに「きれいです"ドキュメントを生成する方法。

+0

_ "マークダウンは、とにかく完全なHTML文書を表示しません。" _ああ、それが私の鍵でした!私はredcarpetがHTMLフラグメントを生成していることに気づいていませんでした。なぜなら私はChromeで変換されたhtmlファイルを開き、HTMLを検査するためにDeveloper Toolsを使いましたが、CDTはhead/bodyタグを追加したからです。 redcarpetがhtmlフラグメントを生成することがわかったので、それらを組み合わせるのは面倒ではありません。 – wisbucky