开发者

django haystack highlight template tag issue

Is there a way to make django-haystack's {% highlight %} template ta开发者_如何学编程g show the full variable passed in, rather than removing everything before the first match?

I'm using it like this:

{% highlight thread.title with request.GET.q %}


i've never used haystack, but from a quick look in the docs and the source it looks like you can make your own custom highlighter and tell haystack to use that instead

from haystack.utils import Highlighter
from django.utils.html import strip_tags

class MyHighlighter(Highlighter):
    def highlight(self, text_block):
        self.text_block = strip_tags(text_block)
        highlight_locations = self.find_highlightable_words()
        start_offset, end_offset = self.find_window(highlight_locations)

        # this is my only edit here, but you'll have to experiment
        start_offset = 0
        return self.render_html(highlight_locations, start_offset, end_offset)

and then set

HAYSTACK_CUSTOM_HIGHLIGHTER = 'path.to.your.highligher.MyHighlighter'

in your settings.py


The answer by @second works, however if you also don't want it to cut off the end of the string and you're under the max length you can try this. Still testing it but it seems to work:

class MyHighlighter(Highlighter):
    """
    Custom highlighter
    """
    def highlight(self, text_block):
        self.text_block = strip_tags(text_block)
        highlight_locations = self.find_highlightable_words()
        start_offset, end_offset = self.find_window(highlight_locations)
        text_len = len(self.text_block)

        if text_len <= self.max_length:
            start_offset = 0
        elif (text_len - 1 - start_offset) <= self.max_length:
            end_offset = text_len
            start_offset = end_offset - self.max_length

        if start_offset < 0:
            start_offset = 0
        return self.render_html(highlight_locations, start_offset, end_offset)
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