Add system for registering new page extensions / markup formats

This commit is contained in:
James Dabbs
2012-10-17 21:17:58 -04:00
committed by James Dabbs
parent 982915a22f
commit 62601f1adc
6 changed files with 69 additions and 59 deletions
+9 -3
View File
@@ -80,8 +80,8 @@ choose. Special footers can be created in `footer files`. Other content
## PAGE FILES ## PAGE FILES
Page files may be written in any format supported by Page files may be written in any format supported by
[GitHub-Markup](http://github.com/github/markup) (except roff). The [GitHub-Markup](http://github.com/github/markup) (except roff). By default,
current list of formats and allowed extensions is: Gollum recognizes the following extensions:
* ASCIIDoc: .asciidoc * ASCIIDoc: .asciidoc
* Creole: .creole * Creole: .creole
@@ -93,8 +93,14 @@ current list of formats and allowed extensions is:
* Textile: .textile * Textile: .textile
* MediaWiki: .mediawiki, .wiki * MediaWiki: .mediawiki, .wiki
You may also register your own extensions and parsers:
Gollum::Markup.register(:angry, "Angry") do |content|
content.upcase
end
Gollum detects the page file format via the extension, so files must have one Gollum detects the page file format via the extension, so files must have one
of the supported extensions in order to be converted. of the default or registered extensions in order to be converted.
Page file names may contain any printable UTF-8 character except space Page file names may contain any printable UTF-8 character except space
(U+0020) and forward slash (U+002F). If you commit a page file with any of (U+0020) and forward slash (U+002F). If you commit a page file with any of
+1
View File
@@ -19,6 +19,7 @@ require File.expand_path('../gollum/page', __FILE__)
require File.expand_path('../gollum/file', __FILE__) require File.expand_path('../gollum/file', __FILE__)
require File.expand_path('../gollum/file_view', __FILE__) require File.expand_path('../gollum/file_view', __FILE__)
require File.expand_path('../gollum/markup', __FILE__) require File.expand_path('../gollum/markup', __FILE__)
require File.expand_path('../gollum/markups', __FILE__)
require File.expand_path('../gollum/sanitization', __FILE__) require File.expand_path('../gollum/sanitization', __FILE__)
require File.expand_path('../gollum/web_sequence_diagram', __FILE__) require File.expand_path('../gollum/web_sequence_diagram', __FILE__)
require File.expand_path('../gollum/frontend/uri_encode_component', __FILE__) require File.expand_path('../gollum/frontend/uri_encode_component', __FILE__)
+2 -2
View File
@@ -1,8 +1,8 @@
module Precious module Precious
module Editable module Editable
def formats(selected = @page.format) def formats(selected = @page.format)
Gollum::Page::FORMAT_NAMES.map do |key, val| Gollum::Markup.formats.map do |key, val|
{ :name => val, { :name => val[:name],
:id => key.to_s, :id => key.to_s,
:selected => selected == key} :selected => selected == key}
end.sort do |a, b| end.sort do |a, b|
+22
View File
@@ -15,6 +15,28 @@ module Gollum
class Markup class Markup
include Precious::Helpers include Precious::Helpers
@formats = {}
class << self
attr_reader :formats
# Register a file extension and associated markup type
#
# ext - The file extension
# name - The name of the markup type
# options - Hash of options:
# regexp - Regexp to match against.
# Defaults to exact match of ext.
#
# If given a block, that block will be registered with GitHub::Markup to
# render any matching pages
def register(ext, name, options = {}, &block)
regexp = options[:regexp] || Regexp.new(ext.to_s)
@formats[ext] = { :name => name, :regexp => regexp }
GitHub::Markup.add_markup(regexp, &block) if block_given?
end
end
attr_accessor :toc attr_accessor :toc
attr_reader :metadata attr_reader :metadata
+13
View File
@@ -0,0 +1,13 @@
module Gollum
class Markup
register(:markdown, "Markdown", :regexp => /md|mkdn?|mdown|markdown/)
register(:textile, "Textile")
register(:rdoc, "RDoc")
register(:org, "Org-mode")
register(:creole, "Creole")
register(:rest, "reStructuredText", :regexp => /re?st(\.txt)?/)
register(:asciidoc, "AsciiDoc")
register(:mediawiki, "MediaWiki", :regexp => /(media)?wiki/)
register(:pod, "Pod")
end
end
+22 -54
View File
@@ -5,17 +5,6 @@ module Gollum
Wiki.page_class = self Wiki.page_class = self
VALID_PAGE_RE = /^(.+)\.(md|mkdn?|mdown|markdown|textile|rdoc|org|creole|re?st(\.txt)?|asciidoc|pod|(media)?wiki)$/i
FORMAT_NAMES = { :markdown => "Markdown",
:textile => "Textile",
:rdoc => "RDoc",
:org => "Org-mode",
:creole => "Creole",
:rest => "reStructuredText",
:asciidoc => "AsciiDoc",
:mediawiki => "MediaWiki",
:pod => "Pod" }
# Sets a Boolean determing whether this page is a historical version. # Sets a Boolean determing whether this page is a historical version.
# #
# Returns nothing. # Returns nothing.
@@ -26,13 +15,29 @@ module Gollum
# Returns a Page # Returns a Page
attr_accessor :parent_page attr_accessor :parent_page
# Checks if a filename has a valid extension understood by GitHub::Markup.
# Checks a filename against the registered markup extensions
#
# filename - String filename, like "Home.md"
#
# Returns e.g. ["Home", :markdown], or [] if the extension is unregistered
def self.parse_filename(filename)
return [] unless filename =~ /^(.+)\.([a-zA-Z]\w*)$/i
pref, ext = $1, $2
Gollum::Markup.formats.each_pair do |name, format|
return [pref, name] if ext =~ format[:regexp]
end
[]
end
# Checks if a filename has a valid, registered extension
# #
# filename - String filename, like "Home.md". # filename - String filename, like "Home.md".
# #
# Returns the matching String basename of the file without the extension. # Returns the matching String basename of the file without the extension.
def self.valid_filename?(filename) def self.valid_filename?(filename)
filename && filename.to_s =~ VALID_PAGE_RE && $1 self.parse_filename(filename).first
end end
# Checks if a filename has a valid extension understood by GitHub::Markup. # Checks if a filename has a valid extension understood by GitHub::Markup.
@@ -51,34 +56,9 @@ module Gollum
# #
# filename - The String filename. # filename - The String filename.
# #
# Returns the Symbol format of the page. One of: # Returns the Symbol format of the page; one of the registered format types
# [ :markdown | :textile | :rdoc | :org | :rest | :asciidoc | :pod |
# :roff ]
def self.format_for(filename) def self.format_for(filename)
case filename.to_s self.parse_filename(filename).last
when /\.(md|mkdn?|mdown|markdown)$/i
:markdown
when /\.(textile)$/i
:textile
when /\.(rdoc)$/i
:rdoc
when /\.(org)$/i
:org
when /\.(creole)$/i
:creole
when /\.(re?st(\.txt)?)$/i
:rest
when /\.(asciidoc)$/i
:asciidoc
when /\.(pod)$/i
:pod
when /\.(\d)$/i
:roff
when /\.(media)?wiki$/i
:mediawiki
else
nil
end
end end
# Reusable filter to turn a filename (without path) into a canonical name. # Reusable filter to turn a filename (without path) into a canonical name.
@@ -249,9 +229,7 @@ module Gollum
# Public: The format of the page. # Public: The format of the page.
# #
# Returns the Symbol format of the page. One of: # Returns the Symbol format of the page; one of the registered format types
# [ :markdown | :textile | :rdoc | :org | :rest | :asciidoc | :pod |
# :roff ]
def format def format
self.class.format_for(@blob.name) self.class.format_for(@blob.name)
end end
@@ -359,17 +337,7 @@ module Gollum
# #
# Returns the String extension (no leading period). # Returns the String extension (no leading period).
def self.format_to_ext(format) def self.format_to_ext(format)
case format format == :markdown ? "md" : format.to_s
when :markdown then 'md'
when :textile then 'textile'
when :rdoc then 'rdoc'
when :org then 'org'
when :creole then 'creole'
when :rest then 'rest'
when :asciidoc then 'asciidoc'
when :pod then 'pod'
when :mediawiki then 'mediawiki'
end
end end
######################################################################### #########################################################################