Изменить ширину HTML-таблицы difflib.make_file()?

Я создаю файлы различий для юридических документов с помощью difflib python и make_file(), который выводит HTML-файлы, содержащие таблицу с различиями.

Но выходные таблицы настолько широки, что их невозможно прочитать.

Есть ли способ изменить ширину таблицы или добавить другой css из моего вызова функции? Я не могу найти ничего связанного в документации.

В случае, если это невозможно, что может быть решением моей проблемы "ширина таблицы слишком широкая"?

Я уже пытался добавить бутстрап и поместить таблицу в адаптивный div, но это не сработало.

см. исходный код difflib - он использует скрытые переменные _styles и _template, которые вы можете использовать для назначения собственных стилей и собственного HTML-шаблона. Кроме того, в классе wrapcolumn есть HtmlDiff, что может помочь сделать его короче.

furas 22.12.2020 23:49
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
1 874
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать 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("&","&amp;").replace(">","&gt;").replace("<","&lt;")

        # make space non-breakable so they don't get compressed or line wrapped
        text = text.replace(' ','&nbsp;').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 в вызове функции, но это не работает

gradyhorn 23.12.2020 00:37

Я сделал пример, который меняется _styles. Если вам не нужно изменять функции в HtmlDiff, вы можете использовать d = HtmlDiff(wrapcolumn=10) и d._file_template = """new template"""

furas 23.12.2020 00:42

Другие вопросы по теме