He encontrado un error por el cual no puedo buscar las publicaciones de un usuario con @+nombredeusuario en el cuadro de búsqueda si el nombre de usuario contiene caracteres unicode (por ejemplo, \\p{Han} en chino).
La razón es que la expresión regular utilizada en el siguiente código (en lib\\search.rb) solo coincide con caracteres ascii.
advanced_filter(/^\\@([a-zA-Z0-9_\\-.]+)$/i) do |posts, match|
Probé que si agrego allowed_unicode_username_characters en la expresión regular (es decir, agregando una regla advanced_filter(/^\\@([a-zA-Z0-9_\\-.\\p{Han}]+)$/i)), funciona bien.
Utilizo un plugin para añadir el advanced_filter con el siguiente código, y satisface mis necesidades.
if SiteSetting.unicode_usernames?
regexp = Regexp.new("(?i-mx:^(?:@([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
Pero no sé cómo modificar el núcleo correctamente, especialmente cuando allowed_unicode_username_characters es una variable. Quizás una solución simple pero probablemente incorrecta sea cambiar advanced_filter(/^\\@([a-zA-Z0-9_\\-.]+)$/i) por advanced_filter(/^\\@(.+)$/i), tal como lo hiciste en advanced_filter(/^user:(.+)$/i).