Make Highlight accept language param
This replaces the repository param. This allows more flexiblity as sometimes we have highlight content not related to repository. Sometimes we know ahead of time the language of the content. Lastly language determination seems better fit as a logic in the Blob class. `repository` param is only used to determine the language, which seems to be the responsiblity of Blob.
This commit is contained in:
parent
32f9cf8ce3
commit
39ae9a59a5
|
|
@ -61,7 +61,7 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController
|
|||
format.html do
|
||||
usage_data_json = JSON.pretty_generate(Gitlab::UsageData.data)
|
||||
|
||||
render html: Gitlab::Highlight.highlight('payload.json', usage_data_json)
|
||||
render html: Gitlab::Highlight.highlight('payload.json', usage_data_json, language: 'json')
|
||||
end
|
||||
format.json { render json: Gitlab::UsageData.to_json }
|
||||
end
|
||||
|
|
|
|||
|
|
@ -92,7 +92,7 @@ class Projects::BlobController < Projects::ApplicationController
|
|||
apply_diff_view_cookie!
|
||||
|
||||
@blob.load_all_data!
|
||||
@lines = Gitlab::Highlight.highlight(@blob.path, @blob.data, repository: @repository).lines
|
||||
@lines = @blob.present.highlight.lines
|
||||
|
||||
@form = UnfoldForm.new(params)
|
||||
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module BlobHelper
|
||||
def highlight(blob_name, blob_content, repository: nil, plain: false)
|
||||
plain ||= blob_content.length > Blob::MAXIMUM_TEXT_HIGHLIGHT_SIZE
|
||||
highlighted = Gitlab::Highlight.highlight(blob_name, blob_content, plain: plain, repository: repository)
|
||||
def highlight(file_name, file_content, language: nil, plain: false)
|
||||
plain ||= file_content.length > Blob::MAXIMUM_TEXT_HIGHLIGHT_SIZE
|
||||
highlighted = Gitlab::Highlight.highlight(file_name, file_content, plain: plain, language: language)
|
||||
|
||||
raw %(<pre class="code highlight"><code>#{highlighted}</code></pre>)
|
||||
end
|
||||
|
|
|
|||
|
|
@ -4,4 +4,6 @@
|
|||
- blob.data.each_line.each_with_index do |_, index|
|
||||
%span.diff-line-num= index + 1
|
||||
.blob-content{ data: { blob_id: blob.id } }
|
||||
= highlight(blob.path, blob.data, repository: nil, plain: blob.no_highlighting?)
|
||||
%pre.code.highlight
|
||||
%code
|
||||
= blob.present.highlight
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
= render 'shared/file_highlight', blob: viewer.blob, repository: @repository
|
||||
= render 'shared/file_highlight', blob: viewer.blob
|
||||
|
|
|
|||
|
|
@ -15,14 +15,14 @@
|
|||
.col-md-2.text-center
|
||||
Markdown
|
||||
.col-md-10.code.js-syntax-highlight
|
||||
= highlight('.md', badge.to_markdown)
|
||||
= highlight('.md', badge.to_markdown, language: 'markdown')
|
||||
.row
|
||||
%hr
|
||||
.row
|
||||
.col-md-2.text-center
|
||||
HTML
|
||||
.col-md-10.code.js-syntax-highlight
|
||||
= highlight('.html', badge.to_html)
|
||||
= highlight('.html', badge.to_html, language: 'html')
|
||||
.row
|
||||
%hr
|
||||
.row
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@
|
|||
.blob-content
|
||||
- snippet_chunks.each do |chunk|
|
||||
- unless chunk[:data].empty?
|
||||
= highlight(snippet.file_name, chunk[:data], repository: nil, plain: snippet.blob.no_highlighting?)
|
||||
= highlight(snippet.file_name, chunk[:data], plain: snippet.blob.no_highlighting?)
|
||||
- else
|
||||
.file-content.code
|
||||
.nothing-here-block Empty file
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
- repository = nil unless local_assigns.key?(:repository)
|
||||
|
||||
.file-content.code.js-syntax-highlight
|
||||
.line-numbers
|
||||
- if blob.data.present?
|
||||
|
|
@ -13,4 +11,6 @@
|
|||
= link_icon
|
||||
= i
|
||||
.blob-content{ data: { blob_id: blob.id } }
|
||||
= highlight(blob.path, blob.data, repository: repository, plain: blob.no_highlighting?)
|
||||
%pre.code.highlight
|
||||
%code
|
||||
= blob.present.highlight
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@
|
|||
%li
|
||||
.code.js-syntax-highlight.sherlock-code
|
||||
:preserve
|
||||
#{highlight("#{@query.id}.sql", @query.formatted_query)}
|
||||
#{highlight("#{@query.id}.sql", @query.formatted_query, language: 'sql')}
|
||||
|
||||
.card
|
||||
.card-header
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
= t('sherlock.milliseconds')
|
||||
%td
|
||||
.code.js-syntax-highlight.sherlock-code
|
||||
= highlight("#{query.id}.sql", query.formatted_query)
|
||||
= highlight("#{query.id}.sql", query.formatted_query, language: 'sql')
|
||||
%td
|
||||
= link_to(t('sherlock.view'),
|
||||
sherlock_transaction_query_path(@transaction, query),
|
||||
|
|
|
|||
|
|
@ -43,8 +43,7 @@ module Gitlab
|
|||
|
||||
def highlighted_lines
|
||||
@blob.load_all_data!
|
||||
@highlighted_lines ||=
|
||||
Gitlab::Highlight.highlight(@blob.path, @blob.data, repository: repository).lines
|
||||
@highlighted_lines ||= @blob.present.highlight.lines
|
||||
end
|
||||
|
||||
def project
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ module Gitlab
|
|||
class File
|
||||
include Gitlab::Routing
|
||||
include IconsHelper
|
||||
include Gitlab::Utils::StrongMemoize
|
||||
|
||||
CONTEXT_LINES = 3
|
||||
|
||||
|
|
@ -30,11 +31,8 @@ module Gitlab
|
|||
end
|
||||
|
||||
def highlight_lines!
|
||||
their_file = lines.reject { |line| line.type == 'new' }.map(&:text).join("\n")
|
||||
our_file = lines.reject { |line| line.type == 'old' }.map(&:text).join("\n")
|
||||
|
||||
their_highlight = Gitlab::Highlight.highlight(their_path, their_file, repository: repository).lines
|
||||
our_highlight = Gitlab::Highlight.highlight(our_path, our_file, repository: repository).lines
|
||||
their_highlight = Gitlab::Highlight.highlight(their_path, their_lines, language: their_language).lines
|
||||
our_highlight = Gitlab::Highlight.highlight(our_path, our_lines, language: our_language).lines
|
||||
|
||||
lines.each do |line|
|
||||
line.rich_text =
|
||||
|
|
@ -182,6 +180,34 @@ module Gitlab
|
|||
raw_line[:line_new], parent_file: self)
|
||||
end
|
||||
end
|
||||
|
||||
def their_language
|
||||
strong_memoize(:their_language) do
|
||||
repository.gitattribute(their_path, 'gitlab-language')
|
||||
end
|
||||
end
|
||||
|
||||
def our_language
|
||||
strong_memoize(:our_language) do
|
||||
if our_path == their_path
|
||||
their_language
|
||||
else
|
||||
repository.gitattribute(our_path, 'gitlab-language')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def their_lines
|
||||
strong_memoize(:their_lines) do
|
||||
lines.reject { |line| line.type == 'new' }.map(&:text).join("\n")
|
||||
end
|
||||
end
|
||||
|
||||
def our_lines
|
||||
strong_memoize(:our_lines) do
|
||||
lines.reject { |line| line.type == 'old' }.map(&:text).join("\n")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@ module Gitlab
|
|||
return [] unless blob
|
||||
|
||||
blob.load_all_data!
|
||||
Gitlab::Highlight.highlight(blob.path, blob.data, repository: repository).lines
|
||||
blob.present.highlight.lines
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -5,16 +5,16 @@ module Gitlab
|
|||
TIMEOUT_BACKGROUND = 30.seconds
|
||||
TIMEOUT_FOREGROUND = 3.seconds
|
||||
|
||||
def self.highlight(blob_name, blob_content, repository: nil, plain: false)
|
||||
new(blob_name, blob_content, repository: repository)
|
||||
def self.highlight(blob_name, blob_content, language: nil, plain: false)
|
||||
new(blob_name, blob_content, language: language)
|
||||
.highlight(blob_content, continue: false, plain: plain)
|
||||
end
|
||||
|
||||
attr_reader :blob_name
|
||||
|
||||
def initialize(blob_name, blob_content, repository: nil)
|
||||
def initialize(blob_name, blob_content, language: nil)
|
||||
@formatter = Rouge::Formatters::HTMLGitlab
|
||||
@repository = repository
|
||||
@language = language
|
||||
@blob_name = blob_name
|
||||
@blob_content = blob_content
|
||||
end
|
||||
|
|
@ -36,11 +36,9 @@ module Gitlab
|
|||
private
|
||||
|
||||
def custom_language
|
||||
language_name = @repository && @repository.gitattribute(@blob_name, 'gitlab-language')
|
||||
return nil unless @language
|
||||
|
||||
return nil unless language_name
|
||||
|
||||
Rouge::Lexer.find_fancy(language_name)
|
||||
Rouge::Lexer.find_fancy(@language)
|
||||
end
|
||||
|
||||
def highlight_text(text, continue: true, plain: false)
|
||||
|
|
|
|||
|
|
@ -5,34 +5,15 @@ describe Gitlab::Highlight do
|
|||
|
||||
let(:project) { create(:project, :repository) }
|
||||
let(:repository) { project.repository }
|
||||
let(:commit) { project.commit(sample_commit.id) }
|
||||
|
||||
describe 'custom highlighting from .gitattributes' do
|
||||
let(:branch) { 'gitattributes' }
|
||||
let(:blob) { repository.blob_at_branch(branch, path) }
|
||||
|
||||
describe 'language provided' do
|
||||
let(:highlighter) do
|
||||
described_class.new(blob.path, blob.data, repository: repository)
|
||||
described_class.new('foo.erb', 'bar', language: 'erb?parent=json')
|
||||
end
|
||||
|
||||
before do
|
||||
project.change_head('gitattributes')
|
||||
end
|
||||
|
||||
describe 'basic language selection' do
|
||||
let(:path) { 'custom-highlighting/test.gitlab-custom' }
|
||||
it 'highlights as ruby' do
|
||||
expect(highlighter.lexer.tag).to eq 'ruby'
|
||||
end
|
||||
end
|
||||
|
||||
describe 'cgi options' do
|
||||
let(:path) { 'custom-highlighting/test.gitlab-cgi' }
|
||||
|
||||
it 'highlights as json with erb' do
|
||||
expect(highlighter.lexer.tag).to eq 'erb'
|
||||
expect(highlighter.lexer.parent.tag).to eq 'json'
|
||||
end
|
||||
it 'sets correct lexer' do
|
||||
expect(highlighter.lexer.tag).to eq 'erb'
|
||||
expect(highlighter.lexer.parent.tag).to eq 'json'
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -42,7 +23,7 @@ describe Gitlab::Highlight do
|
|||
let(:path) { 'files/whitespace' }
|
||||
let(:blob) { repository.blob_at_branch(branch, path) }
|
||||
let(:lines) do
|
||||
described_class.highlight(blob.path, blob.data, repository: repository).lines
|
||||
described_class.highlight(blob.path, blob.data).lines
|
||||
end
|
||||
|
||||
it 'strips extra LFs' do
|
||||
|
|
|
|||
|
|
@ -29,6 +29,8 @@ describe 'projects/blob/_viewer.html.haml' do
|
|||
controller.params[:namespace_id] = project.namespace.to_param
|
||||
controller.params[:project_id] = project.to_param
|
||||
controller.params[:id] = File.join('master', blob.path)
|
||||
|
||||
allow(project.repository).to receive(:gitattribute).and_return(nil)
|
||||
end
|
||||
|
||||
def render_view
|
||||
|
|
|
|||
Loading…
Reference in New Issue