Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions lib/discourse_modifications/slug_ascii_patch.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# frozen_string_literal: true

module ::DiscourseModifications
module SlugAsciiPatch
def ascii_generator(string)
super(AnyAscii.transliterate(string.to_s))
end
end
end
22 changes: 0 additions & 22 deletions lib/discourse_modifications/topic_slug.rb

This file was deleted.

20 changes: 9 additions & 11 deletions plugin.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
# url: TODO
# required_version: 2.7.0

gem 'any_ascii', '0.3.2'
gem "any_ascii", "0.3.2"

enabled_site_setting :discourse_modifications_enabled

Expand All @@ -21,19 +21,17 @@ module ::DiscourseModifications
require_relative "lib/discourse_modifications/engine"

after_initialize do
# Code which should run after Rails has finished booting

# Note: if this file gets too large, consider moving code into separate files in the lib directory
# and applying a Initializer pattern to load them.

Topic.slug_computed_callbacks << ::DiscourseModifications::TopicSlug.method(:slug_for_topic)
# Patch Slug.ascii_generator to use AnyAscii before parameterize so that
# Unicode characters (including mathematical/stylised variants) transliterate
# correctly everywhere Slug.for is called — AR lifecycle hooks, bulk import,
# category slugs, etc.
Slug.singleton_class.prepend(::DiscourseModifications::SlugAsciiPatch)

# add permalink normalization
normalizations = SiteSetting.permalink_normalizations
normalizations = normalizations.blank? ? [] : normalizations.split("|")

normalizations << ::DiscourseModifications::XF_TOPIC_LINK_NORMALIZATION if normalizations.exclude?(::DiscourseModifications::XF_TOPIC_LINK_NORMALIZATION)

if normalizations.exclude?(::DiscourseModifications::XF_TOPIC_LINK_NORMALIZATION)
normalizations << ::DiscourseModifications::XF_TOPIC_LINK_NORMALIZATION
end
SiteSetting.permalink_normalizations = normalizations.join("|")

end
30 changes: 30 additions & 0 deletions spec/lib/discourse_modifications/slug_patch_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# frozen_string_literal: true

RSpec.describe "Slug.ascii_generator AnyAscii patch" do
before do
allow(SiteSetting).to receive(:slug_generation_method).and_return("ascii")
allow(SiteSetting).to receive(:default_locale).and_return("en")
end

it "transliterates mathematical bold/italic Unicode to ASCII" do
title = "𝑻𝒉𝒆 𝒔𝒖𝒎𝒎𝒆𝒓 𝒘𝒆 𝒇𝒆𝒍𝒍 𝒊𝒏 𝒍𝒐𝒗𝒆 [𝐇𝐀𝐈𝐊𝐘𝐔]"
expect(Slug.for(title)).to eq("the-summer-we-fell-in-love-haikyu")
end

it "still handles plain ASCII titles" do
expect(Slug.for("Hello World")).to eq("hello-world")
end

it "still handles accented characters" do
expect(Slug.for("Café au lait")).to eq("cafe-au-lait")
end

it "falls back to the default when slug is blank after transliteration" do
expect(Slug.for(":smile:")).to eq("topic")
end

it "is not applied when slug_generation_method is encoded" do
allow(SiteSetting).to receive(:slug_generation_method).and_return("encoded")
expect(Slug.for("Héllo")).to eq("h%C3%A9llo")
end
end
62 changes: 0 additions & 62 deletions spec/lib/discourse_modifications/topic_slug_spec.rb

This file was deleted.

Loading