import os import sys import glob #Allow us to import the parent module os.chdir(os.path.split(os.path.abspath(__file__))[0]) sys.path.insert(0, os.path.abspath(os.path.join(os.pardir, "src"))) import html5lib from html5lib import html5parser, treebuilders #Define the location of the tests as this changes in release versions #RELEASE remove test_dir = os.path.join(os.path.pardir,os.path.pardir,'testdata') #END RELEASE #RELEASE add #test_dir = './testdata' #END RELEASE import json as simplejson #Build a dict of avaliable trees treeTypes = {"simpletree":treebuilders.getTreeBuilder("simpletree")} #"DOM":treebuilders.getTreeBuilder("dom")} #Try whatever etree implementations are avaliable from a list that are #"supposed" to work try: import xml.etree.ElementTree as ElementTree treeTypes['ElementTree'] = treebuilders.getTreeBuilder("etree", ElementTree, fullTree=True) except ImportError: try: import elementtree.ElementTree as ElementTree treeTypes['ElementTree'] = treebuilders.getTreeBuilder("etree", ElementTree, fullTree=True) except ImportError: pass try: import xml.etree.cElementTree as cElementTree treeTypes['cElementTree'] = treebuilders.getTreeBuilder("etree", cElementTree, fullTree=True) except ImportError: try: import cElementTree treeTypes['cElementTree'] = treebuilders.getTreeBuilder("etree", cElementTree, fullTree=True) except ImportError: pass try: import lxml.etree as lxml treeTypes['lxml'] = treebuilders.getTreeBuilder("etree", lxml, fullTree=True) except ImportError: pass try: import BeautifulSoup treeTypes["beautifulsoup"] = treebuilders.getTreeBuilder("beautifulsoup", fullTree=True) except ImportError: pass def html5lib_test_files(subdirectory, files='*.dat'): return glob.glob(os.path.join(test_dir,subdirectory,files)) class DefaultDict(dict): def __init__(self, default, *args, **kwargs): self.default = default dict.__init__(self, *args, **kwargs) def __getitem__(self, key): return dict.get(self, key, self.default) class TestData(object): def __init__(self, filename, newTestHeading="data"): self.f = open(filename, "rb") self.newTestHeading = newTestHeading def __iter__(self): data = DefaultDict(None) key=None for line in self.f: heading = self.isSectionHeading(line) if heading: if data and heading == self.newTestHeading: #Remove trailing newline data[key] = data[key][:-1] yield self.normaliseOutput(data) data = DefaultDict(None) key = heading data[key]=b"" elif key is not None: data[key] += line if data: yield self.normaliseOutput(data) def isSectionHeading(self, line): """If the current heading is a test section heading return the heading, otherwise return False""" if line.startswith(b"#"): return str(line[1:].strip(), "ascii") else: return False def normaliseOutput(self, data): #Remove trailing newlines for key,value in data.items(): if value.endswith(b"\n"): data[key] = value[:-1] return data def convert(stripChars): def convertData(data): """convert the output of str(document) to the format used in the testcases""" data = data.split("\n") rv = [] for line in data: if line.startswith("|"): rv.append(line[stripChars:]) else: rv.append(line) return "\n".join(rv) return convertData convertExpected = convert(2)