Как игнорировать акценты в функции подсветки - PullRequest
3 голосов
/ 27 сентября 2008

У меня есть микро-мини-поисковая система, которая выделяет поисковые термины в моем приложении rails. Поиск игнорирует акценты, а выделение не учитывает регистр. Практически идеально. Но, например, если у меня есть запись с текстом «pão de queijo» и в поиске «pao de queijo», возвращается запись , но iext не выделяется . Аналогично, если я ищу «pÃo de queijo», запись возвращается, но не подсвечивается должным образом.

Мой код прост:

<%= highlight(result_pessoa.observacoes, search_string, '<span style="background-color: yellow;">\1</span>') %>

Ответы [ 4 ]

3 голосов
/ 28 сентября 2008

Может быть, вы ищете строки UTF-8 непосредственно в базе данных MySQL?

Правильно настроенный сервер MySQL (и, вероятно, любой другой основной сервер баз данных) будет работать правильно с учетом без учета регистра и без учета акцента.

Это не касается Руби. Начиная с версии 1.8 Ruby не поддерживает строки Unicode. Таким образом, вы получаете правильные результаты с вашего сервера базы данных, но функция Rails '1005 * highlight , которая использует gsub , не может найти строку поиска. Вам необходимо переопределить выделение , используя библиотеку строк с поддержкой Unicode, например ICU4R .

3 голосов
/ 17 декабря 2009

Я только что отправил патч в Rails, который решает эту проблему.

http://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/3593-patch-support-for-highlighting-with-ignoring-special-chars

  # Highlights one or more +phrases+ everywhere in +text+ by inserting it into
  # a <tt>:highlighter</tt> string. The highlighter can be specialized by passing <tt>:highlighter</tt>
  # as a single-quoted string with \1 where the phrase is to be inserted (defaults to
  # '<strong class="highlight">\1</strong>')
  #
  # ==== Examples
  #   highlight('You searched for: rails', 'rails')
  #   # => You searched for: <strong class="highlight">rails</strong>
  #
  #   highlight('You searched for: ruby, rails, dhh', 'actionpack')
  #   # => You searched for: ruby, rails, dhh
  #
  #   highlight('You searched for: rails', ['for', 'rails'], :highlighter => '<em>\1</em>')
  #   # => You searched <em>for</em>: <em>rails</em>
  #
  #   highlight('You searched for: rails', 'rails', :highlighter => '<a href="search?q=\1">\1</a>')
  #   # => You searched for: <a href="search?q=rails">rails</a>
  #
  #   highlight('Šumné dievčatá', ['šumňe', 'dievca'], :ignore_special_chars => true)
  #   # => <strong class="highlight">Šumné</strong> <strong class="highlight">dievča</strong>tá  
  #
  # You can still use <tt>highlight</tt> with the old API that accepts the
  # +highlighter+ as its optional third parameter:
  #   highlight('You searched for: rails', 'rails', '<a href="search?q=\1">\1</a>')     # => You searched for: <a href="search?q=rails">rails</a>
  def highlight(text, phrases, *args)
    options = args.extract_options!
    unless args.empty?
      options[:highlighter] = args[0] || '<strong class="highlight">\1</strong>'
    end
    options.reverse_merge!(:highlighter => '<strong class="highlight">\1</strong>')

    if text.blank? || phrases.blank?
      text
    else
      haystack = text.clone
      match = Array(phrases).map { |p| Regexp.escape(p) }.join('|')
      if options[:ignore_special_chars]
        haystack = haystack.mb_chars.normalize(:kd)
        match = match.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]+/n, '').gsub(/\w/, '\0[^\x00-\x7F]*')
      end
      highlighted = haystack.gsub(/(#{match})(?!(?:[^<]*?)(?:["'])[^<>]*>)/i, options[:highlighter])
      highlighted = highlighted.mb_chars.normalize(:kc) if options[:ignore_special_chars]
      highlighted
    end
  end
1 голос
/ 26 августа 2010

Вот моя статья , которая объясняет элегантное решение, где вам не нужны Rails или ActiveSupport.

0 голосов
/ 27 сентября 2008

Похоже, что вы используете два разных метода для определения того, произошло ли совпадение: один для вашего поиска, а другой - для поиска. Используйте тот же метод, что и при поиске подсветки, и он должен его поднять, нет?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...