diff options
author | http://jneen.net/ <jneen@jneen.net> | 2016-07-15 16:43:02 -0700 |
---|---|---|
committer | http://jneen.net/ <jneen@jneen.net> | 2016-07-18 11:06:22 -0700 |
commit | b15fd7e01a179db869fd079c2f5f4c5f99e6dd94 (patch) | |
tree | b702018f2016a940fdbdc4430cc2c114844488f0 | |
parent | c367fa8eb773a049ffdfe4735d42254ed808fef2 (diff) | |
download | gitlab-ce-b15fd7e01a179db869fd079c2f5f4c5f99e6dd94.tar.gz |
proof of concept: highlight in chunks
-rw-r--r-- | app/helpers/blob_helper.rb | 15 | ||||
-rw-r--r-- | app/views/shared/_file_highlight.html.haml | 5 | ||||
-rw-r--r-- | lib/gitlab/highlight.rb | 13 |
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 |