#-- # Copyright (C) 2008 Dimitrij Denissenko # Please read LICENSE document for more information. #++ module RepositoryHelper def browse_path_hash(fullpath, rev=nil) path = relative_path(fullpath).split('/').reject(&:blank?) options = {:controller => 'browse', :action => 'browse'} options[:path] = path.blank? ? nil : path options[:rev] = rev.blank? ? nil : rev options end def render_diff(unified_diff, node_path) scanner = Repository::Abstract::DiffScanner.new(unified_diff) tbody_tags = scanner.blocks.map do |block| block.line_pairs.map do |line_set| table_rows = [] line_set.each_with_index do |(source, target), i| table_rows << content_tag(:tr, wrap_diff(:th, source.n1) + wrap_diff(:td, source) + wrap_diff(:th, target.n1) + wrap_diff(:td, target), :class => html_class_for_diff_row(i, line_set.size) ) end "#{table_rows.join("\n")}" end.join("\n") end content_tag :table, header_for_diff_table(scanner, node_path) + body_for_diff_table(tbody_tags), :class => 'ln-code' end def format_changeset_log(log) method = RetroCM[:content][:format][:changeset_logs] == 'wikified' ? :markup : :simple_markup send(method, log) end protected def header_for_diff_table(scanner, node_path) source_rev = link_to_if_permitted "r#{scanner.source_rev}", browse_path_hash(node_path, scanner.source_rev) target_rev = link_to_if_permitted "r#{scanner.target_rev}", browse_path_hash(node_path, scanner.target_rev) "#{source_rev}#{target_rev}" end def body_for_diff_table(tbody_tags) separator = content_tag :tr, wrap_diff(:th, '...') + wrap_diff(:td, nil) + wrap_diff(:th, '...') + wrap_diff(:td, nil), :class => 'separator' tbody_tags.join("#{separator}") end def html_class_for_diff_row(index, row_count) c = [index.zero? ? 'first' : nil] + [index == row_count - 1 ? 'last' : nil] c.compact.blank? ? nil : c.compact.join(' ') end def wrap_diff(tag, values, options = {}, joiner = "\n") values = values.join(joiner) if values.is_a?(Array) content_tag tag, "
#{values ? h(values) : ' '}
", options end def relative_path(fullpath) path = Project.current ? Project.current.relativize_path(fullpath) : fullpath path.blank? ? '/' : path end end