لقد واجهت خطأً لا يمكنني من خلاله البحث عن منشورات المستخدم بواسطة @+اسم المستخدم في مربع البحث إذا كان اسم المستخدم يحتوي على يونيكود (مثل الصينية \\p{Han}).
السبب هو أن التعبير النمطي المستخدم في الكود التالي (في lib\\search.rb) يطابق الأحرف الأسكي فقط.
advanced_filter(/^\\@([a-zA-Z0-9_\\-.]+)$/i) do |posts, match|
لقد اختبرت أنه إذا أضفت allowed_unicode_username_characters في التعبير النمطي (أي إضافة قاعدة advanced_filter(/^\\@([a-zA-Z0-9_\\-.\\p{Han}]+)$/i)), فإنه يعمل بشكل جيد.
أستخدم إضافة لإضافة advanced_filter بالكود التالي، وهو يلبي احتياجاتي.
if SiteSetting.unicode_usernames?
regexp = Regexp.new("(?i-mx:^(?![_\\-.])(?!.*[_\\-.]{2})[a-zA-Z0-9_\\-.]#{SiteSetting.allowed_unicode_username_characters}+)")
Search.advanced_filter(regexp) do |posts, match|
username = match.downcase
user_id = User.where(staged: false).where(username_lower: username).pluck_first(:id)
if !user_id && username == "me"
user_id = @guardian.user&.id
end
if user_id
posts.where("posts.user_id = #{user_id}")
else
posts.where("1 = 0")
end
end
end
لكنني لا أعرف كيفية تعديل النواة بشكل صحيح، خاصة عندما يكون allowed_unicode_username_characters متغيرًا. ربما يكون الحل البسيط ولكنه خاطئ على الأرجح هو تغيير advanced_filter(/^\\@([a-zA-Z0-9_\\-.]+)$/i) إلى advanced_filter(/^\\@(.+)$/i)، تمامًا كما فعلت في advanced_filter(/^user:(.+)$/i).