2013-09-12 2 views
4

Каков наилучший способ проверить изменения (отредактированный/добавленный/удаленный текст) в сообщении между версиями двух сообщений (оригинал и отредактированный)?Как сравнить две модели, которые будут отображаться с помощью Markdown с помощью Django?

Я использую Markdown поэтому я не уверен, что при использовании difflib.HtmlDiff является хорошей идеей. Моя цель - отметить зеленым фоном добавленный текст и красным фоном удаленные, что-то похожее, как то, что делает github.

+0

Вы сравниваете сам Markdown или рендеринг Markdown? –

+0

The Markdown себя – Pompeyo

ответ

5

Попробуйте ghdiff, стиль HTML GitHub для унифицированных различий. Это on PyPI, но есть better docs on GitHub. Вам нужно будет pip install ghdiff.

Простое использование, если уценка находится в markdown1 и markdown2.

import ghdiff 
diff_as_html = ghdiff.diff(markdown1,markdown2) 

Вот еще более явная демонстрация. Скажем, у вас есть эти две уценки строки:

md1 = ''' 
# Hello world 

I am text 

* No really 

''' 

md2 = ''' 
# Hi world 

I am text 

* No really 

''' 

Мы можем выполнить диф на этих

import ghdiff 
diff_as_html = ghdiff.diff(md1,md2) 

Когда оказывается, это выглядит следующим образом:

ghdiff

Вот сырец и рендер в ноутбуке IPython:

raw and rendered in IPython notebook

+2

Спасибо, применительно к [моему решению] (https://github.com/ctrl-alt-d/fpuf/blob/master/fpuf/apps/material/business_rules/material.py#L151) образец здесь: http://uf.ctrl-alt-d.net/material/revisions/16/ – danihp

+0

Кроме того, чтение кода проекта, это не так уж и далеко от моего грязного решения;) – danihp

+0

@ danihp - Это смешно. Да, difflib (по крайней мере, в Python 2.7) не очень эффективен. Я использовал [get_close_matches] (http://docs.python.org/2/library/difflib.html#difflib.get%5Fclose%5Fmatches) для какой-то интересной логики скребка, но ничего такого, что нужно для украшенных различий , –

0

Я использую this dirty code написал сам в течение нескольких минут, как первый подход. Я также сравниваю сам указ.

Я также ищу лучший способ.

def canvis_html(before, after): 
    d = ''.join(
        ndiff(
        before.splitlines(1), 
        after.splitlines(1) 
         ) 
        ) 

    estils = {'+':'color:green;', '-':'color:red;text-decoration:line-through;',} 
    new = u"" 
    previous_zone = 'new'  
    for l in d.splitlines(1): 
     l=l+u" " 
     zona = l[0] 
     if zona in ('+', '-'): 
      if zona != previous_zone: 
       #si havia obert una zona la tanco 
       if previous_zone != 'new': new += u"</span>" 
       #colorejo segons la zona 
       new += u"<span style='{estil};'>".format(estil = estils[zona]) 
       previous_zone = zona 
      new += l[1:] 
     elif l.startswith('?'): 
      pass 
     else: 
      new += l[1:] 

    return new 

Here you can see edit results, как вы можете видеть, это всего лишь отправная точка, если вы должны кодировать самостоятельно.

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