更改difflib.make_file()HTML表格的宽度?

2024-05-14 03:29:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用python difflib和make_file()为法律文档创建diff文件,这两个文件输出HTML文件,其中包含一个带有diff的表

但输出表太宽,无法读取

是否有任何方法可以更改表的宽度或从我的函数调用中添加其他css?我在文档中找不到任何相关内容

如果不可能,我的“桌子宽度太宽”问题有什么解决方案

我已经尝试过添加引导程序,并将表放入一个响应良好的div中,但没有成功


Tags: 文件方法文档内容make宽度htmldiff
1条回答
网友
1楼 · 发布于 2024-05-14 03:29:10

您可以在HtmlDiff中使用wrapcolumn=

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=

enter image description here

wrapcolumn=10

enter image description here


编辑:

我没有测试它,但在diff的源代码中,您可以看到隐藏变量_styles_table_template_file_template,您可以在HtmlDiff中替换这些变量以生成不同的HTML。通过这种方式,您可以添加类和样式来格式化它

它可能还需要更改隐藏的_format_line以删除nowrap="nowrap"


编辑:

我使用HtmlDiff创建自己的类,使用新的_format_line()而不使用nowrap="nowrap",现在我可以添加带有widthword-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')

相关问题 更多 >