'a'
mh-two-thousand-and-two
2024-04-12 44d2c92345cd156a59fc327b3060292a282d2893
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
var toEl = require('./toEl');
var isStr = require('./isStr');
var h = require('./h');
var isNull = require('./isNull');
var each = require('./each');
 
exports = function(from, to) {
    if (isStr(to)) {
        to = toEl(to);
    }
    var morphed = from;
    var morphedType = morphed.nodeType;
    var toType = to.nodeType;
    if (morphedType === toType) {
        if (morphedType === ELEMENT_NODE) {
            if (morphed.nodeName !== to.nodeName) {
                morphed = h(to.nodeName);
                moveChildren(from, morphed);
            }
        } else if (morphedType === TEXT_NODE || morphedType === COMMENT_NODE) {
            if (morphed.nodeValue !== to.nodeValue) {
                morphed.nodeValue = to.nodeValue;
            }
            return morphed;
        }
    } else {
        morphed = to;
    }
    if (morphed !== to) {
        morphEl(morphed, to);
    }
    if (from.parentNode) {
        from.parentNode.replaceChild(morphed, from);
    }
    return morphed;
};
var ELEMENT_NODE = 1;
var TEXT_NODE = 3;
var COMMENT_NODE = 8;
function morphEl(from, to) {
    morphAttrs(from, to);
    morphChildren(from, to);
}
function morphAttrs(from, to) {
    var attrs = to.attributes;
    each(attrs, function(_ref) {
        var name = _ref.name,
            value = _ref.value;
        var fromVal = from.getAttribute(name);
        if (fromVal !== value) {
            from.setAttribute(name, value);
        }
    });
    attrs = from.attributes;
    var removedAttrNames = [];
    each(attrs, function(_ref2) {
        var name = _ref2.name;
        if (isNull(to.getAttribute(name))) {
            removedAttrNames.push(name);
        }
    });
    each(removedAttrNames, function(name) {
        return from.removeAttribute(name);
    });
}
function morphChildren(from, to) {
    var curToChild = to.firstChild;
    var curFromChild = from.firstChild;
    var toNextSibling;
    var fromNextSibling;
    outer: while (curToChild) {
        toNextSibling = curToChild.nextSibling;
        while (curFromChild) {
            fromNextSibling = curFromChild.nextSibling;
            var isCompatible = false;
            var curFromType = curFromChild.nodeType;
            var curToType = curToChild.nodeType;
            if (curFromType === curToType) {
                if (curFromType === ELEMENT_NODE) {
                    if (curFromChild.nodeName === curToChild.nodeName) {
                        isCompatible = true;
                        morphEl(curFromChild, curToChild);
                    }
                } else if (
                    curFromType === TEXT_NODE ||
                    curFromType === COMMENT_NODE
                ) {
                    isCompatible = true;
                    if (curFromChild.nodeValue !== curToChild.nodeValue) {
                        curFromChild.nodeValue = curToChild.nodeValue;
                    }
                }
            }
            if (isCompatible) {
                curToChild = toNextSibling;
                curFromChild = fromNextSibling;
                continue outer;
            }
            from.removeChild(curFromChild);
            curFromChild = fromNextSibling;
        }
        from.appendChild(curToChild);
        curFromChild = fromNextSibling;
        curToChild = toNextSibling;
    }
    if (curFromChild) {
        while (curFromChild) {
            fromNextSibling = curFromChild.nextSibling;
            from.removeChild(curFromChild);
            curFromChild = fromNextSibling;
        }
    }
}
function moveChildren(from, to) {
    var curChild = from.firstChild;
    while (curChild) {
        var nextChild = curChild.nextSibling;
        to.appendChild(curChild);
        curChild = nextChild;
    }
}
 
module.exports = exports;