JekyllのH2からサブナビゲーションを自動的に生成します
Jekyllを使用してドキュメントサイトを再構築しています。ドキュメントページはかなり大きいため、トップレベルのナビゲーションに加えて、なんらかのサブナビゲーションが必要です。
この投稿では、投稿またはページの見出しからサブナビゲーションリンクを生成できる簡単なJekyllプラグインを作成する方法について説明します。
このプロジェクトを次のタスクに分割しました:
- サイトのすべてのページに対して実行されるJekyllジェネレーターを作成します。
- 見出し情報を抽出できるように、ページを事前にレンダリングする方法をジェネレーターに教えます。
- nokogiriを使用してページを解析し、HTMLで関連する見出しとコンテンツを抽出します。
- サブナビゲーションをレンダリングします。
以下の例では、すべてのサブナビゲーションリンクがアンカーリンクです。このアプローチを機能させるには、マークダウンプロセッサが見出しのIDを作成することを確認する必要があります。 with_toc_data
を使用したRedCarpet オプションはうまく機能します。
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タグで、メニューにサブサブナビゲーションリンクを作成したい場合は
これについては、今後のブログ投稿で取り上げます。引き続きご期待ください!
-
Web サイトから Excel にデータを自動的に抽出する方法
データの抽出 Web ページから Excel ワークシートへの自動 (データの収集と更新) は、ジョブによっては重要な場合があります。 Excel を使用すると、Web ページからデータを収集できます。これは、データ分析ジョブに Excel を使用するユーザーにとって最もよく使用される Excel 機能の 1 つです。金融アナリスト会社で働いている場合は、分析のために毎日の株価を Web サイトから Excel ブックに取得またはインポートする必要がある場合があります。この記事では、ウェブサイトからデータを抽出して Excel にする方法を紹介します。 簡単な手順で自動的に。 Web サイトか
-
Windows 10 で Skype が自動的に起動しないようにする方法
Windows PC を開くと、Skype が自動的にポップアップ表示されます。同じ操作にイライラする人もいます。ただし、この自動ポップアップは、PC で利用できない間に見逃した可能性のある通話、メッセージ、または共有ドキュメントなどのすべての通信を転送することを目的としています。 Skype によるこのような自動ポップアップを回避するには、下にスクロールして、Windows 10 で Skype が自動的に起動しないようにする方法を学びます。 Skype の設定を変更したら、Skype を手動で開いて、すべてのメッセージまたは不在着信を確認する必要があります。ただし、他のアプリケーションの