From 78289a53bb2fafa01eb4a13981763184cd6a0c3c Mon Sep 17 00:00:00 2001 From: Dawa Ometto Date: Fri, 19 Oct 2018 16:09:23 +0200 Subject: [PATCH] Implement header counting using YAML frontmatter. Resolves #908 (#1330) --- .../public/gollum/stylesheets/template.scss | 17 ++++++++++ lib/gollum/templates/page.mustache | 2 +- lib/gollum/views/page.rb | 18 ++++++++++ test/test_page_view.rb | 33 +++++++++++++++++++ 4 files changed, 69 insertions(+), 1 deletion(-) diff --git a/lib/gollum/public/gollum/stylesheets/template.scss b/lib/gollum/public/gollum/stylesheets/template.scss index e0be9129..43980912 100644 --- a/lib/gollum/public/gollum/stylesheets/template.scss +++ b/lib/gollum/public/gollum/stylesheets/template.scss @@ -92,6 +92,7 @@ body { font: 13.34px $font-default; font-size: small; line-height: 1.4; + counter-reset: h1; } img { @@ -117,6 +118,22 @@ a { /* Markdown body */ +.header-enum { + h2 {counter-reset: h3} + h3 {counter-reset: h4} + h4 {counter-reset: h5} + h5 {counter-reset: h6} + + --header-enum-style: decimal; + + h1:before {counter-increment: h1; content: counter(h1, var(--header-enum-style)) ". ";} + h2:before {counter-increment: h2; content: counter(h1, var(--header-enum-style)) "." counter(h2, var(--header-enum-style)) ". ";} + h3:before {counter-increment: h3; content: counter(h1, var(--header-enum-style)) "." counter(h2, var(--header-enum-style)) "." counter(h3, var(--header-enum-style)) ". ";} + h4:before {counter-increment: h4; content: counter(h1, var(--header-enum-style)) "." counter(h2, var(--header-enum-style)) "." counter(h3, var(--header-enum-style)) "." counter(h4, var(--header-enum-style)) ". ";} + h5:before {counter-increment: h5; content: counter(h1, var(--header-enum-style)) "." counter(h2, var(--header-enum-style)) "." counter(h3, var(--header-enum-style)) "." counter(h4, var(--header-enum-style)) "." counter(h5, var(--header-enum-style)) ". ";} + h6:before {counter-increment: h6; content: counter(h1, var(--header-enum-style)) "." counter(h2, var(--header-enum-style)) "." counter(h3, var(--header-enum-style)) "." counter(h4, var(--header-enum-style)) "." counter(h5, var(--header-enum-style)) "." counter(h6, var(--header-enum-style)) ". ";} +} + .markdown-body { padding: 1em; font-size: 15px; diff --git a/lib/gollum/templates/page.mustache b/lib/gollum/templates/page.mustache index 6853ff43..a7bc84e4 100644 --- a/lib/gollum/templates/page.mustache +++ b/lib/gollum/templates/page.mustache @@ -66,7 +66,7 @@ Mousetrap.bind(['e'], function( e ) { {{/has_header}} -
+
{{{rendered_metadata}}} {{{content}}}
diff --git a/lib/gollum/views/page.rb b/lib/gollum/views/page.rb index 99eff784..c7f0c58c 100644 --- a/lib/gollum/views/page.rb +++ b/lib/gollum/views/page.rb @@ -4,6 +4,14 @@ module Precious include HasPage attr_reader :content, :page, :header, :footer + + VALID_COUNTER_STYLES = ['decimal', 'decimal-leading-zero', 'arabic-indic', 'armenian', 'upper-armenian', + 'lower-armenian', 'bengali', 'cambodian', 'khmer', 'cjk-decimal', 'devanagari', 'georgian', 'gujarati', 'gurmukhi', + 'hebrew', 'kannada', 'lao', 'malayalam', 'mongolian', 'myanmar', 'oriya', 'persian', 'lower-roman', 'upper-roman', + 'tamil', 'telugu', 'thai', 'tibetan', 'lower-alpha', 'lower-latin', 'upper-alpha', 'upper-latin', 'cjk-earthly-branch', + 'cjk-heavenly-stem', 'lower-greek', 'hiragana', 'hiragana-iroha', 'katakana', 'katakana-iroha', 'disc', 'circle', 'square', + 'disclosure-open', 'disclosure-closed'] # https://www.w3.org/TR/css-counter-styles-3/ + DATE_FORMAT = "%Y-%m-%d %H:%M:%S" DEFAULT_AUTHOR = 'you' @@to_xml = { :save_with => Nokogiri::XML::Node::SaveOptions::DEFAULT_XHTML ^ 1, :indent => 0, :encoding => 'UTF-8' } @@ -147,6 +155,16 @@ module Precious @rendered_metadata ||= table(metadata) end + def header_enum? + !!metadata['header_enum'] + end + + def header_enum_style + if header_enum? + VALID_COUNTER_STYLES.include?(metadata['header_enum']) ? metadata['header_enum'] : 'decimal' + end + end + private # Wraps page formatted data to Nokogiri::HTML document. diff --git a/test/test_page_view.rb b/test/test_page_view.rb index 1565b29e..dee46a38 100644 --- a/test/test_page_view.rb +++ b/test/test_page_view.rb @@ -51,6 +51,39 @@ context "Precious::Views::Page" do EOS end + test "allow numbered headings based on metadata" do + title = 'header enumeration test' + @wiki.write_page(title, :markdown, "---\nheader_enum: true\n---\n# Some markdown\nIn this doc") + page = @wiki.page(title) + + @view = Precious::Views::Page.new + @view.instance_variable_set :@page, page + + assert_equal @view.header_enum?, true + assert_equal @view.header_enum_style, 'decimal' + + title = 'header_enum test2' + @wiki.write_page(title, :markdown, "---\nheader_enum: 'lower-roman'\n---\n# Some markdown\nIn this doc") + page = @wiki.page(title) + + @view = Precious::Views::Page.new + @view.instance_variable_set :@page, page + + assert_equal @view.header_enum?, true + assert_equal @view.header_enum_style, 'lower-roman' + + # With invalid style + title = 'header_enum test3' + @wiki.write_page(title, :markdown, "---\nheader_enum: 'roman'\n---\n# Some markdown\nIn this doc") + page = @wiki.page(title) + + @view = Precious::Views::Page.new + @view.instance_variable_set :@page, page + + assert_equal @view.header_enum?, true + assert_equal @view.header_enum_style, 'decimal' + end + test 'page has sha id' do title = 'test' @wiki.write_page(title, :markdown, 'Test' + "\n # 3", commit_details)