2

このpythonスクリプト(diff.py)を変換しようとしています

http://www.aaronsw.com/2002/diff/

私のサイトのまったく同じもの、つまりWebインターフェースに。彼はあなたがダウンロードできるスクリプトを提供し、コマンド ライン経由で Wi​​ndows コンピューターで動作するようにしましたが、サーバーでも動作するようにしたいと考えています。私はとても近いです。これが私がこれまでに持っているものです。

これが私のhtmlドキュメントです-

<form action="/cgi-bin/diff.py" method="get"><p>
<strong>Old URL:</strong> <input name="old" type="text"><br>
<strong>New URL:</strong> <input name="new" type="text"><br>
<input value="Diff!" type="submit">
</p></form>

これが私の編集された diff.py スクリプトで、ほとんど機能しています-

#!G:\Program Files\Python25\python.exe
"""HTML Diff: http://www.aaronsw.com/2002/diff
Rough code, badly documented. Send me comments and patches.

__author__ = 'Aaron Swartz <me@aaronsw.com>'
__copyright__ = '(C) 2003 Aaron Swartz. GNU GPL 2 or 3.'
__version__ = '0.22' """

import cgi
import cgitb; cgitb.enable()
form = cgi.FieldStorage()
reshtml = """Content-Type: text/html\n
<html>
<head><title>Test</title></head>
<body>
"""
print reshtml
a = form['old'].value
b = form['new'].value

import difflib, string

def isTag(x): return x[0] == "<" and x[-1] == ">"

def textDiff(a, b):
    """Takes in strings a and b and returns a human-readable HTML diff."""

    out = []
    a, b = html2list(a), html2list(b)
    s = difflib.SequenceMatcher(None, a, b)
    for e in s.get_opcodes():
        if e[0] == "replace":
            # @@ need to do something more complicated here
            # call textDiff but not for html, but for some html... ugh
            # gonna cop-out for now
            out.append('<del class="diff modified">'+''.join(a[e[1]:e[2]]) +   '</del><ins class="diff modified">'+''.join(b[e[3]:e[4]])+"</ins>")
        elif e[0] == "delete":
            out.append('<del class="diff">'+ ''.join(a[e[1]:e[2]]) + "</del>")
        elif e[0] == "insert":
            out.append('<ins class="diff">'+''.join(b[e[3]:e[4]]) + "</ins>")
        elif e[0] == "equal":
            out.append(''.join(b[e[3]:e[4]]))
        else: 
            raise "Um, something's broken. I didn't expect a '" + `e[0]` + "'."
    return ''.join(out)

def html2list(x, b=0):
    mode = 'char'
    cur = ''
    out = []
    for c in x:
        if mode == 'tag':
            if c == '>': 
                if b: cur += ']'
                else: cur += c
                out.append(cur); cur = ''; mode = 'char'
            else: cur += c
        elif mode == 'char':
            if c == '<': 
                out.append(cur)
                if b: cur = '['
                else: cur = c
                mode = 'tag'
            elif c in string.whitespace: out.append(cur+c); cur = ''
            else: cur += c
    out.append(cur)
    return filter(lambda x: x is not '', out)

if __name__ == '__main__':
    import sys
    try:
        a, b = sys.argv[1:3]
    except ValueError:
        print "htmldiff: highlight the differences between two html files"
        print "usage: " + sys.argv[0] + " a b"
        sys.exit(1)
    print textDiff(open(a).read(), open(b).read())

print '</body>'
print '</html>'

これは私がブラウザで得た結果です -

htmldiff: highlight the differences between two html files usage: E:/xampp/cgi-bin/diff.py a b 

誰が何が悪いのか見ることができますか?

さて、print open(a).read() を使用したときのエラーは次のとおりです ---

A problem occurred in a Python script. Here is the sequence of function calls leading up to the error, in the order they occurred.
 E:\xampp\cgi-bin\diff2.py in ()
   19 b = form['new'].value
   20 
   21 print open(a).read()
   22 
   23 
builtin open = <built-in function open>, a = 'http://www.google.com', ).read undefined

<type 'exceptions.IOError'>: [Errno 2] No such file or directory: 'http://www.google.com'
    args = (2, 'No such file or directory')
    errno = 2
    filename = 'http://www.google.com'
    message = ''
    strerror = 'No such file or directory'

わかりました、私は実際にこれを自分で考え出したと思います。必要な変更は次のとおりです。元のコードの先頭で停止しました-

#!G:\Program Files\Python25\python.exe
"""HTML Diff: http://www.aaronsw.com/2002/diff
Rough code, badly documented. Send me comments and patches.

__author__ = 'Aaron Swartz <me@aaronsw.com>'
__copyright__ = '(C) 2003 Aaron Swartz. GNU GPL 2 or 3.'
__version__ = '0.22' """


import cgi
import cgitb; cgitb.enable()
form = cgi.FieldStorage()
reshtml = """Content-Type: text/html\n
<html>
<head><title>Tonys Test</title></head>
<body>
"""
print reshtml
old2 = form['old'].value
new2 = form['new'].value

import urllib2

a = urllib2.urlopen(old2).read()
b = urllib2.urlopen(new2).read()

#print a
#print b

import difflib, string

さて、私はあまりにも早く話しました。機能しますが、違いが強調表示されません。古いバージョンの取り消し線しか表示されません。強調表示を行うと思われる部分を切り取って追加しようとしましたが、機能しません。元のエラーステートメントが表示されます。私はそれに取り組み続けます。

よし、やっと作業。最後にこのコードを追加する必要がありました-

def htmlDiff(a, b):
    f1, f2 = a.find('</head>'), a.find('</body>')
    ca = a[f1+len('</head>'):f2]

    f1, f2 = b.find('</head>'), b.find('</body>')
    cb = b[f1+len('</head>'):f2]

    r = textDiff(ca, cb)
    hdr = '<style type="text/css"><!-- ins{background-color: #bbffbb} del{background-color: #ffcccc}--></style></head>'
    return b[:f1] + hdr + r + b[f2:]


print htmlDiff(a, b)
print '</body>'
print '</html>'

このコードは、0.1 バージョンのダウンロードで見つかりました。

4

1 に答える 1

2

このチャンクが問題です:

if __name__ == '__main__':
    import sys
    try:
        a, b = sys.argv[1:3]
    except ValueError:
        print "htmldiff: highlight the differences between two html files"
        print "usage: " + sys.argv[0] + " a b"
        sys.exit(1)

それを除く。

そして、この行:

print textDiff(open(a).read(), open(b).read())

なるはず

print textDiff(a, b)
于 2012-11-24T20:27:04.380 に答える