次のようにフォーマットされたページがあります。
<h1>Header</h1>
<h2>Subheader</h2>
<h3>Subsubheader</h3>
<h1>Another header</h1>
ウィキペディアが記事で行っているように、ページの最初に目次/概要をサーバー側で生成することは可能ですか? Ruby on Rails を使用しています。
編集: JavaScript なしで!
次のようにフォーマットされたページがあります。
<h1>Header</h1>
<h2>Subheader</h2>
<h3>Subsubheader</h3>
<h1>Another header</h1>
ウィキペディアが記事で行っているように、ページの最初に目次/概要をサーバー側で生成することは可能ですか? Ruby on Rails を使用しています。
編集: JavaScript なしで!
今日、この目的のためにクラスを作成しました。http://www.nokogiri.org/に依存しますが、その gem はすでに Rails に付属しています。
これを入れてくださいapp/models/toc.rb
:
class Toc
attr_accessor :html
TOC_CLASS = "toc".freeze
TOC_ELEMENT = "p".freeze
TOC_ITEMS = "h1 | h2 | h3 | h4 | h5".freeze
UNIQUEABLE_ELEMENTS = "h1 | h2 | h3 | h4 | h5 | p".freeze
def initialize(content)
@html = Nokogiri::HTML.fragment content
end
def generate
clear
set_uniq_ids
toc = create_container
html.xpath(TOC_ITEMS).each { |node| toc << toc_item_tag(node) }
html.prepend_child toc
return html.to_s
end
private
def clear
html.search(".#{TOC_CLASS}").remove
end
def set_uniq_ids
html.xpath(UNIQUEABLE_ELEMENTS).
each { |node| node["id"] = rand_id }
end
def rand_id
(0...8).map { ('a'..'z').to_a[rand(26)] }.join
end
def create_container
toc = Nokogiri::XML::Node.new TOC_ELEMENT, html
toc["class"] = TOC_CLASS
return toc
end
def toc_item_tag(node)
"<a data-turbolinks='false' class=\"toc-link toc-link-#{node.name}\" href=\"##{node["id"]}\">#{node.text}</a>"
end
end
のように使う
toc = Toc.new article.body
body_with_toc = toc.generate
article.update body: body_with_toc
はい、可能です。これにはレールは必要ありません。JavaScript を使用して目次を生成することもできます。これは、使用できるライブラリの例です。 http://www.kryogenix.org/code/browser/generated-toc/
または、Rails erb/haml ビューの要素をループするときに、アンカー リンクを作成することもできます。