mirror of
https://github.com/discourse/discourse.git
synced 2025-05-22 22:43:33 +08:00
DEV: Apply syntax_tree formatting to lib/*
This commit is contained in:
@ -1,7 +1,6 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class DiscourseDiff
|
||||
|
||||
MAX_DIFFERENCE = 200
|
||||
|
||||
def initialize(before, after)
|
||||
@ -9,8 +8,8 @@ class DiscourseDiff
|
||||
@after = after
|
||||
before_html = tokenize_html_blocks(@before)
|
||||
after_html = tokenize_html_blocks(@after)
|
||||
before_markdown = tokenize_line(CGI::escapeHTML(@before))
|
||||
after_markdown = tokenize_line(CGI::escapeHTML(@after))
|
||||
before_markdown = tokenize_line(CGI.escapeHTML(@before))
|
||||
after_markdown = tokenize_line(CGI.escapeHTML(@after))
|
||||
|
||||
@block_by_block_diff = ONPDiff.new(before_html, after_html).paragraph_diff
|
||||
@line_by_line_diff = ONPDiff.new(before_markdown, after_markdown).short_diff
|
||||
@ -21,7 +20,8 @@ class DiscourseDiff
|
||||
inline = []
|
||||
while i < @block_by_block_diff.size
|
||||
op_code = @block_by_block_diff[i][1]
|
||||
if op_code == :common then inline << @block_by_block_diff[i][0]
|
||||
if op_code == :common
|
||||
inline << @block_by_block_diff[i][0]
|
||||
else
|
||||
if op_code == :delete
|
||||
opposite_op_code = :add
|
||||
@ -36,7 +36,11 @@ class DiscourseDiff
|
||||
end
|
||||
|
||||
if i + 1 < @block_by_block_diff.size && @block_by_block_diff[i + 1][1] == opposite_op_code
|
||||
diff = ONPDiff.new(tokenize_html(@block_by_block_diff[first][0]), tokenize_html(@block_by_block_diff[second][0])).diff
|
||||
diff =
|
||||
ONPDiff.new(
|
||||
tokenize_html(@block_by_block_diff[first][0]),
|
||||
tokenize_html(@block_by_block_diff[second][0]),
|
||||
).diff
|
||||
inline << generate_inline_html(diff)
|
||||
i += 1
|
||||
else
|
||||
@ -73,7 +77,11 @@ class DiscourseDiff
|
||||
end
|
||||
|
||||
if i + 1 < @block_by_block_diff.size && @block_by_block_diff[i + 1][1] == opposite_op_code
|
||||
diff = ONPDiff.new(tokenize_html(@block_by_block_diff[first][0]), tokenize_html(@block_by_block_diff[second][0])).diff
|
||||
diff =
|
||||
ONPDiff.new(
|
||||
tokenize_html(@block_by_block_diff[first][0]),
|
||||
tokenize_html(@block_by_block_diff[second][0]),
|
||||
).diff
|
||||
deleted, inserted = generate_side_by_side_html(diff)
|
||||
left << deleted
|
||||
right << inserted
|
||||
@ -109,9 +117,13 @@ class DiscourseDiff
|
||||
end
|
||||
|
||||
if i + 1 < @line_by_line_diff.size && @line_by_line_diff[i + 1][1] == opposite_op_code
|
||||
before_tokens, after_tokens = tokenize_markdown(@line_by_line_diff[first][0]), tokenize_markdown(@line_by_line_diff[second][0])
|
||||
before_tokens, after_tokens =
|
||||
tokenize_markdown(@line_by_line_diff[first][0]),
|
||||
tokenize_markdown(@line_by_line_diff[second][0])
|
||||
if (before_tokens.size - after_tokens.size).abs > MAX_DIFFERENCE
|
||||
before_tokens, after_tokens = tokenize_line(@line_by_line_diff[first][0]), tokenize_line(@line_by_line_diff[second][0])
|
||||
before_tokens, after_tokens =
|
||||
tokenize_line(@line_by_line_diff[first][0]),
|
||||
tokenize_line(@line_by_line_diff[second][0])
|
||||
end
|
||||
diff = ONPDiff.new(before_tokens, after_tokens).short_diff
|
||||
deleted, inserted = generate_side_by_side_markdown(diff)
|
||||
@ -178,7 +190,7 @@ class DiscourseDiff
|
||||
def add_class_or_wrap_in_tags(html_or_text, klass)
|
||||
result = html_or_text.dup
|
||||
index_of_next_chevron = result.index(">")
|
||||
if result.size > 0 && result[0] == '<' && index_of_next_chevron
|
||||
if result.size > 0 && result[0] == "<" && index_of_next_chevron
|
||||
index_of_class = result.index("class=")
|
||||
if index_of_class.nil? || index_of_class > index_of_next_chevron
|
||||
# we do not have a class for the current tag
|
||||
@ -202,9 +214,12 @@ class DiscourseDiff
|
||||
inline = []
|
||||
diff.each do |d|
|
||||
case d[1]
|
||||
when :common then inline << d[0]
|
||||
when :delete then inline << add_class_or_wrap_in_tags(d[0], "del")
|
||||
when :add then inline << add_class_or_wrap_in_tags(d[0], "ins")
|
||||
when :common
|
||||
inline << d[0]
|
||||
when :delete
|
||||
inline << add_class_or_wrap_in_tags(d[0], "del")
|
||||
when :add
|
||||
inline << add_class_or_wrap_in_tags(d[0], "ins")
|
||||
end
|
||||
end
|
||||
inline
|
||||
@ -217,8 +232,10 @@ class DiscourseDiff
|
||||
when :common
|
||||
deleted << d[0]
|
||||
inserted << d[0]
|
||||
when :delete then deleted << add_class_or_wrap_in_tags(d[0], "del")
|
||||
when :add then inserted << add_class_or_wrap_in_tags(d[0], "ins")
|
||||
when :delete
|
||||
deleted << add_class_or_wrap_in_tags(d[0], "del")
|
||||
when :add
|
||||
inserted << add_class_or_wrap_in_tags(d[0], "ins")
|
||||
end
|
||||
end
|
||||
[deleted, inserted]
|
||||
@ -231,15 +248,16 @@ class DiscourseDiff
|
||||
when :common
|
||||
deleted << d[0]
|
||||
inserted << d[0]
|
||||
when :delete then deleted << "<del>#{d[0]}</del>"
|
||||
when :add then inserted << "<ins>#{d[0]}</ins>"
|
||||
when :delete
|
||||
deleted << "<del>#{d[0]}</del>"
|
||||
when :add
|
||||
inserted << "<ins>#{d[0]}</ins>"
|
||||
end
|
||||
end
|
||||
[deleted, inserted]
|
||||
end
|
||||
|
||||
class HtmlTokenizer < Nokogiri::XML::SAX::Document
|
||||
|
||||
attr_accessor :tokens
|
||||
|
||||
def initialize
|
||||
@ -253,23 +271,21 @@ class DiscourseDiff
|
||||
me.tokens
|
||||
end
|
||||
|
||||
USELESS_TAGS = %w{html body}
|
||||
USELESS_TAGS = %w[html body]
|
||||
def start_element(name, attributes = [])
|
||||
return if USELESS_TAGS.include?(name)
|
||||
attrs = attributes.map { |a| " #{a[0]}=\"#{CGI::escapeHTML(a[1])}\"" }.join
|
||||
attrs = attributes.map { |a| " #{a[0]}=\"#{CGI.escapeHTML(a[1])}\"" }.join
|
||||
@tokens << "<#{name}#{attrs}>"
|
||||
end
|
||||
|
||||
AUTOCLOSING_TAGS = %w{area base br col embed hr img input meta}
|
||||
AUTOCLOSING_TAGS = %w[area base br col embed hr img input meta]
|
||||
def end_element(name)
|
||||
return if USELESS_TAGS.include?(name) || AUTOCLOSING_TAGS.include?(name)
|
||||
@tokens << "</#{name}>"
|
||||
end
|
||||
|
||||
def characters(string)
|
||||
@tokens.concat string.scan(/\W|\w+[ \t]*/).map { |x| CGI::escapeHTML(x) }
|
||||
@tokens.concat string.scan(/\W|\w+[ \t]*/).map { |x| CGI.escapeHTML(x) }
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
Reference in New Issue
Block a user