From 1db15bee5269981b8839f0549a57995877ba0469 Mon Sep 17 00:00:00 2001
From: Ian Gulliver
Date: Thu, 3 Jul 2014 01:20:40 -0400
Subject: [PATCH] Python: Pull group, extract and filter order fixes from
JavaScript
---
recentrunes.py | 29 +++++++++++++++++++++--------
test.py | 2 +-
2 files changed, 22 insertions(+), 9 deletions(-)
diff --git a/recentrunes.py b/recentrunes.py
index 4de5baa..54ea7ac 100644
--- a/recentrunes.py
+++ b/recentrunes.py
@@ -73,6 +73,15 @@ class Element(object):
oldNode.previousSibling = None
oldNode.nextSibling = None
+ def insertBefore(self, newNode, oldNode):
+ index = self.childNodes.index(oldNode)
+ self.childNodes.insert(index, newNode)
+ if oldNode.previousSibling:
+ oldNode.previousSibling.nextSibling = newNode
+ newNode.previousSibling = oldNode.previousSibling
+ oldNode.previousSibling = newNode
+ newNode.nextSibling = oldNode
+
def normalize(self):
lastTextNode = None
for childNode in list(self.childNodes):
@@ -320,7 +329,7 @@ def ExtractElement(nodeName):
return
parentNode = node.parentNode
for childNode in node.childNodes:
- parentNode.appendChild(childNode)
+ parentNode.insertBefore(childNode, node)
parentNode.removeChild(node)
parentNode.normalize()
return Filter
@@ -330,13 +339,15 @@ def GroupSiblings(parentName, childNames):
def Filter(node):
if node.nodeName not in childNames:
return
- if (node.previousSibling and
- node.previousSibling.nodeName == parentName):
- node.previousSibling.appendChild(node)
- return
+ nodes = []
+ iterNode = node
+ while iterNode and iterNode.nodeName in childNames:
+ nodes.append(iterNode)
+ iterNode = iterNode.nextSibling
newNode = Element(parentName)
node.parentNode.replaceChild(newNode, node)
- newNode.appendChild(node)
+ for childNode in nodes:
+ newNode.appendChild(childNode)
return Filter
@@ -372,8 +383,10 @@ def SplitElementAndNest(originalName, newNames):
def ApplyFilter(node, callback):
callback(node)
- for childNode in list(node.childNodes):
- ApplyFilter(childNode, callback)
+ i = 0
+ while i < len(node.childNodes):
+ ApplyFilter(node.childNodes[i], callback)
+ i += 1
def ApplyFilters(node, filters):
diff --git a/test.py b/test.py
index 692023c..429b9ba 100755
--- a/test.py
+++ b/test.py
@@ -48,6 +48,6 @@ code looks like this. Fixed width text looks like
this. This sentence is inline pre-formatted, which stops
'''''this from being bold and italic.'''''
We can also
stop <u>this from being underlined</u>, or just try
-<pre>interrupting cow style.</pre>This is a blockquote
Header 2
Header 3 with italics
Header 4
Header 5
Header 6
- Item 1a
- Item 1b
- Item 2
- Item 3
- Item 1c
I don't really understand what a definition isBut blockquotes are easy
Even larger onesAnd really huge onesThis line is pre-formatted and <del>not interpolated</del>
+<pre>interrupting cow style.</pre>This is a blockquote
Header 2
Header 3 with italics
Header 4
Header 5
Header 6
- Item 1a
- Item 1b
- Item 2
- Item 3
- Item 1c
I don't really understand what a definition isBut blockquotes are easyEven larger onesAnd really huge ones
This line is pre-formatted and <del>not interpolated</del>
This line is also pre-formatted
""", result