summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhttp://jneen.net/ <jneen@jneen.net>2016-07-15 16:43:02 -0700
committerhttp://jneen.net/ <jneen@jneen.net>2016-07-18 11:06:22 -0700
commitb15fd7e01a179db869fd079c2f5f4c5f99e6dd94 (patch)
treeb702018f2016a940fdbdc4430cc2c114844488f0
parentc367fa8eb773a049ffdfe4735d42254ed808fef2 (diff)
downloadgitlab-ce-b15fd7e01a179db869fd079c2f5f4c5f99e6dd94.tar.gz
proof of concept: highlight in chunks
-rw-r--r--app/helpers/blob_helper.rb15
-rw-r--r--app/views/shared/_file_highlight.html.haml5
-rw-r--r--lib/gitlab/highlight.rb13
3 files changed, 26 insertions, 7 deletions
diff --git a/app/helpers/blob_helper.rb b/app/helpers/blob_helper.rb
index abe115d8c68..16ddecf9c2d 100644
--- a/app/helpers/blob_helper.rb
+++ b/app/helpers/blob_helper.rb
@@ -1,7 +1,16 @@
module BlobHelper
- def highlight(blob_name, blob_content, repository: nil, plain: false)
- highlighted = Gitlab::Highlight.highlight(blob_name, blob_content, plain: plain, repository: repository)
- raw %(<pre class="code highlight"><code>#{highlighted}</code></pre>)
+ include Hamlit::HamlHelpers
+
+ def highlight(blob_name, blob_content, repository: nil, plain: false, &block)
+ unless block_given?
+ return raw enum_for(:highlight, blob_name, blob_content, repository: repository, plain: false).to_a.join
+ end
+
+ yield raw('<pre class="code highlight><code>')
+ Gitlab::Highlight.stream_highlight(blob_name, blob_content, plain: plain, repository: repository) do |chunk|
+ yield raw(chunk)
+ end
+ yield raw('</code></pre>')
end
def no_highlight_files
diff --git a/app/views/shared/_file_highlight.html.haml b/app/views/shared/_file_highlight.html.haml
index e26693bf5b9..231e912a2d4 100644
--- a/app/views/shared/_file_highlight.html.haml
+++ b/app/views/shared/_file_highlight.html.haml
@@ -12,5 +12,6 @@
%a.diff-line-num{href: "#{link}#L#{i}", id: "L#{i}", 'data-line-number' => i}
= link_icon
= i
- .blob-content{data: {blob_id: blob.id}}
- = highlight(blob.path, blob.data, repository: repository, plain: blob.no_highlighting?)
+ .blob-content{data: {blob_id: blob.id}}><
+ - highlight(blob.path, blob.data, repository: repository, plain: blob.no_highlighting?) do |chunk|
+ ~ chunk
diff --git a/lib/gitlab/highlight.rb b/lib/gitlab/highlight.rb
index 9360afedfcb..c33b1513638 100644
--- a/lib/gitlab/highlight.rb
+++ b/lib/gitlab/highlight.rb
@@ -5,6 +5,11 @@ module Gitlab
highlight(blob_content, continue: false, plain: plain)
end
+ def self.stream_highlight(blob_name, blob_content, repository: nil, plain: false, &b)
+ new(blob_name, blob_content, repository: repository).
+ highlight(blob_content, continue: false, plain: plain, &b)
+ end
+
def self.highlight_lines(repository, ref, file_name)
blob = repository.blob_at(ref, file_name)
return [] unless blob
@@ -20,7 +25,7 @@ module Gitlab
@blob_content = blob_content
end
- def highlight(text, continue: true, plain: false)
+ def highlight(text, continue: true, plain: false, &b)
if plain
hl_lexer = Rouge::Lexers::PlainText
continue = false
@@ -28,7 +33,11 @@ module Gitlab
hl_lexer = self.lexer
end
- @formatter.format(hl_lexer.lex(text, continue: continue)).html_safe
+ if b
+ @formatter.format(hl_lexer.lex(text, continue: continue), &b)
+ else
+ @formatter.format(hl_lexer.lex(text, continue: continue)).html_safe
+ end
rescue
@formatter.format(Rouge::Lexers::PlainText.lex(text)).html_safe
end