Add table of contents to about page (#11885)
Move public domain blocks information to about pagemaster
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