mirror of
https://github.com/danog/sass-site.git
synced 2024-11-27 04:24:50 +01:00
add846dff2
Most tables of contents within a single documentation page are quite short, so having them start out collapsed just requires extra clicks. This expands them just enough that they're no longer than the (smallest possible version of) the global table of contents.
117 lines
3.9 KiB
Ruby
117 lines
3.9 KiB
Ruby
require 'middleman-syntax'
|
|
|
|
require_relative 'lib/rack/try_dynamic'
|
|
|
|
use Rack::TryDynamic, try: ['.html', '/index.html']
|
|
|
|
activate :automatic_image_sizes
|
|
activate :autoprefixer do |config|
|
|
config.browsers = ['last 2 versions']
|
|
# config.ignore = ['hacks.css']
|
|
end
|
|
activate :livereload
|
|
activate :syntax
|
|
|
|
set :markdown, fenced_code_blocks: true,
|
|
autolink: true,
|
|
smartypants: true,
|
|
with_toc_data: true
|
|
Haml::Filters::Markdown.options.merge! fenced_code_blocks: true,
|
|
autolink: true
|
|
set :markdown_engine, :redcarpet
|
|
set :css_dir, 'assets/css'
|
|
set :js_dir, 'assets/js'
|
|
set :images_dir, 'assets/img'
|
|
|
|
page '/*.xml', :layout => false
|
|
page '/*.json', :layout => false
|
|
page '/*.txt', :layout => false
|
|
page '/*.html', :layout => :has_no_sidebars
|
|
page '/404.html', :layout => :has_no_sidebars
|
|
page '/about.html', :layout => :has_no_sidebars
|
|
page '/implementation.html', :layout => :has_no_sidebars
|
|
page '/install.html', :layout => :has_no_sidebars
|
|
page '/dart-sass.html', :layout => :has_no_sidebars
|
|
page '/ruby-sass.html', :layout => :has_no_sidebars
|
|
page '/community.html', :layout => :has_complementary
|
|
page '/community-guidelines.html', :layout => :has_complementary
|
|
page '/libsass.html', :layout => :has_both_sidebars
|
|
page '/styleguide/*', :layout => :section_styleguide
|
|
page '/documentation/*', :layout => :section_reference
|
|
|
|
configure :development do
|
|
config[:host] = 'http://localhost:4567'
|
|
end
|
|
|
|
configure :build do
|
|
config[:host] = data.sitemap.url
|
|
activate :asset_hash
|
|
activate :gzip
|
|
activate :minify_css
|
|
activate :minify_html
|
|
activate :minify_javascript
|
|
|
|
set :relative_links, true
|
|
end
|
|
|
|
before_render do |body, page, _, template_class|
|
|
if current_page.data.table_of_contents &&
|
|
template_class == Middleman::Renderers::RedcarpetTemplate
|
|
markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML_TOC.new)
|
|
fragment = Nokogiri::HTML::DocumentFragment.parse(markdown.render(body))
|
|
|
|
# The JS API's header names are uniquely large and difficult to break up
|
|
# effectively. We do some post-processing to clean them up.
|
|
if page.start_with?("js-api.")
|
|
fragment.css("a code").each do |code|
|
|
code.content = code.content.
|
|
gsub(/^types\.[A-Za-z]+\./, '').
|
|
gsub(/^[a-z]+\./, '').
|
|
gsub(/^new types\./, 'new ').
|
|
gsub(/\(.+\)$/, '()')
|
|
end
|
|
end
|
|
|
|
# Modify the default Markdown table of contents to have overview links and
|
|
# section classes.
|
|
fragment.css("li > ul").each do |ul|
|
|
a = ul.parent.elements.first
|
|
a.add_class("section")
|
|
ul.elements.before('<li class="overview"><a>Overview</a></li>')
|
|
ul.elements.first.elements.first['href'] = a['href']
|
|
end
|
|
|
|
# Expand the page's table of contents to the deepest level possible without
|
|
# making it longer than the most-collapsed-possible documentation table of
|
|
# contents.
|
|
entries = fragment.css("> li")
|
|
total_entries = entries.count
|
|
loop do
|
|
child_entries = entries.css("> ul > li")
|
|
total_entries += child_entries.count
|
|
break if total_entries > data.documentation.toc.count
|
|
|
|
sections = entries.xpath("a[following-sibling::ul]")
|
|
sections.add_class("section open")
|
|
break if sections.empty?
|
|
|
|
entries = child_entries
|
|
end
|
|
|
|
current_page.add_metadata(table_of_contents: fragment.to_html)
|
|
body
|
|
end
|
|
end
|
|
|
|
after_render do |content, path, locs|
|
|
# Only modify the original page's rendering.
|
|
next if path.include?("source/layouts/")
|
|
|
|
content.gsub(%r{^<(h[0-6])(.*?)</\1>}m) do |header_text|
|
|
header = Nokogiri::HTML::DocumentFragment.parse(header_text).children.first
|
|
id = header.attr(:id)
|
|
header.children.before("<a class='anchor' href='##{id}'></a>") if id
|
|
header.to_html
|
|
end
|
|
end
|