[javascriptlint-commit] SF.net SVN: javascriptlint:[223] trunk
Status: Beta
Brought to you by:
matthiasmiller
From: <mat...@us...> - 2008-08-27 01:58:43
|
Revision: 223 http://javascriptlint.svn.sourceforge.net/javascriptlint/?rev=223&view=rev Author: matthiasmiller Date: 2008-08-27 01:58:41 +0000 (Wed, 27 Aug 2008) Log Message: ----------- htmlparse: begin work on parsing HTML files Modified Paths: -------------- trunk/jsl.py Added Paths: ----------- trunk/pyjsl/htmlparse.py Modified: trunk/jsl.py =================================================================== --- trunk/jsl.py 2008-08-26 16:06:32 UTC (rev 222) +++ trunk/jsl.py 2008-08-27 01:58:41 UTC (rev 223) @@ -15,6 +15,7 @@ sys.path.append(setup.get_lib_path()) import pyjsl.conf +import pyjsl.htmlparse import pyjsl.jsparse import pyjsl.util import test @@ -130,7 +131,7 @@ if options.unittest: suite = unittest.TestSuite(); - for module in [pyjsl.jsparse, pyjsl.util]: + for module in [pyjsl.htmlparse, pyjsl.jsparse, pyjsl.util]: suite.addTest(unittest.findTestCases(module)) runner = unittest.TextTestRunner(verbosity=options.verbosity) Added: trunk/pyjsl/htmlparse.py =================================================================== --- trunk/pyjsl/htmlparse.py (rev 0) +++ trunk/pyjsl/htmlparse.py 2008-08-27 01:58:41 UTC (rev 223) @@ -0,0 +1,80 @@ +# vim: ts=4 sw=4 expandtab +import HTMLParser +import unittest + +import jsparse + +class _Parser(HTMLParser.HTMLParser): + def __init__(self): + HTMLParser.HTMLParser.__init__(self) + self._node_positions = jsparse.NodePositions('') + self._script = None + self._scripts = [] + + def handle_starttag(self, tag, attributes): + if tag.lower() == 'script' and not self._script: + offset = self._getoffset() + len(self.get_starttag_text()) + self._script = self._script or { + 'start': offset, + 'attributes': attributes + } + + def handle_endtag(self, tag): + if tag.lower() == 'script' and self._script: + start = self._script['start'] + end = self._getoffset() + script = self.rawdata[start:end] + if jsparse.is_compilable_unit(script): + attr = dict(self._script['attributes']) + self._scripts.append({ + 'script': script, + 'startoffset': start, + 'endoffset': end, + 'startpos': self._node_positions.from_offset(start), + 'endpos': self._node_positions.from_offset(end), + 'src': attr.get('src'), + 'type': attr.get('type') + }) + self._script = None + + def feed(self, data): + self._node_positions = jsparse.NodePositions(self.rawdata + data) + HTMLParser.HTMLParser.feed(self, data) + + def getscripts(self): + return self._scripts + + def _getnodepos(self): + line, col = self.getpos() + return jsparse.NodePos(line - 1, col) + + def _getoffset(self): + return self._node_positions.to_offset(self._getnodepos()) + +def findscripts(s): + parser = _Parser() + parser.feed(s) + parser.close() + return parser.getscripts() + +class TestHTMLParse(unittest.TestCase): + def testFindScript(self): + html = """ +<html><body> +<script src=test.js></script> +hi&b +a<script><!-- +var s = '<script></script>'; +--></script> +ok& +..</script> +ok& +</body> +</html> +""" + scripts = [x['script'] for x in findscripts(html)] + self.assertEquals(scripts, [ + "", + "<!--\nvar s = '<script></script>';\n-->" + ]) + Property changes on: trunk/pyjsl/htmlparse.py ___________________________________________________________________ Added: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |