3

次のようにフォーマットされたページがあります。

<h1>Header</h1>
<h2>Subheader</h2>    
<h3>Subsubheader</h3>
<h1>Another header</h1>

ウィキペディアが記事で行っているように、ページの最初に目次/概要をサーバー側で生成することは可能ですか? Ruby on Rails を使用しています。

編集: JavaScript なしで!

4

3 に答える 3

1

今日、この目的のためにクラスを作成しました。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
于 2016-08-12T12:53:05.790 に答える
-2

はい、可能です。これにはレールは必要ありません。JavaScript を使用して目次を生成することもできます。これは、使用できるライブラリの例です。 http://www.kryogenix.org/code/browser/generated-toc/

または、Rails erb/haml ビューの要素をループするときに、アンカー リンクを作成することもできます。

于 2013-03-19T15:11:02.133 に答える