Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Javascript比较用户输入_Javascript_Html_Css - Fatal编程技术网

使用Javascript比较用户输入

使用Javascript比较用户输入,javascript,html,css,Javascript,Html,Css,我有下面的代码,它使用3列来检查输入值的差异。 “我的视图”中的第三列差异生成得很好,但在查看时,表没有显示它 我们要做的是将基础文本与新文本和第三个文本输入条目进行比较,并以内联或并排格式向用户显示更改 index.html <!doctype html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=E

我有下面的代码,它使用3列来检查输入值的差异。 “我的视图”中的第三列差异生成得很好,但在查看时,表没有显示它

我们要做的是将基础文本与新文本和第三个文本输入条目进行比较,并以内联或并排格式向用户显示更改

index.html

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
    <title>jsdifflib demo</title>
    <link rel="stylesheet" type="text/css" href="diffview.css"/>
    <script type="text/javascript" src="diffview.js"></script>
    <script type="text/javascript" src="difflib.js"></script>
<style type="text/css">
body {
    font-size: 12px;
    font-family: Sans-Serif,serif;
}
h2 {
    margin: 0.5em 0 0.1em;
    text-align: center;
}
.top {
    text-align: center;
}
.textInput {
    display: block;
    width: 49%;
    float: left;
}
textarea {
    width:100%;
    height:300px;
}
label:hover {
    text-decoration: underline;
    cursor: pointer;
}
.spacer {
    margin-left: 10px;
}
.viewType {
    font-size: 16px;
    clear: both;
    text-align: center;
    padding: 1em;
}
#diffoutput {
    width: 100%;
}
</style>

<script type="text/javascript">

function diffUsingJS(viewType) {
    "use strict";
    var byId = function (id) { return document.getElementById(id); },
        base = difflib.stringAsLines(byId("baseText").value),
        newtxt = difflib.stringAsLines(byId("newText").value),
            thirdText = difflib.stringAsLines(byId("3rdText").value),
        sm = new difflib.SequenceMatcher(base, newtxt, thirdText),
        opcodes = sm.get_opcodes(),
        diffoutputdiv = byId("diffoutput"),
        contextSize = byId("contextSize").value;

    diffoutputdiv.innerHTML = "";
    contextSize = contextSize || null;

    diffoutputdiv.appendChild(diffview.buildView({
        baseTextLines: base,
        newTextLines: newtxt,
        thirdTextLines: thirdText,
        opcodes: opcodes,
        baseTextName: "Base Text",
        newTextName: "New Text",
        thirdTextName: "Third Text",
        contextSize: contextSize,
        viewType: viewType
    }));
}

</script>
</head>
<body>
    <div class="top">
        <strong>Context size (optional):</strong> <input type="text" id="contextSize" value="" />
    </div>
    <div class="textInput">
        <h2>Base Text</h2>
        <textarea id="baseText" >a</textarea>
    </div>
    <div class="textInput spacer">
        <h2>New Text</h2>
        <textarea id="newText">b</textarea>
    </div>
    <div class="textInput spacer">
        <h2>3rd Text</h2>
        <textarea id="3rdText">c</textarea>
    </div>
    <div class="viewType">
        <input type="radio" name="_viewtype" id="sidebyside" onclick="diffUsingJS(0);" /> <label for="sidebyside">Side by Side Diff</label>
        &nbsp; &nbsp;
        <input type="radio" name="_viewtype" id="inline" onclick="diffUsingJS(1);" /> <label for="inline">Inline Diff</label>
    </div>
    <div id="diffoutput"> </div>
</body>
</html>

