2014-06-07 08:46:58 -04:00
module BlobHelper
2015-05-23 23:34:03 -04:00
def highlight ( blob_name , blob_content , nowrap : false , continue : false )
2015-06-28 14:45:40 -04:00
@formatter || = Rouge :: Formatters :: HTMLGitlab . new (
2014-12-03 09:27:31 -05:00
nowrap : nowrap ,
cssclass : 'code highlight' ,
lineanchors : true ,
lineanchorsid : 'LC'
)
begin
2015-06-28 14:42:41 -04:00
@lexer || = Rouge :: Lexer . guess ( filename : blob_name , source : blob_content ) . new
2015-05-23 23:34:03 -04:00
result = @formatter . format ( @lexer . lex ( blob_content , continue : continue ) ) . html_safe
2015-05-20 09:46:40 -04:00
rescue
2015-06-28 14:45:40 -04:00
@lexer = Rouge :: Lexers :: PlainText
result = @formatter . format ( @lexer . lex ( blob_content ) ) . html_safe
2014-06-07 08:46:58 -04:00
end
2014-12-03 09:27:31 -05:00
2015-05-20 09:46:40 -04:00
result
2014-06-07 08:46:58 -04:00
end
def no_highlight_files
2014-12-03 06:50:00 -05:00
%w( credits changelog news copying copyright license authors )
2014-06-07 08:46:58 -04:00
end
2015-01-26 18:03:14 -05:00
2015-12-18 04:03:34 -05:00
def edit_blob_link ( project = @project , ref = @ref , path = @path , options = { } )
return unless current_user
blob = project . repository . blob_at ( ref , path ) rescue nil
2015-12-18 10:14:12 -05:00
return unless blob && blob_text_viewable? ( blob )
2015-12-18 04:03:34 -05:00
2015-12-08 11:10:07 -05:00
from_mr = options [ :from_merge_request_id ]
link_opts = { }
link_opts [ :from_merge_request_id ] = from_mr if from_mr
2015-12-18 04:03:34 -05:00
edit_path = namespace_project_edit_blob_path ( project . namespace , project ,
tree_join ( ref , path ) ,
link_opts )
if ! on_top_of_branch?
2015-12-18 05:19:08 -05:00
button_tag " Edit " , class : " btn btn-default disabled has_tooltip " , title : " You can only edit files when you are on a branch " , data : { container : 'body' }
2015-12-18 04:03:34 -05:00
elsif can_edit_blob? ( blob )
link_to " Edit " , edit_path , class : 'btn btn-small'
elsif can? ( current_user , :fork_project , project )
continue_params = {
to : edit_path ,
notice : edit_in_new_fork_notice ,
notice_now : edit_in_new_fork_notice_now
}
fork_path = namespace_project_fork_path ( project . namespace , project , namespace_key : current_user . namespace . id ,
continue : continue_params )
link_to " Edit " , fork_path , class : 'btn btn-small' , method : :post
end
end
def modify_file_link ( project = @project , ref = @ref , path = @path , label : , action : , btn_class : , modal_type : )
return unless current_user
blob = project . repository . blob_at ( ref , path ) rescue nil
return unless blob
if ! on_top_of_branch?
2015-12-18 05:19:08 -05:00
button_tag label , class : " btn btn- #{ btn_class } disabled has_tooltip " , title : " You can only #{ action } files when you are on a branch " , data : { container : 'body' }
2015-12-18 10:14:12 -05:00
elsif blob . lfs_pointer?
button_tag label , class : " btn btn- #{ btn_class } disabled has_tooltip " , title : " It is not possible to #{ action } files that are stored in LFS using the web interface " , data : { container : 'body' }
2015-12-18 04:03:34 -05:00
elsif can_edit_blob? ( blob )
button_tag label , class : " btn btn- #{ btn_class } " , 'data-target' = > " # modal- #{ modal_type } -blob " , 'data-toggle' = > 'modal'
elsif can? ( current_user , :fork_project , project )
continue_params = {
to : request . fullpath ,
notice : edit_in_new_fork_notice + " Try to #{ action } this file again. " ,
notice_now : edit_in_new_fork_notice_now
}
fork_path = namespace_project_fork_path ( project . namespace , project , namespace_key : current_user . namespace . id ,
continue : continue_params )
link_to label , fork_path , class : " btn btn- #{ btn_class } " , method : :post
end
end
def replace_blob_link ( project = @project , ref = @ref , path = @path )
modify_file_link (
project ,
ref ,
path ,
label : " Replace " ,
action : " replace " ,
btn_class : " default " ,
modal_type : " upload "
)
end
def delete_blob_link ( project = @project , ref = @ref , path = @path )
modify_file_link (
project ,
ref ,
path ,
label : " Delete " ,
action : " delete " ,
btn_class : " remove " ,
modal_type : " remove "
)
end
def can_edit_blob? ( blob , project = @project , ref = @ref )
! blob . lfs_pointer? && can_edit_tree? ( project , ref )
2015-01-26 18:03:14 -05:00
end
def leave_edit_message
" Leave edit mode? \n All unsaved changes will be lost. "
end
def editing_preview_title ( filename )
2015-05-12 19:40:11 -04:00
if Gitlab :: MarkupHelper . previewable? ( filename )
2015-01-26 18:03:14 -05:00
'Preview'
else
2015-12-02 08:53:11 -05:00
'Preview Changes'
2015-01-26 18:03:14 -05:00
end
end
2014-10-04 06:29:18 -04:00
# Return an image icon depending on the file mode and extension
#
# mode - File unix mode
# mode - File name
def blob_icon ( mode , name )
icon ( " #{ file_type_icon_class ( 'file' , mode , name ) } fw " )
end
2015-12-07 09:03:50 -05:00
2015-12-18 10:14:12 -05:00
def blob_text_viewable? ( blob )
2015-12-07 09:56:38 -05:00
blob && blob . text? && ! blob . lfs_pointer?
2015-12-07 09:03:50 -05:00
end
def blob_size ( blob )
if blob . lfs_pointer?
blob . lfs_size
else
blob . size
end
end
2014-06-07 08:46:58 -04:00
end