Files
danbooru/test/unit/d_text_test.rb
evazion bbf2b53d83 aliases: fix broken wiki links when aliasing tags.
When aliasing A to B, update any wikis linking to [[A]] to link to [[B]]
instead.

This is a best-effort process based on rough heuristics. There are a few
known problems:

* We don't always know how to capitalize the new tag. We try to mimic
  the capitalization of the old tag, such that if the old tag was
  capitalized (because it was at the beginning of a sentence), or if
  every word in the old link was capitalized (because it's a proper
  noun), then the new link will be capitalized in the same way. This can
  handle simple general tags and character tags, but will fail for
  copyright tags with mixed capitalization. For example, we don't know
  that [[jojo_no_kimyou_na_bouken]] should be capitalized as [[JoJo no
  Kimyou na Bouken]]. If we don't know how to capitalize the new tag, we
  leave the old tag as-is so it can manually be fixed.

* Some aliases might require changing how a tag is pluralized. If we
  changed [[rat]] to [[mouse]], then we should change `[[rat]]s` to
  [[mice]]. We don't try to deal with this.

* In general, some changes might require entire sentences to be
  rewritten to keep the grammar correct. Changing something like
  [[skirt lift]] to [[lifting skirt]] could break the grammar of the
  sentence. We don't try to deal with this.
2020-08-26 19:02:19 -05:00

169 lines
7.2 KiB
Ruby

