DOM diff problem: max prefix and suffix mutable
This commit is contained in:
parent
11e4f355e7
commit
adf3e1b769
1 changed files with 29 additions and 10 deletions
39
karax.nim
39
karax.nim
|
|
@ -119,22 +119,41 @@ proc updateElement(parent, current: Node, newNode, oldNode: VNode) =
|
||||||
elif newNode.kind != VNodeKind.text:
|
elif newNode.kind != VNodeKind.text:
|
||||||
let newLength = newNode.len
|
let newLength = newNode.len
|
||||||
let oldLength = oldNode.len
|
let oldLength = oldNode.len
|
||||||
|
let minLength = min(newLength, oldLength)
|
||||||
assert oldNode.kind == newNode.kind
|
assert oldNode.kind == newNode.kind
|
||||||
when false:
|
when false:
|
||||||
if current.nodeName != toTag[oldNode.kind]:
|
if current.nodeName != toTag[oldNode.kind]:
|
||||||
kout current.nodeName
|
kout current.nodeName
|
||||||
kout toTag[oldNode.kind]
|
kout toTag[oldNode.kind]
|
||||||
assert false
|
assert false
|
||||||
for i in 0..min(newLength, oldLength)-1:
|
|
||||||
updateElement(current, current.childNodes[i],
|
var commonPrefix = 0
|
||||||
newNode[i],
|
while commonPrefix < minLength and newNode[commonPrefix] == oldNode[commonPrefix]:
|
||||||
oldNode[i])
|
inc commonPrefix
|
||||||
if newLength > oldLength:
|
|
||||||
for i in oldLength..newLength-1:
|
var oldPos = oldLength - 1
|
||||||
current.appendChild(vnodeToDom(newNode[i]))
|
var newPos = newLength - 1
|
||||||
elif oldLength > newLength:
|
while oldPos >= 0 and newPos >= 0 and newNode[newPos] == oldNode[oldPos]:
|
||||||
for i in countdown(oldLength-1, newLength):
|
dec oldPos
|
||||||
current.removeChild(current.lastChild)
|
dec newPos
|
||||||
|
|
||||||
|
var pos = commonPrefix
|
||||||
|
while pos <= newPos and pos <= oldPos:
|
||||||
|
updateElement(current, current.childNodes[pos],
|
||||||
|
newNode[pos],
|
||||||
|
oldNode[pos])
|
||||||
|
inc pos
|
||||||
|
|
||||||
|
while pos <= newPos:
|
||||||
|
if newPos == newLength - 1:
|
||||||
|
current.appendChild(vnodeToDom(newNode[pos]))
|
||||||
|
else:
|
||||||
|
current.insertBefore(vnodeToDom(newNode[pos]), current.childNodes[pos + 1])
|
||||||
|
inc pos
|
||||||
|
|
||||||
|
while pos <= oldPos:
|
||||||
|
current.removeChild(current.childNodes[pos])
|
||||||
|
inc pos
|
||||||
|
|
||||||
proc dodraw() =
|
proc dodraw() =
|
||||||
let newtree = dorender()
|
let newtree = dorender()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue