Skip to content

Commit e96dfcb

Browse files
author
Yuki Izumi
committed
Merge branch 'kivikakk/reintroduce-537'
2 parents 3087f06 + 665ab4d commit e96dfcb

9 files changed

Lines changed: 72 additions & 44 deletions

File tree

github-markup.gemspec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,5 @@ Gem::Specification.new do |s|
2424
s.add_development_dependency 'sanitize', '~> 2.1', '>= 2.1.0'
2525
s.add_development_dependency 'nokogiri', '1.6.8.1'
2626
s.add_development_dependency 'nokogiri-diff', '~> 0.2.0'
27+
s.add_development_dependency "github-linguist", "~> 5.0", ">= 5.0.8"
2728
end

lib/github/markup.rb

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
begin
2+
require "linguist"
3+
rescue LoadError
4+
# Rely on extensions instead.
5+
end
6+
17
require "github/markup/command_implementation"
28
require "github/markup/gem_implementation"
39

@@ -37,7 +43,7 @@ def preload!
3743
def render(filename, content = nil)
3844
content ||= File.read(filename)
3945

40-
if impl = renderer(filename)
46+
if impl = renderer(filename, content)
4147
impl.render(content)
4248
else
4349
content
@@ -53,9 +59,9 @@ def render_s(symbol, content)
5359
content
5460
end
5561
end
56-
57-
def markup(symbol, file, pattern, opts = {}, &block)
58-
markup_impl(symbol, GemImplementation.new(pattern, file, &block))
62+
63+
def markup(symbol, gem_name, regexp, languages, opts = {}, &block)
64+
markup_impl(symbol, GemImplementation.new(regexp, languages, gem_name, &block))
5965
end
6066

6167
def markup_impl(symbol, impl)
@@ -65,24 +71,32 @@ def markup_impl(symbol, impl)
6571
markups[symbol] = impl
6672
end
6773

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

73-
markup_impl(symbol, CommandImplementation.new(regexp, command, name, &block))
79+
markup_impl(symbol, CommandImplementation.new(regexp, languages, command, name, &block))
7480
end
7581

76-
def can_render?(filename)
77-
!!renderer(filename)
82+
def can_render?(filename, content)
83+
!!renderer(filename, content)
7884
end
7985

80-
def renderer(filename)
86+
def renderer(filename, content)
87+
language = language(filename, content)
8188
markup_impls.find { |impl|
82-
impl.match?(filename)
89+
impl.match?(filename, language)
8390
}
8491
end
8592

93+
def language(filename, content)
94+
if defined?(::Linguist)
95+
blob = Linguist::Blob.new(filename, content)
96+
return Linguist.detect(blob, allow_empty: true)
97+
end
98+
end
99+
86100
# Define markups
87101
markups_rb = File.dirname(__FILE__) + '/markups.rb'
88102
instance_eval File.read(markups_rb), markups_rb

lib/github/markup/command_implementation.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ class CommandError < RuntimeError
1515
class CommandImplementation < Implementation
1616
attr_reader :command, :block, :name
1717

18-
def initialize(regexp, command, name, &block)
19-
super regexp
18+
def initialize(regexp, languages, command, name, &block)
19+
super(regexp, languages)
2020
@command = command.to_s
2121
@block = block
2222
@name = name

lib/github/markup/gem_implementation.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ module Markup
55
class GemImplementation < Implementation
66
attr_reader :gem_name, :renderer
77

8-
def initialize(regexp, gem_name, &renderer)
9-
super regexp
8+
def initialize(regexp, languages, gem_name, &renderer)
9+
super(regexp, languages)
1010
@gem_name = gem_name.to_s
1111
@renderer = renderer
1212
end

lib/github/markup/implementation.rb

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,14 @@ module GitHub
22
module Markup
33
class Implementation
44
attr_reader :regexp
5+
attr_reader :languages
56

6-
def initialize(regexp)
7+
def initialize(regexp, languages)
78
@regexp = regexp
9+
10+
if defined?(::Linguist)
11+
@languages = languages.map {|l| Linguist::Language[l]}
12+
end
813
end
914

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

18-
def match?(filename)
19-
file_ext_regexp =~ filename
23+
def match?(filename, language)
24+
if defined?(::Linguist)
25+
languages.include? language
26+
else
27+
file_ext_regexp =~ filename
28+
end
2029
end
2130

22-
private
31+
private
32+
2333
def file_ext_regexp
2434
@file_ext_regexp ||= /\.(#{regexp})\z/
2535
end

lib/github/markup/markdown.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ class Markdown < Implementation
2828
}
2929

3030
def initialize
31-
super(/md|rmd|mkdn?|mdwn|mdown|markdown|litcoffee/i)
31+
super(
32+
/md|rmd|mkdn?|mdwn|mdown|markdown|litcoffee/i,
33+
["Markdown", "RMarkdown", "Literate CoffeeScript"])
3234
end
3335

