mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
Extract BlobHelper mixin
This commit is contained in:
@@ -2,6 +2,7 @@ module Linguist
|
|||||||
end
|
end
|
||||||
|
|
||||||
require 'linguist/blob'
|
require 'linguist/blob'
|
||||||
|
require 'linguist/blob_helper'
|
||||||
require 'linguist/language'
|
require 'linguist/language'
|
||||||
require 'linguist/mime'
|
require 'linguist/mime'
|
||||||
require 'linguist/pathname'
|
require 'linguist/pathname'
|
||||||
|
|||||||
@@ -1,11 +1,9 @@
|
|||||||
require 'linguist/language'
|
require 'linguist/blob_helper'
|
||||||
require 'linguist/mime'
|
|
||||||
require 'linguist/pathname'
|
|
||||||
|
|
||||||
require 'escape_utils'
|
|
||||||
|
|
||||||
module Linguist
|
module Linguist
|
||||||
class Blob
|
class Blob
|
||||||
|
include BlobHelper
|
||||||
|
|
||||||
def initialize(blob)
|
def initialize(blob)
|
||||||
@blob = blob
|
@blob = blob
|
||||||
end
|
end
|
||||||
@@ -14,134 +12,12 @@ module Linguist
|
|||||||
@blob.name
|
@blob.name
|
||||||
end
|
end
|
||||||
|
|
||||||
def pathname
|
|
||||||
Pathname.new(name || "")
|
|
||||||
end
|
|
||||||
|
|
||||||
def mime_type
|
|
||||||
Mime.lookup(pathname.extname)
|
|
||||||
end
|
|
||||||
|
|
||||||
def disposition
|
|
||||||
case mime_type
|
|
||||||
when 'application/octet-stream', 'application/java-archive'
|
|
||||||
"attachment; filename=#{EscapeUtils.escape_url(pathname.basename)}"
|
|
||||||
else
|
|
||||||
'inline'
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def data
|
def data
|
||||||
@blob.data
|
@blob.data
|
||||||
end
|
end
|
||||||
|
|
||||||
def lines
|
|
||||||
@lines ||= data ? data.split("\n", -1) : []
|
|
||||||
end
|
|
||||||
|
|
||||||
def size
|
def size
|
||||||
@blob.size
|
@blob.size
|
||||||
end
|
end
|
||||||
|
|
||||||
def loc
|
|
||||||
lines.size
|
|
||||||
end
|
|
||||||
|
|
||||||
def sloc
|
|
||||||
lines.grep(/\S/).size
|
|
||||||
end
|
|
||||||
|
|
||||||
def submodule?
|
|
||||||
defined?(Grit::Submodule) && @blob.kind_of?(Grit::Submodule)
|
|
||||||
end
|
|
||||||
|
|
||||||
def binary?
|
|
||||||
mime_type == 'octet-stream' || !(text? || image?)
|
|
||||||
end
|
|
||||||
|
|
||||||
def file?
|
|
||||||
image? || binary?
|
|
||||||
end
|
|
||||||
|
|
||||||
def text?
|
|
||||||
return false if submodule?
|
|
||||||
|
|
||||||
pathname.media_type == 'text' ||
|
|
||||||
pathname.mime_type == 'application/json'
|
|
||||||
end
|
|
||||||
|
|
||||||
def image?
|
|
||||||
['.png', '.jpg', '.jpeg', '.gif'].include?(pathname.extname)
|
|
||||||
end
|
|
||||||
|
|
||||||
MEGABYTE = 1024 * 1024
|
|
||||||
|
|
||||||
def large?
|
|
||||||
size.to_i > MEGABYTE
|
|
||||||
end
|
|
||||||
|
|
||||||
def viewable?
|
|
||||||
!file? && !large?
|
|
||||||
end
|
|
||||||
|
|
||||||
def language
|
|
||||||
if text?
|
|
||||||
shebang_language || pathname.language
|
|
||||||
else
|
|
||||||
Language['Text']
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def lexer
|
|
||||||
language.lexer
|
|
||||||
end
|
|
||||||
|
|
||||||
def shebang_script
|
|
||||||
return if !text? || large?
|
|
||||||
|
|
||||||
if (match = data.match(/(.+)\n?/)) && (bang = match[0]) =~ /^#!/
|
|
||||||
bang.sub!(/^#! /, '#!')
|
|
||||||
tokens = bang.split(' ')
|
|
||||||
pieces = tokens.first.split('/')
|
|
||||||
if pieces.size > 1
|
|
||||||
script = pieces.last
|
|
||||||
else
|
|
||||||
script = pieces.first.sub('#!', '')
|
|
||||||
end
|
|
||||||
|
|
||||||
script = script == 'env' ? tokens[1] : script
|
|
||||||
|
|
||||||
# python2.4 => python
|
|
||||||
if script =~ /((?:\d+\.?)+)/
|
|
||||||
script.sub! $1, ''
|
|
||||||
end
|
|
||||||
|
|
||||||
script
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def shebang_language
|
|
||||||
if script = shebang_script
|
|
||||||
case script
|
|
||||||
when 'bash'
|
|
||||||
Language['Shell']
|
|
||||||
when 'groovy'
|
|
||||||
Language['Java']
|
|
||||||
when 'macruby'
|
|
||||||
Language['Ruby']
|
|
||||||
when 'node'
|
|
||||||
Language['JavaScript']
|
|
||||||
when 'rake'
|
|
||||||
Language['Ruby']
|
|
||||||
when 'sh'
|
|
||||||
Language['Shell']
|
|
||||||
when 'zsh'
|
|
||||||
Language['Shell']
|
|
||||||
else
|
|
||||||
lang = Language.find_by_lexer(shebang_script)
|
|
||||||
lang != Language['Text'] ? lang : nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
125
lib/linguist/blob_helper.rb
Normal file
125
lib/linguist/blob_helper.rb
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
require 'linguist/language'
|
||||||
|
require 'linguist/mime'
|
||||||
|
require 'linguist/pathname'
|
||||||
|
|
||||||
|
require 'escape_utils'
|
||||||
|
|
||||||
|
module Linguist
|
||||||
|
module BlobHelper
|
||||||
|
def pathname
|
||||||
|
Pathname.new(name || "")
|
||||||
|
end
|
||||||
|
|
||||||
|
def mime_type
|
||||||
|
@mime_type ||= Mime.lookup(pathname.extname)
|
||||||
|
end
|
||||||
|
|
||||||
|
def disposition
|
||||||
|
case mime_type
|
||||||
|
when 'application/octet-stream', 'application/java-archive'
|
||||||
|
"attachment; filename=#{EscapeUtils.escape_url(pathname.basename)}"
|
||||||
|
else
|
||||||
|
'inline'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def lines
|
||||||
|
@lines ||= data ? data.split("\n", -1) : []
|
||||||
|
end
|
||||||
|
|
||||||
|
def loc
|
||||||
|
lines.size
|
||||||
|
end
|
||||||
|
|
||||||
|
def sloc
|
||||||
|
lines.grep(/\S/).size
|
||||||
|
end
|
||||||
|
|
||||||
|
def binary?
|
||||||
|
mime_type == 'octet-stream' || !(text? || image?)
|
||||||
|
end
|
||||||
|
|
||||||
|
def file?
|
||||||
|
image? || binary?
|
||||||
|
end
|
||||||
|
|
||||||
|
def text?
|
||||||
|
pathname.media_type == 'text' ||
|
||||||
|
pathname.mime_type == 'application/json'
|
||||||
|
end
|
||||||
|
|
||||||
|
def image?
|
||||||
|
['.png', '.jpg', '.jpeg', '.gif'].include?(pathname.extname)
|
||||||
|
end
|
||||||
|
|
||||||
|
MEGABYTE = 1024 * 1024
|
||||||
|
|
||||||
|
def large?
|
||||||
|
size.to_i > MEGABYTE
|
||||||
|
end
|
||||||
|
|
||||||
|
def viewable?
|
||||||
|
!file? && !large?
|
||||||
|
end
|
||||||
|
|
||||||
|
def language
|
||||||
|
if text?
|
||||||
|
shebang_language || pathname.language
|
||||||
|
else
|
||||||
|
Language['Text']
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def lexer
|
||||||
|
language.lexer
|
||||||
|
end
|
||||||
|
|
||||||
|
def shebang_script
|
||||||
|
return if !text? || large?
|
||||||
|
|
||||||
|
if (match = data.match(/(.+)\n?/)) && (bang = match[0]) =~ /^#!/
|
||||||
|
bang.sub!(/^#! /, '#!')
|
||||||
|
tokens = bang.split(' ')
|
||||||
|
pieces = tokens.first.split('/')
|
||||||
|
if pieces.size > 1
|
||||||
|
script = pieces.last
|
||||||
|
else
|
||||||
|
script = pieces.first.sub('#!', '')
|
||||||
|
end
|
||||||
|
|
||||||
|
script = script == 'env' ? tokens[1] : script
|
||||||
|
|
||||||
|
# python2.4 => python
|
||||||
|
if script =~ /((?:\d+\.?)+)/
|
||||||
|
script.sub! $1, ''
|
||||||
|
end
|
||||||
|
|
||||||
|
script
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def shebang_language
|
||||||
|
if script = shebang_script
|
||||||
|
case script
|
||||||
|
when 'bash'
|
||||||
|
Language['Shell']
|
||||||
|
when 'groovy'
|
||||||
|
Language['Java']
|
||||||
|
when 'macruby'
|
||||||
|
Language['Ruby']
|
||||||
|
when 'node'
|
||||||
|
Language['JavaScript']
|
||||||
|
when 'rake'
|
||||||
|
Language['Ruby']
|
||||||
|
when 'sh'
|
||||||
|
Language['Shell']
|
||||||
|
when 'zsh'
|
||||||
|
Language['Shell']
|
||||||
|
else
|
||||||
|
lang = Language.find_by_lexer(shebang_script)
|
||||||
|
lang != Language['Text'] ? lang : nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Reference in New Issue
Block a user