jsdifflib演示
身体{
字体大小:12px;
字体系列:无衬线,衬线;
}
氢{
边缘:0.5em 0.1em;
文本对齐:居中;
}
.顶{
文本对齐:居中;
}
.textInput{
显示:块;
宽度:49%;
浮动:左;
}
文本区{
宽度:100%;
高度:300px;
}
标签:悬停{
文字装饰:下划线;
光标:指针;
}
.垫片{
左边距:10px;
}
.视图类型{
字体大小:16px;
明确:两者皆有;
文本对齐:居中;
填充:1em;
}
#扩散输出{
宽度:100%;
}
函数扩散JS(视图类型){
“严格使用”;
var byId=函数(id){return document.getElementById(id);},
base=difflib.stringAsLines(byId(“baseText”).value),
newText=difflib.stringAsLines(byId(“newText”).value),
thirdText=difflib.stringAsLines(byId(“第三文本”).value),
sm=新的difflib.SequenceMatcher(基本、新文本、第三文本),
操作码=sm.get_操作码(),
diffoutputdiv=byId(“diffoutput”),
contextSize=byId(“contextSize”).value;
diffoutputdiv.innerHTML=“”;
contextSize=contextSize | | null;
diffoutputdiv.appendChild(diffview.buildView({
baseTextLines:base,
newTextLines:newtext,
第三行:第三行,
操作码:操作码,
baseTextName:“基本文本”,
newTextName:“新文本”,
第三文本名称:“第三文本”,
contextSize:contextSize,
viewType:viewType
}));
}
上下文大小(可选):
基本文本
A.
新文本
B
第三文本
C
并排
内联差分
diffview.js

