class Linguist::Language

Language names that are recognizable by GitHub. Defined languages can be highlighted, searched and listed under the Top Languages page.

Languages are defined in `lib/linguist/languages.yml`.

Constants

TYPES

Valid Languages types

Attributes

ace_mode[R]

Public: Get Ace mode

Examples

# => "text"
# => "javascript"
# => "c_cpp"

Returns a String name or nil

aliases[R]

Public: Get aliases

Examples

Language['C++'].aliases
# => ["cpp"]

Returns an Array of String names

codemirror_mime_type[R]

Public: Get CodeMirror MIME type mode

Examples

# => "nil"
# => "text/x-javascript"
# => "text/x-csrc"

Returns a String name or nil

codemirror_mode[R]

Public: Get CodeMirror mode

Maps to a directory in the `mode/` source code.

https://github.com/codemirror/CodeMirror/tree/master/mode

Examples

# => "nil"
# => "javascript"
# => "clike"

Returns a String name or nil

color[R]

Public: Get color.

Returns a hex color String.

extensions[R]

Public: Get extensions

Examples

# => ['.rb', '.rake', ...]

Returns the extensions Array

filenames[R]

Public: Get filenames

Examples

# => ['Rakefile', ...]

Returns the extensions Array

interpreters[R]

Public: Get interpreters

Examples

# => ['awk', 'gawk', 'mawk' ...]

Returns the interpreters Array

language_id[R]

Public: Get #language_id (used in GitHub search)

Examples

# => "1"
# => "2"
# => "3"

Returns the integer #language_id

name[R]

Public: Get proper name

Examples

# => "Ruby"
# => "Python"
# => "Perl"

Returns the name String

tm_scope[R]

Public: Get the name of a TextMate-compatible scope

Returns the scope

type[R]

Public: Get type.

Returns a type Symbol or nil.

wrap[R]

Public: Should language lines be wrapped

Returns true or false

Public Class Methods

[](name) click to toggle source

Public: Look up Language by its name.

name - The String name of the Language

Examples

Language['Ruby']
# => #<Language name="Ruby">

Language['ruby']
# => #<Language name="Ruby">

Returns the Language or nil if none was found.

# File lib/linguist/language.rb, line 216
def self.[](name)
  return nil if name.to_s.empty?

  lang = @index[name.downcase]
  return lang if lang

  name = name.split(',').first
  return nil if name.to_s.empty?

  @index[name.downcase]
end
all() click to toggle source

Public: Get all Languages

Returns an Array of Languages

# File lib/linguist/language.rb, line 97
def self.all
  @languages
end
by_type(type) click to toggle source

Detect languages by a specific type

type - A symbol that exists within TYPES

Returns an array

# File lib/linguist/language.rb, line 42
def self.by_type(type)
  all.select { |h| h.type == type }
end
colors() click to toggle source

Public: A List of languages with assigned colors.

Returns an Array of Languages.

# File lib/linguist/language.rb, line 255
def self.colors
  @colors ||= all.select(&:color).sort_by { |lang| lang.name.downcase }
end
create(attributes = {}) click to toggle source

Internal: Create a new Language object

attributes - A hash of attributes

Returns a Language object

# File lib/linguist/language.rb, line 51
def self.create(attributes = {})
  language = new(attributes)

  @languages << language

  # All Language names should be unique. Raise if there is a duplicate.
  if @name_index.key?(language.name)
    raise ArgumentError, "Duplicate language name: #{language.name}"
  end

  # Language name index
  @index[language.name.downcase] = @name_index[language.name.downcase] = language

  language.aliases.each do |name|
    # All Language aliases should be unique. Raise if there is a duplicate.
    if @alias_index.key?(name)
      raise ArgumentError, "Duplicate alias: #{name}"
    end

    @index[name.downcase] = @alias_index[name.downcase] = language
  end

  language.extensions.each do |extension|
    if extension !~ /^\./
      raise ArgumentError, "Extension is missing a '.': #{extension.inspect}"
    end

    @extension_index[extension.downcase] << language
  end

  language.interpreters.each do |interpreter|
    @interpreter_index[interpreter] << language
  end

  language.filenames.each do |filename|
    @filename_index[filename] << language
  end

  @language_id_index[language.language_id] = language

  language
end
find_by_alias(name) click to toggle source

Public: Look up Language by one of its aliases.

name - A String alias of the Language

Examples

Language.find_by_alias('cpp')
# => #<Language name="C++">

Returns the Language or nil if none was found.

# File lib/linguist/language.rb, line 126
def self.find_by_alias(name)
  return nil if name.to_s.empty?
  name && (@alias_index[name.downcase] || @alias_index[name.split(',').first.downcase])
end
find_by_extension(filename) click to toggle source

Public: Look up Languages by file extension.

The behaviour of this method recently changed. See the second example below.

filename - The path String.

Examples

Language.find_by_extension('dummy.rb')
# => [#<Language name="Ruby">]
Language.find_by_extension('rb')
# => []

Returns all matching Languages or [] if none were found.

# File lib/linguist/language.rb, line 166
def self.find_by_extension(filename)
  # find the first extension with language definitions
  extname = FileBlob.new(filename.downcase).extensions.detect do |e|
    !@extension_index[e].empty?
  end

  @extension_index[extname]
end
find_by_filename(filename) click to toggle source

Public: Look up Languages by filename.

The behaviour of this method recently changed. See the second example below.

