Add table of contents to about page (#11885)
Move public domain blocks information to about pagemain
parent
e1066cd431
commit
d930eb88b6
@ -0,0 +1,69 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class TOCGenerator
|
||||
TARGET_ELEMENTS = %w(h1 h2 h3 h4 h5 h6).freeze
|
||||
LISTED_ELEMENTS = %w(h2 h3).freeze
|
||||
|
||||
class Section
|
||||
attr_accessor :depth, :title, :children, :anchor
|
||||
|
||||
def initialize(depth, title, anchor)
|
||||
@depth = depth
|
||||
@title = title
|
||||
@children = []
|
||||
@anchor = anchor
|
||||
end
|
||||
|
||||
delegate :<<, to: :children
|
||||
end
|
||||
|
||||
def initialize(source_html)
|
||||
@source_html = source_html
|
||||
@processed = false
|
||||
@target_html = ''
|
||||
@headers = []
|
||||
@slugs = Hash.new { |h, k| h[k] = 0 }
|
||||
end
|
||||
|
||||
def html
|
||||
parse_and_transform unless @processed
|
||||
@target_html
|
||||
end
|
||||
|
||||
def toc
|
||||
parse_and_transform unless @processed
|
||||
@headers
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def parse_and_transform
|
||||
return if @source_html.blank?
|
||||
|
||||
parsed_html = Nokogiri::HTML.fragment(@source_html)
|
||||
|
||||
parsed_html.traverse do |node|
|
||||
next unless TARGET_ELEMENTS.include?(node.name)
|
||||
|
||||
anchor = node.text.parameterize
|
||||
@slugs[anchor] += 1
|
||||
anchor = "#{anchor}-#{@slugs[anchor]}" if @slugs[anchor] > 1
|
||||
|
||||
node['id'] = anchor
|
||||
|
||||
next unless LISTED_ELEMENTS.include?(node.name)
|
||||
|
||||
depth = node.name[1..-1]
|
||||
latest_section = @headers.last
|
||||
|
||||
if latest_section.nil? || latest_section.depth >= depth
|
||||
@headers << Section.new(depth, node.text, anchor)
|
||||
else
|
||||
latest_section << Section.new(depth, node.text, anchor)
|
||||
end
|
||||
end
|
||||
|
||||
@target_html = parsed_html.to_s
|
||||
@processed = true
|
||||
end
|
||||
end
|
@ -1,48 +0,0 @@
|
||||
- content_for :page_title do
|
||||
= t('domain_blocks.title', instance: site_hostname)
|
||||
|
||||
.grid
|
||||
.column-0
|
||||
.box-widget.rich-formatting
|
||||
%h2= t('domain_blocks.blocked_domains')
|
||||
%p= t('domain_blocks.description', instance: site_hostname)
|
||||
.table-wrapper
|
||||
%table.blocks-table
|
||||
%thead
|
||||
%tr
|
||||
%th= t('domain_blocks.domain')
|
||||
%th.severity-column= t('domain_blocks.severity')
|
||||
- if @show_rationale
|
||||
%th.button-column
|
||||
%tbody
|
||||
- if @blocks.empty?
|
||||
%tr
|
||||
%td{ colspan: @show_rationale ? 3 : 2 }= t('domain_blocks.no_domain_blocks')
|
||||
- else
|
||||
- @blocks.each_with_index do |block, i|
|
||||
%tr{ class: i % 2 == 0 ? 'even': nil }
|
||||
%td{ title: block.domain }= block.domain
|
||||
%td= block_severity_text(block)
|
||||
- if @show_rationale
|
||||
%td
|
||||
- if block.public_comment.present?
|
||||
%button.icon-button{ title: t('domain_blocks.show_rationale'), 'aria-label' => t('domain_blocks.show_rationale') }
|
||||
= fa_icon 'chevron-down fw', 'aria-hidden' => true
|
||||
- if @show_rationale
|
||||
- if block.public_comment.present?
|
||||
%tr.rationale.hidden
|
||||
%td{ colspan: 3 }= block.public_comment.presence
|
||||
%h2= t('domain_blocks.severity_legend.title')
|
||||
- if @blocks.any? { |block| block.reject_media? }
|
||||
%h3= t('domain_blocks.media_block')
|
||||
%p= t('domain_blocks.severity_legend.media_block')
|
||||
- if @blocks.any? { |block| block.severity == 'silence' }
|
||||
%h3= t('domain_blocks.silence')
|
||||
%p= t('domain_blocks.severity_legend.silence')
|
||||
- if @blocks.any? { |block| block.severity == 'suspend' }
|
||||
%h3= t('domain_blocks.suspension')
|
||||
%p= t('domain_blocks.severity_legend.suspension')
|
||||
- if public_fetch_mode?
|
||||
%p= t('domain_blocks.severity_legend.suspension_disclaimer')
|
||||
.column-1
|
||||
= render 'application/sidebar'
|
Loading…
Reference in new issue