Skip to content

Commit

Permalink
Merge branch 'kivikakk/reintroduce-537'
Browse files Browse the repository at this point in the history
  • Loading branch information
Yuki Izumi committed Mar 27, 2017
2 parents 3087f06 + 665ab4d commit e96dfcb
Show file tree
Hide file tree
Showing 9 changed files with 72 additions and 44 deletions.
1 change: 1 addition & 0 deletions github-markup.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,5 @@ Gem::Specification.new do |s|
s.add_development_dependency 'sanitize', '~> 2.1', '>= 2.1.0'
s.add_development_dependency 'nokogiri', '1.6.8.1'
s.add_development_dependency 'nokogiri-diff', '~> 0.2.0'
s.add_development_dependency "github-linguist", "~> 5.0", ">= 5.0.8"
end
34 changes: 24 additions & 10 deletions lib/github/markup.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
begin
require "linguist"
rescue LoadError
# Rely on extensions instead.
end

require "github/markup/command_implementation"
require "github/markup/gem_implementation"

Expand Down Expand Up @@ -37,7 +43,7 @@ def preload!
def render(filename, content = nil)
content ||= File.read(filename)

if impl = renderer(filename)
if impl = renderer(filename, content)
impl.render(content)
else
content
Expand All @@ -53,9 +59,9 @@ def render_s(symbol, content)
content
end
end
def markup(symbol, file, pattern, opts = {}, &block)
markup_impl(symbol, GemImplementation.new(pattern, file, &block))

def markup(symbol, gem_name, regexp, languages, opts = {}, &block)
markup_impl(symbol, GemImplementation.new(regexp, languages, gem_name, &block))
end

def markup_impl(symbol, impl)
Expand All @@ -65,24 +71,32 @@ def markup_impl(symbol, impl)
markups[symbol] = impl
end

def command(symbol, command, regexp, name, &block)
def command(symbol, command, regexp, languages, name, &block)
if File.exist?(file = File.dirname(__FILE__) + "/commands/#{command}")
command = file
end

markup_impl(symbol, CommandImplementation.new(regexp, command, name, &block))
markup_impl(symbol, CommandImplementation.new(regexp, languages, command, name, &block))
end

def can_render?(filename)
!!renderer(filename)
def can_render?(filename, content)
!!renderer(filename, content)
end

def renderer(filename)
def renderer(filename, content)
language = language(filename, content)
markup_impls.find { |impl|
impl.match?(filename)
impl.match?(filename, language)
}
end

def language(filename, content)
if defined?(::Linguist)
blob = Linguist::Blob.new(filename, content)
return Linguist.detect(blob, allow_empty: true)
end
end

# Define markups
markups_rb = File.dirname(__FILE__) + '/markups.rb'
instance_eval File.read(markups_rb), markups_rb
Expand Down
4 changes: 2 additions & 2 deletions lib/github/markup/command_implementation.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ class CommandError < RuntimeError
class CommandImplementation < Implementation
attr_reader :command, :block, :name

def initialize(regexp, command, name, &block)
super regexp
def initialize(regexp, languages, command, name, &block)
super(regexp, languages)
@command = command.to_s
@block = block
@name = name
Expand Down
4 changes: 2 additions & 2 deletions lib/github/markup/gem_implementation.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ module Markup
class GemImplementation < Implementation
attr_reader :gem_name, :renderer

def initialize(regexp, gem_name, &renderer)
super regexp
def initialize(regexp, languages, gem_name, &renderer)
super(regexp, languages)
@gem_name = gem_name.to_s
@renderer = renderer
end
Expand Down
18 changes: 14 additions & 4 deletions lib/github/markup/implementation.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,14 @@ module GitHub
module Markup
class Implementation
attr_reader :regexp
attr_reader :languages

def initialize(regexp)
def initialize(regexp, languages)
@regexp = regexp

if defined?(::Linguist)
@languages = languages.map {|l| Linguist::Language[l]}
end
end

def load
Expand All @@ -15,11 +20,16 @@ def render(content)
raise NotImplementedError, "subclasses of GitHub::Markup::Implementation must define #render"
end

def match?(filename)
file_ext_regexp =~ filename
def match?(filename, language)
if defined?(::Linguist)
languages.include? language
else
file_ext_regexp =~ filename
end
end

private
private

def file_ext_regexp
@file_ext_regexp ||= /\.(#{regexp})\z/
end
Expand Down
4 changes: 3 additions & 1 deletion lib/github/markup/markdown.rb
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@ class Markdown < Implementation
}

def initialize
super(/md|rmd|mkdn?|mdwn|mdown|markdown|litcoffee/i)
super(
/md|rmd|mkdn?|mdwn|mdown|markdown|litcoffee/i,
["Markdown", "RMarkdown", "Literate CoffeeScript"])
end

def load
Expand Down
2 changes: 1 addition & 1 deletion lib/github/markup/rdoc.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ module GitHub
module Markup
class RDoc < Implementation
def initialize
super(/rdoc/)
super(/rdoc/, ["RDoc"])
end

def render(content)
Expand Down
13 changes: 7 additions & 6 deletions lib/github/markups.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,30 +4,30 @@

markup_impl(::GitHub::Markups::MARKUP_MARKDOWN, ::GitHub::Markup::Markdown.new)

markup(::GitHub::Markups::MARKUP_TEXTILE, :redcloth, /textile/) do |content|
markup(::GitHub::Markups::MARKUP_TEXTILE, :redcloth, /textile/, ["Textile"]) do |content|
RedCloth.new(content).to_html
end

markup_impl(::GitHub::Markups::MARKUP_RDOC, GitHub::Markup::RDoc.new)