filename - The path String.

Examples

Language.find_by_filename('Cakefile')
# => [#<Language name="CoffeeScript">]
Language.find_by_filename('foo.rb')
# => []

Returns all matching Languages or [] if none were found.

# File lib/linguist/language.rb, line 146
def self.find_by_filename(filename)
  basename = File.basename(filename)
  @filename_index[basename]
end
find_by_id(language_id) click to toggle source

Public: Look up Languages by its language_id.

#language_id - Integer of #language_id

Examples

Language.find_by_id(100)
# => [#<Language name="Elixir">]

Returns the matching Language

# File lib/linguist/language.rb, line 199
def self.find_by_id(language_id)
  @language_id_index[language_id.to_i]
end
find_by_interpreter(interpreter) click to toggle source

Public: Look up Languages by interpreter.

interpreter - String of interpreter name

Examples

Language.find_by_interpreter("bash")
# => [#<Language name="Bash">]

Returns the matching Language

# File lib/linguist/language.rb, line 185
def self.find_by_interpreter(interpreter)
  @interpreter_index[interpreter]
end
find_by_name(name) click to toggle source

Public: Look up Language by its proper name.

name - The String name of the Language

Examples

Language.find_by_name('Ruby')
# => #<Language name="Ruby">

Returns the Language or nil if none was found.

# File lib/linguist/language.rb, line 111
def self.find_by_name(name)
  return nil if name.to_s.empty?
  name && (@name_index[name.downcase] || @name_index[name.split(',').first.downcase])
end
new(attributes = {}) click to toggle source

Internal: Initialize a new Language

attributes - A hash of attributes

# File lib/linguist/language.rb, line 262
def initialize(attributes = {})
  # @name is required
  @name = attributes[:name] || raise(ArgumentError, "missing name")

  # Set type
  @type = attributes[:type] ? attributes[:type].to_sym : nil
  if @type && !TYPES.include?(@type)
    raise ArgumentError, "invalid type: #{@type}"
  end

  @color = attributes[:color]

  # Set aliases
  @aliases = [default_alias] + (attributes[:aliases] || [])

  # Load the TextMate scope name or try to guess one
  @tm_scope = attributes[:tm_scope] || begin
    context = case @type
              when :data, :markup, :prose
                'text'
              when :programming, nil
                'source'
              end
    "#{context}.#{@name.downcase}"
  end

  @ace_mode = attributes[:ace_mode]
  @codemirror_mode = attributes[:codemirror_mode]
  @codemirror_mime_type = attributes[:codemirror_mime_type]
  @wrap = attributes[:wrap] || false

  # Set the language_id
  @language_id = attributes[:language_id]

  # Set extensions or default to [].
  @extensions = attributes[:extensions] || []
  @interpreters = attributes[:interpreters]   || []
  @filenames  = attributes[:filenames]  || []

  # Set popular, and searchable flags
  @popular    = attributes.key?(:popular)    ? attributes[:popular]    : false
  @searchable = attributes.key?(:searchable) ? attributes[:searchable] : true

  # If group name is set, save the name so we can lazy load it later
  if attributes[:group_name]
    @group = nil
    @group_name = attributes[:group_name]

  # Otherwise we can set it to self now
  else
    @group = self
  end
end
unpopular() click to toggle source

Public: A List of non-popular languages

Unpopular languages appear below popular ones in language chooser dropdowns.

This list is created from all the languages not listed in “popular.yml”.

Returns an Array of Languages.

# File lib/linguist/language.rb, line 248
def self.unpopular
  @unpopular ||= all.select(&:unpopular?).sort_by { |lang| lang.name.downcase }
end

Public Instance Methods

==(other) click to toggle source
# File lib/linguist/language.rb, line 488
def ==(other)
  eql?(other)
end
default_alias() click to toggle source

Public: Get default alias name

Returns the alias name String

# File lib/linguist/language.rb, line 447
def default_alias
  name.downcase.gsub(/\s/, '-')
end
Also aliased as: default_alias_name
default_alias_name()
Alias for: default_alias
eql?(other) click to toggle source
# File lib/linguist/language.rb, line 492
def eql?(other)
  equal?(other)
end
escaped_name() click to toggle source

Public: Get URL escaped name.

Examples

"C%23"
"C%2B%2B"
"Common%20Lisp"

Returns the escaped String.

# File lib/linguist/language.rb, line 440
def escaped_name
  EscapeUtils.escape_url(name).gsub('+', '%20')
end
group() click to toggle source

Public: Get Language group

Returns a Language

# File lib/linguist/language.rb, line 455
def group
  @group ||= Language.find_by_name(@group_name)
end
hash() click to toggle source
# File lib/linguist/language.rb, line 496
def hash
  name.hash
end
inspect() click to toggle source
# File lib/linguist/language.rb, line 500
def inspect
  "#<#{self.class} name=#{name}>"
end
searchable?() click to toggle source

Public: Is it searchable?

Unsearchable languages won't by indexed by solr and won't show up in the code search dropdown.

Returns true or false

# File lib/linguist/language.rb, line 479
def searchable?
  @searchable
end
to_s() click to toggle source

Public: Return name as String representation

# File lib/linguist/language.rb, line 484
def to_s
  name
end
unpopular?() click to toggle source

Public: Is it not popular?

Returns true or false

# File lib/linguist/language.rb, line 469
def unpopular?
  !popular?
end