Я создаю файлы различий для юридических документов с помощью difflib python и make_file(), который выводит HTML-файлы, содержащие таблицу с различиями.
Но выходные таблицы настолько широки, что их невозможно прочитать.
Есть ли способ изменить ширину таблицы или добавить другой css из моего вызова функции? Я не могу найти ничего связанного в документации.
В случае, если это невозможно, что может быть решением моей проблемы "ширина таблицы слишком широкая"?
Я уже пытался добавить бутстрап и поместить таблицу в адаптивный div, но это не сработало.
Вы можете использовать wrapcolumn=
в HtmlDiff
import difflib
import webbrowser
d = difflib.HtmlDiff(wrapcolumn=10)
lines1 = ['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa']
lines2 = ['XXXXXXXXXXXXXaaaaaaaaaYYYaaaaaaZZZZZZZZZZZaaaaZZZZZZZZ']
html = d.make_file(lines1, lines2)
with open('output.html', 'w') as fh:
fh.write(html)
webbrowser.open('output.html')
Без wrapcolumn=
С wrapcolumn=10
Обновлено:
Я не тестировал это, но в исходном коде diff вы можете увидеть скрытые переменные _styles , _table_template , _file_template , которые вы можете заменить в HtmlDiff для генерации другого HTML. Таким образом, вы можете добавить классы и стили для его форматирования.
Также может потребоваться изменить скрытый _format_line, чтобы удалить nowrap = "nowrap"
Обновлено:
Я использую HtmlDiff
для создания собственного класса с новым _format_line()
без nowrap = "nowrap"
, и теперь я могу добавлять стили с width
и word-break
import difflib
import webbrowser
# --- classes ---
class MyHTML(difflib.HtmlDiff):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# append new styles inside new class
self._styles = self._styles + """
table.diff {width: 300px}
.diff_sub {display: inline-block; word-break: break-word;}
.diff_add {display: inline-block; word-break: break-word;}
"""
# function from source code - I remove only `nowrap = "nowrap"`
def _format_line(self,side,flag,linenum,text):
"""Returns HTML markup of "from" / "to" text lines
side -- 0 or 1 indicating "from" or "to" text
flag -- indicates if difference on line
linenum -- line number (used for line number column)
text -- line text to be marked up
"""
try:
linenum = '%d' % linenum
id = ' id = "%s%s"' % (self._prefix[side],linenum)
except TypeError:
# handle blank lines where linenum is '>' or ''
id = ''
# replace those things that would get confused with HTML symbols
text=text.replace("&","&").replace(">",">").replace("<","<")
# make space non-breakable so they don't get compressed or line wrapped
text = text.replace(' ',' ').rstrip()
return '<td class = "diff_header"%s>%s</td><td>%s</td>' \
% (id,linenum,text)
# --- main ---
d = MyHTML()
# >>> changing styles after creating `MyHTML` or in original `HtmlDiff <<<
#d._styles = d._styles + """
#table.diff {width: 300px}
#.diff_sub {display: inline-block; word-break: break-word;}
#.diff_add {display: inline-block; word-break: break-word;}
#"""
#d._file_template = """new template"""
lines1 = ['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa']
lines2 = ['XXXXXXXXXXXXXaaaaaaaaaYYYaaaaaaZZZZZZZZZZZaaaaZZZZZZZZ']
html = d.make_file(lines1, lines2)
with open('output.html', 'w') as fh:
fh.write(html)
webbrowser.open('output.html')
Укороченная версия
import difflib
import webbrowser
d = HtmlDiff(wrapcolumn=10)
d._file_template = """new template with %(charset)s %(styles)s %(table)s %(legend)s"""
#d._styles = """new styles"""
lines1 = ['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa']
lines2 = ['XXXXXXXXXXXXXaaaaaaaaaYYYaaaaaaZZZZZZZZZZZaaaaZZZZZZZZ']
html = d.make_file(lines1, lines2)
with open('output.html', 'w') as fh:
fh.write(html)
webbrowser.open('output.html')
Большое спасибо! Wrapcolumn сделал свое дело для ширины. Можете ли вы привести пример для вызова, например. с измененным _file_template? Я установил переменную file='''<!DOCTYPE.... ''' и использовал _file_template=file в вызове функции, но это не работает
Я сделал пример, который меняется _styles
. Если вам не нужно изменять функции в HtmlDiff
, вы можете использовать d = HtmlDiff(wrapcolumn=10)
и d._file_template = """new template"""
см. исходный код difflib - он использует скрытые переменные
_styles
и_template
, которые вы можете использовать для назначения собственных стилей и собственного HTML-шаблона. Кроме того, в классеwrapcolumn
естьHtmlDiff
, что может помочь сделать его короче.