markup(::GitHub::Markups::MARKUP_ORG, 'org-ruby', /org/) do |content|
markup(::GitHub::Markups::MARKUP_ORG, 'org-ruby', /org/, ["Org"]) do |content|
Orgmode::Parser.new(content, {
:allow_include_files => false,
:skip_syntax_highlight => true
}).to_html
end

markup(::GitHub::Markups::MARKUP_CREOLE, :creole, /creole/) do |content|
markup(::GitHub::Markups::MARKUP_CREOLE, :creole, /creole/, ["Creole"]) do |content|
Creole.creolize(content)
end

markup(::GitHub::Markups::MARKUP_MEDIAWIKI, :wikicloth, /mediawiki|wiki/) do |content|
markup(::GitHub::Markups::MARKUP_MEDIAWIKI, :wikicloth, /mediawiki|wiki/, ["MediaWiki"]) do |content|
wikicloth = WikiCloth::WikiCloth.new(:data => content)
WikiCloth::WikiBuffer::HTMLElement::ESCAPED_TAGS << 'tt' unless WikiCloth::WikiBuffer::HTMLElement::ESCAPED_TAGS.include?('tt')
wikicloth.to_html(:noedit => true)
end

markup(::GitHub::Markups::MARKUP_ASCIIDOC, :asciidoctor, /adoc|asc(iidoc)?/) do |content|
markup(::GitHub::Markups::MARKUP_ASCIIDOC, :asciidoctor, /adoc|asc(iidoc)?/, ["AsciiDoc"]) do |content|
Asciidoctor::Compliance.unique_id_start_index = 1
Asciidoctor.convert(content, :safe => :secure, :attributes => %w(showtitle=@ idprefix idseparator=- env=github env-github source-highlighter=html-pipeline))
end
Expand All @@ -36,7 +36,8 @@
::GitHub::Markups::MARKUP_RST,
"python2 -S #{Shellwords.escape(File.dirname(__FILE__))}/commands/rest2html",
/re?st(\.txt)?/,
["reStructuredText"],
"restructuredtext"
)

command(::GitHub::Markups::MARKUP_POD, :pod2html, /pod/, "pod")
command(::GitHub::Markups::MARKUP_POD, :pod2html, /pod/, ["Pod"], "pod")
36 changes: 18 additions & 18 deletions test/markup_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -77,35 +77,35 @@ def call
end

def test_knows_what_it_can_and_cannot_render
assert_equal false, GitHub::Markup.can_render?('README.html')
assert_equal true, GitHub::Markup.can_render?('README.markdown')
assert_equal true, GitHub::Markup.can_render?('README.rmd')
assert_equal true, GitHub::Markup.can_render?('README.Rmd')
assert_equal false, GitHub::Markup.can_render?('README.cmd')
assert_equal true, GitHub::Markup.can_render?('README.litcoffee')
assert_equal false, GitHub::Markup.can_render?('README.html', '<h1>Title</h1>')
assert_equal true, GitHub::Markup.can_render?('README.markdown', '=== Title')
assert_equal true, GitHub::Markup.can_render?('README.rmd', '=== Title')
assert_equal true, GitHub::Markup.can_render?('README.Rmd', '=== Title')
assert_equal false, GitHub::Markup.can_render?('README.cmd', 'echo 1')
assert_equal true, GitHub::Markup.can_render?('README.litcoffee', 'Title')
end

def test_each_render_has_a_name
assert_equal "markdown", GitHub::Markup.renderer('README.md').name
assert_equal "redcloth", GitHub::Markup.renderer('README.textile').name
assert_equal "rdoc", GitHub::Markup.renderer('README.rdoc').name
assert_equal "org-ruby", GitHub::Markup.renderer('README.org').name
assert_equal "creole", GitHub::Markup.renderer('README.creole').name
assert_equal "wikicloth", GitHub::Markup.renderer('README.wiki').name
assert_equal "asciidoctor", GitHub::Markup.renderer('README.adoc').name
assert_equal "restructuredtext", GitHub::Markup.renderer('README.rst').name
assert_equal "pod", GitHub::Markup.renderer('README.pod').name
assert_equal "markdown", GitHub::Markup.renderer('README.md', '=== Title').name
assert_equal "redcloth", GitHub::Markup.renderer('README.textile', '* One').name
assert_equal "rdoc", GitHub::Markup.renderer('README.rdoc', '* One').name
assert_equal "org-ruby", GitHub::Markup.renderer('README.org', '* Title').name
assert_equal "creole", GitHub::Markup.renderer('README.creole', '= Title =').name
assert_equal "wikicloth", GitHub::Markup.renderer('README.wiki', '<h1>Title</h1>').name
assert_equal "asciidoctor", GitHub::Markup.renderer('README.adoc', '== Title').name
assert_equal "restructuredtext", GitHub::Markup.renderer('README.rst', 'Title').name
assert_equal "pod", GitHub::Markup.renderer('README.pod', '=begin').name
end

def test_rendering_by_symbol
assert_equal '<p><code>test</code></p>', GitHub::Markup.render_s(GitHub::Markups::MARKUP_MARKDOWN, '`test`').strip
end

def test_raises_error_if_command_exits_non_zero
GitHub::Markup.command(:doesntmatter, 'test/fixtures/fail.sh', /fail/, 'fail')
assert GitHub::Markup.can_render?('README.fail')
GitHub::Markup.command(:doesntmatter, 'test/fixtures/fail.sh', /fail/, ['Java'], 'fail')
assert GitHub::Markup.can_render?('README.java', 'stop swallowing errors')
begin
GitHub::Markup.render('README.fail', "stop swallowing errors")
GitHub::Markup.render('README.java', "stop swallowing errors")
rescue GitHub::Markup::CommandError => e
assert_equal "failure message", e.message
else
Expand Down

0 comments on commit e96dfcb

Please sign in to comment.