2008-09-26 2 views
3

У меня есть микро-мини-поисковая система, которая выделяет условия поиска в моем приложении 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>') %> 

ответ

3

Я только что отправил патч 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 
0

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

+0

actualy Я использую find с условиями, чтобы найти запись, и выделите ее, чтобы выделить ее. Таким образом, только встроенные функции, один для логики БД и другие для визуальной логики. – 2008-09-27 03:45:24

3

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

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

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

1

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

Смежные вопросы