var diffview = {

        /**
         * Builds and returns a visual diff view.  The single parameter, `params', should contain
         * the following values:
         *
         * - baseTextLines: the array of strings that was used as the base text input to SequenceMatcher
         * - newTextLines: the array of strings that was used as the new text input to SequenceMatcher
         * - opcodes: the array of arrays returned by SequenceMatcher.get_opcodes()
         * - baseTextName: the title to be displayed above the base text listing in the diff view; defaults
         *     to "Base Text"
         * - newTextName: the title to be displayed above the new text listing in the diff view; defaults
         *     to "New Text"
         * - contextSize: the number of lines of context to show around differences; by default, all lines
         *     are shown
         * - viewType: if 0, a side-by-side diff view is generated (default); if 1, an inline diff view is
         *     generated
         */
        buildView: function (params) {
            var baseTextLines = params.baseTextLines;
            var newTextLines = params.newTextLines;
            var thirdTextLines = params.thirdTextLines;
            var opcodes = params.opcodes;
            var baseTextName = params.baseTextName ? params.baseTextName : "Base Text";
            var newTextName = params.newTextName ? params.newTextName : "New Text";
            var thirdTextName = params.thirdTextName ? params.thirdTextName: "Third Text"
            var contextSize = params.contextSize;
            var inline = (params.viewType == 0 || params.viewType == 1) ? params.viewType : 0;

            if (baseTextLines == null)
                throw "Cannot build diff view; baseTextLines is not defined.";
            if (newTextLines == null)
                throw "Cannot build diff view; newTextLines is not defined.";
            if (thirdTextLines == null)
                throw "Cannot build diff view; thirdTextLines is not defined.";
            if (!opcodes)
                throw "Canno build diff view; opcodes is not defined.";

            function celt (name, clazz) {
                var e = document.createElement(name);
                e.className = clazz;
                return e;
            }

            function telt (name, text) {
                var e = document.createElement(name);
                e.appendChild(document.createTextNode(text));
                return e;
            }

            function ctelt (name, clazz, text) {
                var e = document.createElement(name);
                e.className = clazz;
                e.appendChild(document.createTextNode(text));
                return e;
            }

            var tdata = document.createElement("thead");
            var node = document.createElement("tr");
            tdata.appendChild(node);
            if (inline) {
                node.appendChild(document.createElement("th"));
                node.appendChild(document.createElement("th"));
                node.appendChild(ctelt("th", "texttitle", baseTextName + " vs. " + newTextName + " vs. " + thirdTextName));
            } else {
                node.appendChild(document.createElement("th"));
                node.appendChild(ctelt("th", "texttitle", baseTextName));
                node.appendChild(document.createElement("th"));
                node.appendChild(ctelt("th", "texttitle", newTextName));
                node.appendChild(document.createElement("th"));
                node.appendChild(ctelt("th", "texttitle", thirdTextName));
            }
            tdata = [tdata];

            var rows = [];
            var node2;

            /**
             * Adds two cells to the given row; if the given row corresponds to a real
             * line number (based on the line index tidx and the endpoint of the 
             * range in question tend), then the cells will contain the line number
             * and the line of text from textLines at position tidx (with the class of
             * the second cell set to the name of the change represented), and tidx + 1 will
             * be returned.  Otherwise, tidx is returned, and two empty cells are added
             * to the given row.
             */
            function addCells (row, tidx, tend, textLines, change) {
                if (tidx < tend) {
                    row.appendChild(telt("th", (tidx + 1).toString()));
                    row.appendChild(ctelt("td", change, textLines[tidx].replace(/\t/g, "\u00a0\u00a0\u00a0\u00a0")));
                    return tidx + 1;
                } else {
                    row.appendChild(document.createElement("th"));
                    row.appendChild(celt("td", "empty"));
                    return tidx;
                }
            }

            function addCellsInline (row, tidx, tidx2, textLines, change) {
                row.appendChild(telt("th", tidx == null ? "" : (tidx + 1).toString()));
                row.appendChild(telt("th", tidx2 == null ? "" : (tidx2 + 1).toString()));
                row.appendChild(ctelt("td", change, textLines[tidx != null ? tidx : tidx2].replace(/\t/g, "\u00a0\u00a0\u00a0\u00a0")));
            }

            for (var idx = 0; idx < opcodes.length; idx++) {
                code = opcodes[idx];
                change = code[0];
                var b = code[1];
                var be = code[2];
                var n = code[3];
                var ne = code[4];
                var rowcnt = Math.max(be - b, ne - n);
                var toprows = [];
                var botrows = [];
                for (var i = 0; i < rowcnt; i++) {
                    // jump ahead if we've alredy provided leading context or if this is the first range
                    if (contextSize && opcodes.length > 1 && ((idx > 0 && i == contextSize) || (idx == 0 && i == 0)) && change=="equal") {
                        var jump = rowcnt - ((idx == 0 ? 1 : 2) * contextSize);
                        if (jump > 1) {
                            toprows.push(node = document.createElement("tr"));

                            b += jump;
                            n += jump;
                            i += jump - 1;
                            node.appendChild(telt("th", "..."));
                            if (!inline) node.appendChild(ctelt("td", "skip", ""));
                            node.appendChild(telt("th", "..."));
                            node.appendChild(ctelt("td", "skip", ""));

                            // skip last lines if they're all equal
                            if (idx + 1 == opcodes.length) {
                                break;
                            } else {
                                continue;
                            }
                        }
                    }

                    toprows.push(node = document.createElement("tr"));
                    if (inline) {
                        if (change == "insert") {
                            addCellsInline(node, null, n++, newTextLines, change);
                        } else if (change == "replace") {
                            botrows.push(node2 = document.createElement("tr"));
                            if (b < be) addCellsInline(node, b++, null, baseTextLines, "delete");
                            if (n < ne) addCellsInline(node2, null, n++, newTextLines, "insert");
                            if (n < ne) addCellsInline(node2, null, n++, thirdTextLines, "insert");

                        } else if (change == "delete") {
                            addCellsInline(node, b++, null, baseTextLines, change);
                        } else {
                            // equal
                            addCellsInline(node, b++, n++, baseTextLines, change);
                        }
                    } else {
                        b = addCells(node, b, be, baseTextLines, change);
                        n = addCells(node, n, ne, newTextLines, change);
                        n = addCells(node, n, ne, thirdTextLines, change);

                    }
                }

                for (var i = 0; i < toprows.length; i++) rows.push(toprows[i]);
                for (var i = 0; i < botrows.length; i++) rows.push(botrows[i]);
            }



            tdata.push(node = document.createElement("tbody"));
            for (var idx in rows) rows.hasOwnProperty(idx) && node.appendChild(rows[idx]);

            node = celt("table", "diff" + (inline ? " inlinediff" : ""));
            for (var idx in tdata) tdata.hasOwnProperty(idx) && node.appendChild(tdata[idx]);
            return node;
        }
    };
