Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

JekyllのH2からサブナビゲーションを自動的に生成します

JekyllのH2からサブナビゲーションを自動的に生成します

Jekyllを使用してドキュメントサイトを再構築しています。ドキュメントページはかなり大きいため、トップレベルのナビゲーションに加えて、なんらかのサブナビゲーションが必要です。

この投稿では、投稿またはページの見出しからサブナビゲーションリンクを生成できる簡単なJekyllプラグインを作成する方法について説明します。

概要

このプロジェクトを次のタスクに分割しました:

  1. サイトのすべてのページに対して実行されるJekyllジェネレーターを作成します。
  2. 見出し情報を抽出できるように、ページを事前にレンダリングする方法をジェネレーターに教えます。
  3. nokogiriを使用してページを解析し、HTMLで関連する見出しとコンテンツを抽出します。
  4. サブナビゲーションをレンダリングします。

以下の例では、すべてのサブナビゲーションリンクがアンカーリンクです。このアプローチを機能させるには、マークダウンプロセッサが見出しのIDを作成することを確認する必要があります。 with_toc_dataを使用したRedCarpet オプションはうまく機能します。

基本的なJekyllジェネレーター

Jekyll用に作成できるプラグインにはいくつかの種類があります。ジェネレーターを作成します。

ジェネレーターは、Jekyll::Generatorから継承する単なるクラスです。 generateと呼ばれるメソッドを提供します 。

ジェネレーターは、Jekyllがすべてのマークダウンファイルをロードした後、それらのファイルがHTMLに変換される前に実行されます。 site オブジェクトはgenerateメソッドに渡されます。また、サイトオブジェクトを使用して、すべてのサイトページ、投稿、その他のリソースにアクセスできます。

以下の例では、すべてのページをループしてタイトルを出力するジェネレーターを作成します。

class MySubnavGenerator < Jekyll::Generator
  def generate(site)
    site.pages.each do |page|
      puts page.data["title"]
    end
  end
end

ジェネレーター内のページとサイトのデータを変更することもできます。データはフロントマターとサイト構成ファイルから読み込まれます。

   page.data["title"] += " - modified!"
   site.data["tagline"]

HTMLへの事前レンダリングマークダウン

マークダウンドキュメントから見出しを抽出したいと思います。これを行う最も簡単な方法は、マークダウンをHTMLに変換してから、nokogiriなどのツールを使用してHTMLを解析することです。

これは私を少し汚く感じさせますか?うん。ちょっと遅いでしょうか?絶対。しかし、Jekyllは静的サイトジェネレーターなので、リアルタイムのパフォーマンスについて心配する必要はありません。だから私はただ鼻を押さえてそれを成し遂げるつもりです。

ここでは、Jekyllの組み込みのマークダウンラッパーを使用して、すべてのマークダウンページをHTMLに変換します。

class MySubnavGenerator < Jekyll::Generator
  def generate(site)
    parser = Jekyll::Converters::Markdown.new(site.config)

    site.pages.each do |page|
      if page.ext == ".md"
        html = parser.convert(page['content'])
        # Do something with the html here
      end
    end
  end
end
見出しの抽出

新しいドキュメントサイトでは、すべてのH2タグに対応するサブナビゲーションリンクが必要であると判断しました。そこで、nokogiriを使用して各ページのHTMLを解析し、次にページから各H2タグを取り出します。

今のところ、H2のコンテンツとIDを画面に出力するだけです:

require "nokogiri"

class MySubnavGenerator < Jekyll::Generator
  def generate(site)
    parser = Jekyll::Converters::Markdown.new(site.config)

    site.pages.each do |page|
      if page.ext == ".md"
        doc = Nokogiri::HTML(parser.convert(page['content']))
        doc.css('h2').each do |heading|
          puts "#{ heading.text }: #{ heading['id'] }"
        end
      end
    end
  end
end
サブナビゲーションメニューの作成

見出しのテキストとIDができたので、サブナビゲーションリンクのリストを作成できます。

このリンクのリストは、ページ自体のデータ属性として保存されます。そうすれば、ページテンプレートからリンクにアクセスできます。

require "nokogiri"

class MySubnavGenerator < Jekyll::Generator
  def generate(site)
    parser = Jekyll::Converters::Markdown.new(site.config)

    site.pages.each do |page|
      if page.ext == ".md"
        doc = Nokogiri::HTML(parser.convert(page['content']))
        page.data["subnav"] = []
        doc.css('h2').each do |heading|
          page.data["subnav"] << { "title" => heading.text, "url" => [page.url, heading['id']].join("#") }
        end
      end
    end
  end
end

これで、テンプレートで、サブナビゲーションをループして各リンクを表示できます。

{% for item in page.subnav %}
  <a href="{{ item.url }}">{{ item.title }}</a>
{% endfor %}
トラブルシューティング

前に述べたように、これはすべて、各見出しに一意のIDを作成するマークダウンプロセッサに依存します。 _config.ymlからのマークダウン設定は次のとおりです :

# Use the redcarpet Markdown renderer
markdown: redcarpet
redcarpet:
    extensions: [
        'no_intra_emphasis',
        'fenced_code_blocks',
        'autolink',
        'strikethrough',
        'superscript',
        'with_toc_data',
        'tables',
        'hardwrap'
    ]

次のアップ...

上記のアプローチは、サブナビゲーションのレベルが1つだけ必要な場合にうまく機能します。しかし、もっと必要な場合はどうなりますか?つまり、H2の「内部」にあるすべてのH3タグで、メニューにサブサブナビゲーションリンクを作成したい場合は

これについては、今後のブログ投稿で取り上げます。引き続きご期待ください!


  1. Web サイトから Excel にデータを自動的に抽出する方法

    データの抽出 Web ページから Excel ワークシートへの自動 (データの収集と更新) は、ジョブによっては重要な場合があります。 Excel を使用すると、Web ページからデータを収集できます。これは、データ分析ジョブに Excel を使用するユーザーにとって最もよく使用される Excel 機能の 1 つです。金融アナリスト会社で働いている場合は、分析のために毎日の株価を Web サイトから Excel ブックに取得またはインポートする必要がある場合があります。この記事では、ウェブサイトからデータを抽出して Excel にする方法を紹介します。 簡単な手順で自動的に。 Web サイトか

  2. Windows 10 で Skype が自動的に起動しないようにする方法

    Windows PC を開くと、Skype が自動的にポップアップ表示されます。同じ操作にイライラする人もいます。ただし、この自動ポップアップは、PC で利用できない間に見逃した可能性のある通話、メッセージ、または共有ドキュメントなどのすべての通信を転送することを目的としています。 Skype によるこのような自動ポップアップを回避するには、下にスクロールして、Windows 10 で Skype が自動的に起動しないようにする方法を学びます。 Skype の設定を変更したら、Skype を手動で開いて、すべてのメッセージまたは不在着信を確認する必要があります。ただし、他のアプリケーションの