[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.
|