var __whitespace = {" ":true, "\t":true, "\n":true, "\f":true, "\r":true};

var difflib = {
    defaultJunkFunction: function (c) {
        return __whitespace.hasOwnProperty(c);
    },

    stripLinebreaks: function (str) { return str.replace(/^[\n\r]*|[\n\r]*$/g, ""); },

    stringAsLines: function (str) {
        var lfpos = str.indexOf("\n");
        var crpos = str.indexOf("\r");
        var linebreak = ((lfpos > -1 && crpos > -1) || crpos < 0) ? "\n" : "\r";

        var lines = str.split(linebreak);
        for (var i = 0; i < lines.length; i++) {
            lines[i] = difflib.stripLinebreaks(lines[i]);
        }

        return lines;
    },

    // iteration-based reduce implementation
    __reduce: function (func, list, initial) {
        if (initial != null) {
            var value = initial;
            var idx = 0;
        } else if (list) {
            var value = list[0];
            var idx = 1;
        } else {
            return null;
        }

        for (; idx < list.length; idx++) {
            value = func(value, list[idx]);
        }

        return value;
    },

    // comparison function for sorting lists of numeric tuples
    __ntuplecomp: function (a, b) {
        var mlen = Math.max(a.length, b.length);
        for (var i = 0; i < mlen; i++) {
            if (a[i] < b[i]) return -1;
            if (a[i] > b[i]) return 1;
        }

        return a.length == b.length ? 0 : (a.length < b.length ? -1 : 1);
    },

    __calculate_ratio: function (matches, length) {
        return length ? 2.0 * matches / length : 1.0;
    },

    // returns a function that returns true if a key passed to the returned function
    // is in the dict (js object) provided to this function; replaces being able to
    // carry around dict.has_key in python...
    __isindict: function (dict) {
        return function (key) { return dict.hasOwnProperty(key); };
    },

    // replacement for python's dict.get function -- need easy default values
    __dictget: function (dict, key, defaultValue) {
        return dict.hasOwnProperty(key) ? dict[key] : defaultValue;
    },  

    SequenceMatcher: function (a, b, c, isjunk) {

        this.set_seqs = function (a, b, c, ) {


            this.set_seq1(a);
            this.set_seq2(b);
            this.set_seq3(c);


        }

        this.set_seq1 = function (a) {
            if (a == this.a) return;
            this.a = a;
            this.matching_blocks = this.opcodes = null;
        }

        this.set_seq2 = function (b) {
            console.log("Value in set ", b)

            if (b == this.b) return;
            this.b = b;
            this.matching_blocks = this.opcodes = this.fullbcount = null;
            this.__chain_b();
        }

        this.set_seq3 = function (c) {
            console.log("Value in set ", c)
            if (c == this.c) return;
            this.c = c;
            this.matching_blocks = this.opcodes = this.fullbcount = null;
            this.__chain_c();
        }

        this.__chain_c = function () {
            console.log("This is ", this.c)
            var c = this.c;
            var n = c.length;
            var c2j = this.c2j = {};
            var populardict = {};
            for (var i = 0; i < c.length; i++) {
                var celt = c[i];
                if (c2j.hasOwnProperty(celt)) {
                    var indices = c2j[elt];
                    if (n >= 200 && indices.length * 100 > n) {
                        populardict[celt] = 1;
                        delete c2j[celt];
                    } else {
                        indices.push(i);
                    }
                } else {
                    c2j[celt] = [i];
                }
            }

            for (var elt in populardict) {
                if (populardict.hasOwnProperty(elt)) {
                    delete c2j[elt];
                }
            }

            var isjunk = this.isjunk;
            var junkdict = {};
            if (isjunk) {
                for (var elt in populardict) {
                    if (populardict.hasOwnProperty(elt) && isjunk(elt)) {
                        junkdict[elt] = 1;
                        delete populardict[elt];
                    }
                }
                for (var elt in c2j) {
                    if (c2j.hasOwnProperty(elt) && isjunk(elt)) {
                        junkdict[elt] = 1;
                        delete c2j[elt];
                    }
                }
            }

            this.iscjunk = difflib.__isindict(junkdict);
            this.iscpopular = difflib.__isindict(populardict);
        }



        this.__chain_b = function () {
            var b = this.b;
            var n = b.length;
            var b2j = this.b2j = {};
            var populardict = {};
            for (var i = 0; i < b.length; i++) {
                var elt = b[i];
                if (b2j.hasOwnProperty(elt)) {
                    var indices = b2j[elt];
                    if (n >= 200 && indices.length * 100 > n) {
                        populardict[elt] = 1;
                        delete b2j[elt];
                    } else {
                        indices.push(i);
                    }
                } else {
                    b2j[elt] = [i];
                }
            }

            for (var elt in populardict) {
                if (populardict.hasOwnProperty(elt)) {
                    delete b2j[elt];
                }
            }

            var isjunk = this.isjunk;
            var junkdict = {};
            if (isjunk) {
                for (var elt in populardict) {
                    if (populardict.hasOwnProperty(elt) && isjunk(elt)) {
                        junkdict[elt] = 1;
                        delete populardict[elt];
                    }
                }
                for (var elt in b2j) {
                    if (b2j.hasOwnProperty(elt) && isjunk(elt)) {
                        junkdict[elt] = 1;
                        delete b2j[elt];
                    }
                }
            }

            this.isbjunk = difflib.__isindict(junkdict);
            this.isbpopular = difflib.__isindict(populardict);
        }

        this.find_longest_match = function (alo, ahi, blo, bhi) {
            var a = this.a;
            var b = this.b;
            var b2j = this.b2j;
            var isbjunk = this.isbjunk;
            var besti = alo;
            var bestj = blo;
            var bestsize = 0;
            var j = null;
            var k;

            var j2len = {};
            var nothing = [];
            for (var i = alo; i < ahi; i++) {
                var newj2len = {};
                var jdict = difflib.__dictget(b2j, a[i], nothing);
                for (var jkey in jdict) {
                    if (jdict.hasOwnProperty(jkey)) {
                        j = jdict[jkey];
                        if (j < blo) continue;
                        if (j >= bhi) break;
                        newj2len[j] = k = difflib.__dictget(j2len, j - 1, 0) + 1;
                        if (k > bestsize) {
                            besti = i - k + 1;
                            bestj = j - k + 1;
                            bestsize = k;
                        }
                    }
                }
                j2len = newj2len;
            }

            while (besti > alo && bestj > blo && !isbjunk(b[bestj - 1]) && a[besti - 1] == b[bestj - 1]) {
                besti--;
                bestj--;
                bestsize++;
            }

            while (besti + bestsize < ahi && bestj + bestsize < bhi &&
                    !isbjunk(b[bestj + bestsize]) &&
                    a[besti + bestsize] == b[bestj + bestsize]) {
                bestsize++;
            }

            while (besti > alo && bestj > blo && isbjunk(b[bestj - 1]) && a[besti - 1] == b[bestj - 1]) {
                besti--;
                bestj--;
                bestsize++;
            }

            while (besti + bestsize < ahi && bestj + bestsize < bhi && isbjunk(b[bestj + bestsize]) &&
                    a[besti + bestsize] == b[bestj + bestsize]) {
                bestsize++;
            }

            return [besti, bestj, bestsize];
        }

        this.get_matching_blocks = function () {
            if (this.matching_blocks != null) return this.matching_blocks;
            var la = this.a.length;
            var lb = this.b.length;

            var queue = [[0, la, 0, lb]];
            var matching_blocks = [];
            var alo, ahi, blo, bhi, qi, i, j, k, x;
            while (queue.length) {
                qi = queue.pop();
                alo = qi[0];
                ahi = qi[1];
                blo = qi[2];
                bhi = qi[3];
                x = this.find_longest_match(alo, ahi, blo, bhi);
                i = x[0];
                j = x[1];
                k = x[2];

                if (k) {
                    matching_blocks.push(x);
                    if (alo < i && blo < j)
                        queue.push([alo, i, blo, j]);
                    if (i+k < ahi && j+k < bhi)
                        queue.push([i + k, ahi, j + k, bhi]);
                }
            }

            matching_blocks.sort(difflib.__ntuplecomp);

            var i1 = 0, j1 = 0, k1 = 0, block = 0;
            var i2, j2, k2;
            var non_adjacent = [];
            for (var idx in matching_blocks) {
                if (matching_blocks.hasOwnProperty(idx)) {
                    block = matching_blocks[idx];
                    i2 = block[0];
                    j2 = block[1];
                    k2 = block[2];
                    if (i1 + k1 == i2 && j1 + k1 == j2) {
                        k1 += k2;
                    } else {
                        if (k1) non_adjacent.push([i1, j1, k1]);
                        i1 = i2;
                        j1 = j2;
                        k1 = k2;
                    }
                }
            }

            if (k1) non_adjacent.push([i1, j1, k1]);

            non_adjacent.push([la, lb, 0]);
            this.matching_blocks = non_adjacent;
            return this.matching_blocks;
        }

        this.get_opcodes = function () {
            if (this.opcodes != null) return this.opcodes;
            var i = 0;
            var j = 0;
            var answer = [];
            this.opcodes = answer;
            var block, ai, bj, size, tag;
            var blocks = this.get_matching_blocks();
            for (var idx in blocks) {
                if (blocks.hasOwnProperty(idx)) {
                    block = blocks[idx];
                    ai = block[0];
                    bj = block[1];
                    size = block[2];
                    tag = '';
                    if (i < ai && j < bj) {
                        tag = 'replace';
                    } else if (i < ai) {
                        tag = 'delete';
                    } else if (j < bj) {
                        tag = 'insert';
                    }
                    if (tag) answer.push([tag, i, ai, j, bj]);
                    i = ai + size;
                    j = bj + size;

                    if (size) answer.push(['equal', ai, i, bj, j]);
                }
            }

            return answer;
        }

        // this is a generator function in the python lib, which of course is not supported in javascript
        // the reimplementation builds up the grouped opcodes into a list in their entirety and returns that.
        this.get_grouped_opcodes = function (n) {
            if (!n) n = 3;
            var codes = this.get_opcodes();
            if (!codes) codes = [["equal", 0, 1, 0, 1]];
            var code, tag, i1, i2, j1, j2;
            if (codes[0][0] == 'equal') {
                code = codes[0];
                tag = code[0];
                i1 = code[1];
                i2 = code[2];
                j1 = code[3];
                j2 = code[4];
                codes[0] = [tag, Math.max(i1, i2 - n), i2, Math.max(j1, j2 - n), j2];
            }
            if (codes[codes.length - 1][0] == 'equal') {
                code = codes[codes.length - 1];
                tag = code[0];
                i1 = code[1];
                i2 = code[2];
                j1 = code[3];
                j2 = code[4];
                codes[codes.length - 1] = [tag, i1, Math.min(i2, i1 + n), j1, Math.min(j2, j1 + n)];
            }

            var nn = n + n;
            var group = [];
            var groups = [];
            for (var idx in codes) {
                if (codes.hasOwnProperty(idx)) {
                    code = codes[idx];
                    tag = code[0];
                    i1 = code[1];
                    i2 = code[2];
                    j1 = code[3];
                    j2 = code[4];
                    if (tag == 'equal' && i2 - i1 > nn) {
                        group.push([tag, i1, Math.min(i2, i1 + n), j1, Math.min(j2, j1 + n)]);
                        groups.push(group);
                        group = [];
                        i1 = Math.max(i1, i2-n);
                        j1 = Math.max(j1, j2-n);
                    }

                    group.push([tag, i1, i2, j1, j2]);
                }
            }

            if (group && !(group.length == 1 && group[0][0] == 'equal')) groups.push(group)

            return groups;
        }

        this.ratio = function () {
            matches = difflib.__reduce(
                            function (sum, triple) { return sum + triple[triple.length - 1]; },
                            this.get_matching_blocks(), 0);
            return difflib.__calculate_ratio(matches, this.a.length + this.b.length);
        }

        this.quick_ratio = function () {
            var fullbcount, elt;
            if (this.fullbcount == null) {
                this.fullbcount = fullbcount = {};
                for (var i = 0; i < this.b.length; i++) {
                    elt = this.b[i];
                    fullbcount[elt] = difflib.__dictget(fullbcount, elt, 0) + 1;
                }
            }
            fullbcount = this.fullbcount;

            var avail = {};
            var availhas = difflib.__isindict(avail);
            var matches = numb = 0;
            for (var i = 0; i < this.a.length; i++) {
                elt = this.a[i];
                if (availhas(elt)) {
                    numb = avail[elt];
                } else {
                    numb = difflib.__dictget(fullbcount, elt, 0);
                }
                avail[elt] = numb - 1;
                if (numb > 0) matches++;
            }

            return difflib.__calculate_ratio(matches, this.a.length + this.b.length);
        }

        this.real_quick_ratio = function () {
            var la = this.a.length;
            var lb = this.b.length;
            return _calculate_ratio(Math.min(la, lb), la + lb);
        }

        this.isjunk = isjunk ? isjunk : difflib.defaultJunkFunction;
        this.a = this.b = null;
        this.set_seqs(a, b, c);
    }
};
var diffview={
/**
*生成并返回视觉差异视图。单个参数“params”应包含
*以下值:
*
*-baseTextLines:用作SequenceMatcher基本文本输入的字符串数组
*-newTextLines:用作SequenceMatcher新文本输入的字符串数组
*-操作码:SequenceMatcher.get_操作码()返回的数组数组
*-baseTextName:要在差异视图中的基本文本列表上方显示的标题;默认值
*到“基本文本”
*-newTextName:在diff视图中新文本列表上方显示的标题;默认值
*“新文本”
*-contextSize:显示差异周围的上下文行数;默认情况下,所有行
*显示
*-viewType:如果为0,则生成并排差异视图(默认);如果为1,则生成内联差异视图
*产生
*/
buildView:函数(参数){
var baseTextLines=参数baseTextLines;
var newTextLines=params.newTextLines;
var thirdTextLines=params.thirdTextLines;
var操作码=参数操作码;
var baseTextName=params.baseTextName?params.baseTextName:“基本文本”;
var newTextName=params.newTextName?params.newTextName:“新文本”;
var thirdTextName=params.thirdTextName?params.thirdTextName:“第三个文本”
var contextSize=params.contextSize;
var inline=(params.viewType==0 | | params.viewType==1)?params.viewType:0;
if(baseTextLines==null)
抛出“无法生成差异视图;未定义基线。”;
if(newTextLines==null)
抛出“无法生成差异视图;未定义newTextLines。”;
if(thirdTextLines==null)
throw“无法生成差异视图;未定义第三个文本行。”;
如果(!操作码)
抛出“Canno build diff view;操作码未定义。”;
函数celt(名称,clazz){
var e=document.createElement(名称);
e、 className=clazz;
返回e;
}
函数telt(名称、文本){
var e=document.createElement(名称);
e、 appendChild(document.createTextNode(text));
返回e;
}
函数ctelt(名称、类别、文本){
var e=document.createElement(名称);
e、 className=clazz;
e、 appendChild(document.createTextNode(text));
返回e;
}
var tdata=document.createElement(“thead”);
var节点=document.createElement(“tr”);
tdata.appendChild(节点);
如果(内联){
appendChild(document.createElement(“th”));
appendChild(document.createElement(“th”));
node.appendChild(ctelt(“th”,“texttitle”,baseTextName+“vs.”+newTextName+“vs.”+thirdTextName));
}否则{
appendChild(document.createElement(“th”));
appendChild(ctelt(“th”,“texttitle”,baseTextName));
appendChild(document.createElement(“th”));
appendChild(ctelt(“th”,“texttitle”,newTextName));
appendChild(document.createElement(“th”));
appendChild(ctelt(“th”,“texttitle”,thirdTextName));
}
tdata=[tdata];
var行=[];
var节点2;
/**
*将两个单元格添加到给定行;如果给定行