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)