Add system for registering new page extensions / markup formats
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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__)
|
||||||
|
|||||||
@@ -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|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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
|
||||||
|
|
||||||
#########################################################################
|
#########################################################################
|
||||||
|
|||||||
Reference in New Issue
Block a user