3436
def load

lib/github/markup/rdoc.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ module GitHub
66
module Markup
77
class RDoc < Implementation
88
def initialize
9-
super(/rdoc/)
9+
super(/rdoc/, ["RDoc"])
1010
end
1111

1212
def render(content)

lib/github/markups.rb

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,30 +4,30 @@
44

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

7-
markup(::GitHub::Markups::MARKUP_TEXTILE, :redcloth, /textile/) do |content|
7+
markup(::GitHub::Markups::MARKUP_TEXTILE, :redcloth, /textile/, ["Textile"]) do |content|
88
RedCloth.new(content).to_html
99
end
1010

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

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

20-
markup(::GitHub::Markups::MARKUP_CREOLE, :creole, /creole/) do |content|
20+
markup(::GitHub::Markups::MARKUP_CREOLE, :creole, /creole/, ["Creole"]) do |content|
2121
Creole.creolize(content)
2222
end
2323

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

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

42-
command(::GitHub::Markups::MARKUP_POD, :pod2html, /pod/, "pod")
43+
command(::GitHub::Markups::MARKUP_POD, :pod2html, /pod/, ["Pod"], "pod")

test/markup_test.rb

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -77,35 +77,35 @@ def call
7777
end
7878

7979
def test_knows_what_it_can_and_cannot_render
80-
assert_equal false, GitHub::Markup.can_render?('README.html')
81-
assert_equal true, GitHub::Markup.can_render?('README.markdown')
82-
assert_equal true, GitHub::Markup.can_render?('README.rmd')
83-
assert_equal true, GitHub::Markup.can_render?('README.Rmd')
84-
assert_equal false, GitHub::Markup.can_render?('README.cmd')
85-
assert_equal true, GitHub::Markup.can_render?('README.litcoffee')
80+
assert_equal false, GitHub::Markup.can_render?('README.html', '<h1>Title</h1>')
81+
assert_equal true, GitHub::Markup.can_render?('README.markdown', '=== Title')
82+
assert_equal true, GitHub::Markup.can_render?('README.rmd', '=== Title')
83+
assert_equal true, GitHub::Markup.can_render?('README.Rmd', '=== Title')
84+
assert_equal false, GitHub::Markup.can_render?('README.cmd', 'echo 1')
85+
assert_equal true, GitHub::Markup.can_render?('README.litcoffee', 'Title')
8686
end
8787

8888
def test_each_render_has_a_name
89-
assert_equal "markdown", GitHub::Markup.renderer('README.md').name
90-
assert_equal "redcloth", GitHub::Markup.renderer('README.textile').name
91-
assert_equal "rdoc", GitHub::Markup.renderer('README.rdoc').name
92-
assert_equal "org-ruby", GitHub::Markup.renderer('README.org').name
93-
assert_equal "creole", GitHub::Markup.renderer('README.creole').name
94-
assert_equal "wikicloth", GitHub::Markup.renderer('README.wiki').name
95-
assert_equal "asciidoctor", GitHub::Markup.renderer('README.adoc').name
96-
assert_equal "restructuredtext", GitHub::Markup.renderer('README.rst').name
97-
assert_equal "pod", GitHub::Markup.renderer('README.pod').name
89+
assert_equal "markdown", GitHub::Markup.renderer('README.md', '=== Title').name
90+
assert_equal "redcloth", GitHub::Markup.renderer('README.textile', '* One').name
91+
assert_equal "rdoc", GitHub::Markup.renderer('README.rdoc', '* One').name
92+
assert_equal "org-ruby", GitHub::Markup.renderer('README.org', '* Title').name
93+
assert_equal "creole", GitHub::Markup.renderer('README.creole', '= Title =').name
94+
assert_equal "wikicloth", GitHub::Markup.renderer('README.wiki', '<h1>Title</h1>').name
95+
assert_equal "asciidoctor", GitHub::Markup.renderer('README.adoc', '== Title').name
96+
assert_equal "restructuredtext", GitHub::Markup.renderer('README.rst', 'Title').name
97+
assert_equal "pod", GitHub::Markup.renderer('README.pod', '=begin').name
9898
end
9999

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

104104
def test_raises_error_if_command_exits_non_zero
105-
GitHub::Markup.command(:doesntmatter, 'test/fixtures/fail.sh', /fail/, 'fail')
106-
assert GitHub::Markup.can_render?('README.fail')
105+
GitHub::Markup.command(:doesntmatter, 'test/fixtures/fail.sh', /fail/, ['Java'], 'fail')
106+
assert GitHub::Markup.can_render?('README.java', 'stop swallowing errors')
107107
begin
108-
GitHub::Markup.render('README.fail', "stop swallowing errors")
108+
GitHub::Markup.render('README.java', "stop swallowing errors")
109109
rescue GitHub::Markup::CommandError => e
110110
assert_equal "failure message", e.message
111111
else

0 commit comments

Comments
 (0)