From 5b6019f357d01d7871068da15549d19be1a0cf4f Mon Sep 17 00:00:00 2001 From: Arthur Schreiber Date: Fri, 20 Apr 2012 23:21:12 +0200 Subject: [PATCH] Using github's linguist to better detect filetypes and to do syntax highlighting. --- Gemfile | 1 + Gemfile.lock | 12 ++++++ app/views/refs/_tree_file.html.haml | 8 ++-- app/views/snippets/show.html.haml | 5 +-- config/initializers/gitlabhq/20_grit_ext.rb | 7 +--- lib/utils.rb | 44 --------------------- 6 files changed, 21 insertions(+), 56 deletions(-) delete mode 100644 lib/utils.rb diff --git a/Gemfile b/Gemfile index 24bc650274a4..8bf737ac4ffe 100644 --- a/Gemfile +++ b/Gemfile @@ -18,6 +18,7 @@ gem "six" gem "therubyracer" gem "faker" gem "seed-fu" +gem "linguist", "~> 1.0.0", :git => "https://github.com/github/linguist.git" gem "pygments.rb", "0.2.7" gem "thin" gem "unicorn" diff --git a/Gemfile.lock b/Gemfile.lock index 30dc519dd9d3..221e81474ba4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -4,6 +4,16 @@ GIT specs: annotate (2.4.1.beta1) +GIT + remote: https://github.com/github/linguist.git + revision: c444c25b27131cd2aca6017f2a9ce5eae60dfcd3 + specs: + linguist (1.0.0) + charlock_holmes (~> 0.6.6) + escape_utils (~> 0.2.3) + mime-types (~> 1.18) + pygments.rb (~> 0.2.11) + GIT remote: https://github.com/gitlabhq/gitolite-client.git revision: 36dabd226caa40ff052677719adaacbfe667b36c @@ -104,6 +114,7 @@ GEM diff-lcs (1.1.3) drapper (0.8.4) erubis (2.7.0) + escape_utils (0.2.4) eventmachine (0.12.10) execjs (1.3.0) multi_json (~> 1.0) @@ -326,6 +337,7 @@ DEPENDENCIES kaminari launchy letter_opener + linguist (~> 1.0.0)! modularity mysql2 omniauth-ldap diff --git a/app/views/refs/_tree_file.html.haml b/app/views/refs/_tree_file.html.haml index 738dad9bd591..c5512f69b513 100644 --- a/app/views/refs/_tree_file.html.haml +++ b/app/views/refs/_tree_file.html.haml @@ -11,10 +11,10 @@ - if file.text? .view_file_content - unless file.empty? - %div{:class => current_user.dark_scheme ? "black" : "white"} - = preserve do - = raw file.colorize - - else + %div{:class => current_user.dark_scheme ? "black" : "white"} + = preserve do + = raw file.colorize(options: { linenos: 'True'}) + - else %h3 %center Empty file - elsif file.image? diff --git a/app/views/snippets/show.html.haml b/app/views/snippets/show.html.haml index a7ccd44cc799..7af4d2498fd2 100644 --- a/app/views/snippets/show.html.haml +++ b/app/views/snippets/show.html.haml @@ -13,8 +13,7 @@ .view_file_header %strong= @snippet.file_name .view_file_content - %div{:class => current_user.dark_scheme ? "black" : ""} - :erb - <%= raw @snippet.colorize %> + %div{:class => current_user.dark_scheme ? "black" : ""} + = raw @snippet.colorize(options: { linenos: 'True'}) = render "notes/notes", :tid => @snippet.id, :tt => "snippet" diff --git a/config/initializers/gitlabhq/20_grit_ext.rb b/config/initializers/gitlabhq/20_grit_ext.rb index 50b57d5e8883..4c6be1e489f7 100644 --- a/config/initializers/gitlabhq/20_grit_ext.rb +++ b/config/initializers/gitlabhq/20_grit_ext.rb @@ -1,10 +1,7 @@ require 'grit' -require 'pygments' -require "utils" Grit::Blob.class_eval do - include Utils::FileHelper - include Utils::Colorize + include Linguist::BlobHelper end #monkey patch raw_object from string @@ -15,7 +12,7 @@ def content end -Grit::Diff.class_eval do +Grit::Diff.class_eval do def old_path Gitlabhq::Encode.utf8 a_path end diff --git a/lib/utils.rb b/lib/utils.rb deleted file mode 100644 index 52f3ee2e195a..000000000000 --- a/lib/utils.rb +++ /dev/null @@ -1,44 +0,0 @@ -module Utils - module FileHelper - def binary?(string) - string.each_byte do |x| - x.nonzero? or return true - end - false - end - - def image? - mime_type =~ /image/ - end - - def text? - mime_type =~ /application|text/ && !binary?(data) - end - end - - module Colorize - def colorize - system_colorize(data, name) - end - - def system_colorize(data, file_name) - options = { :encoding => 'utf-8', :linenos => 'True' } - - # Try detect language with pygments - Pygments.highlight data, :filename => file_name, :options => options - rescue - # if it fails use manual detection - ft = handle_file_type(file_name) - Pygments.highlight(data, :lexer => ft, :options => options) - end - - def handle_file_type(file_name) - case file_name - when /(\.ru|Gemfile)$/ - :ruby - else - :text - end - end - end -end