Commit bf230da0 authored by Patrick Bajao's avatar Patrick Bajao

Support selective highlighting of lines

Instead of highlighting all lines when not all of them
are needed, only highlight from the beginning up to
the specified limit.

The `BlobPresenter#highlight` method has been updated
to support `to` param. This param will be used to limit
the content to be highlighted.
parent 60adc144
...@@ -3,12 +3,12 @@ ...@@ -3,12 +3,12 @@
class BlobPresenter < Gitlab::View::Presenter::Delegated class BlobPresenter < Gitlab::View::Presenter::Delegated
presents :blob presents :blob
def highlight(plain: nil) def highlight(to: nil, plain: nil)
load_all_blob_data load_all_blob_data
Gitlab::Highlight.highlight( Gitlab::Highlight.highlight(
blob.path, blob.path,
blob.data, limited_blob_data(to: to),
language: blob.language_from_gitattributes, language: blob.language_from_gitattributes,
plain: plain plain: plain
) )
...@@ -23,4 +23,18 @@ class BlobPresenter < Gitlab::View::Presenter::Delegated ...@@ -23,4 +23,18 @@ class BlobPresenter < Gitlab::View::Presenter::Delegated
def load_all_blob_data def load_all_blob_data
blob.load_all_data! if blob.respond_to?(:load_all_data!) blob.load_all_data! if blob.respond_to?(:load_all_data!)
end end
def limited_blob_data(to: nil)
return blob.data if to.blank?
# Even though we don't need all the lines at the start of the file (e.g
# viewing the middle part of a file), they still need to be highlighted
# to ensure that the succeeding lines can be formatted correctly (e.g.
# multi-line comments).
all_lines[0..to - 1].join
end
def all_lines
@all_lines ||= blob.data.lines
end
end end
...@@ -26,8 +26,6 @@ module Blobs ...@@ -26,8 +26,6 @@ module Blobs
# so we can accurately show the rest of the diff when unfolding. # so we can accurately show the rest of the diff when unfolding.
load_all_blob_data load_all_blob_data
@all_lines = blob.data.lines
handle_full_or_end! handle_full_or_end!
end end
...@@ -46,7 +44,7 @@ module Blobs ...@@ -46,7 +44,7 @@ module Blobs
def lines def lines
strong_memoize(:lines) do strong_memoize(:lines) do
limit(highlight.lines).map(&:html_safe) limit(highlight(to: to).lines).map(&:html_safe)
end end
end end
...@@ -76,7 +74,7 @@ module Blobs ...@@ -76,7 +74,7 @@ module Blobs
def all_lines_size def all_lines_size
strong_memoize(:all_lines_size) do strong_memoize(:all_lines_size) do
@all_lines.size all_lines.size
end end
end end
...@@ -101,7 +99,7 @@ module Blobs ...@@ -101,7 +99,7 @@ module Blobs
def limited_blob_lines def limited_blob_lines
strong_memoize(:limited_blob_lines) do strong_memoize(:limited_blob_lines) do
limit(@all_lines) limit(all_lines)
end end
end end
......
---
title: Support selective highlighting of lines
merge_request: 32514
author:
type: performance
...@@ -39,6 +39,20 @@ describe BlobPresenter, :seed_helper do ...@@ -39,6 +39,20 @@ describe BlobPresenter, :seed_helper do
subject.highlight(plain: true) subject.highlight(plain: true)
end end
context '"to" param is present' do
before do
allow(git_blob)
.to receive(:data)
.and_return("line one\nline two\nline 3")
end
it 'returns limited highlighted content' do
expect(Gitlab::Highlight).to receive(:highlight).with('files/ruby/regex.rb', "line one\n", plain: nil, language: nil)
subject.highlight(to: 1)
end
end
context 'gitlab-language contains a match' do context 'gitlab-language contains a match' do
before do before do
allow(blob).to receive(:language_from_gitattributes).and_return('ruby') allow(blob).to receive(:language_from_gitattributes).and_return('ruby')
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment