mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
Replace Lexer with Pygments::Lexer
This commit is contained in:
2
Gemfile
2
Gemfile
@@ -1,2 +1,4 @@
|
|||||||
source :rubygems
|
source :rubygems
|
||||||
gemspec
|
gemspec
|
||||||
|
|
||||||
|
gem 'pygments.rb', :git => 'git://github.com/tmm1/pygments.rb.git'
|
||||||
|
|||||||
14
Rakefile
14
Rakefile
@@ -1,4 +1,3 @@
|
|||||||
require 'rake/clean'
|
|
||||||
require 'rake/testtask'
|
require 'rake/testtask'
|
||||||
|
|
||||||
task :default => :test
|
task :default => :test
|
||||||
@@ -6,16 +5,3 @@ task :default => :test
|
|||||||
Rake::TestTask.new do |t|
|
Rake::TestTask.new do |t|
|
||||||
t.warning = true
|
t.warning = true
|
||||||
end
|
end
|
||||||
|
|
||||||
CLOBBER.include 'lib/linguist/lexers.yml'
|
|
||||||
|
|
||||||
file 'lib/linguist/lexers.yml' do |f|
|
|
||||||
# GitHub vendored pygments path
|
|
||||||
# vendor/python/pygments
|
|
||||||
path = File.expand_path('../../../python/pygments', __FILE__)
|
|
||||||
ENV['PYTHONPATH'] = path if File.directory?(path)
|
|
||||||
|
|
||||||
sh "python ./bin/pygments-lexers > #{f.name}"
|
|
||||||
end
|
|
||||||
|
|
||||||
task :lexers => 'lib/linguist/lexers.yml'
|
|
||||||
|
|||||||
@@ -1,27 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
from pygments import __version__
|
|
||||||
from pygments.lexers import get_all_lexers
|
|
||||||
|
|
||||||
print "# AUTOMATICALLY GENERATED BY bin/pygments-lexers"
|
|
||||||
print "# DO NOT MODIFIY. YOUR PULL WILL BE REJECTED."
|
|
||||||
print "# Pygments version %s" % __version__
|
|
||||||
print "---"
|
|
||||||
|
|
||||||
for name, aliases, filenames, mimetypes in get_all_lexers():
|
|
||||||
print "%s:" % name
|
|
||||||
|
|
||||||
if any(aliases):
|
|
||||||
print " aliases:"
|
|
||||||
for alias in aliases:
|
|
||||||
print " - '%s'" % alias
|
|
||||||
|
|
||||||
if any(filenames):
|
|
||||||
print " filenames:"
|
|
||||||
for filename in filenames:
|
|
||||||
print " - '%s'" % filename
|
|
||||||
|
|
||||||
if any(mimetypes):
|
|
||||||
print " mimetypes:"
|
|
||||||
for mimetype in mimetypes:
|
|
||||||
print " - '%s'" % mimetype
|
|
||||||
@@ -3,6 +3,7 @@ require 'linguist/mime'
|
|||||||
require 'linguist/pathname'
|
require 'linguist/pathname'
|
||||||
|
|
||||||
require 'escape_utils'
|
require 'escape_utils'
|
||||||
|
require 'pygments'
|
||||||
require 'yaml'
|
require 'yaml'
|
||||||
|
|
||||||
module Linguist
|
module Linguist
|
||||||
@@ -343,7 +344,7 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# Returns a Lexer.
|
# Returns a Lexer.
|
||||||
def lexer
|
def lexer
|
||||||
language ? language.lexer : Lexer['Text only']
|
language ? language.lexer : Pygments::Lexer.find_by_name('Text only')
|
||||||
end
|
end
|
||||||
|
|
||||||
# Internal: Disambiguates between multiple language extensions.
|
# Internal: Disambiguates between multiple language extensions.
|
||||||
@@ -512,19 +513,27 @@ module Linguist
|
|||||||
|
|
||||||
# Public: Highlight syntax of blob
|
# Public: Highlight syntax of blob
|
||||||
#
|
#
|
||||||
|
# options - A Hash of options (defaults to {})
|
||||||
|
#
|
||||||
# Returns html String
|
# Returns html String
|
||||||
def colorize
|
def colorize(options = {})
|
||||||
return if !text? || large?
|
return if !text? || large?
|
||||||
lexer.colorize(data)
|
lexer.highlight(data, options)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Highlight syntax of blob without the outer highlight div
|
# Public: Highlight syntax of blob without the outer highlight div
|
||||||
# wrapper.
|
# wrapper.
|
||||||
#
|
#
|
||||||
|
# options - A Hash of options (defaults to {})
|
||||||
|
#
|
||||||
# Returns html String
|
# Returns html String
|
||||||
def colorize_without_wrapper
|
def colorize_without_wrapper(options = {})
|
||||||
return if !text? || large?
|
return if !text? || large?
|
||||||
lexer.colorize_without_wrapper(data)
|
if text = lexer.highlight(data, options)
|
||||||
|
text[%r{<div class="highlight"><pre>(.*?)</pre>\s*</div>}m, 1]
|
||||||
|
else
|
||||||
|
''
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
Language.overridden_extensions.each do |extension|
|
Language.overridden_extensions.each do |extension|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
require 'linguist/lexer'
|
|
||||||
|
|
||||||
require 'yaml'
|
require 'yaml'
|
||||||
|
require 'pygments'
|
||||||
|
|
||||||
module Linguist
|
module Linguist
|
||||||
# Language names that are recognizable by GitHub. Defined languages
|
# Language names that are recognizable by GitHub. Defined languages
|
||||||
@@ -211,7 +210,7 @@ module Linguist
|
|||||||
@aliases = [default_alias_name] + (attributes[:aliases] || [])
|
@aliases = [default_alias_name] + (attributes[:aliases] || [])
|
||||||
|
|
||||||
# Lookup Lexer object
|
# Lookup Lexer object
|
||||||
@lexer = Lexer.find_by_name(attributes[:lexer] || name) ||
|
@lexer = Pygments::Lexer.find_by_name(attributes[:lexer] || name) ||
|
||||||
raise(ArgumentError, "#{@name} is missing lexer")
|
raise(ArgumentError, "#{@name} is missing lexer")
|
||||||
|
|
||||||
# Set legacy search term
|
# Set legacy search term
|
||||||
@@ -370,21 +369,12 @@ module Linguist
|
|||||||
|
|
||||||
# Public: Highlight syntax of text
|
# Public: Highlight syntax of text
|
||||||
#
|
#
|
||||||
# text - String of code to be highlighted
|
# text - String of code to be highlighted
|
||||||
|
# options - A Hash of options (defaults to {})
|
||||||
#
|
#
|
||||||
# Returns html String
|
# Returns html String
|
||||||
def colorize(text)
|
def colorize(text, options = {})
|
||||||
lexer.colorize(text)
|
lexer.highlight(text, options = {})
|
||||||
end
|
|
||||||
|
|
||||||
# Public: Highlight syntax of text without the outer highlight div
|
|
||||||
# wrapper.
|
|
||||||
#
|
|
||||||
# text - String of code to be highlighted
|
|
||||||
#
|
|
||||||
# Returns html String
|
|
||||||
def colorize_without_wrapper(text)
|
|
||||||
lexer.colorize_without_wrapper(text)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Return name as String representation
|
# Public: Return name as String representation
|
||||||
|
|||||||
@@ -1,167 +0,0 @@
|
|||||||
require 'pygments'
|
|
||||||
require 'yaml'
|
|
||||||
|
|
||||||
module Linguist
|
|
||||||
# Mirror of Pygments Lexer structure.
|
|
||||||
#
|
|
||||||
# name - Proper lexer name (JavaScript, Ruby, Python)
|
|
||||||
# aliases - Aliases for lookup (js, javascript)
|
|
||||||
# filenames - Filename globs (*.js)
|
|
||||||
# mimetypes - Mime types (application/javascript)
|
|
||||||
class Lexer < Struct.new(:name, :aliases, :filenames, :mimetypes)
|
|
||||||
@lexers = []
|
|
||||||
@index = {}
|
|
||||||
@name_index = {}
|
|
||||||
@alias_index = {}
|
|
||||||
@mimetypes_index = {}
|
|
||||||
|
|
||||||
# Internal: Create a new Lexer object
|
|
||||||
#
|
|
||||||
# name - Name of Lexer
|
|
||||||
# attrs - A hash of attributes
|
|
||||||
#
|
|
||||||
# Returns a Lexer object
|
|
||||||
def self.create(name, attrs)
|
|
||||||
name = name
|
|
||||||
aliases = attrs['aliases'] || []
|
|
||||||
filenames = attrs['filenames'] || []
|
|
||||||
mimetypes = attrs['mimetypes'] || []
|
|
||||||
|
|
||||||
@lexers << lexer = new(name, aliases, filenames, mimetypes)
|
|
||||||
|
|
||||||
# All Lexer names should be unique. Warn if there is a duplicate.
|
|
||||||
if @name_index.key?(lexer.name)
|
|
||||||
warn "Duplicate lexer name: #{lexer.name}"
|
|
||||||
end
|
|
||||||
|
|
||||||
@index[lexer.name] = @name_index[lexer.name] = lexer
|
|
||||||
|
|
||||||
lexer.aliases.each do |name|
|
|
||||||
# All Lexer aliases should be unique. Warn if there is a duplicate.
|
|
||||||
if @alias_index.key?(name)
|
|
||||||
warn "Duplicate alias: #{name}"
|
|
||||||
end
|
|
||||||
|
|
||||||
@index[name] = @alias_index[name] = lexer
|
|
||||||
end
|
|
||||||
|
|
||||||
lexer.mimetypes.each do |type|
|
|
||||||
# All Lexer mimetypes should be unique. Warn if there is a duplicate.
|
|
||||||
if @mimetypes_index.key?(name)
|
|
||||||
warn "Duplicate mimetype: #{name}"
|
|
||||||
end
|
|
||||||
|
|
||||||
@mimetypes_index[type] = lexer
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Public: Get all Lexers
|
|
||||||
#
|
|
||||||
# Returns an Array of Lexers
|
|
||||||
def self.all
|
|
||||||
@lexers
|
|
||||||
end
|
|
||||||
|
|
||||||
# Public: Look up Lexer by name or alias.
|
|
||||||
#
|
|
||||||
# name - A String name or alias
|
|
||||||
#
|
|
||||||
# Lexer['Ruby']
|
|
||||||
# => #<Lexer name="Ruby">
|
|
||||||
#
|
|
||||||
# Returns the Lexer or nil if none was found.
|
|
||||||
def self.[](name)
|
|
||||||
@index[name]
|
|
||||||
end
|
|
||||||
|
|
||||||
# Public: Look up Lexer by its proper name.
|
|
||||||
#
|
|
||||||
# name - The String name of the Lexer
|
|
||||||
#
|
|
||||||
# Examples
|
|
||||||
#
|
|
||||||
# Lexer.find_by_name('Ruby')
|
|
||||||
# # => #<Lexer name="Ruby">
|
|
||||||
#
|
|
||||||
# Returns the Lexer or nil if none was found.
|
|
||||||
def self.find_by_name(name)
|
|
||||||
@name_index[name]
|
|
||||||
end
|
|
||||||
|
|
||||||
# Public: Look up Lexer by one of its aliases.
|
|
||||||
#
|
|
||||||
# name - A String alias of the Lexer
|
|
||||||
#
|
|
||||||
# Examples
|
|
||||||
#
|
|
||||||
# Lexer.find_by_alias('rb')
|
|
||||||
# # => #<Lexer name="Ruby">
|
|
||||||
#
|
|
||||||
# Returns the Lexer or nil if none was found.
|
|
||||||
def self.find_by_alias(name)
|
|
||||||
@alias_index[name]
|
|
||||||
end
|
|
||||||
|
|
||||||
# Public: Look up Lexer by one of it's mime types.
|
|
||||||
#
|
|
||||||
# type - A mime type String.
|
|
||||||
#
|
|
||||||
# Examples
|
|
||||||
#
|
|
||||||
# Lexer.find_by_mimetype('application/x-ruby')
|
|
||||||
# # => #<Lexer name="Ruby">
|
|
||||||
#
|
|
||||||
# Returns the Lexer or nil if none was found.
|
|
||||||
def self.find_by_mimetype(type)
|
|
||||||
@mimetypes_index[type]
|
|
||||||
end
|
|
||||||
|
|
||||||
# Public: Return a alias of the Lexer to pass to Pygments.
|
|
||||||
#
|
|
||||||
# The alias we choose is arbitrary.
|
|
||||||
#
|
|
||||||
# Returns the alias String
|
|
||||||
def to_s
|
|
||||||
aliases.first
|
|
||||||
end
|
|
||||||
|
|
||||||
# Public: Highlight syntax of text
|
|
||||||
#
|
|
||||||
# text - String of code to be highlighted
|
|
||||||
#
|
|
||||||
# Returns html String
|
|
||||||
def colorize(text)
|
|
||||||
Pygments.highlight(text, :lexer => aliases.first, :options => {:stripnl => false})
|
|
||||||
end
|
|
||||||
|
|
||||||
# Public: Highlight syntax of text without the outer highlight div
|
|
||||||
# wrapper.
|
|
||||||
#
|
|
||||||
# text - String of code to be highlighted
|
|
||||||
#
|
|
||||||
# Returns html String
|
|
||||||
def colorize_without_wrapper(text)
|
|
||||||
if text = colorize(text)
|
|
||||||
text[%r{<div class="highlight"><pre>(.*?)</pre>\s*</div>}m, 1]
|
|
||||||
else
|
|
||||||
''
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def ==(other)
|
|
||||||
eql?(other)
|
|
||||||
end
|
|
||||||
|
|
||||||
def eql?(other)
|
|
||||||
equal?(other)
|
|
||||||
end
|
|
||||||
|
|
||||||
# Load lexers from lexers.yml
|
|
||||||
#
|
|
||||||
# `bin/pygments-lexers` dumps a YAML list of all the available
|
|
||||||
# Pygments lexers.
|
|
||||||
YAML.load_file(File.expand_path("../lexers.yml", __FILE__)).each do |name, attrs|
|
|
||||||
Lexer.create(name, attrs)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,6 @@
|
|||||||
require 'linguist/language'
|
require 'linguist/language'
|
||||||
require 'linguist/mime'
|
require 'linguist/mime'
|
||||||
|
require 'pygments'
|
||||||
|
|
||||||
module Linguist
|
module Linguist
|
||||||
# Similar to ::Pathname, Linguist::Pathname wraps a path string and
|
# Similar to ::Pathname, Linguist::Pathname wraps a path string and
|
||||||
@@ -61,7 +62,7 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# Returns a Lexer.
|
# Returns a Lexer.
|
||||||
def lexer
|
def lexer
|
||||||
language ? language.lexer : Lexer['Text only']
|
language ? language.lexer : Pygments::Lexer.find_by_name('Text only')
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Get the mime type
|
# Public: Get the mime type
|
||||||
|
|||||||
@@ -2,10 +2,13 @@ require 'linguist/file_blob'
|
|||||||
|
|
||||||
require 'test/unit'
|
require 'test/unit'
|
||||||
require 'mime/types'
|
require 'mime/types'
|
||||||
|
require 'pygments'
|
||||||
|
|
||||||
class TestBlob < Test::Unit::TestCase
|
class TestBlob < Test::Unit::TestCase
|
||||||
include Linguist
|
include Linguist
|
||||||
|
|
||||||
|
Lexer = Pygments::Lexer
|
||||||
|
|
||||||
def fixtures_path
|
def fixtures_path
|
||||||
File.expand_path("../fixtures", __FILE__)
|
File.expand_path("../fixtures", __FILE__)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,10 +1,13 @@
|
|||||||
require 'linguist/language'
|
require 'linguist/language'
|
||||||
|
|
||||||
require 'test/unit'
|
require 'test/unit'
|
||||||
|
require 'pygments'
|
||||||
|
|
||||||
class TestLanguage < Test::Unit::TestCase
|
class TestLanguage < Test::Unit::TestCase
|
||||||
include Linguist
|
include Linguist
|
||||||
|
|
||||||
|
Lexer = Pygments::Lexer
|
||||||
|
|
||||||
def test_ambiguous_extensions
|
def test_ambiguous_extensions
|
||||||
assert Language.ambiguous?('.h')
|
assert Language.ambiguous?('.h')
|
||||||
assert_equal Language['C'], Language.find_by_extension('h')
|
assert_equal Language['C'], Language.find_by_extension('h')
|
||||||
@@ -311,26 +314,4 @@ class TestLanguage < Test::Unit::TestCase
|
|||||||
</div>
|
</div>
|
||||||
HTML
|
HTML
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_colorize_without_wrapper
|
|
||||||
assert_equal <<-HTML, Language['Text'].colorize_without_wrapper("Hello")
|
|
||||||
Hello
|
|
||||||
HTML
|
|
||||||
|
|
||||||
assert_equal <<-HTML, Language['Ruby'].colorize_without_wrapper("def foo\n 'foo'\nend\n")
|
|
||||||
<span class="k">def</span> <span class="nf">foo</span>
|
|
||||||
<span class="s1">'foo'</span>
|
|
||||||
<span class="k">end</span>
|
|
||||||
HTML
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_colorize_doesnt_strip_newlines
|
|
||||||
assert_equal <<-HTML, Language['Ruby'].colorize_without_wrapper("\n\n# Foo\ndef 'foo'\nend\n")
|
|
||||||
|
|
||||||
|
|
||||||
<span class="c1"># Foo</span>
|
|
||||||
<span class="k">def</span> <span class="s1">'foo'</span>
|
|
||||||
<span class="k">end</span>
|
|
||||||
HTML
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,91 +0,0 @@
|
|||||||
require 'linguist/lexer'
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
|
|
||||||
class TestLexer < Test::Unit::TestCase
|
|
||||||
include Linguist
|
|
||||||
|
|
||||||
def test_find_by_name
|
|
||||||
assert_equal Lexer['Ruby'], Lexer.find_by_name('Ruby')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_find_all_by_name
|
|
||||||
Lexer.all.each do |lexer|
|
|
||||||
assert_equal lexer, Lexer.find_by_name(lexer.name)
|
|
||||||
assert_equal lexer, Lexer[lexer.name]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_find_by_alias
|
|
||||||
assert_equal Lexer['Ruby'], Lexer.find_by_alias('rb')
|
|
||||||
assert_equal Lexer['Ruby'], Lexer.find_by_alias('ruby')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_find_all_by_alias
|
|
||||||
Lexer.all.each do |lexer|
|
|
||||||
lexer.aliases.each do |name|
|
|
||||||
assert_equal lexer, Lexer.find_by_alias(name)
|
|
||||||
assert_equal lexer, Lexer[name]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_find_by_mimetype
|
|
||||||
assert_equal Lexer['Ruby'], Lexer.find_by_mimetype('text/x-ruby')
|
|
||||||
assert_equal Lexer['Ruby'], Lexer.find_by_mimetype('application/x-ruby')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_find_all_by_mimetype
|
|
||||||
Lexer.all.each do |lexer|
|
|
||||||
lexer.mimetypes.each do |type|
|
|
||||||
assert_equal lexer, Lexer.find_by_mimetype(type)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_name
|
|
||||||
assert_equal 'Ruby', Lexer['Ruby'].name
|
|
||||||
assert_equal 'Python', Lexer['Python'].name
|
|
||||||
assert_equal 'Perl', Lexer['Perl'].name
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_aliases
|
|
||||||
assert_equal ['rb', 'ruby', 'duby'], Lexer['Ruby'].aliases
|
|
||||||
assert_equal ['python', 'py'], Lexer['Python'].aliases
|
|
||||||
assert_equal ['perl', 'pl'], Lexer['Perl'].aliases
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_eql
|
|
||||||
assert Lexer['Ruby'].eql?(Lexer['Ruby'])
|
|
||||||
assert !Lexer['Ruby'].eql?(Lexer['Python'])
|
|
||||||
assert !Lexer['Ruby'].eql?(Lexer.new('Ruby'))
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_colorize
|
|
||||||
assert_equal <<-HTML, Lexer['Text only'].colorize("Hello")
|
|
||||||
<div class="highlight"><pre>Hello
|
|
||||||
</pre>
|
|
||||||
</div>
|
|
||||||
HTML
|
|
||||||
|
|
||||||
assert_equal <<-HTML, Lexer['Ruby'].colorize("def foo\n 'foo'\nend\n")
|
|
||||||
<div class="highlight"><pre><span class="k">def</span> <span class="nf">foo</span>
|
|
||||||
<span class="s1">'foo'</span>
|
|
||||||
<span class="k">end</span>
|
|
||||||
</pre>
|
|
||||||
</div>
|
|
||||||
HTML
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_colorize_without_wrapper
|
|
||||||
assert_equal <<-HTML, Lexer['Text only'].colorize_without_wrapper("Hello")
|
|
||||||
Hello
|
|
||||||
HTML
|
|
||||||
|
|
||||||
assert_equal <<-HTML, Lexer['Ruby'].colorize_without_wrapper("def foo\n 'foo'\nend\n")
|
|
||||||
<span class="k">def</span> <span class="nf">foo</span>
|
|
||||||
<span class="s1">'foo'</span>
|
|
||||||
<span class="k">end</span>
|
|
||||||
HTML
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@@ -1,10 +1,13 @@
|
|||||||
require 'linguist/pathname'
|
require 'linguist/pathname'
|
||||||
|
|
||||||
require 'test/unit'
|
require 'test/unit'
|
||||||
|
require 'pygments'
|
||||||
|
|
||||||
class TestPathname < Test::Unit::TestCase
|
class TestPathname < Test::Unit::TestCase
|
||||||
include Linguist
|
include Linguist
|
||||||
|
|
||||||
|
Lexer = Pygments::Lexer
|
||||||
|
|
||||||
def test_to_s
|
def test_to_s
|
||||||
assert_equal "file.rb", Pathname.new("file.rb").to_s
|
assert_equal "file.rb", Pathname.new("file.rb").to_s
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user