require "test_helper"
class DTextTest < ActiveSupport::TestCase
def assert_strip_dtext(expected, dtext)
assert_equal(expected, DText.strip_dtext(dtext))
end
def assert_rewrite_wiki_links(expected, dtext, old, new)
assert_equal(expected, DText.rewrite_wiki_links(dtext, old, new))
end
context "DText" do
context "#strip_dtext" do
should "strip dtext markup from the input" do
assert_strip_dtext("x", "[b]x[/b]")
assert_strip_dtext("x", "[i]x[/i]")
assert_strip_dtext("x", "[tn]x[/tn]")
assert_strip_dtext("x", "[spoilers]x[/spoilers]")
assert_strip_dtext("post #123", "post #123")
assert_strip_dtext("pixiv #123", "pixiv #123")
assert_strip_dtext("bkub", "{{bkub}}")
assert_strip_dtext("bkub", "[[bkub]]")
assert_strip_dtext("Bkub", "[[bkub|Bkub]]")
assert_strip_dtext("http://www.example.com", "http://www.example.com")
assert_strip_dtext("http://www.example.com", "<http://www.example.com>")
assert_strip_dtext("x", '"x":/posts')
assert_strip_dtext("x", '"x":[/posts]')
assert_strip_dtext("@bkub", "@bkub")
assert_strip_dtext("@bkub", "<@bkub>")
assert_strip_dtext("x", "h1. x")
assert_strip_dtext("x", "h2. [i]x[/i]")
assert_strip_dtext("* one\n* two", "* [b]one[/b]\n* [[two]]")
assert_strip_dtext("okay", "[expand][u]okay[/u][/expand]")
assert_strip_dtext("> chen said:\n> \n> honk honk", "[quote]chen said:\n\nhonk honk[/quote]")
assert_strip_dtext("one two three\nfour\n\nfive six", "one [b]two[/b] three\nfour\n\nfive six")
end
end
context "#format_text" do
setup do
CurrentUser.user = create(:user)
CurrentUser.ip_addr = "127.0.0.1"
end
teardown do
CurrentUser.user = nil
CurrentUser.ip_addr = nil
end
should "add tag types to wiki links" do
create(:tag, name: "bkub", category: Tag.categories.artist, post_count: 42)
assert_match(/tag-type-#{Tag.categories.artist}/, DText.format_text("[[bkub]]"))
end
should "parse wiki links correctly with the base_url option" do
create(:tag, name: "bkub", category: Tag.categories.artist, post_count: 42)
assert_match(/tag-type-#{Tag.categories.artist}/, DText.format_text("[[bkub]]", base_url: "http://www.example.com"))
end
should "mark links to nonexistent tags or wikis" do
create(:tag, name: "no_wiki", post_count: 42)
create(:tag, name: "empty_tag", post_count: 0)
assert_match(/dtext-wiki-does-not-exist/, DText.format_text("[[no wiki]]"))
assert_match(/dtext-tag-does-not-exist/, DText.format_text("[[no tag]]"))
assert_match(/dtext-tag-empty/, DText.format_text("[[empty tag]]"))
refute_match(/dtext-tag-does-not-exist/, DText.format_text("[[help:nothing]]"))
end
should "parse [ta:<id>], [ti:<id>], [bur:<id>] pseudo tags" do
@bur = create(:bulk_update_request)
@ti = create(:tag_implication)
@ta = create(:tag_alias)
assert_match(/bulk update request/, DText.format_text("[bur:#{@bur.id}]"))
assert_match(/implication ##{@ti.id}/, DText.format_text("[ti:#{@ti.id}]"))
assert_match(/alias ##{@ta.id}/, DText.format_text("[ta:#{@ta.id}]"))
end
should "link artist tags to the artist page instead of the wiki page" do
tag = create(:tag, name: "m&m", category: Tag.categories.artist)
artist = create(:artist, name: "m&m")
assert_equal(
'<p><a class="dtext-link dtext-wiki-link tag-type-1" href="/artists/show_or_new?name=m%26m">m&amp;m</a></p>',
DText.format_text("[[m&m]]")
)
end
should "not link general tags to artist pages" do
tag = create(:tag, name: "cat")
artist = create(:artist, name: "cat", is_deleted: true)
assert_match(%r!/wiki_pages/cat!, DText.format_text("[[cat]]"))
end
end
context "#parse_wiki_titles" do
should "parse wiki links in dtext" do
assert_equal(["foo"], DText.parse_wiki_titles("[[foo]] [[FOO]"))
end
end
context "#parse_external_links" do
should "parse external links in dtext" do
dtext = <<~EOS
* https://test1.com
* <https://test2.com>
* "test":https://test3.com
* "test":[https://test4.com]
* [https://test5.com](test)
* <a href="https://test6.com">test</a>
EOS
links = %w[
https://test1.com https://test2.com https://test3.com
https://test4.com https://test5.com https://test6.com
]
assert_equal(links, DText.parse_external_links(dtext))
end
end
context "#rewrite_wiki_links" do
should "work" do
assert_rewrite_wiki_links("[[rabbit]]", "[[bunny]]", "bunny", "rabbit")
assert_rewrite_wiki_links("[[rabbit|bun]]", "[[bunny|bun]]", "bunny", "rabbit")
assert_rewrite_wiki_links("[[cat]] [[rabbit]]", "[[cat]] [[rabbit]]", "bunny", "rabbit")
assert_rewrite_wiki_links("I like [[cat]]s and [[bunny]]s", "I like [[cat]]s and [[rabbit]]s", "rabbit", "bunny")
assert_rewrite_wiki_links("[[miku hatsune (cosplay)|]]", "[[hatsune miku (cosplay)]]", "hatsune_miku_(cosplay)", "miku_hatsune_(cosplay)")
assert_rewrite_wiki_links("[[Miku hatsune (cosplay)|]]", "[[Hatsune miku (cosplay)]]", "hatsune_miku_(cosplay)", "miku_hatsune_(cosplay)")
assert_rewrite_wiki_links("[[Miku Hatsune (cosplay)|]]", "[[Hatsune Miku (cosplay)]]", "hatsune_miku_(cosplay)", "miku_hatsune_(cosplay)")
assert_rewrite_wiki_links("[[miku hatsune (cosplay)|miku]]", "[[hatsune miku (cosplay)|miku]]", "hatsune_miku_(cosplay)", "miku_hatsune_(cosplay)")
assert_rewrite_wiki_links("[[the legend of zelda]]", "[[zelda no densetsu]]", "zelda_no_densetsu", "the_legend_of_zelda")
assert_rewrite_wiki_links("[[The legend of zelda]]", "[[Zelda no densetsu]]", "zelda_no_densetsu", "the_legend_of_zelda")
assert_rewrite_wiki_links("[[The Legend Of Zelda]]", "[[Zelda No Densetsu]]", "zelda_no_densetsu", "the_legend_of_zelda")
assert_rewrite_wiki_links("[[the legend of zelda]]", "[[zelda_no_densetsu]]", "zelda_no_densetsu", "the_legend_of_zelda")
assert_rewrite_wiki_links("[[The legend of zelda]]", "[[Zelda_no_densetsu]]", "zelda_no_densetsu", "the_legend_of_zelda")
assert_rewrite_wiki_links("[[The Legend Of Zelda]]", "[[Zelda_No_Densetsu]]", "zelda_no_densetsu", "the_legend_of_zelda")
assert_rewrite_wiki_links("[[Zelda no Densetsu]]", "[[Zelda no Densetsu]]", "zelda_no_densetsu", "the_legend_of_zelda")
assert_rewrite_wiki_links("[[Zelda_no_Densetsu]]", "[[Zelda_no_Densetsu]]", "zelda_no_densetsu", "the_legend_of_zelda")
end
end
context "#from_html" do
should "convert basic html to dtext" do
assert_equal("[b]abc[/b] [i]def[/i] [u]ghi[/u]", DText.from_html("<b>abc</b> <i>def</i> <u>ghi</u>"))
end
should "convert links to dtext" do
assert_equal('"example":[https://www.example.com]', DText.from_html('<a href="https://www.example.com">example</a>'))
assert_equal("<https://www.example.com>", DText.from_html('<a href="https://www.example.com">https://www.example.com</a>'))
end
end
end
end