Thread: [javascriptlint-commit] SF.net SVN: javascriptlint:[254] trunk (Page 2)
Status: Beta
Brought to you by:
matthiasmiller
From: <mat...@us...> - 2009-10-03 16:41:15
|
Revision: 254 http://javascriptlint.svn.sourceforge.net/javascriptlint/?rev=254&view=rev Author: matthiasmiller Date: 2009-10-03 16:41:05 +0000 (Sat, 03 Oct 2009) Log Message: ----------- Automatically run the makefiles from setup.py. (Note that the install is still broken.) Modified Paths: -------------- trunk/INSTALL trunk/Makefile.SpiderMonkey trunk/setup.py Modified: trunk/INSTALL =================================================================== --- trunk/INSTALL 2009-10-03 15:45:19 UTC (rev 253) +++ trunk/INSTALL 2009-10-03 16:41:05 UTC (rev 254) @@ -9,6 +9,7 @@ on Windows Vista.) Run the commands in that shell. On all platforms: - $ make -f Makefile.SpiderMonkey $ python setup.py build +To install on Unix: + $ sudo python setup.py install Modified: trunk/Makefile.SpiderMonkey =================================================================== --- trunk/Makefile.SpiderMonkey 2009-10-03 15:45:19 UTC (rev 253) +++ trunk/Makefile.SpiderMonkey 2009-10-03 16:41:05 UTC (rev 254) @@ -1,3 +1,5 @@ +## THIS IS AN INTERNAL MAKEFILE FOR setup.py +## DO NOT RUN THIS MAKEFILE DIRECTLY. SPIDERMONKEY_SRC=spidermonkey/src @@ -3,5 +5,4 @@ # Load the SpiderMonkey config to find the OS define # Also use this for the SO_SUFFIX -BUILD_OPT=1 DEPTH=$(SPIDERMONKEY_SRC) include $(SPIDERMONKEY_SRC)/config.mk @@ -16,10 +17,6 @@ BUILD_DIR=build/spidermonkey -# Use a dynamically-created makefile to determine the distutils output dir -DISTUTILS_DIR_MAKEFILE=$(BUILD_DIR)/Makefile-distutils -include $(DISTUTILS_DIR_MAKEFILE) - ORIG_LIB=$(SPIDERMONKEY_SRC)/$(OBJDIR)/$(JS_LIB) COPY_LIB=$(BUILD_DIR)/$(JS_LIB) ORIG_DLL=$(SPIDERMONKEY_SRC)/$(OBJDIR)/js32.dll @@ -40,23 +37,16 @@ all: $(ALL_TARGETS) clean: - make -f Makefile.ref -C $(SPIDERMONKEY_SRC) BUILD_OPT=$(BUILD_OPT) clean - rm $(ORIG_LIB) - rm -R $(BUILD_DIR) + rm -f $(ORIG_LIB) + rm -Rf $(BUILD_DIR) -$(DISTUTILS_DIR_MAKEFILE): Makefile.SpiderMonkey $(BUILD_DIR) - python -c "import setup; print 'DISTUTILS_DIR='+setup.get_lib_path()" >> $(DISTUTILS_DIR_MAKEFILE) - $(BUILD_DIR): mkdir -p $(BUILD_DIR) $(COPY_LIB): $(BUILD_DIR) $(ORIG_LIB) cp $(ORIG_LIB) $(COPY_LIB) -$(DISTUTILS_DIR): $(DISTUTILS_DIR_MAKEFILE) - mkdir -p $(DISTUTILS_DIR) - -$(COPY_DLL): $(DISTUTILS_DIR) $(ORIG_LIB) +$(COPY_DLL): $(ORIG_LIB) cp $(ORIG_DLL) $(COPY_DLL) $(OS_HEADER): $(BUILD_DIR) @@ -65,6 +55,3 @@ $(COPY_JSAUTOCFG_H): $(ORIG_JSAUTOCFG_H) cp $(ORIG_JSAUTOCFG_H) $(COPY_JSAUTOCFG_H) -$(ORIG_LIB): - make -f Makefile.ref -C $(SPIDERMONKEY_SRC) BUILD_OPT=$(BUILD_OPT) - Modified: trunk/setup.py =================================================================== --- trunk/setup.py 2009-10-03 15:45:19 UTC (rev 253) +++ trunk/setup.py 2009-10-03 16:41:05 UTC (rev 254) @@ -1,9 +1,35 @@ #!/usr/bin/python # vim: ts=4 sw=4 expandtab from distutils.core import setup, Extension +import distutils.command.build +import distutils.command.clean import os +import subprocess import sys +def _runmakefiles(distutils_dir, build_opt=1, args=[]): + # First build SpiderMonkey. + subprocess.check_call(['make', '-f', 'Makefile.ref', '-C', + 'spidermonkey/src', 'BUILD_OPT=%i' % build_opt] + \ + args) + + # Then copy the files to the build directory. + env = dict(os.environ) + if distutils_dir: + env['DISTUTILS_DIR'] = distutils_dir + subprocess.check_call(['make', '-f', 'Makefile.SpiderMonkey', + 'BUILD_OPT=%i' % build_opt] + args, env=env) + +class _MyBuild(distutils.command.build.build): + def run(self): + _runmakefiles(self.build_platlib) + distutils.command.build.build.run(self) + +class _MyClean(distutils.command.clean.clean): + def run(self): + _runmakefiles(None, args=['clean']) + distutils.command.clean.clean.run(self) + if __name__ == '__main__': if os.name == 'nt': library = 'js32' @@ -19,6 +45,10 @@ 'javascriptlint/pyspidermonkey/nodepos.c' ] ) + cmdclass = { + 'build': _MyBuild, + 'clean': _MyClean, + } args = {} args.update( name = 'javascriptlint', @@ -26,6 +56,7 @@ author = 'Matthias Miller', author_email = 'in...@ja...', url = 'http://www.javascriptlint.com/', + cmdclass = cmdclass, description = 'JavaScript Lint', ext_modules = [pyspidermonkey], packages = ['javascriptlint', 'javascriptlint.pyjsl'], This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mat...@us...> - 2009-10-03 16:53:15
|
Revision: 255 http://javascriptlint.svn.sourceforge.net/javascriptlint/?rev=255&view=rev Author: matthiasmiller Date: 2009-10-03 16:53:02 +0000 (Sat, 03 Oct 2009) Log Message: ----------- Move the contents of pyjsl out one level. Modified Paths: -------------- trunk/javascriptlint/jsl.py trunk/test.py Added Paths: ----------- trunk/javascriptlint/conf.py trunk/javascriptlint/htmlparse.py trunk/javascriptlint/jsparse.py trunk/javascriptlint/lint.py trunk/javascriptlint/spidermonkey.py trunk/javascriptlint/spidermonkey_.py trunk/javascriptlint/util.py trunk/javascriptlint/visitation.py trunk/javascriptlint/warnings.py Removed Paths: ------------- trunk/javascriptlint/pyjsl/ Copied: trunk/javascriptlint/conf.py (from rev 254, trunk/javascriptlint/pyjsl/conf.py) =================================================================== --- trunk/javascriptlint/conf.py (rev 0) +++ trunk/javascriptlint/conf.py 2009-10-03 16:53:02 UTC (rev 255) @@ -0,0 +1,136 @@ +# vim: ts=4 sw=4 expandtab +import os + +import warnings + +class ConfError(Exception): + def __init__(self, error): + Exception.__init__(self, error) + self.lineno = None + self.path = None + +class Setting: + wants_parm = False + wants_dir = False + +class BooleanSetting(Setting): + wants_parm = False + def __init__(self, default): + self.value = default + def load(self, enabled): + self.value = enabled + +class StringSetting(Setting): + wants_parm = True + def __init__(self, default): + self.value = default + def load(self, enabled, parm): + if not enabled: + raise ConfError, 'Expected +.' + self.value = parm + +class DeclareSetting(Setting): + wants_parm = True + def __init__(self): + self.value = [] + def load(self, enabled, parm): + if not enabled: + raise ConfError, 'Expected +.' + self.value.append(parm) + +class ProcessSetting(Setting): + wants_parm = True + wants_dir = True + def __init__(self, recurse_setting): + self.value = [] + self._recurse = recurse_setting + def load(self, enabled, parm, dir): + if dir: + parm = os.path.join(dir, parm) + self.value.append((self._recurse.value, parm)) + +class Conf: + def __init__(self): + recurse = BooleanSetting(False) + self._settings = { + 'recurse': recurse, + 'show_context': BooleanSetting(False), + 'output-format': StringSetting('__FILE__(__LINE__): __ERROR__'), + 'lambda_assign_requires_semicolon': BooleanSetting(False), + 'legacy_control_comments': BooleanSetting(True), + 'jscript_function_extensions': BooleanSetting(False), + 'always_use_option_explicit': BooleanSetting(False), + 'define': DeclareSetting(), + 'context': BooleanSetting(False), + 'process': ProcessSetting(recurse), + # SpiderMonkey warnings + 'no_return_value': BooleanSetting(True), + 'equal_as_assign': BooleanSetting(True), + 'anon_no_return_value': BooleanSetting(True) + } + for name in warnings.warnings: + self._settings[name] = BooleanSetting(True) + self.loadline('-block_without_braces') + + def loadfile(self, path): + path = os.path.abspath(path) + conf = open(path, 'r').read() + try: + self.loadtext(conf, dir=os.path.dirname(path)) + except ConfError, error: + error.path = path + raise + + def loadtext(self, conf, dir=None): + lines = conf.splitlines() + for lineno in range(0, len(lines)): + try: + self.loadline(lines[lineno], dir) + except ConfError, error: + error.lineno = lineno + raise + + def loadline(self, line, dir=None): + assert not '\r' in line + assert not '\n' in line + + # Allow comments + if '#' in line: + line = line[:line.find('#')] + line = line.rstrip() + if not line: + return + + # Parse the +/- + if line.startswith('+'): + enabled = True + elif line.startswith('-'): + enabled = False + else: + raise ConfError, 'Expected + or -.' + line = line[1:] + + # Parse the key/parms + name = line.split()[0].lower() + parm = line[len(name):].lstrip() + + # Load the setting + setting = self._settings[name] + args = { + 'enabled': enabled + } + if setting.wants_parm: + args['parm'] = parm + elif parm: + raise ConfError, 'The %s setting does not expect a parameter.' % name + if setting.wants_dir: + args['dir'] = dir + setting.load(**args) + + def __getitem__(self, name): + if name == 'paths': + name = 'process' + elif name == 'declarations': + name = 'define' + return self._settings[name].value + Property changes on: trunk/javascriptlint/conf.py ___________________________________________________________________ Added: svn:mergeinfo + Added: svn:eol-style + native Copied: trunk/javascriptlint/htmlparse.py (from rev 254, trunk/javascriptlint/pyjsl/htmlparse.py) =================================================================== --- trunk/javascriptlint/htmlparse.py (rev 0) +++ trunk/javascriptlint/htmlparse.py 2009-10-03 16:53:02 UTC (rev 255) @@ -0,0 +1,89 @@ +# 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 unknown_decl(self, data): + # Ignore unknown declarations instead of raising an exception. + pass + + 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-->" + ]) + def testConditionalComments(self): + html = """ +<!--[if IE]>This is Internet Explorer.<![endif]--> +<![if !IE]>This is not Internet Explorer<![endif]> +""" + findscripts(html) Property changes on: trunk/javascriptlint/htmlparse.py ___________________________________________________________________ Added: svn:mergeinfo + Added: svn:eol-style + native Modified: trunk/javascriptlint/jsl.py =================================================================== --- trunk/javascriptlint/jsl.py 2009-10-03 16:41:05 UTC (rev 254) +++ trunk/javascriptlint/jsl.py 2009-10-03 16:53:02 UTC (rev 255) @@ -7,11 +7,11 @@ import unittest from optparse import OptionParser -import pyjsl.conf -import pyjsl.htmlparse -import pyjsl.jsparse -import pyjsl.lint -import pyjsl.util +import conf +import htmlparse +import jsparse +import lint +import util _lint_results = { 'warnings': 0, @@ -20,15 +20,15 @@ def _dump(paths): for path in paths: - script = pyjsl.util.readfile(path) - pyjsl.jsparse.dump_tree(script) + script = util.readfile(path) + jsparse.dump_tree(script) -def _lint(paths, conf): +def _lint(paths, conf_): def lint_error(path, line, col, errname, errdesc): _lint_results['warnings'] = _lint_results['warnings'] + 1 - print pyjsl.util.format_error(conf['output-format'], path, line, col, + print util.format_error(conf_['output-format'], path, line, col, errname, errdesc) - pyjsl.lint.lint_files(paths, lint_error, conf=conf) + lint.lint_files(paths, lint_error, conf=conf_) def _resolve_paths(path, recurse): if os.path.isfile(path): @@ -88,9 +88,9 @@ parser.print_help() sys.exit() - conf = pyjsl.conf.Conf() + conf_ = conf.Conf() if options.conf: - conf.loadfile(options.conf) + conf_.loadfile(options.conf) profile_func = _profile_disabled if options.profile: @@ -98,21 +98,21 @@ if options.unittest: suite = unittest.TestSuite(); - for module in [pyjsl.htmlparse, pyjsl.jsparse, pyjsl.util]: + for module in [htmlparse, jsparse, util]: suite.addTest(unittest.findTestCases(module)) runner = unittest.TextTestRunner(verbosity=options.verbosity) runner.run(suite) paths = [] - for recurse, path in conf['paths']: + for recurse, path in conf_['paths']: paths.extend(_resolve_paths(path, recurse)) for arg in args: paths.extend(_resolve_paths(arg, False)) if options.dump: profile_func(_dump, paths) else: - profile_func(_lint, paths, conf) + profile_func(_lint, paths, conf_) if _lint_results['errors']: sys.exit(3) Copied: trunk/javascriptlint/jsparse.py (from rev 254, trunk/javascriptlint/pyjsl/jsparse.py) =================================================================== --- trunk/javascriptlint/jsparse.py (rev 0) +++ trunk/javascriptlint/jsparse.py 2009-10-03 16:53:02 UTC (rev 255) @@ -0,0 +1,414 @@ +#!/usr/bin/python +# vim: ts=4 sw=4 expandtab +""" Parses a script into nodes. """ +import bisect +import re +import unittest + +import spidermonkey +from spidermonkey import tok, op + +_tok_names = dict(zip( + [getattr(tok, prop) for prop in dir(tok)], + ['tok.%s' % prop for prop in dir(tok)] +)) +_op_names = dict(zip( + [getattr(op, prop) for prop in dir(op)], + ['op.%s' % prop for prop in dir(op)] +)) + +NodePos = spidermonkey.NodePos + +class NodePositions: + " Given a string, allows [x] lookups for NodePos line and column numbers." + def __init__(self, text, start_pos=None): + # Find the length of each line and incrementally sum all of the lengths + # to determine the ending position of each line. + self._start_pos = start_pos + self._lines = text.splitlines(True) + lines = [0] + [len(x) for x in self._lines] + for x in range(1, len(lines)): + lines[x] += lines[x-1] + self._line_offsets = lines + def from_offset(self, offset): + line = bisect.bisect(self._line_offsets, offset)-1 + col = offset - self._line_offsets[line] + if self._start_pos: + if line == 0: + col += self._start_pos.col + line += self._start_pos.line + return NodePos(line, col) + def to_offset(self, pos): + pos = self._to_rel_pos(pos) + offset = self._line_offsets[pos.line] + pos.col + assert offset <= self._line_offsets[pos.line+1] # out-of-bounds col num + return offset + def text(self, start, end): + assert start <= end + start, end = self._to_rel_pos(start), self._to_rel_pos(end) + # Trim the ending first in case it's a single line. + lines = self._lines[start.line:end.line+1] + lines[-1] = lines[-1][:end.col+1] + lines[0] = lines[0][start.col:] + return ''.join(lines) + def _to_rel_pos(self, pos): + " converts a position to a position relative to self._start_pos " + if not self._start_pos: + return pos + line, col = pos.line, pos.col + line -= self._start_pos.line + if line == 0: + col -= self._start_pos.col + assert line >= 0 and col >= 0 # out-of-bounds node position + return NodePos(line, col) + +class NodeRanges: + def __init__(self): + self._offsets = [] + def add(self, start, end): + i = bisect.bisect_left(self._offsets, start) + if i % 2 == 1: + i -= 1 + start = self._offsets[i] + + end = end + 1 + j = bisect.bisect_left(self._offsets, end) + if j % 2 == 1: + end = self._offsets[j] + j += 1 + + self._offsets[i:j] = [start,end] + def has(self, pos): + return bisect.bisect_right(self._offsets, pos) % 2 == 1 + +class _Node: + def add_child(self, node): + if node: + node.node_index = len(self.kids) + node.parent = self + self.kids.append(node) + + def start_pos(self): + try: + return self._start_pos + except AttributeError: + self._start_pos = NodePos(self._start_line, self._start_col) + return self._start_pos + + def end_pos(self): + try: + return self._end_pos + except AttributeError: + self._end_pos = NodePos(self._end_line, self._end_col) + return self._end_pos + + def __str__(self): + kind = self.kind + if not kind: + kind = '(none)' + return '%s>%s' % (_tok_names[kind], str(self.kids)) + + def is_equivalent(self, other, are_functions_equiv=False): + if not other: + return False + + # Bail out for functions + if not are_functions_equiv: + if self.kind == tok.FUNCTION: + return False + if self.kind == tok.LP and self.opcode == op.CALL: + return False + + if self.kind != other.kind: + return False + if self.opcode != other.opcode: + return False + + # Check atoms on names, properties, and string constants + if self.kind in (tok.NAME, tok.DOT, tok.STRING) and self.atom != other.atom: + return False + + # Check values on numbers + if self.kind == tok.NUMBER and self.dval != other.dval: + return False + + # Compare child nodes + if len(self.kids) != len(other.kids): + return False + for i in range(0, len(self.kids)): + # Watch for dead nodes + if not self.kids[i]: + if not other.kids[i]: return True + else: return False + if not self.kids[i].is_equivalent(other.kids[i]): + return False + + return True + +def findpossiblecomments(script, node_positions): + pos = 0 + single_line_re = r"//[^\r\n]*" + multi_line_re = r"/\*(.*?)\*/" + full_re = "(%s)|(%s)" % (single_line_re, multi_line_re) + comment_re = re.compile(full_re, re.DOTALL) + + comments = [] + while True: + match = comment_re.search(script, pos) + if not match: + return comments + + # Get the comment text + comment_text = script[match.start():match.end()] + if comment_text.startswith('/*'): + comment_text = comment_text[2:-2] + opcode = 'JSOP_C_COMMENT' + else: + comment_text = comment_text[2:] + opcode = 'JSOP_CPP_COMMENT' + opcode = opcode[5:].lower() + + start_offset = match.start() + end_offset = match.end()-1 + + start_pos = node_positions.from_offset(start_offset) + end_pos = node_positions.from_offset(end_offset) + kwargs = { + 'type': 'COMMENT', + 'atom': comment_text, + 'opcode': opcode, + '_start_line': start_pos.line, + '_start_col': start_pos.col, + '_end_line': end_pos.line, + '_end_col': end_pos.col, + 'parent': None, + 'kids': [], + 'node_index': None + } + comment_node = _Node() + comment_node.__dict__.update(kwargs) + comments.append(comment_node) + + # Start searching immediately after the start of the comment in case + # this one was within a string or a regexp. + pos = match.start()+1 + +def parse(script, error_callback, startpos=None): + """ All node positions will be relative to startpos. This allows scripts + to be embedded in a file (for example, HTML). + """ + def _wrapped_callback(line, col, msg): + assert msg.startswith('JSMSG_') + msg = msg[6:].lower() + error_callback(line, col, msg) + + startpos = startpos or NodePos(0,0) + return spidermonkey.parse(script, _Node, _wrapped_callback, + startpos.line, startpos.col) + +def filtercomments(possible_comments, node_positions, root_node): + comment_ignore_ranges = NodeRanges() + + def process(node): + if node.kind == tok.NUMBER: + node.atom = node_positions.text(node.start_pos(), node.end_pos()) + elif node.kind == tok.STRING or \ + (node.kind == tok.OBJECT and node.opcode == op.REGEXP): + start_offset = node_positions.to_offset(node.start_pos()) + end_offset = node_positions.to_offset(node.end_pos()) - 1 + comment_ignore_ranges.add(start_offset, end_offset) + for kid in node.kids: + if kid: + process(kid) + process(root_node) + + comments = [] + for comment in possible_comments: + start_offset = node_positions.to_offset(comment.start_pos()) + end_offset = node_positions.to_offset(comment.end_pos()) + if comment_ignore_ranges.has(start_offset): + continue + comment_ignore_ranges.add(start_offset, end_offset) + comments.append(comment) + return comments + +def findcomments(script, root_node, start_pos=None): + node_positions = NodePositions(script, start_pos) + possible_comments = findpossiblecomments(script, node_positions) + return filtercomments(possible_comments, node_positions, root_node) + +def is_compilable_unit(script): + return spidermonkey.is_compilable_unit(script) + +def _dump_node(node, depth=0): + if node is None: + print ' '*depth, + print '(None)' + print + else: + print ' '*depth, + print '%s, %s' % (_tok_names[node.kind], _op_names[node.opcode]) + print ' '*depth, + print '%s - %s' % (node.start_pos(), node.end_pos()) + if hasattr(node, 'atom'): + print ' '*depth, + print 'atom: %s' % node.atom + if node.no_semi: + print ' '*depth, + print '(no semicolon)' + print + for node in node.kids: + _dump_node(node, depth+1) + +def dump_tree(script): + def error_callback(line, col, msg): + print '(%i, %i): %s', (line, col, msg) + node = parse(script, error_callback) + _dump_node(node) + +class TestComments(unittest.TestCase): + def _test(self, script, expected_comments): + root = parse(script, lambda line, col, msg: None) + comments = findcomments(script, root) + encountered_comments = [node.atom for node in comments] + self.assertEquals(encountered_comments, list(expected_comments)) + def testSimpleComments(self): + self._test('re = /\//g', ()) + self._test('re = /\///g', ()) + self._test('re = /\////g', ('g',)) + def testCComments(self): + self._test('/*a*//*b*/', ('a', 'b')) + self._test('/*a\r\na*//*b\r\nb*/', ('a\r\na', 'b\r\nb')) + self._test('a//*b*/c', ('*b*/c',)) + self._test('a///*b*/c', ('/*b*/c',)) + self._test('a/*//*/;', ('//',)) + self._test('a/*b*/+/*c*/d', ('b', 'c')) + +class TestNodePositions(unittest.TestCase): + def _test(self, text, expected_lines, expected_cols): + # Get a NodePos list + positions = NodePositions(text) + positions = [positions.from_offset(i) for i in range(0, len(text))] + encountered_lines = ''.join([str(x.line) for x in positions]) + encountered_cols = ''.join([str(x.col) for x in positions]) + self.assertEquals(encountered_lines, expected_lines.replace(' ', '')) + self.assertEquals(encountered_cols, expected_cols.replace(' ', '')) + def testSimple(self): + self._test( + 'abc\r\ndef\nghi\n\nj', + '0000 0 1111 2222 3 4', + '0123 4 0123 0123 0 0' + ) + self._test( + '\rabc', + '0 111', + '0 012' + ) + def testText(self): + pos = NodePositions('abc\r\ndef\n\nghi') + self.assertEquals(pos.text(NodePos(0, 0), NodePos(0, 0)), 'a') + self.assertEquals(pos.text(NodePos(0, 0), NodePos(0, 2)), 'abc') + self.assertEquals(pos.text(NodePos(0, 2), NodePos(1, 2)), 'c\r\ndef') + def testOffset(self): + pos = NodePositions('abc\r\ndef\n\nghi') + self.assertEquals(pos.to_offset(NodePos(0, 2)), 2) + self.assertEquals(pos.to_offset(NodePos(1, 0)), 5) + self.assertEquals(pos.to_offset(NodePos(3, 1)), 11) + def testStartPos(self): + pos = NodePositions('abc\r\ndef\n\nghi', NodePos(3,4)) + self.assertEquals(pos.to_offset(NodePos(3, 4)), 0) + self.assertEquals(pos.to_offset(NodePos(3, 5)), 1) + self.assertEquals(pos.from_offset(0), NodePos(3, 4)) + self.assertEquals(pos.text(NodePos(3, 4), NodePos(3, 4)), 'a') + self.assertEquals(pos.text(NodePos(3, 4), NodePos(3, 6)), 'abc') + self.assertEquals(pos.text(NodePos(3, 6), NodePos(4, 2)), 'c\r\ndef') + +class TestNodeRanges(unittest.TestCase): + def testAdd(self): + r = NodeRanges() + r.add(5, 10) + self.assertEquals(r._offsets, [5,11]) + r.add(15, 20) + self.assertEquals(r._offsets, [5,11,15,21]) + r.add(21,22) + self.assertEquals(r._offsets, [5,11,15,23]) + r.add(4,5) + self.assertEquals(r._offsets, [4,11,15,23]) + r.add(9,11) + self.assertEquals(r._offsets, [4,12,15,23]) + r.add(10,20) + self.assertEquals(r._offsets, [4,23]) + r.add(4,22) + self.assertEquals(r._offsets, [4,23]) + r.add(30,30) + self.assertEquals(r._offsets, [4,23,30,31]) + def testHas(self): + r = NodeRanges() + r.add(5, 10) + r.add(15, 15) + assert not r.has(4) + assert r.has(5) + assert r.has(6) + assert r.has(9) + assert r.has(10) + assert not r.has(14) + assert r.has(15) + assert not r.has(16) + +class TestCompilableUnit(unittest.TestCase): + def test(self): + tests = ( + ('var s = "', False), + ('bogon()', True), + ('int syntax_error;', True), + ('a /* b', False), + ('re = /.*', False), + ('{ // missing curly', False) + ) + for text, result in tests: + self.assertEquals(is_compilable_unit(text), result) + # NOTE: This seems like a bug. + self.assert_(is_compilable_unit("/* test")) + +class TestLineOffset(unittest.TestCase): + def testErrorPos(self): + def geterror(script, startpos): + errors = [] + def onerror(line, col, msg): + errors.append((line, col, msg)) + parse(script, onerror, startpos) + self.assertEquals(len(errors), 1) + return errors[0] + self.assertEquals(geterror(' ?', None), (0, 1, 'syntax_error')) + self.assertEquals(geterror('\n ?', None), (1, 1, 'syntax_error')) + self.assertEquals(geterror(' ?', NodePos(1,1)), (1, 2, 'syntax_error')) + self.assertEquals(geterror('\n ?', NodePos(1,1)), (2, 1, 'syntax_error')) + def testNodePos(self): + def getnodepos(script, startpos): + root = parse(script, None, startpos) + self.assertEquals(root.kind, tok.LC) + var, = root.kids + self.assertEquals(var.kind, tok.VAR) + return var.start_pos() + self.assertEquals(getnodepos('var x;', None), NodePos(0,0)) + self.assertEquals(getnodepos(' var x;', None), NodePos(0,1)) + self.assertEquals(getnodepos('\n\n var x;', None), NodePos(2,1)) + self.assertEquals(getnodepos('var x;', NodePos(3,4)), NodePos(3,4)) + self.assertEquals(getnodepos(' var x;', NodePos(3,4)), NodePos(3,5)) + self.assertEquals(getnodepos('\n\n var x;', NodePos(3,4)), NodePos(5,1)) + def testComments(self): + def testcomment(comment, startpos, expectedpos): + root = parse(comment, None, startpos) + comment, = findcomments(comment, root, startpos) + self.assertEquals(comment.start_pos(), expectedpos) + for comment in ('/*comment*/', '//comment'): + testcomment(comment, None, NodePos(0,0)) + testcomment(' %s' % comment, None, NodePos(0,1)) + testcomment('\n\n %s' % comment, None, NodePos(2,1)) + testcomment('%s' % comment, NodePos(3,4), NodePos(3,4)) + testcomment(' %s' % comment, NodePos(3,4), NodePos(3,5)) + testcomment('\n\n %s' % comment, NodePos(3,4), NodePos(5,1)) + +if __name__ == '__main__': + unittest.main() + Property changes on: trunk/javascriptlint/jsparse.py ___________________________________________________________________ Added: svn:mergeinfo + Added: svn:eol-style + native Copied: trunk/javascriptlint/lint.py (from rev 254, trunk/javascriptlint/pyjsl/lint.py) =================================================================== --- trunk/javascriptlint/lint.py (rev 0) +++ trunk/javascriptlint/lint.py 2009-10-03 16:53:02 UTC (rev 255) @@ -0,0 +1,505 @@ +#!/usr/bin/python +# vim: ts=4 sw=4 expandtab +import os.path +import re + +import conf +import htmlparse +import jsparse +import visitation +import warnings +import util + +from spidermonkey import tok, op + +_newline_kinds = ( + 'eof', 'comma', 'dot', 'semi', 'colon', 'lc', 'rc', 'lp', 'rb', 'assign', + 'relop', 'hook', 'plus', 'minus', 'star', 'divop', 'eqop', 'shop', 'or', + 'and', 'bitor', 'bitxor', 'bitand', 'else', 'try' +) + +_globals = frozenset([ + 'Array', 'Boolean', 'Math', 'Number', 'String', 'RegExp', 'Script', 'Date', + 'isNaN', 'isFinite', 'parseFloat', 'parseInt', + 'eval', 'NaN', 'Infinity', + 'escape', 'unescape', 'uneval', + 'decodeURI', 'encodeURI', 'decodeURIComponent', 'encodeURIComponent', + 'Function', 'Object', + 'Error', 'InternalError', 'EvalError', 'RangeError', 'ReferenceError', + 'SyntaxError', 'TypeError', 'URIError', + 'arguments', 'undefined' +]) + +def _find_function(node): + while node and node.kind != tok.FUNCTION: + node = node.parent + return node + +def _find_functions(node): + functions = [] + while node: + if node.kind == tok.FUNCTION: + functions.append(node) + node = node.parent + return functions + +def _parse_control_comment(comment): + """ Returns None or (keyword, parms) """ + if comment.atom.lower().startswith('jsl:'): + control_comment = comment.atom[4:] + elif comment.atom.startswith('@') and comment.atom.endswith('@'): + control_comment = comment.atom[1:-1] + else: + return None + + control_comments = { + 'ignoreall': (False), + 'ignore': (False), + 'end': (False), + 'option explicit': (False), + 'import': (True), + 'fallthru': (False), + 'pass': (False), + 'declare': (True) + } + if control_comment.lower() in control_comments: + keyword = control_comment.lower() + else: + keyword = control_comment.lower().split()[0] + if not keyword in control_comments: + return None + + parms = control_comment[len(keyword):].strip() + return (comment, keyword, parms) + +class Scope: + """ Outer-level scopes will never be associated with a node. + Inner-level scopes will always be associated with a node. + """ + def __init__(self): + self._parent = None + self._kids = [] + self._identifiers = {} + self._references = [] + self._node = None + def add_scope(self, node): + assert not node is None + self._kids.append(Scope()) + self._kids[-1]._parent = self + self._kids[-1]._node = node + return self._kids[-1] + def add_declaration(self, name, node): + self._identifiers[name] = node + def add_reference(self, name, node): + self._references.append((name, node)) + def get_identifier(self, name): + if name in self._identifiers: + return self._identifiers[name] + else: + return None + def get_identifiers(self): + "returns a list of names" + return self._identifiers.keys() + def resolve_identifier(self, name): + if name in self._identifiers: + return self, self._identifiers[name] + if self._parent: + return self._parent.resolve_identifier(name) + return None + def get_unreferenced_and_undeclared_identifiers(self): + """ Returns a tuple of unreferenced and undeclared, where each is a list + of (scope, name, node) tuples. + """ + unreferenced = {} + undeclared = [] + self._find_unreferenced_and_undeclared(unreferenced, undeclared, False) + + # Convert "unreferenced" from a dictionary of: + # { (scope, name): node } + # to a list of: + # [ (scope, name, node) ] + # sorted by node position. + unreferenced = [(key[0], key[1], node) for key, node + in unreferenced.items()] + unreferenced.sort(key=lambda x: x[2].start_pos()) + + return unreferenced, undeclared + def _find_unreferenced_and_undeclared(self, unreferenced, undeclared, + is_in_with_scope): + """ unreferenced is a dictionary, such that: + (scope, name): node + } + undeclared is a list, such that: [ + (scope, name, node) + ] + """ + if self._node and self._node.kind == tok.WITH: + is_in_with_scope = True + + # Add all identifiers as unreferenced. Children scopes will remove + # them if they are referenced. Variables need to be keyed by name + # instead of node, because function parameters share the same node. + for name, node in self._identifiers.items(): + unreferenced[(self, name)] = node + + # Remove all declared variables from the "unreferenced" set; add all + # undeclared variables to the "undeclared" list. + for name, node in self._references: + resolved = self.resolve_identifier(name) + if resolved: + # Make sure this isn't an assignment. + if node.parent.kind in (tok.ASSIGN, tok.INC, tok.DEC) and \ + node.node_index == 0 and \ + node.parent.parent.kind == tok.SEMI: + continue + unreferenced.pop((resolved[0], name), None) + else: + # with statements cannot have undeclared identifiers. + if not is_in_with_scope: + undeclared.append((self, name, node)) + + for child in self._kids: + child._find_unreferenced_and_undeclared(unreferenced, undeclared, + is_in_with_scope) + def find_scope(self, node): + for kid in self._kids: + scope = kid.find_scope(node) + if scope: + return scope + + # Always add it to the outer scope. + if not self._parent: + assert not self._node + return self + + # Conditionally add it to an inner scope. + assert self._node + if (node.start_pos() >= self._node.start_pos() and \ + node.end_pos() <= self._node.end_pos()): + return self + +class _Script: + def __init__(self): + self._imports = set() + self.scope = Scope() + def importscript(self, script): + self._imports.add(script) + def hasglobal(self, name): + return not self._findglobal(name, set()) is None + def _findglobal(self, name, searched): + """ searched is a set of all searched scripts """ + # Avoid recursion. + if self in searched: + return + + # Check this scope. + if self.scope.get_identifier(name): + return self + searched.add(self) + + # Search imported scopes. + for script in self._imports: + global_ = script._findglobal(name, searched) + if global_: + return global_ + +def lint_files(paths, lint_error, conf=conf.Conf()): + def lint_file(path, kind): + def import_script(import_path): + # The user can specify paths using backslashes (such as when + # linting Windows scripts on a posix environment. + import_path = import_path.replace('\\', os.sep) + import_path = os.path.join(os.path.dirname(path), import_path) + return lint_file(import_path, 'js') + def _lint_error(*args): + return lint_error(normpath, *args) + + normpath = util.normpath(path) + if normpath in lint_cache: + return lint_cache[normpath] + print normpath + contents = util.readfile(path) + lint_cache[normpath] = _Script() + + script_parts = [] + if kind == 'js': + script_parts.append((None, contents)) + elif kind == 'html': + for script in htmlparse.findscripts(contents): + if script['src']: + other = import_script(script['src']) + lint_cache[normpath].importscript(other) + if script['script'].strip(): + script_parts.append((script['startpos'], script['script'])) + else: + assert False, 'Unsupported file kind: %s' % kind + + _lint_script_parts(script_parts, lint_cache[normpath], _lint_error, conf, import_script) + return lint_cache[normpath] + + lint_cache = {} + for path in paths: + ext = os.path.splitext(path)[1] + if ext.lower() in ['.htm', '.html']: + lint_file(path, 'html') + else: + lint_file(path, 'js') + +def _lint_script_part(scriptpos, script, script_cache, conf, ignores, + report_native, report_lint, import_callback): + def parse_error(row, col, msg): + if not msg in ('anon_no_return_value', 'no_return_value', + 'redeclared_var', 'var_hides_arg'): + parse_errors.append((jsparse.NodePos(row, col), msg)) + + def report(node, errname, pos=None, **errargs): + if errname == 'empty_statement' and node.kind == tok.LC: + for pass_ in passes: + if pass_.start_pos() > node.start_pos() and \ + pass_.end_pos() < node.end_pos(): + passes.remove(pass_) + return + + if errname == 'missing_break': + # Find the end of the previous case/default and the beginning of + # the next case/default. + assert node.kind in (tok.CASE, tok.DEFAULT) + prevnode = node.parent.kids[node.node_index-1] + expectedfallthru = prevnode.end_pos(), node.start_pos() + elif errname == 'missing_break_for_last_case': + # Find the end of the current case/default and the end of the + # switch. + assert node.parent.kind == tok.LC + expectedfallthru = node.end_pos(), node.parent.end_pos() + else: + expectedfallthru = None + + if expectedfallthru: + start, end = expectedfallthru + for fallthru in fallthrus: + # Look for a fallthru between the end of the current case or + # default statement and the beginning of the next token. + if fallthru.start_pos() > start and fallthru.end_pos() < end: + fallthrus.remove(fallthru) + return + + report_lint(node, errname, pos, **errargs) + + parse_errors = [] + declares = [] + import_paths = [] + fallthrus = [] + passes = [] + + node_positions = jsparse.NodePositions(script, scriptpos) + possible_comments = jsparse.findpossiblecomments(script, node_positions) + + root = jsparse.parse(script, parse_error, scriptpos) + if not root: + # Report errors and quit. + for pos, msg in parse_errors: + report_native(pos, msg) + return + + comments = jsparse.filtercomments(possible_comments, node_positions, root) + start_ignore = None + for comment in comments: + cc = _parse_control_comment(comment) + if cc: + node, keyword, parms = cc + if keyword == 'declare': + if not util.isidentifier(parms): + report(node, 'jsl_cc_not_understood') + else: + declares.append((parms, node)) + elif keyword == 'ignore': + if start_ignore: + report(node, 'mismatch_ctrl_comments') + else: + start_ignore = node + elif keyword == 'end': + if start_ignore: + ignores.append((start_ignore.start_pos(), node.end_pos())) + start_ignore = None + else: + report(node, 'mismatch_ctrl_comments') + elif keyword == 'import': + if not parms: + report(node, 'jsl_cc_not_understood') + else: + import_paths.append(parms) + elif keyword == 'fallthru': + fallthrus.append(node) + elif keyword == 'pass': + passes.append(node) + else: + if comment.opcode == 'c_comment': + # Look for nested C-style comments. + nested_comment = comment.atom.find('/*') + if nested_comment < 0 and comment.atom.endswith('/'): + nested_comment = len(comment.atom) - 1 + # Report at the actual error of the location. Add two + # characters for the opening two characters. + if nested_comment >= 0: + pos = node_positions.from_offset(node_positions.to_offset(comment.start_pos()) + 2 + nested_comment) + report(comment, 'nested_comment', pos=pos) + if comment.atom.lower().startswith('jsl:'): + report(comment, 'jsl_cc_not_understood') + elif comment.atom.startswith('@'): + report(comment, 'legacy_cc_not_understood') + if start_ignore: + report(start_ignore, 'mismatch_ctrl_comments') + + # Wait to report parse errors until loading jsl:ignore directives. + for pos, msg in parse_errors: + report_native(pos, msg) + + # Find all visitors and convert them into "onpush" callbacks that call "report" + visitors = { + 'push': warnings.make_visitors() + } + for event in visitors: + for kind, callbacks in visitors[event].items(): + visitors[event][kind] = [_getreporter(callback, report) for callback in callbacks] + + # Push the scope/variable checks. + visitation.make_visitors(visitors, [_get_scope_checks(script_cache.scope, report)]) + + # kickoff! + _lint_node(root, visitors) + + for fallthru in fallthrus: + report(fallthru, 'invalid_fallthru') + for fallthru in passes: + report(fallthru, 'invalid_pass') + + # Process imports by copying global declarations into the universal scope. + for path in import_paths: + script_cache.importscript(import_callback(path)) + + for name, node in declares: + declare_scope = script_cache.scope.find_scope(node) + if declare_scope.get_identifier(name): + report(node, 'redeclared_var', name=name) + else: + declare_scope.add_declaration(name, node) + +def _lint_script_parts(script_parts, script_cache, lint_error, conf, import_callback): + def report_lint(node, errname, pos=None, **errargs): + errdesc = warnings.format_error(errname, **errargs) + _report(pos or node.start_pos(), errname, errdesc, True) + + def report_native(pos, errname): + # TODO: Format the error. + _report(pos, errname, errname, False) + + def _report(pos, errname, errdesc, require_key): + try: + if not conf[errname]: + return + except KeyError, err: + if require_key: + raise + + for start, end in ignores: + if pos >= start and pos <= end: + return + + return lint_error(pos.line, pos.col, errname, errdesc) + + for scriptpos, script in script_parts: + ignores = [] + _lint_script_part(scriptpos, script, script_cache, conf, ignores, + report_native, report_lint, import_callback) + + scope = script_cache.scope + unreferenced, undeclared = scope.get_unreferenced_and_undeclared_identifiers() + for decl_scope, name, node in undeclared: + if name in conf['declarations']: + continue + if name in _globals: + continue + if not script_cache.hasglobal(name): + report_lint(node, 'undeclared_identifier', name=name) + for ref_scope, name, node in unreferenced: + # Ignore the outer scope. + if ref_scope != scope: + report_lint(node, 'unreferenced_identifier', name=name) + +def _getreporter(visitor, report): + def onpush(node): + try: + ret = visitor(node) + assert ret is None, 'visitor should raise an exception, not return a value' + except warnings.LintWarning, warning: + # TODO: This is ugly hardcoding to improve the error positioning of + # "missing_semicolon" errors. + if visitor.warning in ('missing_semicolon', 'missing_semicolon_for_lambda'): + pos = warning.node.end_pos() + else: + pos = None + report(warning.node, visitor.warning, pos=pos, **warning.errargs) + return onpush + +def _warn_or_declare(scope, name, node, report): + parent_scope, other = scope.resolve_identifier(name) or (None, None) + if other and other.kind == tok.FUNCTION and name in other.fn_args: + report(node, 'var_hides_arg', name=name) + elif other and parent_scope == scope: + report(node, 'redeclared_var', name=name) + else: + # TODO: Warn when hiding a variable in a parent scope. + scope.add_declaration(name, node) + +def _get_scope_checks(scope, report): + scopes = [scope] + + class scope_checks: + ' ' + @visitation.visit('push', tok.NAME) + def _name(self, node): + if node.node_index == 0 and node.parent.kind == tok.COLON and node.parent.parent.kind == tok.RC: + return # left side of object literal + if node.parent.kind == tok.VAR: + _warn_or_declare(scopes[-1], node.atom, node, report) + return + if node.parent.kind == tok.CATCH: + scopes[-1].add_declaration(node.atom, node) + scopes[-1].add_reference(node.atom, node) + + @visitation.visit('push', tok.FUNCTION) + def _push_func(self, node): + if node.fn_name: + _warn_or_declare(scopes[-1], node.fn_name, node, report) + self._push_scope(node) + for var_name in node.fn_args: + scopes[-1].add_declaration(var_name, node) + + @visitation.visit('push', tok.LEXICALSCOPE, tok.WITH) + def _push_scope(self, node): + scopes.append(scopes[-1].add_scope(node)) + + @visitation.visit('pop', tok.FUNCTION, tok.LEXICALSCOPE, tok.WITH) + def _pop_scope(self, node): + scopes.pop() + + return scope_checks + + +def _lint_node(node, visitors): + + for kind in (node.kind, (node.kind, node.opcode)): + if kind in visitors['push']: + for visitor in visitors['push'][kind]: + visitor(node) + + for child in node.kids: + if child: + _lint_node(child, visitors) + + for kind in (node.kind, (node.kind, node.opcode)): + if kind in visitors['pop']: + for visitor in visitors['pop'][kind]: + visitor(node) + + Property changes on: trunk/javascriptlint/lint.py ___________________________________________________________________ Added: svn:mergeinfo + Added: svn:eol-style + native Copied: trunk/javascriptlint/spidermonkey.py (from rev 254, trunk/javascriptlint/pyjsl/spidermonkey.py) =================================================================== --- trunk/javascriptlint/spidermonkey.py (rev 0) +++ trunk/javascriptlint/spidermonkey.py 2009-10-03 16:53:02 UTC (rev 255) @@ -0,0 +1,10 @@ +# vim: ts=4 sw=4 expandtab + +# This is a wrapper script to make it easier for development. It tries to +# import the development version first, and if that fails, it goes after the +# real version. +try: + from spidermonkey_ import * +except ImportError: + from pyspidermonkey import * + Property changes on: trunk/javascriptlint/spidermonkey.py ___________________________________________________________________ Added: svn:mergeinfo + Added: svn:eol-style + native Copied: trunk/javascriptlint/spidermonkey_.py (from rev 254, trunk/javascriptlint/pyjsl/spidermonkey_.py) =================================================================== --- trunk/javascriptlint/spidermonkey_.py (rev 0) +++ trunk/javascriptlint/spidermonkey_.py 2009-10-03 16:53:02 UTC (rev 255) @@ -0,0 +1,20 @@ +# vim: ts=4 sw=4 expandtab +from distutils.core import setup, Extension +import os +import sys + +# Add the bin directory to the module search path +def _get_lib_path(): + import distutils.dist + import distutils.command.build + dist = distutils.dist.Distribution() + build = distutils.command.build.build(dist) + build.finalize_options() + return os.path.join(os.path.dirname(__file__), '..', build.build_platlib, 'javascriptlint') + +sys.path.insert(0, _get_lib_path()) +try: + from pyspidermonkey import * +finally: + sys.path.pop(0) + Property changes on: trunk/javascriptlint/spidermonkey_.py ___________________________________________________________________ Added: svn:mergeinfo + Added: svn:eol-style + native Copied: trunk/javascriptlint/util.py (from rev 254, trunk/javascriptlint/pyjsl/util.py) =================================================================== --- trunk/javascriptlint/util.py (rev 0) +++ trunk/javascriptlint/util.py 2009-10-03 16:53:02 UTC (rev 255) @@ -0,0 +1,97 @@ +# vim: ts=4 sw=4 expandtab +import codecs +import os.path +import re +import unittest + +_identifier = re.compile('^[A-Za-z_$][A-Za-z0-9_$]*$') + +def isidentifier(text): + return _identifier.match(text) + +def _encode_error_keyword(s): + s = s.replace('\\', '\\\\') + s = s.replace('"', '\\"') + s = s.replace("'", "\\'") + s = s.replace("\t", "\\t") + s = s.replace("\r", "\\r") + s = s.replace("\n", "\\n") + return s + +def format_error(output_format, path, line, col, errname, errdesc): + errprefix = 'warning' #TODO + replacements = { + '__FILE__': path, + '__FILENAME__': os.path.basename(path), + '__LINE__': str(line+1), + '__COL__': str(col), + '__ERROR__': '%s: %s' % (errprefix, errdesc), + '__ERROR_NAME__': errname, + '__ERROR_PREFIX__': errprefix, + '__ERROR_MSG__': errdesc, + '__ERROR_MSGENC__': errdesc, + } + + formatted_error = output_format + + # If the output format starts with encode:, all of the keywords should be + # encoded. + if formatted_error.startswith('encode:'): + formatted_error = formatted_error[len('encode:'):] + encoded_keywords = replacements.keys() + else: + encoded_keywords = ['__ERROR_MSGENC__'] + + for keyword in encoded_keywords: + replacements[keyword] = _encode_error_keyword(replacements[keyword]) + + regexp = '|'.join(replacements.keys()) + return re.sub(regexp, lambda match: replacements[match.group(0)], + formatted_error) + +def readfile(path): + file = codecs.open(path, 'r', 'utf-8') + contents = file.read() + if contents and contents[0] == unicode(codecs.BOM_UTF8, 'utf8'): + contents = contents[1:] + return contents + +def normpath(path): + path = os.path.abspath(path) + path = os.path.normcase(path) + path = os.path.normpath(path) + return path + +class TestUtil(unittest.TestCase): + def testIdentifier(self): + assert not isidentifier('') + assert not isidentifier('0a') + assert not isidentifier('a b') + assert isidentifier('a') + assert isidentifier('$0') + + def testEncodeKeyword(self): + self.assertEquals(_encode_error_keyword(r'normal text'), 'normal text') + self.assertEquals(_encode_error_keyword(r'a\b'), r'a\\b') + self.assertEquals(_encode_error_keyword(r"identifier's"), r"identifier\'s") + self.assertEquals(_encode_error_keyword(r'"i"'), r'\"i\"') + self.assertEquals(_encode_error_keyword('a\tb'), r'a\tb') + self.assertEquals(_encode_error_keyword('a\rb'), r'a\rb') + self.assertEquals(_encode_error_keyword('a\nb'), r'a\nb') + + def testFormattedError(self): + self.assertEquals(format_error('__FILE__', '__LINE__', 1, 2, 'name', 'desc'), + '__LINE__') + self.assertEquals(format_error('__FILE__', r'c:\my\file', 1, 2, 'name', 'desc'), + r'c:\my\file') + self.assertEquals(format_error('encode:__FILE__', r'c:\my\file', 1, 2, 'name', 'desc'), + r'c:\\my\\file') + self.assertEquals(format_error('__ERROR_MSGENC__', r'c:\my\file', 1, 2, 'name', r'a\b'), + r'a\\b') + self.assertEquals(format_error('encode:__ERROR_MSGENC__', r'c:\my\file', 1, 2, 'name', r'a\b'), + r'a\\b') + + +if __name__ == '__main__': + unittest.main() + Property changes on: trunk/javascriptlint/util.py ___________________________________________________________________ Added: svn:mergeinfo + Added: svn:eol-style + native Copied: trunk/javascriptlint/visitation.py (from rev 254, trunk/javascriptlint/pyjsl/visitation.py) =================================================================== --- trunk/javascriptlint/visitation.py (rev 0) +++ trunk/javascriptlint/visitation.py 2009-10-03 16:53:02 UTC (rev 255) @@ -0,0 +1,52 @@ +# vim: ts=4 sw=4 expandtab +""" This is an abstract module for visiting specific nodes. This is useed to +traverse the tree to generate warnings. +""" + +def visit(event, *args): + """ This decorator is used to indicate which nodes the function should + examine. The function should accept (self, node) and return the relevant + node or None. """ + def _decorate(fn): + fn._visit_event = event + fn._visit_nodes = args + return fn + return _decorate + +def make_visitors(visitors, klasses): + """ Searches klasses for all member functions decorated with @visit and + fills a dictionary that looks like: + visitors = { + 'event_name': { + 'node_type' : [func1, func2] + } + } + """ + assert isinstance(visitors, dict) + + # Intantiate an instance of each class + for klass in klasses: + if klass.__name__.lower() != klass.__name__: + raise ValueError, 'class names must be lowercase' + if not klass.__doc__: + raise ValueError, 'missing docstring on class' + + # Look for functions with the "_visit_nodes" property. + visitor = klass() + for func in [getattr(visitor, name) for name in dir(visitor)]: + event_visitors = None + for node_kind in getattr(func, '_visit_nodes', ()): + # Group visitors by event (e.g. push vs pop) + if not event_visitors: + try: + event_visitors = visitors[func._visit_event] + except KeyError: + event_visitors = visitors[func._visit_event] = {} + + # Map from node_kind to the function + try: + event_visitors[node_kind].append(func) + except KeyError: + event_visitors[node_kind] = [func] + return visitors + Property changes on: trunk/javascriptlint/visitation.py ___________________________________________________________________ Added: svn:mergeinfo + Added: svn:eol-style + native Copied: trunk/javascriptlint/warnings.py (from rev 254, trunk/javascriptlint/pyjsl/warnings.py) =================================================================== --- trunk/javascriptlint/warnings.py (rev 0) +++ trunk/javascriptlint/warnings.py 2009-10-03 16:53:02 UTC (rev 255) @@ -0,0 +1,611 @@ +# vim: ts=4 sw=4 expandtab +""" This module contains all the warnings. To add a new warning, define a +function. Its name should be in lowercase and words should be separated by +underscores. + +The function should be decorated with a @lookfor call specifying the nodes it +wants to examine. The node names may be in the tok.KIND or (tok.KIND, op.OPCODE) +format. To report a warning, the function should raise a LintWarning exception. + +For example: + + @lookfor(tok.NODEKIND, (tok.NODEKIND, op.OPCODE)) + def warning_name(node): + if questionable: + raise LintWarning, node +""" +import re +import sys +import types + +import util +import visitation + +from spidermonkey import tok, op + +_ALL_TOKENS = tuple(filter(lambda x: x != tok.EOF, tok.__dict__.values())) + +def _get_assigned_lambda(node): + """ Given a node "x = function() {}", returns "function() {}". + """ + value = None + if node.kind == tok.SEMI: + assign_node, = node.kids + if assign_node and assign_node.kind == tok.ASSIGN: + ignored, value = assign_node.kids + elif node.kind == tok.VAR: + variables = node.kids + if variables: + value, = variables[-1].kids + + if value and value.kind == tok.FUNCTION and value.opcode == op.ANONFUNOBJ: + return value + +# TODO: document inspect, node:opcode, etc + +warnings = { + 'comparison_type_conv': 'comparisons against null, 0, true, false, or an empty string allowing implicit type conversion (use === or !==)', + 'default_not_at_end': 'the default case is not at the end of the switch statement', + 'duplicate_case_in_switch': 'duplicate case in switch statement', + 'missing_default_case': 'missing default case in switch statement', + 'with_statement': 'with statement hides undeclared variables; use temporary variable instead', + 'useless_comparison': 'useless comparison; comparing identical expressions', + 'use_of_label': 'use of label', + 'misplaced_regex': 'regular expressions should be preceded by a left parenthesis, assignment, colon, or comma', + 'assign_to_function_call': 'assignment to a function call', + 'ambiguous_else_stmt': 'the else statement could be matched with one of multiple if statements (use curly braces to indicate intent', + 'block_without_braces': 'block statement without curly braces', + 'ambiguous_nested_stmt': 'block statements containing block statements should use curly braces to resolve ambiguity', + 'inc_dec_within_stmt': 'increment (++) and decrement (--) operators used as part of greater statement', + 'comma_separated_stmts': 'multiple statements separated by commas (use semicolons?)', + 'empty_statement': 'empty statement or extra semicolon', + 'missing_break': 'missing break statement', + 'missing_break_for_last_case': 'missing break statement for last case in switch', + 'multiple_plus_minus': 'unknown order of operations for successive plus (e.g. x+++y) or minus (e.g. x---y) signs', + 'useless_assign': 'useless assignment', + 'unreachable_code': 'unreachable code', + 'meaningless_block': 'meaningless block; curly braces have no impact', + 'useless_void': 'use of the void type may be unnecessary (void is always undefined)', + 'parseint_missing_radix': 'parseInt missing radix parameter', + 'leading_decimal_point': 'leading decimal point may indicate a number or an object member', + 'trailing_decimal_point': 'trailing decimal point may indicate a number or an object member', + 'octal_number': 'leading zeros make an octal number', + 'trailing_comma_in_array': 'extra comma is not recommended in array initializers', + 'useless_quotes': 'the quotation marks are unnecessary', + 'mismatch_ctrl_comments': 'mismatched control comment; "ignore" and "end" control comments must have a one-to-one correspondence', + 'redeclared_var': 'redeclaration of {name}', + 'undeclared_identifier': 'undeclared identifier: {name}', + 'unreferenced_identifier': 'identifier is declared but never referenced: {name}', + 'jsl_cc_not_understood': 'couldn\'t understand control comment using /*jsl:keyword*/ syntax', + 'nested_comment': 'nested comment', + 'legacy_cc_not_understood': 'couldn\'t understand control comment using /*@keyword@*/ syntax', + 'var_hides_arg': 'variable {name} hides argument', + 'duplicate_formal': 'TODO', + 'missing_semicolon': 'missing semicolon', + 'missing_semicolon_for_lambda': 'missing semicolon for lambda assignment', + 'ambiguous_newline': 'unexpected end of line; it is ambiguous whether these lines are part of the same statement', + 'missing_option_explicit': 'the "option explicit" control comment is missing', + 'partial_option_explicit': 'the "option explicit" control comment, if used, must be in the first script tag', + 'dup_option_explicit': 'duplicate "option explicit" control comment', + 'invalid_fallthru': 'unexpected "fallthru" control comment', + 'invalid_pass': 'unexpected "pass" control comment', + 'want_assign_or_call': 'expected an assignment or function call', + 'no_return_value': 'function {name} does not always return a value', + 'anon_no_return_value': 'anonymous function does not always return value' +} + +def format_error(errname, **errargs): + errdesc = warnings[errname] + try: + errdesc = re.sub(r"{(\w+)}", lambda match: errargs[match.group(1)], errdesc) + except (TypeError, KeyError):... [truncated message content] |
From: <mat...@us...> - 2009-10-03 17:14:56
|
Revision: 256 http://javascriptlint.svn.sourceforge.net/javascriptlint/?rev=256&view=rev Author: matthiasmiller Date: 2009-10-03 17:14:49 +0000 (Sat, 03 Oct 2009) Log Message: ----------- Move spidermonkey_ into a subdirectory to keep it from being installed. Modified Paths: -------------- trunk/javascriptlint/spidermonkey.py trunk/setup.py Added Paths: ----------- trunk/javascriptlint/pyspidermonkey_/ trunk/javascriptlint/pyspidermonkey_/__init__.py Removed Paths: ------------- trunk/javascriptlint/spidermonkey_.py Property changes on: trunk/javascriptlint/pyspidermonkey_ ___________________________________________________________________ Added: svn:ignore + *.pyc Copied: trunk/javascriptlint/pyspidermonkey_/__init__.py (from rev 255, trunk/javascriptlint/spidermonkey_.py) =================================================================== --- trunk/javascriptlint/pyspidermonkey_/__init__.py (rev 0) +++ trunk/javascriptlint/pyspidermonkey_/__init__.py 2009-10-03 17:14:49 UTC (rev 256) @@ -0,0 +1,21 @@ +# vim: ts=4 sw=4 expandtab +from distutils.core import setup, Extension +import os +import sys + +# Add the bin directory to the module search path +def _get_lib_path(): + import distutils.dist + import distutils.command.build + dist = distutils.dist.Distribution() + build = distutils.command.build.build(dist) + build.finalize_options() + return os.path.join(os.path.dirname(__file__), '..', '..', + build.build_platlib, 'javascriptlint') + +sys.path.insert(0, _get_lib_path()) +try: + from pyspidermonkey import * +finally: + sys.path.pop(0) + Modified: trunk/javascriptlint/spidermonkey.py =================================================================== --- trunk/javascriptlint/spidermonkey.py 2009-10-03 16:53:02 UTC (rev 255) +++ trunk/javascriptlint/spidermonkey.py 2009-10-03 17:14:49 UTC (rev 256) @@ -4,7 +4,7 @@ # import the development version first, and if that fails, it goes after the # real version. try: - from spidermonkey_ import * + from pyspidermonkey_ import * except ImportError: from pyspidermonkey import * Deleted: trunk/javascriptlint/spidermonkey_.py =================================================================== --- trunk/javascriptlint/spidermonkey_.py 2009-10-03 16:53:02 UTC (rev 255) +++ trunk/javascriptlint/spidermonkey_.py 2009-10-03 17:14:49 UTC (rev 256) @@ -1,20 +0,0 @@ -# vim: ts=4 sw=4 expandtab -from distutils.core import setup, Extension -import os -import sys - -# Add the bin directory to the module search path -def _get_lib_path(): - import distutils.dist - import distutils.command.build - dist = distutils.dist.Distribution() - build = distutils.command.build.build(dist) - build.finalize_options() - return os.path.join(os.path.dirname(__file__), '..', build.build_platlib, 'javascriptlint') - -sys.path.insert(0, _get_lib_path()) -try: - from pyspidermonkey import * -finally: - sys.path.pop(0) - Modified: trunk/setup.py =================================================================== --- trunk/setup.py 2009-10-03 16:53:02 UTC (rev 255) +++ trunk/setup.py 2009-10-03 17:14:49 UTC (rev 256) @@ -59,7 +59,7 @@ cmdclass = cmdclass, description = 'JavaScript Lint', ext_modules = [pyspidermonkey], - packages = ['javascriptlint', 'javascriptlint.pyjsl'], + packages = ['javascriptlint'], scripts = ['jsl'] ) try: @@ -71,7 +71,7 @@ console = ['jsl.py'], options = { 'py2exe': { - 'excludes': ['pyjsl.spidermonkey_'], + 'excludes': ['javascriptlint.spidermonkey_'], 'bundle_files': 1 } }, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mat...@us...> - 2009-10-03 17:39:51
|
Revision: 257 http://javascriptlint.svn.sourceforge.net/javascriptlint/?rev=257&view=rev Author: matthiasmiller Date: 2009-10-03 17:39:40 +0000 (Sat, 03 Oct 2009) Log Message: ----------- Break unreferenced_identifier into unreferenced_argument, unreferenced_variable, and unreferenced_function. Modified Paths: -------------- trunk/javascriptlint/lint.py trunk/javascriptlint/warnings.py trunk/test.py trunk/tests/warnings/unreferenced_identifier.js Modified: trunk/javascriptlint/lint.py =================================================================== --- trunk/javascriptlint/lint.py 2009-10-03 17:14:49 UTC (rev 256) +++ trunk/javascriptlint/lint.py 2009-10-03 17:39:40 UTC (rev 257) @@ -88,21 +88,31 @@ self._kids[-1]._parent = self self._kids[-1]._node = node return self._kids[-1] - def add_declaration(self, name, node): - self._identifiers[name] = node + def add_declaration(self, name, node, type_): + assert type_ in ('arg', 'function', 'var'), \ + 'Unrecognized identifier type: %s' % type_ + self._identifiers[name] = { + 'node': node, + 'type': type_ + } def add_reference(self, name, node): self._references.append((name, node)) def get_identifier(self, name): if name in self._identifiers: - return self._identifiers[name] + return self._identifiers[name]['node'] else: return None + def get_identifier_type(self, name): + if name in self._identifiers: + return self._identifiers[name]['type'] + else: + return None def get_identifiers(self): "returns a list of names" return self._identifiers.keys() def resolve_identifier(self, name): if name in self._identifiers: - return self, self._identifiers[name] + return self, self._identifiers[name]['node'] if self._parent: return self._parent.resolve_identifier(name) return None @@ -139,8 +149,8 @@ # Add all identifiers as unreferenced. Children scopes will remove # them if they are referenced. Variables need to be keyed by name # instead of node, because function parameters share the same node. - for name, node in self._identifiers.items(): - unreferenced[(self, name)] = node + for name, info in self._identifiers.items(): + unreferenced[(self, name)] = info['node'] # Remove all declared variables from the "unreferenced" set; add all # undeclared variables to the "undeclared" list. @@ -382,7 +392,7 @@ if declare_scope.get_identifier(name): report(node, 'redeclared_var', name=name) else: - declare_scope.add_declaration(name, node) + declare_scope.add_declaration(name, node, 'var') def _lint_script_parts(script_parts, script_cache, lint_error, conf, import_callback): def report_lint(node, errname, pos=None, **errargs): @@ -424,7 +434,15 @@ for ref_scope, name, node in unreferenced: # Ignore the outer scope. if ref_scope != scope: - report_lint(node, 'unreferenced_identifier', name=name) + type_ = ref_scope.get_identifier_type(name) + if type_ == 'arg': + report_lint(node, 'unreferenced_argument', name=name) + elif type_ == 'function': + report_lint(node, 'unreferenced_function', name=name) + elif type_ == 'var': + report_lint(node, 'unreferenced_variable', name=name) + else: + assert False, 'Unrecognized identifier type: %s' % type_ def _getreporter(visitor, report): def onpush(node): @@ -441,7 +459,7 @@ report(warning.node, visitor.warning, pos=pos, **warning.errargs) return onpush -def _warn_or_declare(scope, name, node, report): +def _warn_or_declare(scope, name, type_, node, report): parent_scope, other = scope.resolve_identifier(name) or (None, None) if other and other.kind == tok.FUNCTION and name in other.fn_args: report(node, 'var_hides_arg', name=name) @@ -449,7 +467,7 @@ report(node, 'redeclared_var', name=name) else: # TODO: Warn when hiding a variable in a parent scope. - scope.add_declaration(name, node) + scope.add_declaration(name, node, type_) def _get_scope_checks(scope, report): scopes = [scope] @@ -461,19 +479,19 @@ if node.node_index == 0 and node.parent.kind == tok.COLON and node.parent.parent.kind == tok.RC: return # left side of object literal if node.parent.kind == tok.VAR: - _warn_or_declare(scopes[-1], node.atom, node, report) + _warn_or_declare(scopes[-1], node.atom, 'var', node, report) return if node.parent.kind == tok.CATCH: - scopes[-1].add_declaration(node.atom, node) + scopes[-1].add_declaration(node.atom, node, 'var') scopes[-1].add_reference(node.atom, node) @visitation.visit('push', tok.FUNCTION) def _push_func(self, node): if node.fn_name: - _warn_or_declare(scopes[-1], node.fn_name, node, report) + _warn_or_declare(scopes[-1], node.fn_name, 'function', node, report) self._push_scope(node) for var_name in node.fn_args: - scopes[-1].add_declaration(var_name, node) + scopes[-1].add_declaration(var_name, node, 'arg') @visitation.visit('push', tok.LEXICALSCOPE, tok.WITH) def _push_scope(self, node): Modified: trunk/javascriptlint/warnings.py =================================================================== --- trunk/javascriptlint/warnings.py 2009-10-03 17:14:49 UTC (rev 256) +++ trunk/javascriptlint/warnings.py 2009-10-03 17:39:40 UTC (rev 257) @@ -75,7 +75,9 @@ 'mismatch_ctrl_comments': 'mismatched control comment; "ignore" and "end" control comments must have a one-to-one correspondence', 'redeclared_var': 'redeclaration of {name}', 'undeclared_identifier': 'undeclared identifier: {name}', - 'unreferenced_identifier': 'identifier is declared but never referenced: {name}', + 'unreferenced_argument': 'argument declared but never referenced: {name}', + 'unreferenced_function': 'function is declared but never referenced: {name}', + 'unreferenced_variable': 'variable is declared but never referenced: {name}', 'jsl_cc_not_understood': 'couldn\'t understand control comment using /*jsl:keyword*/ syntax', 'nested_comment': 'nested comment', 'legacy_cc_not_understood': 'couldn\'t understand control comment using /*@keyword@*/ syntax', Modified: trunk/test.py =================================================================== --- trunk/test.py 2009-10-03 17:14:49 UTC (rev 256) +++ trunk/test.py 2009-10-03 17:39:40 UTC (rev 257) @@ -10,7 +10,9 @@ _DEFAULT_CONF = """ # This warning triggers a lot of warnings in many of the tests, so only enable # it when specifically testing it. --unreferenced_identifier +-unreferenced_argument +-unreferenced_function +-unreferenced_variable """ class TestError(Exception): Modified: trunk/tests/warnings/unreferenced_identifier.js =================================================================== --- trunk/tests/warnings/unreferenced_identifier.js 2009-10-03 17:14:49 UTC (rev 256) +++ trunk/tests/warnings/unreferenced_identifier.js 2009-10-03 17:39:40 UTC (rev 257) @@ -1,11 +1,13 @@ /* The tests disable this warning by default becaues of noise. Enable it. */ -/*conf:+unreferenced_identifier*/ +/*conf:+unreferenced_argument*/ +/*conf:+unreferenced_function*/ +/*conf:+unreferenced_variable*/ /* outer-level functions shouldn't warn */ var unreferenced_global; function unreferenced_identifier() { /* Test an unreferenced function. */ - function unreferenced_func() { /*warning:unreferenced_identifier*/ + function unreferenced_func() { /*warning:unreferenced_function*/ return true; } function referenced_func() { @@ -14,20 +16,20 @@ referenced_var(); /* Test an unreferenced parameter. */ - var z = new function(unreferenced_parm) { /*warning:unreferenced_identifier*/ + var z = new function(unreferenced_parm) { /*warning:unreferenced_argument*/ }; z.prop = 42; /* Test an unreferenced variable. */ - var unreferenced_variable = 100; /*warning:unreferenced_identifier*/ + var unreferenced_variable = 100; /*warning:unreferenced_variable*/ /* An unreferenced duplicate parameter should give one warning. */ - function func_with_dup(unref_dup_parm, unref_dup_parm) { /*warning:unreferenced_identifier*/ /*warning:duplicate_formal*/ + function func_with_dup(unref_dup_parm, unref_dup_parm) { /*warning:unreferenced_argument*/ /*warning:duplicate_formal*/ } func_with_dup(); /* An unreferenced duplicate variable should give one warning. */ - var unref_dup_var; /*warning:unreferenced_identifier*/ + var unref_dup_var; /*warning:unreferenced_variable*/ var unref_dup_var; /*warning:redeclared_var*/ /* Test a try/catch. The error doesn't need to be referenced. */ @@ -51,7 +53,7 @@ } /* Test assignments. */ - var assigned_but_unref; /*warning:unreferenced_identifier*/ + var assigned_but_unref; /*warning:unreferenced_variable*/ assigned_but_unref = 42; function callback() { @@ -60,9 +62,9 @@ (assigned_but_ref = callback)(); /* Test increment and decrement. */ - var unref_inc; /*warning:unreferenced_identifier*/ + var unref_inc; /*warning:unreferenced_variable*/ unref_inc++; - var unref_dec; /*warning:unreferenced_identifier*/ + var unref_dec; /*warning:unreferenced_variable*/ unref_dec--; var tmp; @@ -73,7 +75,7 @@ tmp = -tmp; /* Test named functions as references. */ - var fn = function ref_func() { return 42; }; /*warning:unreferenced_identifier*/ + var fn = function ref_func() { return 42; }; /*warning:unreferenced_function*/ fn(); /* Test nested scopes. */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mat...@us...> - 2009-10-05 06:04:18
|
Revision: 261 http://javascriptlint.svn.sourceforge.net/javascriptlint/?rev=261&view=rev Author: matthiasmiller Date: 2009-10-05 06:04:04 +0000 (Mon, 05 Oct 2009) Log Message: ----------- Initial work to support py2exe on Windows. Modified Paths: -------------- trunk/INSTALL trunk/Makefile.SpiderMonkey trunk/setup.py Modified: trunk/INSTALL =================================================================== --- trunk/INSTALL 2009-10-03 19:20:23 UTC (rev 260) +++ trunk/INSTALL 2009-10-05 06:04:04 UTC (rev 261) @@ -3,11 +3,16 @@ * Windows Prequisites: * Visual Studio 2003 * Python + * py2exe * MozillaBuild (http://developer.mozilla.org/en/docs/Windows_Build_Prerequisites) Launch the MozillaBuild 7.1 batch file. (You may have to run this as an Administrator on Windows Vista.) Run the commands in that shell. + If you don't have a copy of Visual Studio 2003, you can download the Python + source code and compile it yourself. Python C extensions must be built with + the same compiler as the Python interpreter. + On all platforms: $ python setup.py build Modified: trunk/Makefile.SpiderMonkey =================================================================== --- trunk/Makefile.SpiderMonkey 2009-10-03 19:20:23 UTC (rev 260) +++ trunk/Makefile.SpiderMonkey 2009-10-05 06:04:04 UTC (rev 261) @@ -46,7 +46,7 @@ $(COPY_LIB): $(BUILD_DIR) $(ORIG_LIB) cp $(ORIG_LIB) $(COPY_LIB) -$(COPY_DLL): $(ORIG_LIB) +$(COPY_DLL): $(ORIG_DLL) cp $(ORIG_DLL) $(COPY_DLL) $(OS_HEADER): $(BUILD_DIR) Modified: trunk/setup.py =================================================================== --- trunk/setup.py 2009-10-03 19:20:23 UTC (rev 260) +++ trunk/setup.py 2009-10-05 06:04:04 UTC (rev 261) @@ -11,24 +11,26 @@ pass def _runmakefiles(distutils_dir, build_opt=1, args=[]): + args = ['BUILD_OPT=%i' % build_opt] + if distutils_dir: + args.append('DISTUTILS_DIR=%s' % distutils_dir) + # First build SpiderMonkey. ret = subprocess.call(['make', '-f', 'Makefile.ref', '-C', - 'spidermonkey/src', 'BUILD_OPT=%i' % build_opt] + \ - args) + 'spidermonkey/src'] + args) if ret != 0: raise _MakefileError, 'Error running make.' # Then copy the files to the build directory. - env = dict(os.environ) - if distutils_dir: - env['DISTUTILS_DIR'] = distutils_dir - ret = subprocess.call(['make', '-f', 'Makefile.SpiderMonkey', - 'BUILD_OPT=%i' % build_opt] + args, env=env) + ret = subprocess.call(['make', '-f', 'Makefile.SpiderMonkey'] + args) if ret != 0: raise _MakefileError, 'Error running make.' class _MyBuild(distutils.command.build.build): def run(self): + # py2exe is calling reinitialize_command without finalizing. + self.ensure_finalized() + _runmakefiles(self.build_platlib) distutils.command.build.build.run(self) @@ -75,7 +77,7 @@ pass else: args.update( - console = ['jsl.py'], + console = ['jsl'], options = { 'py2exe': { 'excludes': ['javascriptlint.spidermonkey_'], This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mat...@us...> - 2009-10-06 16:06:08
|
Revision: 262 http://javascriptlint.svn.sourceforge.net/javascriptlint/?rev=262&view=rev Author: matthiasmiller Date: 2009-10-06 16:05:47 +0000 (Tue, 06 Oct 2009) Log Message: ----------- www: first cut on a markdown-based website Added Paths: ----------- trunk/www/ trunk/www/__template__ trunk/www/docs/ trunk/www/docs/index.htm trunk/www/docs/running_from_the_command_line.htm trunk/www/docs/running_from_windows_explorer.htm trunk/www/docs/running_from_your_ide.htm trunk/www/docs/running_from_your_php_website.htm trunk/www/docs/running_from_your_windows_program.htm trunk/www/download.htm trunk/www/index.htm trunk/www/online_lint.php trunk/www/static/ trunk/www/static/feed-icon-32x32.png trunk/www/static/global.css trunk/www.py Added: trunk/www/__template__ =================================================================== --- trunk/www/__template__ (rev 0) +++ trunk/www/__template__ 2009-10-06 16:05:47 UTC (rev 262) @@ -0,0 +1,22 @@ +<html> +<head> + <title>%(title)s</title> + <link rel="stylesheet" type="text/css" href="/static/global.css" /> +</head> +<body> + <div id="title"> + JavaScript Lint + </div> + <div id="nav"> + %(nav)s + <p align="center"><a href="rss.php"> + <img border="0" src="/static/feed-icon-32x32.png" width="32" height="32"></a></p> + </div> + <div id="body"> + %(body)s + </div> + <div id="footer"> + JavaScript Lint is sponsored by <a href="http://blog.outofhanwell.com/">Matthias Miller</a>. + </div> +</body> +</html> Property changes on: trunk/www/__template__ ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/www/docs/index.htm =================================================================== --- trunk/www/docs/index.htm (rev 0) +++ trunk/www/docs/index.htm 2009-10-06 16:05:47 UTC (rev 262) @@ -0,0 +1,84 @@ +<!-- +@title=Documentation +--> + +Setting Up JavaScript Lint +========================== + +You can run JavaScript Lint several ways: + +* You can [integrate it into your IDE](running_from_your_ide.htm), such as Visual Studio, SciTE, or any other IDE supporting external tools. When JavaScript Lint finds an error, your IDE takes you directly to the line containing the error. + +* You can [run it through Windows Explorer](running_from_windows_explorer.htm), which Windows programmers may prefer. + +* You can [use the command line](running_from_the_command_line.htm) to integrate into your build system, or maybe you're a Linux programmer and simply prefer the command line! + +Additionally, if you are a software developer, you may want to [integrate into your Windows program](running_from_your_windows_program.htm) or [run it from your PHP website](running_from_your_php_website.htm) to take advantage of the full power of JavaScript Lint. + +Disable Warnings with Control Comment +===================================== + +JavaScript Lint has limited support for control comments. To disable warnings in part of your JavaScript file, you can add the following comments: + +> /*jsl:ignore*/ +> (code that fires warnings) +> /*jsl:end*/ + +To ignore all warnings in a file, simply place `/*jsl:ignoreall*/` at the top of the file. + +Note that this should only be used as a short-term solution for code that you maintain. If this is caused by a bug or missing feature in JavaScript Lint, please report the problem to Info\<at\>JavaScriptLint.com. + +Option Explicit +=============== + +JavaScript Lint can optionally check for variables, functions, and objects that don't exist, much like Visual Basic's "option explicit." In the interest of making JavaScript Lint accessible to the average programmer, this powerful feature is disabled by default. Although this feature requires more work to understand and implement, it provides a higher level of protection against coding errors. + +A variable that is not explicitly declared has a global scope. For example, if a function uses a counter variable and calls another function that uses a counter variable by the same name, unless these functions use the var keyword to declare the variable, the two functions will be accessing and modifying the same variable. This almost never produces the expected behavior. + +Here's what it takes to set up this feature: + +* The check for undeclared identifiers is enabled on a per-file basis with a `/*jsl:option explicit*/` comment within a script. To enforce the use of option explicit, you can modify your configuration file to warn against scripts that do not use this feature. + +* If a script references a variable, function, or object from another script, you will need to add a `/*jsl:import PathToOtherScript*/` comment in your script. This tells JavaScript Lint to check for items declared in the other script. Relative paths are resolved based on the path of the current script. + +* Your script may also reference global objects that are provided by the runtime (e.g. Firefox or Windows Scripting Host). For example, the script in a web page may reference the global window object. Add the line "+define window" to your configuration file to tell JavaScript Lint about this global. + +JavaScript Lint does not validate object properties. They do not use the var keyword and cannot be validated without executing the script. + +The warnings for undeclared identifiers will appear after other warnings that may occur in the script. This is by design, since the entire script must be examined before identifiers can be called undefined. + +Switches and Breaks +=================== + +By default, JavaScript Lint warns against missing _break_'s in switch statements. Sometimes, however, break statements are intentionally excluded. To indicate this, use the `/*jsl:fallthru*/` control comment: + +> switch (i) { +> case 1: +> break; +> case 2: +> /*jsl:fallthru*/ +> case 3: +> break; +> } + +Empty Statements +================ + +By default, JavaScript Lint warns against empty statements. However, empty statements are sometimes intention. To indicate this, use the /*jsl:pass*/ control comment: + +> while (!hasResponse()) { +> /*jsl:pass*/ +> } + +Advanced Output Format +====================== + +The following output formats may also be used: + +* `__ERROR_PREFIX__` indicates the type of message +* `__ERROR_MSG__` indicates the message contents +* `__ERROR__` indicates the full error including the error type and the message. + +If the output format is prefixed with "encode:", all backslashes, single and double quotes, tabs, carriage returns, and line breaks will be escaped as `\\`, `\'` and `\"`, `\t`, `\r`, and `\n` (respectively). + +> __Syntax Note__: In addition to the /*jsl:keyword*/ syntax, control comments can also use the traditional `/*@keyword@*/` syntax. However, the jsl syntax is recommended for interoperability with JScript conditional compilation. Property changes on: trunk/www/docs/index.htm ___________________________________________________________________ Added: svn:eol-style + native Property changes on: trunk/www/docs/running_from_the_command_line.htm ___________________________________________________________________ Added: svn:eol-style + native Property changes on: trunk/www/docs/running_from_windows_explorer.htm ___________________________________________________________________ Added: svn:eol-style + native Property changes on: trunk/www/docs/running_from_your_ide.htm ___________________________________________________________________ Added: svn:eol-style + native Property changes on: trunk/www/docs/running_from_your_php_website.htm ___________________________________________________________________ Added: svn:eol-style + native Property changes on: trunk/www/docs/running_from_your_windows_program.htm ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/www/download.htm =================================================================== --- trunk/www/download.htm (rev 0) +++ trunk/www/download.htm 2009-10-06 16:05:47 UTC (rev 262) @@ -0,0 +1,28 @@ +<!-- +@title=Download +--> + +Getting Started +=============== + +To get started with JavaScript Lint, download the appropriate package and extract its contents. + +* JavaScript Lint 0.3.0 for Windows ([jsl-0.3.0-win32.zip](http://www.javascriptlint.com/download/jsl-0.3.0-win32.zip)) +* JavaScript Lint 0.3.0 for Mac OS X Intel ([jsl-0.3.0-mac.tar.gz](http://www.javascriptlint.com/download/jsl-0.3.0-mac.tar.gz)) +* JavaScript Lint 0.3.0 Source ([jsl-0.3.0-src.tar.gz](http://www.javascriptlint.com/download/jsl-0.3.0-src.tar.gz)) + +Developers can also check out from the Subversion trunk: + +> svn co https://javascriptlint.svn.sourceforge.net/svnroot/javascriptlint/trunk jsl + +The [documentation](/docs/) explains the different ways that you can run JavaScript Lint. + +JavaScript Lint continues to be improved. If you encounter problems or have suggestions or revisions, please visit the project [forum](http://sourceforge.net/forum/?group_id=168518) and [tracker](http://sourceforge.net/tracker/?group_id=168518). + +Acknowledgements +================ + +We all stand on the shoulders of giants. I would like to especially acknowledge [Douglas Crockford's](http://www.crockford.com/) work on [JSLint](http://www.jslint.com/). This lint is itself written in JavaScript and is an interesting and rather sophisticated script. Crockford's ideas about good coding practices served as a springboard for many of these lint rules. + +We are all indebted to the many people who have worked hard to develop Firefox. + Property changes on: trunk/www/download.htm ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/www/index.htm =================================================================== --- trunk/www/index.htm (rev 0) +++ trunk/www/index.htm 2009-10-06 16:05:47 UTC (rev 262) @@ -0,0 +1,40 @@ +<!-- +@title=JavaScript Lint +--> + +What It Is +========== + +Many JavaScript implementations do not warn against questionable coding practices. Yes, that's nice for the site that "works best with Internet Explorer" (designed with templates, scripted with snippets copied from forums). But it's a nightmare when you actually want to write quality, maintainable code. + +That's where JavaScript Lint comes in. With JavaScript Lint, you can check all your JavaScript source code for common mistakes without actually running the script or opening the web page. + +JavaScript Lint holds an advantage over competing lints because it is based on the JavaScript engine for the [Firefox browser](http://www.spreadfirefox.com/?q=affiliates&id=123423&t=70). This provides a robust framework that can not only check JavaScript syntax but also examine the coding techniques used in the script and warn against questionable practices. + +What It Does +============ + +Here are some common mistakes that JavaScript Lint looks for: + +* Missing semicolons at the end of a line. +* Curly braces without an _if_, _for_, _while_, etc. +* Code that is never run because of a _return_, _throw_, _continue_, or _break_. +* Case statements in a switch that do not have a _break_ statement. +* Leading and trailing decimal points on a number. +* A leading zero that turns a number into octal (base 8). +* Comments within comments. +* Ambiguity whether two adjacent lines are part of the same statement. +* Statements that don't do anything. + +JavaScript Lint also looks for the following less common mistakes: + +* Regular expressions that are not preceded by a left parenthesis, assignment, colon, or comma. +* Statements that are separated by commas instead of semicolons. +* Use of increment (++) and decrement (--) except for simple statements such as "i++;" or "--i;". +* Use of the _void_ type. +* Successive plus (e.g. x+++y) or minus (e.g. x---y) signs. +* Use of labeled _for_ and _while_ loops. +* _if_, _for_, _while_, etc. without curly braces. (This check is disabled by default.) + +Advanced users can also configure JavaScript Lint to check for [undeclared identifiers](docs/). + Property changes on: trunk/www/index.htm ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/www/online_lint.php =================================================================== --- trunk/www/online_lint.php (rev 0) +++ trunk/www/online_lint.php 2009-10-06 16:05:47 UTC (rev 262) @@ -0,0 +1,22 @@ +<!-- +@title=The Online Lint +--> + +Online Lint +=========== + +All warnings except "option explicit" are enabled in this online edition, although certain warnings are displayed only once. For full control over which warnings are displayed, [download the JavaScript Lint software](/download.htm). + +If you encounter any problems, please report them to Matthias Miller at Info<at>JavaScriptLint.com. + + +<form method="POST" action=""> +<p>Paste your JavaScript, HTML, or URL into the box below:</p> +<p> + <textarea name="script" rows="15" cols="75" style="width: 100%"></textarea> +</p> +<p> + <input type="submit" value="Lint"/> + +</p> +</form> Added: trunk/www/static/feed-icon-32x32.png =================================================================== (Binary files differ) Property changes on: trunk/www/static/feed-icon-32x32.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/www/static/global.css =================================================================== --- trunk/www/static/global.css (rev 0) +++ trunk/www/static/global.css 2009-10-06 16:05:47 UTC (rev 262) @@ -0,0 +1,71 @@ +body +{ + font-family: Verdana,Arial,Helvetica,sans-serif; + color: #222; + background: #FFF; +} + +#title +{ + border-bottom: 2px solid #669; + color: #669; + font-size: 4em; + margin-bottom: 0.25em; +} + +#nav +{ + float: left; +} + +#nav ul +{ + margin: 0; + padding: 0; +} + +#nav li a +{ + background: #EEF; + color: #000; + border: 1px solid #AAC; + display: block; + text-decoration: none; + margin: 0.25em; + padding: 0.25em; + text-align: center; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; +} + +#nav li a.active +{ + cursor: default; +} + +#nav li a.active, +#nav li a:hover +{ + background: #335; + border-color: #334; + color: #FFF; +} + +h1 +{ + color: #003; +} + +#body +{ + margin-left: 9em; +} + +#footer +{ + color: #666; + font-size: 0.8em; + font-style: italic; + text-align: right; +} + Property changes on: trunk/www/static/global.css ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/www.py =================================================================== --- trunk/www.py (rev 0) +++ trunk/www.py 2009-10-06 16:05:47 UTC (rev 262) @@ -0,0 +1,98 @@ +#!/usr/bin/python +# vim: ts=4 sw=4 expandtab +import BaseHTTPServer +import re +import os +import sys + +import markdown + +DOC_ROOT = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'www') +TEMPLATE_PATH = os.path.join(DOC_ROOT, '__template__') + +NAV = [ + ('/', 'Home'), + ('/download.htm', 'Download'), + ('/online_lint.php', 'The Online Lint'), + ('/docs/', 'Documentation'), + ('/news.php', 'News'), + ('/contact_support.htm', 'Contact'), +] + +def _resolve_url(url): + urls = [ + url.rstrip('/') + '/index.htm', + url + ] + for url in urls: + path = os.path.join(DOC_ROOT, url.lstrip('/')) + if path.startswith(DOC_ROOT + os.sep) and os.path.isfile(path): + return path + +def _get_nav(path): + nav = [] + for url, name in NAV: + navpath = _resolve_url(url) + if navpath and navpath == path: + nav.append('* <a class="active">%s</a>' % name) + else: + nav.append('* [%s](%s)' % (name, url)) + return markdown.markdown('\n'.join(nav)) + +def _transform_file(path): + source = open(path).read() + if path.endswith('.css'): + return 'text/css', source + elif path.endswith('.gif'): + return 'image/gif', source + elif path.endswith('.png'): + return 'image/png', source + elif path.endswith('.htm') or path.endswith('.php'): + body = markdown.markdown(source) + keywords = re.findall(r'^@(\w+)=(.*)$', source, re.MULTILINE) + # TODO: encode + keywords = dict(keywords) + keywords['body'] = body + keywords['nav'] = _get_nav(path) + page = open(TEMPLATE_PATH).read() % keywords + return 'text/html', page + else: + raise ValueError, 'Invalid file type: %s' % path + +class _Handler(BaseHTTPServer.BaseHTTPRequestHandler): + def do_GET(self): + path = _resolve_url(self.path) + if path: + self._send_response(*_transform_file(path)) + else: + self.send_error(404, "File not found") + + def _send_response(self, contenttype, content): + self.send_response(200) + self.send_header("Content-type", contenttype) + self.send_header("Content-length", str(len(content))) + self.end_headers() + self.wfile.write(content) + + +def runserver(): + server_address = ('', 8000) + httpd = BaseHTTPServer.HTTPServer(server_address, _Handler) + httpd.serve_forever() + +def main(action=''): + if action == 'server': + runserver() + return + # TODO: Implement 'build'. + print >>sys.stderr, """\ +Usage: www.py [server|build] + +server runs a test server on localhost +build generates static HTML files from the markup +""" + sys.exit(1) + +if __name__ == '__main__': + main(*sys.argv[1:]) + Property changes on: trunk/www.py ___________________________________________________________________ Added: svn:executable + * Added: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mat...@us...> - 2009-10-06 16:54:39
|
Revision: 263 http://javascriptlint.svn.sourceforge.net/javascriptlint/?rev=263&view=rev Author: matthiasmiller Date: 2009-10-06 16:54:26 +0000 (Tue, 06 Oct 2009) Log Message: ----------- www: bring in more of the website Modified Paths: -------------- trunk/www/__template__ trunk/www/docs/running_from_the_command_line.htm trunk/www/docs/running_from_windows_explorer.htm trunk/www/docs/running_from_your_ide.htm trunk/www/docs/running_from_your_php_website.htm trunk/www/docs/running_from_your_windows_program.htm trunk/www.py Added Paths: ----------- trunk/www/contact_support.htm trunk/www/news.php trunk/www/rss.php Modified: trunk/www/__template__ =================================================================== --- trunk/www/__template__ 2009-10-06 16:05:47 UTC (rev 262) +++ trunk/www/__template__ 2009-10-06 16:54:26 UTC (rev 263) @@ -9,7 +9,7 @@ </div> <div id="nav"> %(nav)s - <p align="center"><a href="rss.php"> + <p align="center"><a href="/rss.php"> <img border="0" src="/static/feed-icon-32x32.png" width="32" height="32"></a></p> </div> <div id="body"> Added: trunk/www/contact_support.htm =================================================================== --- trunk/www/contact_support.htm (rev 0) +++ trunk/www/contact_support.htm 2009-10-06 16:54:26 UTC (rev 263) @@ -0,0 +1,9 @@ +<!-- +@title=Contact +--> + +Contact +======= + +If you have a bug report, feature request, support question, please visit the project [forum](http://sourceforge.net/forum/?group_id=168518) and [tracker](http://sourceforge.net/tracker/?group_id=168518) or send an e-mail to Matthias Miller at Info\<at\>JavaScriptLint.com. + Property changes on: trunk/www/contact_support.htm ___________________________________________________________________ Added: svn:eol-style + native Modified: trunk/www/docs/running_from_the_command_line.htm =================================================================== --- trunk/www/docs/running_from_the_command_line.htm 2009-10-06 16:05:47 UTC (rev 262) +++ trunk/www/docs/running_from_the_command_line.htm 2009-10-06 16:54:26 UTC (rev 263) @@ -0,0 +1,14 @@ +<!-- +@title=Running from the Command Line +--> + +Running from the Command Line +============================= + +Running JavaScript Lint from the command line allows integration with build and source control systems. It also allows batching lint jobs. + +You can run JavaScript Lint in two modes: using built-in default settings or using settings from a configuration file. For the latter, the name of the configuration file is passed on the command line. The sample configuration file (jsl.default.conf) documents how to enable or disable warnings. + +The names of the files to process can be specified on the command line, in the configuration file, or both. The sample configuration file demonstrates how to use wildcards and recursion to specify which files to lint. + +Run jsl without parameters for usage. Modified: trunk/www/docs/running_from_windows_explorer.htm =================================================================== --- trunk/www/docs/running_from_windows_explorer.htm 2009-10-06 16:05:47 UTC (rev 262) +++ trunk/www/docs/running_from_windows_explorer.htm 2009-10-06 16:54:26 UTC (rev 263) @@ -0,0 +1,14 @@ +<!-- +@title=Running from Windows Explorer +--> + +Running from Windows Explorer +============================= + +The easiest way to run JavaScript lint is by adding it to the right-click menu on .htm and .js files. To do so, open Windows Explorer and choose Tools | Folder Options | File Types. Select the .js file type. Click Advanced, then click New. Enter these settings (paths will vary): + +__Action__: Lint + +__Application used to perform action__: `c:\path\to\jsl.exe -conf c:\path\to\configuration\file -process "%1" -pauseatend` + +Repeat these steps for all the file types that you wish to lint (e.g. .htm, .hta, and .wsf). Modified: trunk/www/docs/running_from_your_ide.htm =================================================================== --- trunk/www/docs/running_from_your_ide.htm 2009-10-06 16:05:47 UTC (rev 262) +++ trunk/www/docs/running_from_your_ide.htm 2009-10-06 16:54:26 UTC (rev 263) @@ -0,0 +1,112 @@ +<!-- +@title=Running from your IDE +--> + +Running from your IDE +===================== + +Visual Studio +------------- + +> If you use Microsoft Visual Studio to edit JavaScript or HTML, you may want to integrate this tool into Visual Studio. This will let you lint the file that is currently open. You can double-click on error messages or use keyboard shortcuts to look at the line of code that triggered a warning. + +> In Visual Studio 2003/2005, go to Tools, External Tools... and create a tool with these settings: + +> > __Command__: `c:\path\to\jsl.exe` +> > __Arguments__: `-conf c:\path\to\configuration\file -process $(ItemPath)` +> > __Initial directory__: +> > [x] Use output window; [_] Prompt for arguments + +> In Visual C++ 6.0, go to Tools, Customize, Tools and create a new tool with the following settings. + +> > __Command__: `c:\path\to\jsl.exe` +> > __Arguments__: `-conf c:\path\to\configuration\file -process $(FilePath)` +> > __Initial directory__: +> > [x] Use output window; [_] Prompt for arguments + +> If you wish to disable warnings, you can simply modify configuration file that is passed through the command line. + +> You may also want to create a second tool to lint all of your JavaScript files. To do this, you can create a copy of the configuration and specify specific folders to lint. (Instructions are included in the default configuration file.) + + +TextMate +-------- + +> See [JavaScript Tools TextMate Bundle](http://www.andrewdupont.net/2006/10/01/javascript-tools-textmate-bundle/). + + +SciTE +----- + +> You can also integrate JavaScript Lint into [SciTE](http://scintilla.sourceforge.net/SciTE.html). Open `~/.SciteUser.properties` (choose Options, Open User Options File). Add the following to the following lines: + +> > `file.patterns.js=*.js;*.es` +> > `command.compile.$(file.patterns.js)=/path/to/jsl conf /path/to/configuration/file process $(FileNameExt)` + +> You will also need to change your JavaScript Lint configuration so that SciTE will correctly place a yellow dot at the beginning of the line corresponding to the current error [see screenshot](../images/jsl-SciTE-screenshot.png). Change the `output-format` setting to: + +> > `+output-format __FILE__:__LINE__: __ERROR__` + +> Like Visual Studio, you can press F4 to go to the next error. + + +vim +--- + +> See [Integrating JavaScript Lint with vim](http://blogs.linux.ie/kenguest/2007/03/18/integrating-javascript-lint-with-vim/ "Integrating JavaScript lint with vim"). + +vim (Cygwin) +------------ + +> This configuration is for vim on Cygwin. There may be some differences with vim directly on Windows. + +1. Copy jsl.exe to /usr/bin +1. Copy jsl.default.conf to /etc/jsl.conf< +1. Edit /etc/jsl.conf: + 1. Comment out the line containing "+process" + 1. Comment out the line containing "+pauseatend" + 1. Set the line containing "+context" to "-context" +1. Add one of the following configurations to vimrc: + * To process the current file: + + `autocmd FileType javascript set makeprg=jsl\ -nologo\ -nofilelisting\ -nosummary\ -nocontext\ -conf\ '/cygwin/etc/jsl.conf'\ -process\ %` + `autocmd FileType javascript set errorformat=%f(%l):\ %m^M` + + * To process ALL files in the directory instead of just the current file: + + `autocmd FileType javascript set makeprg=jsl\ -nologo\ -nofilelisting\ -nosummary\ <autocmd FileType javascript set makeprg=jsl\ -nologo\ -nofilelisting\ -nosummary\ -nocontext\ -conf\ '/cygwin/etc/jsl.conf'\ -process\ '*.js'` + `autocmd FileType javascript set errorformat=%f(%l):\ %m^M` + + * If you want to process ALL files recursively, use these lines instead: + + `autocmd FileType javascript set makeprg=jsl\ -nologo\ -nofilelisting\ -nosummary\ -nocontext\ -conf\ '/cygwin/etc/jsl.conf'\ -process\ '*.js'\ -recurse` + `autocmd FileType javascript set errorformat=%f(%l):\ %m^M` + +> _Note that ^M should be a control character! To enter it, Press {Ctrl-V}{Ctrl-M}. If this doesn't work for you, just leave out ^M. Note also that if using method 2 or 3 and vim on cygwin, you will probably get vim errors about "unable to open swap file...". I have no way around this, but if you are ok with not having a swap file in vim (no recovery on crash), then that's fine._ + +emacs +----- + +> To integrate JavaScript Lint to emacs, add the following to your emacs init file (~/.emacs). It assumes you are using a javascript-mode with a hook support. You can use [Karl Landström's mode](http://www.brgeight.se/downloads/emacs/javascript.el). + +> > + ;; javascript lint + (defun jslint-thisfile () + (interactive) + (compile (format "jsl -process %s" (buffer-file-name)))) +> > + (add-hook 'javascript-mode-hook + '(lambda () + (local-set-key [f8] 'jslint-thisfile))) + +> Just press 'F8' and it will execute JavaScript Lint in the current buffer. + +Other IDEs +---------- + +Many IDEs can launch a third-party tool and show the results in a window in the IDE. If the tool correctly formats its output, the IDE will read the file +names and line numbers from the tool and provide a way of finding the corresponding location in the code. + +If you use an IDE other than Visual Studio, you may need to customize the format of JavaScript Lint's outputted error messages. The sample configuration +file (jsl.default.conf) demonstrates this feature. + Modified: trunk/www/docs/running_from_your_php_website.htm =================================================================== --- trunk/www/docs/running_from_your_php_website.htm 2009-10-06 16:05:47 UTC (rev 262) +++ trunk/www/docs/running_from_your_php_website.htm 2009-10-06 16:54:26 UTC (rev 263) @@ -0,0 +1,19 @@ +<!-- +@title=Running from Your PHP Website +--> + +Running from Your PHP Website +============================= + +The JavaScript Lint source package (available from the [download page](/download.htm)) includes a `_jsl_online.php` file that allows PHP websites to integrate with JavaScript Lint. This script is used to power [the online lint](/online_lint.php). + +The following example usage is included in the PHP script: + +> + require_once("_jsl_online.php"); + $engine = new JSLEngine('.priv/jsl', '.priv/jsl.server.conf'); + $result = $engine->Lint($code); + if ($result === true) + OutputLintHTML($engine); + else + echo '<b>' . htmlentities($result) . '</b>'; Modified: trunk/www/docs/running_from_your_windows_program.htm =================================================================== --- trunk/www/docs/running_from_your_windows_program.htm 2009-10-06 16:05:47 UTC (rev 262) +++ trunk/www/docs/running_from_your_windows_program.htm 2009-10-06 16:54:26 UTC (rev 263) @@ -0,0 +1,38 @@ +<!-- +@title=Running from Your Windows Program +--> + +Running from Your Windows Program +================================= + +It is difficult for Windows programs to interact with console applications. For that reason, the JavaScript Lint source package (available from the [download](/download.htm) page) includes a C++ source file JavaScriptLintAPI.cpp to help Windows programmers integrate with JavaScript Lint. + +The following code demonstrates how to lint a file: + +> + using namespace std; +> + JavaScriptLint jsl("c:\\path\\to\\jsl.exe", "c:\\path\\to\\configuration\\file"); +> + string error; + vector<JSLMessage> messages; + if (jsl.LintFile("c:\\path\\to\\script.js", messages, error)) + { + for (vector<JSLMessage>::const_iterator msg = messages.begin(); msg != messages.end(); msg++) + { + // process messages + AfxMessageBox(msg->filename.c_str()); + } + } + else + { + // process error + } + +Additionally, the LintString function can be used to lint code in memory: + +> + // ... + if (jsl.LintString("var x = x;", messages, error)) + // ... + Added: trunk/www/news.php =================================================================== --- trunk/www/news.php (rev 0) +++ trunk/www/news.php 2009-10-06 16:54:26 UTC (rev 263) @@ -0,0 +1,6 @@ +<!-- +@title=Contact +--> + +News +======= Property changes on: trunk/www/news.php ___________________________________________________________________ Added: svn:eol-style + native Property changes on: trunk/www/rss.php ___________________________________________________________________ Added: svn:eol-style + native Modified: trunk/www.py =================================================================== --- trunk/www.py 2009-10-06 16:05:47 UTC (rev 262) +++ trunk/www.py 2009-10-06 16:54:26 UTC (rev 263) @@ -63,7 +63,11 @@ def do_GET(self): path = _resolve_url(self.path) if path: - self._send_response(*_transform_file(path)) + try: + self._send_response(*_transform_file(path)) + except Exception: + self.send_error(500, "TRACEBACK") + raise else: self.send_error(404, "File not found") This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mat...@us...> - 2009-10-06 17:02:14
|
Revision: 264 http://javascriptlint.svn.sourceforge.net/javascriptlint/?rev=264&view=rev Author: matthiasmiller Date: 2009-10-06 17:02:05 +0000 (Tue, 06 Oct 2009) Log Message: ----------- www: change template path to be specified in each file Modified Paths: -------------- trunk/www/contact_support.htm trunk/www/docs/index.htm trunk/www/docs/running_from_the_command_line.htm trunk/www/docs/running_from_windows_explorer.htm trunk/www/docs/running_from_your_ide.htm trunk/www/docs/running_from_your_php_website.htm trunk/www/docs/running_from_your_windows_program.htm trunk/www/download.htm trunk/www/index.htm trunk/www/news.php trunk/www/online_lint.php trunk/www.py Modified: trunk/www/contact_support.htm =================================================================== --- trunk/www/contact_support.htm 2009-10-06 16:54:26 UTC (rev 263) +++ trunk/www/contact_support.htm 2009-10-06 17:02:05 UTC (rev 264) @@ -1,4 +1,5 @@ <!-- +@template=__template__ @title=Contact --> Modified: trunk/www/docs/index.htm =================================================================== --- trunk/www/docs/index.htm 2009-10-06 16:54:26 UTC (rev 263) +++ trunk/www/docs/index.htm 2009-10-06 17:02:05 UTC (rev 264) @@ -1,4 +1,5 @@ <!-- +@template=__template__ @title=Documentation --> Modified: trunk/www/docs/running_from_the_command_line.htm =================================================================== --- trunk/www/docs/running_from_the_command_line.htm 2009-10-06 16:54:26 UTC (rev 263) +++ trunk/www/docs/running_from_the_command_line.htm 2009-10-06 17:02:05 UTC (rev 264) @@ -1,4 +1,5 @@ <!-- +@template=__template__ @title=Running from the Command Line --> Modified: trunk/www/docs/running_from_windows_explorer.htm =================================================================== --- trunk/www/docs/running_from_windows_explorer.htm 2009-10-06 16:54:26 UTC (rev 263) +++ trunk/www/docs/running_from_windows_explorer.htm 2009-10-06 17:02:05 UTC (rev 264) @@ -1,4 +1,5 @@ <!-- +@template=__template__ @title=Running from Windows Explorer --> Modified: trunk/www/docs/running_from_your_ide.htm =================================================================== --- trunk/www/docs/running_from_your_ide.htm 2009-10-06 16:54:26 UTC (rev 263) +++ trunk/www/docs/running_from_your_ide.htm 2009-10-06 17:02:05 UTC (rev 264) @@ -1,4 +1,5 @@ <!-- +@template=__template__ @title=Running from your IDE --> Modified: trunk/www/docs/running_from_your_php_website.htm =================================================================== --- trunk/www/docs/running_from_your_php_website.htm 2009-10-06 16:54:26 UTC (rev 263) +++ trunk/www/docs/running_from_your_php_website.htm 2009-10-06 17:02:05 UTC (rev 264) @@ -1,4 +1,5 @@ <!-- +@template=__template__ @title=Running from Your PHP Website --> Modified: trunk/www/docs/running_from_your_windows_program.htm =================================================================== --- trunk/www/docs/running_from_your_windows_program.htm 2009-10-06 16:54:26 UTC (rev 263) +++ trunk/www/docs/running_from_your_windows_program.htm 2009-10-06 17:02:05 UTC (rev 264) @@ -1,4 +1,5 @@ <!-- +@template=__template__ @title=Running from Your Windows Program --> Modified: trunk/www/download.htm =================================================================== --- trunk/www/download.htm 2009-10-06 16:54:26 UTC (rev 263) +++ trunk/www/download.htm 2009-10-06 17:02:05 UTC (rev 264) @@ -1,4 +1,5 @@ <!-- +@template=__template__ @title=Download --> Modified: trunk/www/index.htm =================================================================== --- trunk/www/index.htm 2009-10-06 16:54:26 UTC (rev 263) +++ trunk/www/index.htm 2009-10-06 17:02:05 UTC (rev 264) @@ -1,4 +1,5 @@ <!-- +@template=__template__ @title=JavaScript Lint --> Modified: trunk/www/news.php =================================================================== --- trunk/www/news.php 2009-10-06 16:54:26 UTC (rev 263) +++ trunk/www/news.php 2009-10-06 17:02:05 UTC (rev 264) @@ -1,4 +1,5 @@ <!-- +@template=__template__ @title=Contact --> Modified: trunk/www/online_lint.php =================================================================== --- trunk/www/online_lint.php 2009-10-06 16:54:26 UTC (rev 263) +++ trunk/www/online_lint.php 2009-10-06 17:02:05 UTC (rev 264) @@ -1,4 +1,5 @@ <!-- +@template=__template__ @title=The Online Lint --> Modified: trunk/www.py =================================================================== --- trunk/www.py 2009-10-06 16:54:26 UTC (rev 263) +++ trunk/www.py 2009-10-06 17:02:05 UTC (rev 264) @@ -48,13 +48,17 @@ elif path.endswith('.png'): return 'image/png', source elif path.endswith('.htm') or path.endswith('.php'): - body = markdown.markdown(source) - keywords = re.findall(r'^@(\w+)=(.*)$', source, re.MULTILINE) - # TODO: encode - keywords = dict(keywords) - keywords['body'] = body - keywords['nav'] = _get_nav(path) - page = open(TEMPLATE_PATH).read() % keywords + settings = dict(re.findall(r'^@(\w+)=(.*)$', source, re.MULTILINE)) + + page = markdown.markdown(source) + if 'template' in settings: + # TODO: encode keywords + keywords = dict(settings) + del keywords['template'] + keywords['body'] = page + keywords['nav'] = _get_nav(path) + template_path = os.path.join(DOC_ROOT, settings['template']) + page = open(template_path).read() % keywords return 'text/html', page else: raise ValueError, 'Invalid file type: %s' % path This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mat...@us...> - 2009-10-07 19:32:12
|
Revision: 267 http://javascriptlint.svn.sourceforge.net/javascriptlint/?rev=267&view=rev Author: matthiasmiller Date: 2009-10-07 19:32:04 +0000 (Wed, 07 Oct 2009) Log Message: ----------- www: break news into separate items and implement RSS support Modified Paths: -------------- trunk/www/__template__ trunk/www/news.php trunk/www/rss.php trunk/www.py Added Paths: ----------- trunk/www/news/ trunk/www/news/001 trunk/www/news/002 trunk/www/news/003 trunk/www/news/004 trunk/www/news/005 trunk/www/news/006 trunk/www/news/007 trunk/www/news/008 trunk/www/news/009 trunk/www/news/010 trunk/www/news/011 trunk/www/news/012 trunk/www/news/013 trunk/www/news/014 trunk/www/news/015 trunk/www/news/016 trunk/www/news/017 trunk/www/news/018 trunk/www/news/019 trunk/www/news/020 trunk/www/news/021 trunk/www/news/022 trunk/www/news/023 trunk/www/news/index.htm trunk/www/news.rss Modified: trunk/www/__template__ =================================================================== --- trunk/www/__template__ 2009-10-07 18:44:42 UTC (rev 266) +++ trunk/www/__template__ 2009-10-07 19:32:04 UTC (rev 267) @@ -10,7 +10,7 @@ <div id="nav"> %(nav)s - <p align="center"><br/><a href="/rss.php"> + <p align="center"><br/><a href="/news.rss"> <img border="0" src="/static/feed-icon-32x32.png" width="32" height="32"></a></p> <p align="center"><br/><a href="http://sourceforge.net/projects/javascriptlint"> Added: trunk/www/news/001 =================================================================== --- trunk/www/news/001 (rev 0) +++ trunk/www/news/001 2009-10-07 19:32:04 UTC (rev 267) @@ -0,0 +1,9 @@ +<!-- +@template=__template__ +@title=News +--> + +## [JavaScript Lint 0.1b Released](http://www.javascriptlint.com/news/001) +_Tue, 30 Aug 2005 15:37:08 +0000_ + +This release fixes a crash caused by certain syntax errors. For example: _if (a !=== b)_. Property changes on: trunk/www/news/001 ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/www/news/002 =================================================================== --- trunk/www/news/002 (rev 0) +++ trunk/www/news/002 2009-10-07 19:32:04 UTC (rev 267) @@ -0,0 +1,9 @@ +<!-- +@template=__template__ +@title=News +--> + +## [JavaScript Lint 0.1c Released](http://www.javascriptlint.com/news/002) +_Tue, 30 Aug 2005 18:54:06 +0000_ + +This release corrects problems with the wildcard feature. Property changes on: trunk/www/news/002 ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/www/news/003 =================================================================== --- trunk/www/news/003 (rev 0) +++ trunk/www/news/003 2009-10-07 19:32:04 UTC (rev 267) @@ -0,0 +1,9 @@ +<!-- +@template=__template__ +@title=News +--> + +## [JavaScript Lint 0.1d Released](http://www.javascriptlint.com/news/003) +_Tue, 30 Aug 2005 22:28:35 +0000_ + +This release fixes a crash caused by an incorrectly formed control comment. Property changes on: trunk/www/news/003 ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/www/news/004 =================================================================== --- trunk/www/news/004 (rev 0) +++ trunk/www/news/004 2009-10-07 19:32:04 UTC (rev 267) @@ -0,0 +1,11 @@ +<!-- +@template=__template__ +@title=News +--> + +## [JavaScript Lint 0.1e Released](http://www.javascriptlint.com/news/004) +_Tue, 31 Aug 2005 02:40:49 +0000_ + +This release fixes a crash triggered by the following statement: _for(i = 0; i < 5; )_. (The Linux binary is not currently available for this release.) + + Property changes on: trunk/www/news/004 ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/www/news/005 =================================================================== --- trunk/www/news/005 (rev 0) +++ trunk/www/news/005 2009-10-07 19:32:04 UTC (rev 267) @@ -0,0 +1,11 @@ +<!-- +@template=__template__ +@title=News +--> + +## [JavaScript Lint 0.1f Released](http://www.javascriptlint.com/news/005) +_Sat, 10 Sep 2005 14:59:43 +0000_ + +This release adds a separate warning for nested statements that don't use curly braces (nested _if_, _for_, _while_, etc.), a warning for useless assignments (x = x), and a configuration option to enable option-explicit across all files. + + Property changes on: trunk/www/news/005 ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/www/news/006 =================================================================== --- trunk/www/news/006 (rev 0) +++ trunk/www/news/006 2009-10-07 19:32:04 UTC (rev 267) @@ -0,0 +1,11 @@ +<!-- +@template=__template__ +@title=News +--> + +## [JavaScript Lint Source Package Available](http://www.javascriptlint.com/news/006) +_Sat, 01 Oct 2005 17:06:22 +0000_ + +JavaScript Lint source is now [available for download](http://www.javascriptlint.com/download.htm) as a single package. + + Property changes on: trunk/www/news/006 ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/www/news/007 =================================================================== --- trunk/www/news/007 (rev 0) +++ trunk/www/news/007 2009-10-07 19:32:04 UTC (rev 267) @@ -0,0 +1,13 @@ +<!-- +@template=__template__ +@title=News +--> + +## [JavaScript Lint 0.1g Released](http://www.javascriptlint.com/news/007) +_Sat, 08 Oct 2005 16:37:29 +0000_ + +This release includes a warning if the default case is missing from switch, a warning if a case is duplicated within a switch, better intelligence when checking for missing break statements, and a `/*@fallthru*@/` control comment (must always come at the very end of a case). + +Available from the [download page](http://www.javascriptlint.com/download.htm). + + Property changes on: trunk/www/news/007 ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/www/news/008 =================================================================== --- trunk/www/news/008 (rev 0) +++ trunk/www/news/008 2009-10-07 19:32:04 UTC (rev 267) @@ -0,0 +1,12 @@ +<!-- +@template=__template__ +@title=News +--> + +## [JavaScript Lint 0.1h Released](http://www.javascriptlint.com/news/008) +_Tue, 25 Oct 2005 19:16:04 +0000_ + +This release upgrades the SpiderMonkey JavaScript engine from a release candidate to the latest stable branch (version 1.5). +Available from the [download page](http://www.javascriptlint.com/download.htm). + + Property changes on: trunk/www/news/008 ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/www/news/009 =================================================================== --- trunk/www/news/009 (rev 0) +++ trunk/www/news/009 2009-10-07 19:32:04 UTC (rev 267) @@ -0,0 +1,22 @@ +<!-- +@template=__template__ +@title=News +--> + +## [JavaScript Lint 0.1i Released](http://www.javascriptlint.com/news/009) +_Wed, 16 Nov 2005 14:28:54 +0000_ + +This release has a more specific warning for _else_ statements that may be intended for one of multiple _if_ statements (it previously warned that nested statements should use curly braces to resolve ambiguity): + +> + `if (i)` + `if (j) func1();` + `else func2();` + +The warning against duplicate case statements now correctly handles case statements with string literals. + +This release fixes a bug that caused a "Bus error" on Mac OS X and a segmentation fault on Solaris 5.9; JavaScript Lint has now been compiled and run on those operating systems. If Mac users are interested in precompiled binaries, I will consider making them available for download on the website. + +Available from the [download page](http://www.javascriptlint.com/download.htm). + + Property changes on: trunk/www/news/009 ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/www/news/010 =================================================================== --- trunk/www/news/010 (rev 0) +++ trunk/www/news/010 2009-10-07 19:32:04 UTC (rev 267) @@ -0,0 +1,15 @@ +<!-- +@template=__template__ +@title=News +--> + +## [JavaScript Lint 0.1j Released](http://www.javascriptlint.com/news/010) +_Mon, 05 Dec 2005 20:19:35 +0000_ + +This release fixes a bug in the "duplicate case" warning for numbers. Certain numbers were incorrectly reported as duplicates. (This bug is more likely to affect JavaScript programmers using big-endian processors.) + +The [Online Lint](http://www.javascriptlint.com/online_lint.php) has also been updated to use a local CGI, making the script much more responsive. PHP source code for the Online Lint is included in the source package. + +Available from the [download page](http://www.javascriptlint.com/download.htm). + + Property changes on: trunk/www/news/010 ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/www/news/011 =================================================================== --- trunk/www/news/011 (rev 0) +++ trunk/www/news/011 2009-10-07 19:32:04 UTC (rev 267) @@ -0,0 +1,42 @@ +<!-- +@template=__template__ +@title=News +--> + +## [JavaScript Lint 0.1k Released](http://www.javascriptlint.com/news/011) +_Sat, 24 Dec 2005 18:56:35 +0000_ + +This release includes a number changes. + +__Enhancements:__ + +* JavaScript Lint warns if the default case is not at the end of the switch statement. + +* Control comments can now use the `/*jsl:keyword*/` syntax in addition to the `/*@keyword@*/` syntax. The new syntax is recommended for interoperability with JScript conditional compilation, although the traditional syntax is still supported. + +* The "missing break" warning can be disabled for the last case in a switch statement. The presence of this _break_ is merely stylistic preference. + +* The "missing semicolon" warning can be disabled when anonymous functions are assigned to variables and properties (such as function prototypes). Code such as the following can optionally be allowed: + +> + function Coord() { + this.x = function() { + return 1; + } + } + Coord.prototype.y = function() { + return 0; + } + +__Bug Fixes:__ + +* The "undeclared identifier" warning for variables has been updated to reflect the ECMA specification. The following code no longer issues a warning: + > + function getX() { return x; } + var x; + +* Scripts with circular _import_ directives no longer incorrectly report undeclared identifiers. + +Available from the [download page](http://www.javascriptlint.com/download.htm). + + Property changes on: trunk/www/news/011 ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/www/news/012 =================================================================== --- trunk/www/news/012 (rev 0) +++ trunk/www/news/012 2009-10-07 19:32:04 UTC (rev 267) @@ -0,0 +1,15 @@ +<!-- +@template=__template__ +@title=News +--> + +## [JavaScript Lint 0.1l Released](http://www.javascriptlint.com/news/012) +_Mon, 02 Jan 2006 22:05:25 +0000_ + +This release includes a new warning for useless comparisons (for example, x == x). + +This release also improves the use of the _fallthru_ control comment when used in the final case in a switch statement. The "undeclared identifier" fix in the 0.1k release is now applied to both global and local variables declarations. + +Available from the [download page](http://www.javascriptlint.com/download.htm). + + Property changes on: trunk/www/news/012 ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/www/news/013 =================================================================== --- trunk/www/news/013 (rev 0) +++ trunk/www/news/013 2009-10-07 19:32:04 UTC (rev 267) @@ -0,0 +1,13 @@ +<!-- +@template=__template__ +@title=News +--> + +## [JavaScript Lint 0.1m Released](http://www.javascriptlint.com/news/013) +_Tue, 03 Jan 2006 17:31:25 +0000_ + +This release fixes a bug with the "undeclared identifier" warnings when using the import control comment. + +Available from the [download page](http://www.javascriptlint.com/download.htm). + + Property changes on: trunk/www/news/013 ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/www/news/014 =================================================================== --- trunk/www/news/014 (rev 0) +++ trunk/www/news/014 2009-10-07 19:32:04 UTC (rev 267) @@ -0,0 +1,15 @@ +<!-- +@template=__template__ +@title=News +--> + +## [JavaScript Lint 0.2.0 Released](http://www.javascriptlint.com/news/014) +_Wed, 04 Jan 2006 02:20:01 +0000_ + +This release includes cumulative changes through version 0.1m. + +This release has a command-line parameter to disable the file listing in the output. + +Available from the [download page](http://www.javascriptlint.com/download.htm). + + Property changes on: trunk/www/news/014 ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/www/news/015 =================================================================== --- trunk/www/news/015 (rev 0) +++ trunk/www/news/015 2009-10-07 19:32:04 UTC (rev 267) @@ -0,0 +1,13 @@ +<!-- +@template=__template__ +@title=News +--> + +## [JavaScript Lint 0.2.1 Released](http://www.javascriptlint.com/news/015) +_Mon, 09 Jan 2006 14:18:24 +0000_ + +This release includes a configuration setting to completely disable legacy control comments. + +Available from the [download page](http://www.javascriptlint.com/download.htm). + + Property changes on: trunk/www/news/015 ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/www/news/016 =================================================================== --- trunk/www/news/016 (rev 0) +++ trunk/www/news/016 2009-10-07 19:32:04 UTC (rev 267) @@ -0,0 +1,13 @@ +<!-- +@template=__template__ +@title=News +--> + +## [JavaScript Lint 0.2.2 Released](http://www.javascriptlint.com/news/016) +_Tue, 24 Jan 2006 14:16:24 +0000_ + +This release includes a __FILENAME__ keyword for the output format. + +Available from the [download page](http://www.javascriptlint.com/download.htm). + + Property changes on: trunk/www/news/016 ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/www/news/017 =================================================================== --- trunk/www/news/017 (rev 0) +++ trunk/www/news/017 2009-10-07 19:32:04 UTC (rev 267) @@ -0,0 +1,12 @@ +<!-- +@template=__template__ +@title=News +--> + +## [JavaScript Lint 0.2.3 Released](http://www.javascriptlint.com/news/017) +_Thu, 16 Feb 2006 01:11:07 +0000_ + +Syntax errors in imported scripts were not being reported. +Available from the [download page](http://www.javascriptlint.com/download.htm). + + Property changes on: trunk/www/news/017 ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/www/news/018 =================================================================== --- trunk/www/news/018 (rev 0) +++ trunk/www/news/018 2009-10-07 19:32:04 UTC (rev 267) @@ -0,0 +1,17 @@ +<!-- +@template=__template__ +@title=News +--> + +## [JavaScript Lint 0.2.4 Released](http://www.javascriptlint.com/news/018) +_Sat, 11 Mar 2006 02:55:51 +0000_ + +JavaScript within HTML files can now contain `</script>` in string literals and comments. + +When referencing an external script, the _script_ start and end tags no longer need to be on the same line. + +JavaScript files using "Unicode (UTF-8 with signature) - Codepage 65001" encoding, such as those created in Microsoft Visual Studio, no longer generate errors. + +Available from the [download page](http://www.javascriptlint.com/download.htm). + + Property changes on: trunk/www/news/018 ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/www/news/019 =================================================================== --- trunk/www/news/019 (rev 0) +++ trunk/www/news/019 2009-10-07 19:32:04 UTC (rev 267) @@ -0,0 +1,17 @@ +<!-- +@template=__template__ +@title=News +--> + +## [JavaScript Lint 0.2.5 Released](http://www.javascriptlint.com/news/019) +_Sat, 08 Apr 2006 04:29:38 +0000_ + +To facilitate integration into other applications, the output format can now be passed on the command line and the results can be encoded. The source package contains source files that can be used to easily [integrate JavaScript Lint into a Windows program](http://www.javascriptlint.com/docs/running_from_your_windows_program.htm). + +The [documentation](http://www.javascriptlint.com/docs/) on the website has been updated. + +The "Unicode (UTF-8 with signature) - Codepage 65001" encoding is now supported for configuration files. + +Available from the [download page](http://www.javascriptlint.com/download.htm). + + Property changes on: trunk/www/news/019 ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/www/news/020 =================================================================== --- trunk/www/news/020 (rev 0) +++ trunk/www/news/020 2009-10-07 19:32:04 UTC (rev 267) @@ -0,0 +1,11 @@ +<!-- +@template=__template__ +@title=News +--> + +## [JavaScript Lint 0.2.6 Released](http://www.javascriptlint.com/news/020) +_Sat, 29 Apr 2006 15:07:13 +0000_ + +JavaScript Lint now has a `/*jsl:ignoreall*\` keyword to allow entire files to easily be ignored. Additionally, it no longer complains about blank JavaScript files. + +Available from the [download page](http://www.javascriptlint.com/download.htm). Property changes on: trunk/www/news/020 ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/www/news/021 =================================================================== --- trunk/www/news/021 (rev 0) +++ trunk/www/news/021 2009-10-07 19:32:04 UTC (rev 267) @@ -0,0 +1,9 @@ +<!-- +@template=__template__ +@title=News +--> + +## [JavaScript Lint SourceForge Project](http://www.javascriptlint.com/news/021) +_Fri, 26 May 2006 05:15:10 +0000_ + +JavaScript Lint now has its own [SourceForge project](http://sourceforge.net/projects/javascriptlint) with [discussion forums](http://sourceforge.net/forum/?group_id=168518), [bug/feature trackers](http://sourceforge.net/tracker/?group_id=168518), and a publicly-available [Subversion repository](http://sourceforge.net/svn/?group_id=168518). Property changes on: trunk/www/news/021 ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/www/news/022 =================================================================== --- trunk/www/news/022 (rev 0) +++ trunk/www/news/022 2009-10-07 19:32:04 UTC (rev 267) @@ -0,0 +1,30 @@ +<!-- +@template=__template__ +@title=News +--> + +## [JavaScript Lint 0.3.0 Released](http://www.javascriptlint.com/news/022) +_Fri, 03 Nov 2006 20:32:42 +0000_ + +This version has also been released for Intel Macs. + +__Enhancements:__ + +* Add support for JScript's function extensions, such as `function window.onload() {}` and `function window::onload()`. (This is disabled by default.) +* Add a `/*jsl:pass*/` control comment to suppress warnings about empty statementss. +* Add a `/*jsl:declare*/` control comment to suppress warnings about undeclared identifiers. +* Warn against trailing comments in array initializers. +* Warn against assignments to function calls (for example, `alert() = 10`). +* Warn against calls to `parseInt` without a radix parameter. +* Warn against implicit type conversion when comparing against `true` or `false`. +* Clarify the warning against `with` statements. + +__Bug Fixes:__ + +* Fix syntax error on nested comments. +* Fix duplicate case warning. +* Fix insuppressible increment/decrement warning. +* Fix incorrect warning against invalid `/*jsl:fallthru*/` comment. +* Fix undeclared identifiers in `with` statements. + +_Update:_ Corrected post title. Property changes on: trunk/www/news/022 ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/www/news/023 =================================================================== --- trunk/www/news/023 (rev 0) +++ trunk/www/news/023 2009-10-07 19:32:04 UTC (rev 267) @@ -0,0 +1,11 @@ +<!-- +@template=__template__ +@title=News +--> + +## [IDE Integration](http://www.javascriptlint.com/news/023) +_Sat, 29 Sep 2007 22:08:21 +0000_ + +The [documentation page](http://www.javascriptlint.com/docs/running_from_your_ide.htm) now contains instructions for integrating JavaScript Lint with TextMate, vim, and emacs. + +Improvements to the documentation are welcome. Property changes on: trunk/www/news/023 ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/www/news/index.htm =================================================================== --- trunk/www/news/index.htm (rev 0) +++ trunk/www/news/index.htm 2009-10-07 19:32:04 UTC (rev 267) @@ -0,0 +1,31 @@ +<!-- +@template=__template__ +@title=News +--> + +Project News +============ + +<!--@include 022--> +<!--@include 021--> +<!--@include 020--> +<!--@include 019--> +<!--@include 018--> +<!--@include 017--> +<!--@include 016--> +<!--@include 015--> +<!--@include 014--> +<!--@include 013--> +<!--@include 012--> +<!--@include 011--> +<!--@include 010--> +<!--@include 009--> +<!--@include 008--> +<!--@include 007--> +<!--@include 006--> +<!--@include 005--> +<!--@include 004--> +<!--@include 003--> +<!--@include 002--> +<!--@include 001--> + Property changes on: trunk/www/news/index.htm ___________________________________________________________________ Added: svn:eol-style + native Modified: trunk/www/news.php =================================================================== --- trunk/www/news.php 2009-10-07 18:44:42 UTC (rev 266) +++ trunk/www/news.php 2009-10-07 19:32:04 UTC (rev 267) @@ -1,247 +1,3 @@ -<!-- -@template=__template__ -@title=News ---> - -Project News -============ - -## [IDE Integration](http://www.javascriptlint.com/news.php?id=23) -_Sat, 29 Sep 2007 22:08:21 +0000_ - -The [documentation page](http://www.javascriptlint.com/docs/running_from_your_ide.htm) now contains instructions for integrating JavaScript Lint with TextMate, vim, and emacs. - -Improvements to the documentation are welcome. - - -## [JavaScript Lint 0.3.0 Released](http://www.javascriptlint.com/news.php?id=22) -_Fri, 03 Nov 2006 20:32:42 +0000_ - -This version has also been released for Intel Macs. - -__Enhancements:__ - -* Add support for JScript's function extensions, such as `function window.onload() {}` and `function window::onload()`. (This is disabled by default.) -* Add a `/*jsl:pass*/` control comment to suppress warnings about empty statementss. -* Add a `/*jsl:declare*/` control comment to suppress warnings about undeclared identifiers. -* Warn against trailing comments in array initializers. -* Warn against assignments to function calls (for example, `alert() = 10`). -* Warn against calls to `parseInt` without a radix parameter. -* Warn against implicit type conversion when comparing against `true` or `false`. -* Clarify the warning against `with` statements. - -__Bug Fixes:__ - -* Fix syntax error on nested comments. -* Fix duplicate case warning. -* Fix insuppressible increment/decrement warning. -* Fix incorrect warning against invalid `/*jsl:fallthru*/` comment. -* Fix undeclared identifiers in `with` statements. - -_Update:_ Corrected post title. - - -## [JavaScript Lint SourceForge Project](http://www.javascriptlint.com/news.php?id=21) -_Fri, 26 May 2006 05:15:10 +0000_ - -JavaScript Lint now has its own [SourceForge project](http://sourceforge.net/projects/javascriptlint) with [discussion forums](http://sourceforge.net/forum/?group_id=168518), [bug/feature trackers](http://sourceforge.net/tracker/?group_id=168518), and a publicly-available [Subversion repository](http://sourceforge.net/svn/?group_id=168518). - - -## [JavaScript Lint 0.2.6 Released](http://www.javascriptlint.com/news.php?id=20) -_Sat, 29 Apr 2006 15:07:13 +0000_ - -JavaScript Lint now has a `/*jsl:ignoreall*\` keyword to allow entire files to easily be ignored. Additionally, it no longer complains about blank JavaScript files. - -Available from the [download page](http://www.javascriptlint.com/download.htm). - - -## [JavaScript Lint 0.2.5 Released](http://www.javascriptlint.com/news.php?id=19) -_Sat, 08 Apr 2006 04:29:38 +0000_ - -To facilitate integration into other applications, the output format can now be passed on the command line and the results can be encoded. The source package contains source files that can be used to easily [integrate JavaScript Lint into a Windows program](http://www.javascriptlint.com/docs/running_from_your_windows_program.htm). - -The [documentation](http://www.javascriptlint.com/docs/) on the website has been updated. - -The "Unicode (UTF-8 with signature) - Codepage 65001" encoding is now supported for configuration files. - -Available from the [download page](http://www.javascriptlint.com/download.htm). - - -## [JavaScript Lint 0.2.4 Released](http://www.javascriptlint.com/news.php?id=18) -_Sat, 11 Mar 2006 02:55:51 +0000_ - -JavaScript within HTML files can now contain `</script>` in string literals and comments. - -When referencing an external script, the _script_ start and end tags no longer need to be on the same line. - -JavaScript files using "Unicode (UTF-8 with signature) - Codepage 65001" encoding, such as those created in Microsoft Visual Studio, no longer generate errors. - -Available from the [download page](http://www.javascriptlint.com/download.htm). - - -## [JavaScript Lint 0.2.3 Released](http://www.javascriptlint.com/news.php?id=17) -_Thu, 16 Feb 2006 01:11:07 +0000_ - -Syntax errors in imported scripts were not being reported. -Available from the [download page](http://www.javascriptlint.com/download.htm). - - -## [JavaScript Lint 0.2.2 Released](http://www.javascriptlint.com/news.php?id=16) -_Tue, 24 Jan 2006 14:16:24 +0000_ - -This release includes a __FILENAME__ keyword for the output format. - -Available from the [download page](http://www.javascriptlint.com/download.htm). - - -## [JavaScript Lint 0.2.1 Released](http://www.javascriptlint.com/news.php?id=15) -_Mon, 09 Jan 2006 14:18:24 +0000_ - -This release includes a configuration setting to completely disable legacy control comments. - -Available from the [download page](http://www.javascriptlint.com/download.htm). - - -## [JavaScript Lint 0.2.0 Released](http://www.javascriptlint.com/news.php?id=14) -_Wed, 04 Jan 2006 02:20:01 +0000_ - -This release includes cumulative changes through version 0.1m. - -This release has a command-line parameter to disable the file listing in the output. - -Available from the [download page](http://www.javascriptlint.com/download.htm). - - -## [JavaScript Lint 0.1m Released](http://www.javascriptlint.com/news.php?id=13) -_Tue, 03 Jan 2006 17:31:25 +0000_ - -This release fixes a bug with the "undeclared identifier" warnings when using the import control comment. - -Available from the [download page](http://www.javascriptlint.com/download.htm). - - -## [JavaScript Lint 0.1l Released](http://www.javascriptlint.com/news.php?id=12) -_Mon, 02 Jan 2006 22:05:25 +0000_ - -This release includes a new warning for useless comparisons (for example, x == x). - -This release also improves the use of the _fallthru_ control comment when used in the final case in a switch statement. The "undeclared identifier" fix in the 0.1k release is now applied to both global and local variables declarations. - -Available from the [download page](http://www.javascriptlint.com/download.htm). - - -## [JavaScript Lint 0.1k Released](http://www.javascriptlint.com/news.php?id=11) -_Sat, 24 Dec 2005 18:56:35 +0000_ - -This release includes a number changes. - -__Enhancements:__ - -* JavaScript Lint warns if the default case is not at the end of the switch statement. - -* Control comments can now use the `/*jsl:keyword*/` syntax in addition to the `/*@keyword@*/` syntax. The new syntax is recommended for interoperability with JScript conditional compilation, although the traditional syntax is still supported. - -* The "missing break" warning can be disabled for the last case in a switch statement. The presence of this _break_ is merely stylistic preference. - -* The "missing semicolon" warning can be disabled when anonymous functions are assigned to variables and properties (such as function prototypes). Code such as the following can optionally be allowed: - -> - function Coord() { - this.x = function() { - return 1; - } - } - Coord.prototype.y = function() { - return 0; - } - -__Bug Fixes:__ - -* The "undeclared identifier" warning for variables has been updated to reflect the ECMA specification. The following code no longer issues a warning: - > - function getX() { return x; } - var x; - -* Scripts with circular _import_ directives no longer incorrectly report undeclared identifiers. - -Available from the [download page](http://www.javascriptlint.com/download.htm). - - -## [JavaScript Lint 0.1j Released](http://www.javascriptlint.com/news.php?id=10) -_Mon, 05 Dec 2005 20:19:35 +0000_ - -This release fixes a bug in the "duplicate case" warning for numbers. Certain numbers were incorrectly reported as duplicates. (This bug is more likely to affect JavaScript programmers using big-endian processors.) - -The [Online Lint](http://www.javascriptlint.com/online_lint.php) has also been updated to use a local CGI, making the script much more responsive. PHP source code for the Online Lint is included in the source package. - -Available from the [download page](http://www.javascriptlint.com/download.htm). - - -## [JavaScript Lint 0.1i Released](http://www.javascriptlint.com/news.php?id=9) -_Wed, 16 Nov 2005 14:28:54 +0000_ - -This release has a more specific warning for _else_ statements that may be intended for one of multiple _if_ statements (it previously warned that nested statements should use curly braces to resolve ambiguity): - -> - `if (i)` - `if (j) func1();` - `else func2();` - -The warning against duplicate case statements now correctly handles case statements with string literals. - -This release fixes a bug that caused a "Bus error" on Mac OS X and a segmentation fault on Solaris 5.9; JavaScript Lint has now been compiled and run on those operating systems. If Mac users are interested in precompiled binaries, I will consider making them available for download on the website. - -Available from the [download page](http://www.javascriptlint.com/download.htm). - - -## [JavaScript Lint 0.1h Released](http://www.javascriptlint.com/news.php?id=8) -_Tue, 25 Oct 2005 19:16:04 +0000_ - -This release upgrades the SpiderMonkey JavaScript engine from a release candidate to the latest stable branch (version 1.5). -Available from the [download page](http://www.javascriptlint.com/download.htm). - - -## [JavaScript Lint 0.1g Released](http://www.javascriptlint.com/news.php?id=7) -_Sat, 08 Oct 2005 16:37:29 +0000_ - -This release includes a warning if the default case is missing from switch, a warning if a case is duplicated within a switch, better intelligence when checking for missing break statements, and a `/*@fallthru*@/` control comment (must always come at the very end of a case). - -Available from the [download page](http://www.javascriptlint.com/download.htm). - - -## [JavaScript Lint Source Package Available](http://www.javascriptlint.com/news.php?id=6) -_Sat, 01 Oct 2005 17:06:22 +0000_ - -JavaScript Lint source is now [available for download](http://www.javascriptlint.com/download.htm) as a single package. - - -## [JavaScript Lint 0.1f Released](http://www.javascriptlint.com/download.htm) -_Sat, 10 Sep 2005 14:59:43 +0000_ - -This release adds a separate warning for nested statements that don't use curly braces (nested _if_, _for_, _while_, etc.), a warning for useless assignments (x = x), and a configuration option to enable option-explicit across all files. - - -## [JavaScript Lint 0.1e Released](http://www.javascriptlint.com/download.htm) -_Tue, 31 Aug 2005 02:40:49 +0000_ - -This release fixes a crash triggered by the following statement: _for(i = 0; i < 5; )_. (The Linux binary is not currently available for this release.) - - -## [JavaScript Lint 0.1d Released](http://www.javascriptlint.com/download.htm) -_Tue, 30 Aug 2005 22:28:35 +0000_ - -This release fixes a crash caused by an incorrectly formed control comment. - - -## [JavaScript Lint 0.1c Released](http://www.javascriptlint.com/download.htm) -_Tue, 30 Aug 2005 18:54:06 +0000_ - -This release corrects problems with the wildcard feature. - - -## [JavaScript Lint 0.1b Released](http://www.javascriptlint.com/download.htm) -_Tue, 30 Aug 2005 15:37:08 +0000_ - -This release fixes a crash caused by certain syntax errors. For example: _if (a !=== b)_. - - +<?php +// ?: Header("Location: /news/" . str_pad(int($_GET['id']), 3, "0")); +?> Added: trunk/www/news.rss =================================================================== --- trunk/www/news.rss (rev 0) +++ trunk/www/news.rss 2009-10-07 19:32:04 UTC (rev 267) @@ -0,0 +1,8 @@ +<!-- +@output=rss +@title=JavaScript Lint Project News +@link=http://www.javascriptlint.com/ +@desc=JavaScript Lint Project News +--> + +<!--@include /news/--> Property changes on: trunk/www/news.rss ___________________________________________________________________ Added: svn:eol-style + native Modified: trunk/www/rss.php =================================================================== --- trunk/www/rss.php 2009-10-07 18:44:42 UTC (rev 266) +++ trunk/www/rss.php 2009-10-07 19:32:04 UTC (rev 267) @@ -0,0 +1,3 @@ +<?php +// Header('Location: /news.rss'); +?> Modified: trunk/www.py =================================================================== --- trunk/www.py 2009-10-07 18:44:42 UTC (rev 266) +++ trunk/www.py 2009-10-07 19:32:04 UTC (rev 267) @@ -1,6 +1,7 @@ #!/usr/bin/python # vim: ts=4 sw=4 expandtab import BaseHTTPServer +import md5 import re import os import sys @@ -15,30 +16,169 @@ ('/download.htm', 'Download'), ('/online_lint.php', 'The Online Lint'), ('/docs/', 'Documentation'), - ('/news.php', 'News'), + ('/news/', 'News'), ('/contact_support.htm', 'Contact'), ] -def _resolve_url(url): +def _markdown2doc(source): + class _PostProcessor(markdown.Postprocessor): + def run(self, doc): + self.doc = doc + return doc + postprocessor = _PostProcessor() + md = markdown.Markdown() + md.postprocessors.append(postprocessor) + md.convert(source) + return postprocessor.doc + +def _resolve_url(url, parentpath): + root = DOC_ROOT + if not url.startswith('/'): + if parentpath: + root = os.path.dirname(parentpath) + assert (root + os.sep).startswith(DOC_ROOT + os.sep) + else: + raise ValueError, 'Tried resolving relative URL: %s' % url + urls = [ url.rstrip('/') + '/index.htm', url ] for url in urls: - path = os.path.join(DOC_ROOT, url.lstrip('/')) - if path.startswith(DOC_ROOT + os.sep) and os.path.isfile(path): + path = os.path.join(root, url.lstrip('/')) + if path.startswith(root + os.sep) and os.path.isfile(path): return path def _get_nav(path): nav = [] for url, name in NAV: - navpath = _resolve_url(url) + navpath = _resolve_url(url, None) if navpath and navpath == path: nav.append('* <a class="active">%s</a>' % name) else: nav.append('* [%s](%s)' % (name, url)) return markdown.markdown('\n'.join(nav)) +def _remove_comments(source): + return re.sub('<!--[^>]*-->', '', source) + +def _gen_rss(source, title, link, desc): + def removeblanktextnodes(node): + for i in range(len(node.childNodes)-1, -1, -1): + child = node.childNodes[i] + if child.type == 'text': + if not child.value: + node.removeChild(child) + else: + removeblanktextnodes(child) + text = _remove_comments(source) + doc = _markdown2doc(text) + + oldDocElement = doc.documentElement + removeblanktextnodes(oldDocElement) + + rss = doc.createElement("rss") + rss.setAttribute('version', '2.0') + doc.appendChild(rss) + + channel = doc.createElement("channel") + rss.appendChild(channel) + if not title: + raise ValueError, 'Missing @title= setting.' + if not link: + raise ValueError, 'Missing @link= setting.' + if not desc: + raise ValueError, 'Missing @desc= setting.' + channel.appendChild(doc.createElement('title', textNode=title)) + channel.appendChild(doc.createElement('link', textNode=link)) + channel.appendChild(doc.createElement('desc', textNode=desc)) + + guids = [] + + item = None + item_desc = None + + for child in oldDocElement.childNodes: + if child.type != "element": + if child.value.strip(): + raise ValueError, 'Expected outer-level element, not text.' + continue + + if child.nodeName == 'h1': + pass + elif child.nodeName == "h2": + link = len(child.childNodes) == 1 and child.childNodes[0] + if not link or link.type != 'element' or link.nodeName != 'a': + raise ValueError, 'Each heading must be a link.' + + titlenode = len(link.childNodes) == 1 and link.childNodes[0] + if not titlenode or titlenode.type != 'text': + raise ValueError, 'Each heading link must contain a ' + \ + 'single text node.' + heading = titlenode.value.strip() + + assert 'href' in link.attributes + href = link.attribute_values['href'] + + if href in guids: + raise ValueError, "Duplicate link: %s" % href + guids.append(href) + + item = doc.createElement("item") + channel.appendChild(item) + item.appendChild(doc.createElement("link", href)) + item.appendChild(doc.createElement("title", heading)) + item.appendChild(doc.createElement("guid", guid)) + item_desc = None + + elif child.nodeName in ["p", "ul", "blockquote"] : + if not item_desc: + # The first paragraph is <p><em>pubDate</em></p> + em = len(child.childNodes) == 1 and child.childNodes[0] + if not em or em.type != 'element' or em.nodeName != 'em': + raise ValueError, 'The first paragraph must contain ' + \ + 'only an <em>.' + + emchild = len(em.childNodes) == 1 and em.childNodes[0] + if not emchild or emchild.type != 'text': + raise ValueError, "The first paragraph's em must " + \ + "contain only text." + + # TODO: Validate canonical date format. + + item.appendChild(doc.createElement('pubDate', emchild.value)) + item_desc = doc.createElement("description") + item.appendChild(item_desc) + else: + cdata = doc.createCDATA(child.toxml()) + item_desc.appendChild(cdata) + + else: + raise ValueError, 'Unsupported node type: %s' % child.nodeName + return doc.toxml() + +def _preprocess(path): + def _include(match): + # When including a file, update global settings and replace + # with contents. + includepath = _resolve_url(match.group(1).strip(), path) + if not includepath: + raise ValueError, 'Unmatched URL: %s' % match.group(1) + settings, contents = _preprocess(includepath) + childsettings.update(settings) + return contents + + source = open(path).read() + + # Process includes. + childsettings = {} + source = re.sub('<!--@include ([^>]*)-->', _include, source) + + # The settings defined in the outer file will rule. + settings = dict(re.findall(r'^@(\w+)=(.*)$', source, re.MULTILINE)) + source = _remove_comments(source) + return settings, source + def _transform_file(path): source = open(path).read() if path.endswith('.css'): @@ -47,9 +187,14 @@ return 'image/gif', source elif path.endswith('.png'): return 'image/png', source - elif path.endswith('.htm') or path.endswith('.php'): - settings = dict(re.findall(r'^@(\w+)=(.*)$', source, re.MULTILINE)) - + elif path.endswith('.rss'): + settings, source = _preprocess(path) + return 'text/xml', _gen_rss(source, settings.get('title'), + settings.get('link'), + settings.get('desc')) + elif path.endswith('.htm') or path.endswith('.php') or \ + not '.' in os.path.basename(path): + settings, source = _preprocess(path) page = markdown.markdown(source) if 'template' in settings: # TODO: encode keywords @@ -65,7 +210,7 @@ class _Handler(BaseHTTPServer.BaseHTTPRequestHandler): def do_GET(self): - path = _resolve_url(self.path) + path = _resolve_url(self.path, None) if path: try: self._send_response(*_transform_file(path)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mat...@us...> - 2009-10-07 19:39:31
|
Revision: 268 http://javascriptlint.svn.sourceforge.net/javascriptlint/?rev=268&view=rev Author: matthiasmiller Date: 2009-10-07 19:39:23 +0000 (Wed, 07 Oct 2009) Log Message: ----------- www: disallow changing directory with inclusions, since links get confusing Modified Paths: -------------- trunk/www/__template__ trunk/www/rss.php trunk/www.py Added Paths: ----------- trunk/www/news/index.rss Removed Paths: ------------- trunk/www/news.rss Modified: trunk/www/__template__ =================================================================== --- trunk/www/__template__ 2009-10-07 19:32:04 UTC (rev 267) +++ trunk/www/__template__ 2009-10-07 19:39:23 UTC (rev 268) @@ -10,7 +10,7 @@ <div id="nav"> %(nav)s - <p align="center"><br/><a href="/news.rss"> + <p align="center"><br/><a href="/news/index.rss"> <img border="0" src="/static/feed-icon-32x32.png" width="32" height="32"></a></p> <p align="center"><br/><a href="http://sourceforge.net/projects/javascriptlint"> Copied: trunk/www/news/index.rss (from rev 267, trunk/www/news.rss) =================================================================== --- trunk/www/news/index.rss (rev 0) +++ trunk/www/news/index.rss 2009-10-07 19:39:23 UTC (rev 268) @@ -0,0 +1,8 @@ +<!-- +@output=rss +@title=JavaScript Lint Project News +@link=http://www.javascriptlint.com/ +@desc=JavaScript Lint Project News +--> + +<!--@include index.htm--> Property changes on: trunk/www/news/index.rss ___________________________________________________________________ Added: svn:mergeinfo + Added: svn:eol-style + native Deleted: trunk/www/news.rss =================================================================== --- trunk/www/news.rss 2009-10-07 19:32:04 UTC (rev 267) +++ trunk/www/news.rss 2009-10-07 19:39:23 UTC (rev 268) @@ -1,8 +0,0 @@ -<!-- -@output=rss -@title=JavaScript Lint Project News -@link=http://www.javascriptlint.com/ -@desc=JavaScript Lint Project News ---> - -<!--@include /news/--> Modified: trunk/www/rss.php =================================================================== --- trunk/www/rss.php 2009-10-07 19:32:04 UTC (rev 267) +++ trunk/www/rss.php 2009-10-07 19:39:23 UTC (rev 268) @@ -1,3 +1,3 @@ <?php -// Header('Location: /news.rss'); +// Header('Location: /news/index.rss'); ?> Modified: trunk/www.py =================================================================== --- trunk/www.py 2009-10-07 19:32:04 UTC (rev 267) +++ trunk/www.py 2009-10-07 19:39:23 UTC (rev 268) @@ -128,7 +128,7 @@ channel.appendChild(item) item.appendChild(doc.createElement("link", href)) item.appendChild(doc.createElement("title", heading)) - item.appendChild(doc.createElement("guid", guid)) + item.appendChild(doc.createElement("guid", href)) item_desc = None elif child.nodeName in ["p", "ul", "blockquote"] : @@ -159,9 +159,15 @@ def _preprocess(path): def _include(match): + # Disallow changing directories because of how links, etc + # will resolve. + url = match.group(1).strip() + if '/' in url: + raise ValueError, 'Inclusions cannot cross directories' + # When including a file, update global settings and replace # with contents. - includepath = _resolve_url(match.group(1).strip(), path) + includepath = _resolve_url(url, path) if not includepath: raise ValueError, 'Unmatched URL: %s' % match.group(1) settings, contents = _preprocess(includepath) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mat...@us...> - 2009-10-07 19:56:23
|
Revision: 269 http://javascriptlint.svn.sourceforge.net/javascriptlint/?rev=269&view=rev Author: matthiasmiller Date: 2009-10-07 19:56:09 +0000 (Wed, 07 Oct 2009) Log Message: ----------- www: avoid hardcode URLs whenever possible Modified Paths: -------------- trunk/www/news/001 trunk/www/news/002 trunk/www/news/003 trunk/www/news/004 trunk/www/news/005 trunk/www/news/006 trunk/www/news/007 trunk/www/news/008 trunk/www/news/009 trunk/www/news/010 trunk/www/news/011 trunk/www/news/012 trunk/www/news/013 trunk/www/news/014 trunk/www/news/015 trunk/www/news/016 trunk/www/news/017 trunk/www/news/018 trunk/www/news/019 trunk/www/news/020 trunk/www/news/021 trunk/www/news/022 trunk/www/news/023 trunk/www/news/index.rss trunk/www.py Modified: trunk/www/news/001 =================================================================== --- trunk/www/news/001 2009-10-07 19:39:23 UTC (rev 268) +++ trunk/www/news/001 2009-10-07 19:56:09 UTC (rev 269) @@ -3,7 +3,7 @@ @title=News --> -## [JavaScript Lint 0.1b Released](http://www.javascriptlint.com/news/001) +## [JavaScript Lint 0.1b Released](__BASENAME__) _Tue, 30 Aug 2005 15:37:08 +0000_ This release fixes a crash caused by certain syntax errors. For example: _if (a !=== b)_. Modified: trunk/www/news/002 =================================================================== --- trunk/www/news/002 2009-10-07 19:39:23 UTC (rev 268) +++ trunk/www/news/002 2009-10-07 19:56:09 UTC (rev 269) @@ -3,7 +3,7 @@ @title=News --> -## [JavaScript Lint 0.1c Released](http://www.javascriptlint.com/news/002) +## [JavaScript Lint 0.1c Released](__BASENAME__) _Tue, 30 Aug 2005 18:54:06 +0000_ This release corrects problems with the wildcard feature. Modified: trunk/www/news/003 =================================================================== --- trunk/www/news/003 2009-10-07 19:39:23 UTC (rev 268) +++ trunk/www/news/003 2009-10-07 19:56:09 UTC (rev 269) @@ -3,7 +3,7 @@ @title=News --> -## [JavaScript Lint 0.1d Released](http://www.javascriptlint.com/news/003) +## [JavaScript Lint 0.1d Released](__BASENAME__) _Tue, 30 Aug 2005 22:28:35 +0000_ This release fixes a crash caused by an incorrectly formed control comment. Modified: trunk/www/news/004 =================================================================== --- trunk/www/news/004 2009-10-07 19:39:23 UTC (rev 268) +++ trunk/www/news/004 2009-10-07 19:56:09 UTC (rev 269) @@ -3,7 +3,7 @@ @title=News --> -## [JavaScript Lint 0.1e Released](http://www.javascriptlint.com/news/004) +## [JavaScript Lint 0.1e Released](__BASENAME__) _Tue, 31 Aug 2005 02:40:49 +0000_ This release fixes a crash triggered by the following statement: _for(i = 0; i < 5; )_. (The Linux binary is not currently available for this release.) Modified: trunk/www/news/005 =================================================================== --- trunk/www/news/005 2009-10-07 19:39:23 UTC (rev 268) +++ trunk/www/news/005 2009-10-07 19:56:09 UTC (rev 269) @@ -3,7 +3,7 @@ @title=News --> -## [JavaScript Lint 0.1f Released](http://www.javascriptlint.com/news/005) +## [JavaScript Lint 0.1f Released](__BASENAME__) _Sat, 10 Sep 2005 14:59:43 +0000_ This release adds a separate warning for nested statements that don't use curly braces (nested _if_, _for_, _while_, etc.), a warning for useless assignments (x = x), and a configuration option to enable option-explicit across all files. Modified: trunk/www/news/006 =================================================================== --- trunk/www/news/006 2009-10-07 19:39:23 UTC (rev 268) +++ trunk/www/news/006 2009-10-07 19:56:09 UTC (rev 269) @@ -3,7 +3,7 @@ @title=News --> -## [JavaScript Lint Source Package Available](http://www.javascriptlint.com/news/006) +## [JavaScript Lint Source Package Available](__BASENAME__) _Sat, 01 Oct 2005 17:06:22 +0000_ JavaScript Lint source is now [available for download](http://www.javascriptlint.com/download.htm) as a single package. Modified: trunk/www/news/007 =================================================================== --- trunk/www/news/007 2009-10-07 19:39:23 UTC (rev 268) +++ trunk/www/news/007 2009-10-07 19:56:09 UTC (rev 269) @@ -3,7 +3,7 @@ @title=News --> -## [JavaScript Lint 0.1g Released](http://www.javascriptlint.com/news/007) +## [JavaScript Lint 0.1g Released](__BASENAME__) _Sat, 08 Oct 2005 16:37:29 +0000_ This release includes a warning if the default case is missing from switch, a warning if a case is duplicated within a switch, better intelligence when checking for missing break statements, and a `/*@fallthru*@/` control comment (must always come at the very end of a case). Modified: trunk/www/news/008 =================================================================== --- trunk/www/news/008 2009-10-07 19:39:23 UTC (rev 268) +++ trunk/www/news/008 2009-10-07 19:56:09 UTC (rev 269) @@ -3,7 +3,7 @@ @title=News --> -## [JavaScript Lint 0.1h Released](http://www.javascriptlint.com/news/008) +## [JavaScript Lint 0.1h Released](__BASENAME__) _Tue, 25 Oct 2005 19:16:04 +0000_ This release upgrades the SpiderMonkey JavaScript engine from a release candidate to the latest stable branch (version 1.5). Modified: trunk/www/news/009 =================================================================== --- trunk/www/news/009 2009-10-07 19:39:23 UTC (rev 268) +++ trunk/www/news/009 2009-10-07 19:56:09 UTC (rev 269) @@ -3,7 +3,7 @@ @title=News --> -## [JavaScript Lint 0.1i Released](http://www.javascriptlint.com/news/009) +## [JavaScript Lint 0.1i Released](__BASENAME__) _Wed, 16 Nov 2005 14:28:54 +0000_ This release has a more specific warning for _else_ statements that may be intended for one of multiple _if_ statements (it previously warned that nested statements should use curly braces to resolve ambiguity): Modified: trunk/www/news/010 =================================================================== --- trunk/www/news/010 2009-10-07 19:39:23 UTC (rev 268) +++ trunk/www/news/010 2009-10-07 19:56:09 UTC (rev 269) @@ -3,7 +3,7 @@ @title=News --> -## [JavaScript Lint 0.1j Released](http://www.javascriptlint.com/news/010) +## [JavaScript Lint 0.1j Released](__BASENAME__) _Mon, 05 Dec 2005 20:19:35 +0000_ This release fixes a bug in the "duplicate case" warning for numbers. Certain numbers were incorrectly reported as duplicates. (This bug is more likely to affect JavaScript programmers using big-endian processors.) Modified: trunk/www/news/011 =================================================================== --- trunk/www/news/011 2009-10-07 19:39:23 UTC (rev 268) +++ trunk/www/news/011 2009-10-07 19:56:09 UTC (rev 269) @@ -3,7 +3,7 @@ @title=News --> -## [JavaScript Lint 0.1k Released](http://www.javascriptlint.com/news/011) +## [JavaScript Lint 0.1k Released](__BASENAME__) _Sat, 24 Dec 2005 18:56:35 +0000_ This release includes a number changes. Modified: trunk/www/news/012 =================================================================== --- trunk/www/news/012 2009-10-07 19:39:23 UTC (rev 268) +++ trunk/www/news/012 2009-10-07 19:56:09 UTC (rev 269) @@ -3,7 +3,7 @@ @title=News --> -## [JavaScript Lint 0.1l Released](http://www.javascriptlint.com/news/012) +## [JavaScript Lint 0.1l Released](__BASENAME__) _Mon, 02 Jan 2006 22:05:25 +0000_ This release includes a new warning for useless comparisons (for example, x == x). Modified: trunk/www/news/013 =================================================================== --- trunk/www/news/013 2009-10-07 19:39:23 UTC (rev 268) +++ trunk/www/news/013 2009-10-07 19:56:09 UTC (rev 269) @@ -3,7 +3,7 @@ @title=News --> -## [JavaScript Lint 0.1m Released](http://www.javascriptlint.com/news/013) +## [JavaScript Lint 0.1m Released](__BASENAME__) _Tue, 03 Jan 2006 17:31:25 +0000_ This release fixes a bug with the "undeclared identifier" warnings when using the import control comment. Modified: trunk/www/news/014 =================================================================== --- trunk/www/news/014 2009-10-07 19:39:23 UTC (rev 268) +++ trunk/www/news/014 2009-10-07 19:56:09 UTC (rev 269) @@ -3,7 +3,7 @@ @title=News --> -## [JavaScript Lint 0.2.0 Released](http://www.javascriptlint.com/news/014) +## [JavaScript Lint 0.2.0 Released](__BASENAME__) _Wed, 04 Jan 2006 02:20:01 +0000_ This release includes cumulative changes through version 0.1m. Modified: trunk/www/news/015 =================================================================== --- trunk/www/news/015 2009-10-07 19:39:23 UTC (rev 268) +++ trunk/www/news/015 2009-10-07 19:56:09 UTC (rev 269) @@ -3,7 +3,7 @@ @title=News --> -## [JavaScript Lint 0.2.1 Released](http://www.javascriptlint.com/news/015) +## [JavaScript Lint 0.2.1 Released](__BASENAME__) _Mon, 09 Jan 2006 14:18:24 +0000_ This release includes a configuration setting to completely disable legacy control comments. Modified: trunk/www/news/016 =================================================================== --- trunk/www/news/016 2009-10-07 19:39:23 UTC (rev 268) +++ trunk/www/news/016 2009-10-07 19:56:09 UTC (rev 269) @@ -3,7 +3,7 @@ @title=News --> -## [JavaScript Lint 0.2.2 Released](http://www.javascriptlint.com/news/016) +## [JavaScript Lint 0.2.2 Released](__BASENAME__) _Tue, 24 Jan 2006 14:16:24 +0000_ This release includes a __FILENAME__ keyword for the output format. Modified: trunk/www/news/017 =================================================================== --- trunk/www/news/017 2009-10-07 19:39:23 UTC (rev 268) +++ trunk/www/news/017 2009-10-07 19:56:09 UTC (rev 269) @@ -3,7 +3,7 @@ @title=News --> -## [JavaScript Lint 0.2.3 Released](http://www.javascriptlint.com/news/017) +## [JavaScript Lint 0.2.3 Released](__BASENAME__) _Thu, 16 Feb 2006 01:11:07 +0000_ Syntax errors in imported scripts were not being reported. Modified: trunk/www/news/018 =================================================================== --- trunk/www/news/018 2009-10-07 19:39:23 UTC (rev 268) +++ trunk/www/news/018 2009-10-07 19:56:09 UTC (rev 269) @@ -3,7 +3,7 @@ @title=News --> -## [JavaScript Lint 0.2.4 Released](http://www.javascriptlint.com/news/018) +## [JavaScript Lint 0.2.4 Released](__BASENAME__) _Sat, 11 Mar 2006 02:55:51 +0000_ JavaScript within HTML files can now contain `</script>` in string literals and comments. Modified: trunk/www/news/019 =================================================================== --- trunk/www/news/019 2009-10-07 19:39:23 UTC (rev 268) +++ trunk/www/news/019 2009-10-07 19:56:09 UTC (rev 269) @@ -3,7 +3,7 @@ @title=News --> -## [JavaScript Lint 0.2.5 Released](http://www.javascriptlint.com/news/019) +## [JavaScript Lint 0.2.5 Released](__BASENAME__) _Sat, 08 Apr 2006 04:29:38 +0000_ To facilitate integration into other applications, the output format can now be passed on the command line and the results can be encoded. The source package contains source files that can be used to easily [integrate JavaScript Lint into a Windows program](http://www.javascriptlint.com/docs/running_from_your_windows_program.htm). Modified: trunk/www/news/020 =================================================================== --- trunk/www/news/020 2009-10-07 19:39:23 UTC (rev 268) +++ trunk/www/news/020 2009-10-07 19:56:09 UTC (rev 269) @@ -3,7 +3,7 @@ @title=News --> -## [JavaScript Lint 0.2.6 Released](http://www.javascriptlint.com/news/020) +## [JavaScript Lint 0.2.6 Released](__BASENAME__) _Sat, 29 Apr 2006 15:07:13 +0000_ JavaScript Lint now has a `/*jsl:ignoreall*\` keyword to allow entire files to easily be ignored. Additionally, it no longer complains about blank JavaScript files. Modified: trunk/www/news/021 =================================================================== --- trunk/www/news/021 2009-10-07 19:39:23 UTC (rev 268) +++ trunk/www/news/021 2009-10-07 19:56:09 UTC (rev 269) @@ -3,7 +3,7 @@ @title=News --> -## [JavaScript Lint SourceForge Project](http://www.javascriptlint.com/news/021) +## [JavaScript Lint SourceForge Project](__BASENAME__) _Fri, 26 May 2006 05:15:10 +0000_ JavaScript Lint now has its own [SourceForge project](http://sourceforge.net/projects/javascriptlint) with [discussion forums](http://sourceforge.net/forum/?group_id=168518), [bug/feature trackers](http://sourceforge.net/tracker/?group_id=168518), and a publicly-available [Subversion repository](http://sourceforge.net/svn/?group_id=168518). Modified: trunk/www/news/022 =================================================================== --- trunk/www/news/022 2009-10-07 19:39:23 UTC (rev 268) +++ trunk/www/news/022 2009-10-07 19:56:09 UTC (rev 269) @@ -3,7 +3,7 @@ @title=News --> -## [JavaScript Lint 0.3.0 Released](http://www.javascriptlint.com/news/022) +## [JavaScript Lint 0.3.0 Released](__BASENAME__) _Fri, 03 Nov 2006 20:32:42 +0000_ This version has also been released for Intel Macs. Modified: trunk/www/news/023 =================================================================== --- trunk/www/news/023 2009-10-07 19:39:23 UTC (rev 268) +++ trunk/www/news/023 2009-10-07 19:56:09 UTC (rev 269) @@ -3,7 +3,7 @@ @title=News --> -## [IDE Integration](http://www.javascriptlint.com/news/023) +## [IDE Integration](__BASENAME__) _Sat, 29 Sep 2007 22:08:21 +0000_ The [documentation page](http://www.javascriptlint.com/docs/running_from_your_ide.htm) now contains instructions for integrating JavaScript Lint with TextMate, vim, and emacs. Modified: trunk/www/news/index.rss =================================================================== --- trunk/www/news/index.rss 2009-10-07 19:39:23 UTC (rev 268) +++ trunk/www/news/index.rss 2009-10-07 19:56:09 UTC (rev 269) @@ -3,6 +3,7 @@ @title=JavaScript Lint Project News @link=http://www.javascriptlint.com/ @desc=JavaScript Lint Project News +@linkbase=http://www.javascriptlint.com/news/ --> <!--@include index.htm--> Modified: trunk/www.py =================================================================== --- trunk/www.py 2009-10-07 19:39:23 UTC (rev 268) +++ trunk/www.py 2009-10-07 19:56:09 UTC (rev 269) @@ -62,7 +62,7 @@ def _remove_comments(source): return re.sub('<!--[^>]*-->', '', source) -def _gen_rss(source, title, link, desc): +def _gen_rss(source, title, link, desc, linkbase): def removeblanktextnodes(node): for i in range(len(node.childNodes)-1, -1, -1): child = node.childNodes[i] @@ -117,8 +117,16 @@ 'single text node.' heading = titlenode.value.strip() + # Combine the href with the linkbase. assert 'href' in link.attributes href = link.attribute_values['href'] + if '/' in href: + raise ValueError, 'The heading link should not reference ' + \ + 'directories: %s' % href + if not linkbase.endswith('/'): + raise ValueError, 'The @linkbase must be a directory: %s' % \ + linkbase + href = linkbase + href if href in guids: raise ValueError, "Duplicate link: %s" % href @@ -183,6 +191,7 @@ # The settings defined in the outer file will rule. settings = dict(re.findall(r'^@(\w+)=(.*)$', source, re.MULTILINE)) source = _remove_comments(source) + source = source.replace('__BASENAME__', os.path.basename(path)) return settings, source def _transform_file(path): @@ -197,7 +206,8 @@ settings, source = _preprocess(path) return 'text/xml', _gen_rss(source, settings.get('title'), settings.get('link'), - settings.get('desc')) + settings.get('desc'), + settings.get('linkbase')) elif path.endswith('.htm') or path.endswith('.php') or \ not '.' in os.path.basename(path): settings, source = _preprocess(path) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mat...@us...> - 2009-10-08 08:25:23
|
Revision: 272 http://javascriptlint.svn.sourceforge.net/javascriptlint/?rev=272&view=rev Author: matthiasmiller Date: 2009-10-08 08:25:11 +0000 (Thu, 08 Oct 2009) Log Message: ----------- Updating build instructions for Windows. Modified Paths: -------------- trunk/INSTALL trunk/Makefile.SpiderMonkey trunk/setup.py Modified: trunk/INSTALL =================================================================== --- trunk/INSTALL 2009-10-08 06:53:09 UTC (rev 271) +++ trunk/INSTALL 2009-10-08 08:25:11 UTC (rev 272) @@ -1,20 +1,21 @@ BUILDING FROM THE SUBVERSION TRUNK * Windows Prequisites: - * Visual Studio 2003 - * Python + * Visual Studio 2008 Express + * Python 2.6 * py2exe * MozillaBuild (http://developer.mozilla.org/en/docs/Windows_Build_Prerequisites) - Launch the MozillaBuild 7.1 batch file. (You may have to run this as an Administrator - on Windows Vista.) Run the commands in that shell. + Launch the MozillaBuild MSVC 9 batch file. (You may have to run this as an + Administrator on Windows Vista.) Run the commands in that shell. - If you don't have a copy of Visual Studio 2003, you can download the Python - source code and compile it yourself. Python C extensions must be built with - the same compiler as the Python interpreter. - On all platforms: $ python setup.py build To install on Unix: $ sudo python setup.py install + +WEBSITE + * Windows: http://pypi.python.org/pypi/Markdown/1.7 + * Linux: $ sudo apt-get install python-markdown + Modified: trunk/Makefile.SpiderMonkey =================================================================== --- trunk/Makefile.SpiderMonkey 2009-10-08 06:53:09 UTC (rev 271) +++ trunk/Makefile.SpiderMonkey 2009-10-08 08:25:11 UTC (rev 272) @@ -20,7 +20,7 @@ ORIG_LIB=$(SPIDERMONKEY_SRC)/$(OBJDIR)/$(JS_LIB) COPY_LIB=$(BUILD_DIR)/$(JS_LIB) ORIG_DLL=$(SPIDERMONKEY_SRC)/$(OBJDIR)/js32.dll -COPY_DLL=$(DISTUTILS_DIR)/js32.dll +COPY_DLL=$(DISTUTILS_DIR)/javascriptlint/js32.dll OS_HEADER=$(BUILD_DIR)/js_operating_system.h ORIG_JSAUTOCFG_H=$(SPIDERMONKEY_SRC)/$(OBJDIR)/jsautocfg.h COPY_JSAUTOCFG_H=$(BUILD_DIR)/jsautocfg.h Modified: trunk/setup.py =================================================================== --- trunk/setup.py 2009-10-08 06:53:09 UTC (rev 271) +++ trunk/setup.py 2009-10-08 08:25:11 UTC (rev 272) @@ -10,10 +10,12 @@ class _MakefileError(Exception): pass -def _runmakefiles(distutils_dir, build_opt=1, args=[]): +def _runmakefiles(distutils_dir, build_opt=1, target=None): args = ['BUILD_OPT=%i' % build_opt] if distutils_dir: args.append('DISTUTILS_DIR=%s' % distutils_dir) + if target: + args.append(target) # First build SpiderMonkey. ret = subprocess.call(['make', '-f', 'Makefile.ref', '-C', @@ -36,7 +38,7 @@ class _MyClean(distutils.command.clean.clean): def run(self): - _runmakefiles(None, args=['clean']) + _runmakefiles(None, target='clean') distutils.command.clean.clean.run(self) if __name__ == '__main__': This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mat...@us...> - 2009-10-08 09:08:12
|
Revision: 273 http://javascriptlint.svn.sourceforge.net/javascriptlint/?rev=273&view=rev Author: matthiasmiller Date: 2009-10-08 09:08:05 +0000 (Thu, 08 Oct 2009) Log Message: ----------- www: work on cleaning up RSS Modified Paths: -------------- trunk/www/news/004 trunk/www/static/global.css trunk/www.py Modified: trunk/www/news/004 =================================================================== --- trunk/www/news/004 2009-10-08 08:25:11 UTC (rev 272) +++ trunk/www/news/004 2009-10-08 09:08:05 UTC (rev 273) @@ -4,7 +4,7 @@ --> ## [JavaScript Lint 0.1e Released](__BASENAME__) -_Tue, 31 Aug 2005 02:40:49 +0000_ +_Wed, 31 Aug 2005 02:40:49 +0000_ This release fixes a crash triggered by the following statement: _for(i = 0; i < 5; )_. (The Linux binary is not currently available for this release.) Modified: trunk/www/static/global.css =================================================================== --- trunk/www/static/global.css 2009-10-08 08:25:11 UTC (rev 272) +++ trunk/www/static/global.css 2009-10-08 09:08:05 UTC (rev 273) @@ -34,6 +34,7 @@ margin: 0.25em; padding: 0.25em; text-align: center; + width: 9em; -moz-border-radius: 5px; -webkit-border-radius: 5px; } @@ -58,7 +59,7 @@ #body { - margin-left: 9em; + margin-left: 11em; } #footer Modified: trunk/www.py =================================================================== --- trunk/www.py 2009-10-08 08:25:11 UTC (rev 272) +++ trunk/www.py 2009-10-08 09:08:05 UTC (rev 273) @@ -1,6 +1,7 @@ #!/usr/bin/python # vim: ts=4 sw=4 expandtab import BaseHTTPServer +import datetime import md5 import re import os @@ -92,7 +93,7 @@ raise ValueError, 'Missing @desc= setting.' channel.appendChild(doc.createElement('title', textNode=title)) channel.appendChild(doc.createElement('link', textNode=link)) - channel.appendChild(doc.createElement('desc', textNode=desc)) + channel.appendChild(doc.createElement('description', textNode=desc)) guids = [] @@ -152,9 +153,16 @@ if not emchild or emchild.type != 'text': raise ValueError, "The first paragraph's em must " + \ "contain only text." + pubdate = emchild.value - # TODO: Validate canonical date format. + format = "%a, %d %b %Y %H:%M:%S +0000" + dateobj = datetime.datetime.strptime(pubdate, format) + normalized = dateobj.strftime(format) + if normalized != pubdate: + raise ValueError, 'Encountered date %s but expected %s' % \ + (pubdate, normalized) + item.appendChild(doc.createElement('pubDate', emchild.value)) item_desc = doc.createElement("description") item.appendChild(item_desc) @@ -245,12 +253,17 @@ self.wfile.write(content) -def runserver(): - server_address = ('', 8000) - httpd = BaseHTTPServer.HTTPServer(server_address, _Handler) +def runserver(host): + if host: + addr, _, port = host.partition(':') + else: + addr = '' + port = 8000 + + httpd = BaseHTTPServer.HTTPServer((addr, port), _Handler) httpd.serve_forever() -def build(): +def build(host): def findfiles(searchroot): """ Returns relative paths in root. """ @@ -263,6 +276,9 @@ relpath = abspath[len(searchroot + os.sep):] yield relpath + if host: + raise ValueError, 'Host is not yet implemented.' + for relpath in findfiles(DOC_ROOT): sourcepath = os.path.join(DOC_ROOT, relpath) destpath = os.path.join(BUILD_DIR, relpath) @@ -276,15 +292,15 @@ finally: outfile.close() -def main(action=''): +def main(action='', host=''): if action == 'server': - runserver() + runserver(host) return if action == 'build': build() return print >>sys.stderr, """\ -Usage: www.py [server|build] +Usage: www.py [server|build] <host> server runs a test server on localhost build generates static HTML files from the markup This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mat...@us...> - 2009-10-08 13:32:02
|
Revision: 275 http://javascriptlint.svn.sourceforge.net/javascriptlint/?rev=275&view=rev Author: matthiasmiller Date: 2009-10-08 13:31:52 +0000 (Thu, 08 Oct 2009) Log Message: ----------- www: more refactoring Modified Paths: -------------- trunk/www/__template__ trunk/www/docs/running_from_your_ide.htm trunk/www.py Modified: trunk/www/__template__ =================================================================== --- trunk/www/__template__ 2009-10-08 09:41:26 UTC (rev 274) +++ trunk/www/__template__ 2009-10-08 13:31:52 UTC (rev 275) @@ -2,6 +2,7 @@ <head> <title>%(title)s</title> <link rel="stylesheet" type="text/css" href="/static/global.css" /> + <link rel="alternate" type="text/xml" title="RSS 2.0" href="/news/index.rss" /> </head> <body> <div id="title"> Modified: trunk/www/docs/running_from_your_ide.htm =================================================================== --- trunk/www/docs/running_from_your_ide.htm 2009-10-08 09:41:26 UTC (rev 274) +++ trunk/www/docs/running_from_your_ide.htm 2009-10-08 13:31:52 UTC (rev 275) @@ -44,7 +44,7 @@ > > `file.patterns.js=*.js;*.es` > > `command.compile.$(file.patterns.js)=/path/to/jsl conf /path/to/configuration/file process $(FileNameExt)` -> You will also need to change your JavaScript Lint configuration so that SciTE will correctly place a yellow dot at the beginning of the line corresponding to the current error [see screenshot](../images/jsl-SciTE-screenshot.png). Change the `output-format` setting to: +> You will also need to change your JavaScript Lint configuration so that SciTE will correctly place a yellow dot at the beginning of the line corresponding to the current error. Change the `output-format` setting to: > > `+output-format __FILE__:__LINE__: __ERROR__` Modified: trunk/www.py =================================================================== --- trunk/www.py 2009-10-08 09:41:26 UTC (rev 274) +++ trunk/www.py 2009-10-08 13:31:52 UTC (rev 275) @@ -2,7 +2,6 @@ # vim: ts=4 sw=4 expandtab import BaseHTTPServer import datetime -import md5 import re import os import sys @@ -22,18 +21,68 @@ ('/contact_support.htm', 'Contact'), ] -def _markdown2doc(source): +# RSS should use absolute URLs, but enable it for everything. Also +# use this post-processor to validate links. +class _URLPostProcessor(markdown.Postprocessor): + def __init__(self, host, filepath): + self._host = host + self._filepath = filepath + + def run(self, doc): + self._resolvelinks(doc.documentElement) + return doc + + def _resolvelinks(self, node): + if node.type != "element": + return + for child in node.childNodes: + self._resolvelinks(child) + linkattrs = { + 'a': 'href', + 'script': 'src', + 'link': 'href', + 'img': 'src', + } + if node.nodeName in linkattrs: + attrname = linkattrs[node.nodeName] + if not attrname in node.attribute_values: + return + + attrvalue = node.attribute_values[attrname] + if not attrvalue.startswith('http://'): + if not attrvalue.startswith('/'): + targetpath = _get_path_for_url(attrvalue, self._filepath) + if not targetpath: + raise ValueError, 'Could not resolve URL %s' % attrvalue + + # Get the folder of the parent path. + parenturl = _get_relurl_for_filepath(self._filepath) + assert parenturl.startswith('/') + parenturl = parenturl.rpartition('/')[0] + attrvalue = parenturl + '/' + attrvalue + assert _get_path_for_url(attrvalue, None) == targetpath + attrvalue = 'http://%s%s' % (self._host, attrvalue) + node.attribute_values[attrname] = attrvalue + +def _markdown2doc(host, filepath, source): class _PostProcessor(markdown.Postprocessor): def run(self, doc): self.doc = doc return doc + urlprocessor = _URLPostProcessor(host, filepath) postprocessor = _PostProcessor() md = markdown.Markdown() + md.postprocessors.append(urlprocessor) md.postprocessors.append(postprocessor) md.convert(source) return postprocessor.doc -def _resolve_url(url, parentpath): +def _get_relurl_for_filepath(filepath): + assert (filepath + os.sep).startswith(DOC_ROOT + os.sep) + relpath = filepath[len(DOC_ROOT + os.sep):] + return '/' + relpath.replace(os.sep, '/') + +def _get_path_for_url(url, parentpath): root = DOC_ROOT if not url.startswith('/'): if parentpath: @@ -54,7 +103,7 @@ def _get_nav(path): nav = [] for url, name in NAV: - navpath = _resolve_url(url, None) + navpath = _get_path_for_url(url, None) if navpath and navpath == path: nav.append('* <a class="active">%s</a>' % name) else: @@ -64,7 +113,7 @@ def _remove_comments(source): return re.sub('<!--[^>]*-->', '', source) -def _gen_rss(source, title, link, desc, linkbase): +def _gen_rss(host, path, source, title, link, desc, linkbase): def removeblanktextnodes(node): for i in range(len(node.childNodes)-1, -1, -1): child = node.childNodes[i] @@ -74,13 +123,14 @@ else: removeblanktextnodes(child) text = _remove_comments(source) - doc = _markdown2doc(text) + doc = _markdown2doc(host, path, text) oldDocElement = doc.documentElement removeblanktextnodes(oldDocElement) rss = doc.createElement("rss") rss.setAttribute('version', '2.0') + rss.setAttribute('xmlns:atom', 'http://www.w3.org/2005/Atom') doc.appendChild(rss) channel = doc.createElement("channel") @@ -122,9 +172,6 @@ # Combine the href with the linkbase. assert 'href' in link.attributes href = link.attribute_values['href'] - if '/' in href: - raise ValueError, 'The heading link should not reference ' + \ - 'directories: %s' % href if not linkbase.endswith('/'): raise ValueError, 'The @linkbase must be a directory: %s' % \ linkbase @@ -184,7 +231,7 @@ # When including a file, update global settings and replace # with contents. - includepath = _resolve_url(url, path) + includepath = _get_path_for_url(url, path) if not includepath: raise ValueError, 'Unmatched URL: %s' % match.group(1) settings, contents = _preprocess(includepath) @@ -203,7 +250,16 @@ source = source.replace('__BASENAME__', os.path.basename(path)) return settings, source -def _transform_file(path): +def _transform_markdown(host, path): + settings, source = _preprocess(path) + page = markdown.markdown(source) + + postprocessor = _URLPostProcessor(host, path) + md = markdown.Markdown() + md.postprocessors.append(postprocessor) + return settings, md.convert(source) + +def _transform_file(host, path): source = open(path).read() if path.endswith('.css'): return 'text/css', source @@ -213,14 +269,14 @@ return 'image/png', source elif path.endswith('.rss'): settings, source = _preprocess(path) - return 'text/xml', _gen_rss(source, settings.get('title'), + return 'text/xml', _gen_rss(host, path, source, + settings.get('title'), settings.get('link'), settings.get('desc'), settings.get('linkbase')) elif path.endswith('.htm') or path.endswith('.php') or \ not '.' in os.path.basename(path): - settings, source = _preprocess(path) - page = markdown.markdown(source) + settings, page = _transform_markdown(host, path) if 'template' in settings: # TODO: encode keywords keywords = dict(settings) @@ -235,10 +291,12 @@ class _Handler(BaseHTTPServer.BaseHTTPRequestHandler): def do_GET(self): - path = _resolve_url(self.path, None) + path = _get_path_for_url(self.path, None) if path: + host = '%s:%s' % (self.server.server_name, \ + self.server.server_port) try: - self._send_response(*_transform_file(path)) + self._send_response(*_transform_file(host, path)) except Exception: self.send_error(500, "TRACEBACK") raise @@ -276,8 +334,8 @@ relpath = abspath[len(searchroot + os.sep):] yield relpath - if host: - raise ValueError, 'Host is not yet implemented.' + if not host or '/' in host: + raise ValueError, 'Host must be sub.domain.com' for relpath in findfiles(DOC_ROOT): sourcepath = os.path.join(DOC_ROOT, relpath) @@ -285,7 +343,7 @@ if not os.path.isdir(os.path.dirname(destpath)): os.makedirs(os.path.dirname(destpath)) - content_type, contents = _transform_file(sourcepath) + content_type, contents = _transform_file(host, sourcepath) outfile = open(destpath, 'wb') try: outfile.write(contents) @@ -297,7 +355,7 @@ runserver(host) return if action == 'build': - build() + build(host) return print >>sys.stderr, """\ Usage: www.py [server|build] <host> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mat...@us...> - 2009-10-08 13:54:36
|
Revision: 276 http://javascriptlint.svn.sourceforge.net/javascriptlint/?rev=276&view=rev Author: matthiasmiller Date: 2009-10-08 13:54:28 +0000 (Thu, 08 Oct 2009) Log Message: ----------- www: implement the online lint Modified Paths: -------------- trunk/www/online_lint.php trunk/www.py Added Paths: ----------- trunk/www/_jsl_online.inc trunk/www/_lint_front.inc Added: trunk/www/_jsl_online.inc =================================================================== --- trunk/www/_jsl_online.inc (rev 0) +++ trunk/www/_jsl_online.inc 2009-10-08 13:54:28 UTC (rev 276) @@ -0,0 +1,221 @@ +<?php + /* This script assumes the following configuration settings: + * +output-format __LINE__,__COL__,__ERROR_NAME__,__ERROR_PREFIX__,__ERROR_MSGENC__ + * + * Example Code: + * require_once("_jsl_online.php"); + * $engine = new JSLEngine('.priv/jsl', '.priv/jsl.server.conf'); + * $result = $engine->Lint($g_sScript); + * if ($result === true) + * OutputLintHTML($engine); + * else + * echo '<b>' . htmlentities($result) . '</b>'; + * + * Suggestions or revisions can be sent to Info@JavaScriptLint.com + */ + + class JSLMessage { + var $_line; + var $_char; + var $_errname; + var $_type; + var $_message; + + function JSLMessage($line) { + $info = explode(",", $line); + if (count($info) >= 4) { + $this->_line = ($info[0]*1); + $this->_char = is_numeric($info[1]) ? ($info[1]*1) : -1; + $this->_errname = $info[2]; + $this->_type = $info[3]; + $this->_message = implode(",", array_slice($info, 4)); + } + } + + function getLine() { return $this->_line; } + function getChar() { return $this->_char; } + function getErrName() { return $this->_errname; } + function getType() { return $this->_type; } + function getMessage() { return $this->_message; } + } + + class JSLEngine { + var $_binarypath, $_confpath; + var $_scriptlines, $_scriptmsgsGeneral, $_scriptmsgsSpecific; + + function JSLEngine($binarypath, $confpath) { + $this->_binarypath = $binarypath; + $this->_confpath = $confpath; + + $this->_scriptlines = Array(); + $this->_scriptmsgsGeneral = Array(); + $this->_scriptmsgsSpecific = Array(); + } + + /* returns error on failure; returns true on success */ + function Lint($code, $maxCodeLengthKB=128) { + if (strlen($code) > $maxCodeLengthKB*1024) + return 'Please limit scripts to ' . $maxCodeLengthKB . 'KB'; + + if (!$this->_launchLintBinary($code, $output)) + return 'The JavaScript Lint online service is currently unavailable.'; + + /* parse the script */ + $this->_scriptlines = explode("\n", str_replace("\r\n", "\n", $code)); + + /* parse the output */ + $output_lines = explode("\n", str_replace("\r\n", "\n", $output)); + foreach ($output_lines as $line) { + /* skip blank lines */ + if (strlen($line) > 0) { + /* store in associative array by 0-based line number */ + $msg = new JSLMessage($line); + + if ($msg->getChar() == -1) + $this->_scriptmsgsGeneral[$msg->getLine()-1][] = $msg; + else + $this->_scriptmsgsSpecific[$msg->getLine()-1][] = $msg; + } + } + + return true; + } + + function getNumLines() { + return count($this->_scriptlines); + } + + function getLineText($i) { + return $this->_scriptlines[$i]; + } + + function getLineMessages($i) { + /* messages that do not point to a specific character should come first */ + if (isset($this->_scriptmsgsGeneral[$i]) && + isset($this->_scriptmsgsSpecific[$i])) { + return array_merge($this->_scriptmsgsGeneral[$i], $this->_scriptmsgsSpecific[$i]); + } + + if (isset($this->_scriptmsgsGeneral[$i])) + return $this->_scriptmsgsGeneral[$i]; + + if (isset($this->_scriptmsgsSpecific[$i])) + return $this->_scriptmsgsSpecific[$i]; + + return Array(); + } + + /* assumes path and that SERVER_SOFTWARE env is set */ + function _launchLintBinary($input, &$output) { + $descriptorspec = array( + 0 => array("pipe", "r"), // stdin is a pipe that the child will read from + 1 => array("pipe", "w"), // stdout is a pipe that the child will write to + 2 => array("pipe", "w") + ); + + /* launch process */ + $path = escapeshellcmd($this->_binarypath) . ' --nologo --nosummary --stdin -context --conf ' . escapeshellarg($this->_confpath); + $process = proc_open($path, $descriptorspec, $pipes); + if (!is_resource($process)) + return false; + + // $pipes now looks like this: + // 0 => writeable handle connected to child stdin + // 1 => readable handle connected to child stdout + // 2 => readable handle connected to child stdout + fwrite($pipes[0], $input); + fclose($pipes[0]); + + $output = ''; + while (!feof($pipes[1])) + $output .= fgets($pipes[1], 1024); + fclose($pipes[1]); + fclose($pipes[2]); + + // It is important that you close any pipes before calling + // proc_close in order to avoid a deadlock + $return_value = proc_close($process); + return true; + } + }; + + function getEncodedText($text) + { + $enc = htmlentities($text); + $enc = str_replace("\n", '<br/>', $enc); + $enc = str_replace(' ', ' ', $enc); + return $enc; + } + + function OutputLintHTML($engine) + { +?> + <style type="text/css"> + div#code + { + color: #999; + font-family: monospace; + } + div#code div + { + color: black; + background-color: #EEE; + } + div#code div span + { + font-weight: bold; + font-family: Arial; + white-space: auto; + font-size: .9em; + color: #F00; + } + </style> +<?php + + /* output script */ + $hasWarnedSemicolon = false; + + $numlines = $engine->getNumLines(); + $widthOfLineNo = strlen($numlines); + $lineNoSpacer = str_pad("", $widthOfLineNo, " ") . ' '; + + echo '<div id="code">'; + for ($lineno = 0; $lineno < $numlines; $lineno++) + { + /* format code */ + $text = $engine->getLineText($lineno); + $text = str_replace("\t", str_pad("", 4/*tab width*/, " "), $text); + echo getEncodedText(str_pad($lineno+1, $widthOfLineNo, " ", STR_PAD_LEFT) . ' ' . $text . "\n"); + + /* show errors */ + $errors = $engine->getLineMessages($lineno); + foreach ($errors as $Error) { + /* only show this warning once */ + if (strcasecmp($Error->getErrName(), "missing_semicolon") == 0) { + if ($hasWarnedSemicolon) + continue; + $hasWarnedSemicolon = true; + } + + echo '<div>'; + + /* point to the error position, if available */ + if ($Error->getChar() > -1) + echo getEncodedText($lineNoSpacer . str_pad("", $Error->getChar()-1, "=") . "^\n"); + + /* output error type/message */ + echo getEncodedText($lineNoSpacer) . '<span>'; + if ($Error->getType()) + echo getEncodedText($Error->getType() . ': '); + echo getEncodedText($Error->getMessage()); + echo '</span>' . getEncodedText("\n"); + + echo '</div>'; + } + + if ($lineno % 1000 == 0) + flush(); + } + echo '</div>'; + } +?> Property changes on: trunk/www/_jsl_online.inc ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/www/_lint_front.inc =================================================================== --- trunk/www/_lint_front.inc (rev 0) +++ trunk/www/_lint_front.inc 2009-10-08 13:54:28 UTC (rev 276) @@ -0,0 +1,64 @@ +<?php + // Get the posted script/URL + if (isset($_POST['script'])) + $_Script = stripslashes($_POST['script']); + else + $_Script = ""; + + function _DownloadURL($url) { + $cUrl = curl_init(); + curl_setopt($cUrl, CURLOPT_URL, $url); + curl_setopt($cUrl, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($cUrl, CURLOPT_TIMEOUT, 5); + $PageContent = curl_exec($cUrl); + if (curl_errno($cUrl)) + return false; + return $PageContent; + } + + function _OutputError($error) { + echo '<p style="color: #F00; font-weight: bold">' . htmlentities($error) . '</p>'; + } + + function _isURL($url) { + if (strstr($url, "\n") !== FALSE) + return false; + if (strstr($url, "\r\n") !== FALSE) + return false; + if (!preg_match('!^((ht|f)tps?\:\/\/)?([\w\-]+\.)+([\w]{2,5})((/(.*))?)$!i', $url)) + return false; + return true; + } + + function outputscript() { + global $_Script; + echo htmlentities($_Script); + } + + function outputlint() { + global $_Script; + if (strlen($_Script) > 0) { + // set up the new engine + require_once("_jsl_online.inc"); + $engine = new JSLEngine('../jsl-cgi-bin/jsl', '../jsl-cgi-bin/jsl.server.conf'); + + if (_isURL(trim($_Script))) { + // Download and lint the URL + $code = _DownloadURL(trim($_Script)); + if ($code !== false) + $result = $engine->Lint($code); + else + $result = "The URL could not be downloaded: " . $_Script; + } + else + $result = $engine->Lint($_Script); + + // output the results + if ($result === true) + OutputLintHTML($engine); + else + _OutputError($result); + } + } +?> + Property changes on: trunk/www/_lint_front.inc ___________________________________________________________________ Added: svn:eol-style + native Modified: trunk/www/online_lint.php =================================================================== --- trunk/www/online_lint.php 2009-10-08 13:31:52 UTC (rev 275) +++ trunk/www/online_lint.php 2009-10-08 13:54:28 UTC (rev 276) @@ -3,6 +3,8 @@ @title=The Online Lint --> +<?php require('_lint_front.inc') ?> + Online Lint =========== @@ -14,10 +16,12 @@ <form method="POST" action=""> <p>Paste your JavaScript, HTML, or URL into the box below:</p> <p> - <textarea name="script" rows="15" cols="75" style="width: 100%"></textarea> + <textarea name="script" rows="15" cols="75" style="width: 100%"><?php outputscript(); ?></textarea> </p> <p> <input type="submit" value="Lint"/> +</p> -</p> +<?php outputlint(); ?> + </form> Modified: trunk/www.py =================================================================== --- trunk/www.py 2009-10-08 13:31:52 UTC (rev 275) +++ trunk/www.py 2009-10-08 13:54:28 UTC (rev 276) @@ -267,6 +267,8 @@ return 'image/gif', source elif path.endswith('.png'): return 'image/png', source + elif path.endswith('.inc'): + return 'text/plain', source elif path.endswith('.rss'): settings, source = _preprocess(path) return 'text/xml', _gen_rss(host, path, source, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mat...@us...> - 2009-10-08 14:06:53
|
Revision: 277 http://javascriptlint.svn.sourceforge.net/javascriptlint/?rev=277&view=rev Author: matthiasmiller Date: 2009-10-08 14:06:47 +0000 (Thu, 08 Oct 2009) Log Message: ----------- www: add favicon Modified Paths: -------------- trunk/www.py Added Paths: ----------- trunk/www/favicon.ico Added: trunk/www/favicon.ico =================================================================== (Binary files differ) Property changes on: trunk/www/favicon.ico ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Modified: trunk/www.py =================================================================== --- trunk/www.py 2009-10-08 13:54:28 UTC (rev 276) +++ trunk/www.py 2009-10-08 14:06:47 UTC (rev 277) @@ -260,13 +260,15 @@ return settings, md.convert(source) def _transform_file(host, path): - source = open(path).read() + source = open(path, 'rb').read() if path.endswith('.css'): return 'text/css', source elif path.endswith('.gif'): return 'image/gif', source elif path.endswith('.png'): return 'image/png', source + elif path.endswith('.ico'): + return 'image/x-icon', source elif path.endswith('.inc'): return 'text/plain', source elif path.endswith('.rss'): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mat...@us...> - 2009-10-13 01:30:02
|
Revision: 278 http://javascriptlint.svn.sourceforge.net/javascriptlint/?rev=278&view=rev Author: matthiasmiller Date: 2009-10-13 01:29:52 +0000 (Tue, 13 Oct 2009) Log Message: ----------- Tweaks to the Windows build. Modified Paths: -------------- trunk/Makefile.SpiderMonkey trunk/setup.py Modified: trunk/Makefile.SpiderMonkey =================================================================== --- trunk/Makefile.SpiderMonkey 2009-10-08 14:06:47 UTC (rev 277) +++ trunk/Makefile.SpiderMonkey 2009-10-13 01:29:52 UTC (rev 278) @@ -20,7 +20,8 @@ ORIG_LIB=$(SPIDERMONKEY_SRC)/$(OBJDIR)/$(JS_LIB) COPY_LIB=$(BUILD_DIR)/$(JS_LIB) ORIG_DLL=$(SPIDERMONKEY_SRC)/$(OBJDIR)/js32.dll -COPY_DLL=$(DISTUTILS_DIR)/javascriptlint/js32.dll +COPY_DLL_DIR=$(DISTUTILS_DIR)/javascriptlint +COPY_DLL_PATH=$(COPY_DLL_DIR)/js32.dll OS_HEADER=$(BUILD_DIR)/js_operating_system.h ORIG_JSAUTOCFG_H=$(SPIDERMONKEY_SRC)/$(OBJDIR)/jsautocfg.h COPY_JSAUTOCFG_H=$(BUILD_DIR)/jsautocfg.h @@ -31,7 +32,7 @@ endif ifeq ($(SPIDERMONKEY_OS),XP_WIN) -ALL_TARGETS+=$(COPY_DLL) +ALL_TARGETS+=$(COPY_DLL_PATH) endif all: $(ALL_TARGETS) @@ -46,8 +47,9 @@ $(COPY_LIB): $(BUILD_DIR) $(ORIG_LIB) cp $(ORIG_LIB) $(COPY_LIB) -$(COPY_DLL): $(ORIG_DLL) - cp $(ORIG_DLL) $(COPY_DLL) +$(COPY_DLL_PATH): $(ORIG_DLL) + mkdir -p $(COPY_DLL_DIR) + cp $(ORIG_DLL) $(COPY_DLL_PATH) $(OS_HEADER): $(BUILD_DIR) echo "#define $(SPIDERMONKEY_OS)" > $(OS_HEADER) Modified: trunk/setup.py =================================================================== --- trunk/setup.py 2009-10-08 14:06:47 UTC (rev 277) +++ trunk/setup.py 2009-10-13 01:29:52 UTC (rev 278) @@ -17,9 +17,10 @@ if target: args.append(target) - # First build SpiderMonkey. + # First build SpiderMonkey. Force it to link statically against the CRT to + # make deployment easier. ret = subprocess.call(['make', '-f', 'Makefile.ref', '-C', - 'spidermonkey/src'] + args) + 'spidermonkey/src', 'XCFLAGS=-MT'] + args) if ret != 0: raise _MakefileError, 'Error running make.' This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mat...@us...> - 2009-10-22 11:53:04
|
Revision: 284 http://javascriptlint.svn.sourceforge.net/javascriptlint/?rev=284&view=rev Author: matthiasmiller Date: 2009-10-22 11:52:52 +0000 (Thu, 22 Oct 2009) Log Message: ----------- #1523100: Warn about unreached variable assignments. Modified Paths: -------------- trunk/javascriptlint/warnings.py Added Paths: ----------- trunk/tests/warnings/unreachable_code_2.js Modified: trunk/javascriptlint/warnings.py =================================================================== --- trunk/javascriptlint/warnings.py 2009-10-22 11:43:08 UTC (rev 283) +++ trunk/javascriptlint/warnings.py 2009-10-22 11:52:52 UTC (rev 284) @@ -414,7 +414,16 @@ def unreachable_code(node): if node.parent.kind == tok.LC: for sibling in node.parent.kids[node.node_index+1:]: - if not sibling.kind in (tok.VAR, tok.FUNCTION): + if sibling.kind == tok.VAR: + # Look for a variable assignment + for variable in sibling.kids: + value, = variable.kids + if value: + raise LintWarning, value + elif sibling.kind == tok.FUNCTION: + # Functions are always declared. + pass + else: raise LintWarning, sibling @lookfor(tok.FOR) Added: trunk/tests/warnings/unreachable_code_2.js =================================================================== --- trunk/tests/warnings/unreachable_code_2.js (rev 0) +++ trunk/tests/warnings/unreachable_code_2.js 2009-10-22 11:52:52 UTC (rev 284) @@ -0,0 +1,33 @@ +function unreachable_code_2() { + + // Function declarations are never unreachable. + function scope_a() + { + return inner(); + function inner() { + return 10; + } + } + + // Variable declarations are never unreachable. + function scope_b() + { + return value; + var value; + } + + // Variable assignments are, however. + function scope_c() + { + return value_a; + var value_a = 10; /*warning:unreachable_code*/ + } + + // Test multiple variables. + function scope_d() + { + return value_a; + var value_a, value_b = 10, value_c; /*warning:unreachable_code*/ + } +} + Property changes on: trunk/tests/warnings/unreachable_code_2.js ___________________________________________________________________ Added: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mat...@us...> - 2009-10-22 13:30:59
|
Revision: 285 http://javascriptlint.svn.sourceforge.net/javascriptlint/?rev=285&view=rev Author: matthiasmiller Date: 2009-10-22 13:30:51 +0000 (Thu, 22 Oct 2009) Log Message: ----------- 1516656: Add warning about identifiers hiding an identifier in a parent scope. Modified Paths: -------------- trunk/javascriptlint/jsparse.py trunk/javascriptlint/lint.py trunk/javascriptlint/warnings.py trunk/tests/control_comments/declare.js trunk/tests/warnings/var_hides_arg.js Added Paths: ----------- trunk/tests/warnings/identifier_hides_another.js Modified: trunk/javascriptlint/jsparse.py =================================================================== --- trunk/javascriptlint/jsparse.py 2009-10-22 11:52:52 UTC (rev 284) +++ trunk/javascriptlint/jsparse.py 2009-10-22 13:30:51 UTC (rev 285) @@ -174,7 +174,7 @@ start_pos = node_positions.from_offset(start_offset) end_pos = node_positions.from_offset(end_offset) kwargs = { - 'type': 'COMMENT', + 'kind': 'COMMENT', 'atom': comment_text, 'opcode': opcode, '_start_line': start_pos.line, Modified: trunk/javascriptlint/lint.py =================================================================== --- trunk/javascriptlint/lint.py 2009-10-22 11:52:52 UTC (rev 284) +++ trunk/javascriptlint/lint.py 2009-10-22 13:30:51 UTC (rev 285) @@ -117,13 +117,14 @@ if self._parent: return self._parent.resolve_identifier(name) return None - def get_unreferenced_and_undeclared_identifiers(self): + def get_identifier_warnings(self): """ Returns a tuple of unreferenced and undeclared, where each is a list of (scope, name, node) tuples. """ unreferenced = {} undeclared = [] - self._find_unreferenced_and_undeclared(unreferenced, undeclared, False) + obstructive = [] + self._find_warnings(unreferenced, undeclared, obstructive, False) # Convert "unreferenced" from a dictionary of: # { (scope, name): node } @@ -134,15 +135,22 @@ in unreferenced.items()] unreferenced.sort(key=lambda x: x[2].start_pos()) - return unreferenced, undeclared - def _find_unreferenced_and_undeclared(self, unreferenced, undeclared, - is_in_with_scope): + return { + 'unreferenced': unreferenced, + 'undeclared': undeclared, + 'obstructive': obstructive, + } + def _find_warnings(self, unreferenced, undeclared, obstructive, + is_in_with_scope): """ unreferenced is a dictionary, such that: (scope, name): node } undeclared is a list, such that: [ (scope, name, node) ] + obstructive is a list, such that: [ + (scope, name, node) + ] """ if self._node and self._node.kind == tok.WITH: is_in_with_scope = True @@ -153,6 +161,12 @@ for name, info in self._identifiers.items(): unreferenced[(self, name)] = info['node'] + # Check for variables that hide an identifier in a parent scope. + if self._parent: + for name, info in self._identifiers.items(): + if self._parent.resolve_identifier(name): + obstructive.append((self, name, info['node'])) + # Remove all declared variables from the "unreferenced" set; add all # undeclared variables to the "undeclared" list. for name, node in self._references: @@ -170,8 +184,8 @@ undeclared.append((self, name, node)) for child in self._kids: - child._find_unreferenced_and_undeclared(unreferenced, undeclared, - is_in_with_scope) + child._find_warnings(unreferenced, undeclared, obstructive, + is_in_with_scope) def find_scope(self, node): for kid in self._kids: scope = kid.find_scope(node) @@ -432,10 +446,7 @@ for name, node in declares: declare_scope = script_cache.scope.find_scope(node) - if declare_scope.get_identifier(name): - report(node, 'redeclared_var', name=name) - else: - declare_scope.add_declaration(name, node, 'var') + _warn_or_declare(declare_scope, name, 'var', node, report) def _lint_script_parts(script_parts, script_cache, lint_error, conf, import_callback): def report_lint(node, errname, pos=None, **errargs): @@ -466,15 +477,15 @@ report_native, report_lint, import_callback) scope = script_cache.scope - unreferenced, undeclared = scope.get_unreferenced_and_undeclared_identifiers() - for decl_scope, name, node in undeclared: + identifier_warnings = scope.get_identifier_warnings() + for decl_scope, name, node in identifier_warnings['undeclared']: if name in conf['declarations']: continue if name in _globals: continue if not script_cache.hasglobal(name): report_lint(node, 'undeclared_identifier', name=name) - for ref_scope, name, node in unreferenced: + for ref_scope, name, node in identifier_warnings['unreferenced']: # Ignore the outer scope. if ref_scope != scope: type_ = ref_scope.get_identifier_type(name) @@ -486,6 +497,8 @@ report_lint(node, 'unreferenced_variable', name=name) else: assert False, 'Unrecognized identifier type: %s' % type_ + for ref_scope, name, node in identifier_warnings['obstructive']: + report_lint(node, 'identifier_hides_another', name=name) def _getreporter(visitor, report): def onpush(node): @@ -504,12 +517,14 @@ def _warn_or_declare(scope, name, type_, node, report): parent_scope, other = scope.resolve_identifier(name) or (None, None) - if other and other.kind == tok.FUNCTION and name in other.fn_args: - report(node, 'var_hides_arg', name=name) - elif other and parent_scope == scope: - report(node, 'redeclared_var', name=name) + if other and parent_scope == scope: + # Only warn about duplications in this scope. + # Other scopes will be checked later. + if other.kind == tok.FUNCTION and name in other.fn_args: + report(node, 'var_hides_arg', name=name) + else: + report(node, 'redeclared_var', name=name) else: - # TODO: Warn when hiding a variable in a parent scope. scope.add_declaration(name, node, type_) def _get_scope_checks(scope, report): Modified: trunk/javascriptlint/warnings.py =================================================================== --- trunk/javascriptlint/warnings.py 2009-10-22 11:52:52 UTC (rev 284) +++ trunk/javascriptlint/warnings.py 2009-10-22 13:30:51 UTC (rev 285) @@ -82,6 +82,7 @@ 'nested_comment': 'nested comment', 'legacy_cc_not_understood': 'couldn\'t understand control comment using /*@keyword@*/ syntax', 'var_hides_arg': 'variable {name} hides argument', + 'identifier_hides_another': 'identifer {name} hides an identifier in a parent scope', 'duplicate_formal': 'duplicate formal argument {name}', 'missing_semicolon': 'missing semicolon', 'missing_semicolon_for_lambda': 'missing semicolon for lambda assignment', Modified: trunk/tests/control_comments/declare.js =================================================================== --- trunk/tests/control_comments/declare.js 2009-10-22 11:52:52 UTC (rev 284) +++ trunk/tests/control_comments/declare.js 2009-10-22 13:30:51 UTC (rev 285) @@ -1,4 +1,5 @@ /*jsl:option explicit*/ +/*conf:-identifier_hides_another*/ function declare() { window.alert('http://www.javascriptlint.com/'); /*jsl:declare window*/ /*warning:redeclared_var*/ Added: trunk/tests/warnings/identifier_hides_another.js =================================================================== --- trunk/tests/warnings/identifier_hides_another.js (rev 0) +++ trunk/tests/warnings/identifier_hides_another.js 2009-10-22 13:30:51 UTC (rev 285) @@ -0,0 +1,43 @@ +// Test each combination of arg, var, function, and jsl:declare. +function identifier_hides_another(arg_hides_arg, + function_hides_arg, + var_hides_arg, + declare_hides_arg) { + + function arg_hides_function() { return true; } + function function_hides_function() { return true; } + function var_hides_function() { return true; } + function declare_hides_function() { return true; } + + var arg_hides_var; + var function_hides_var; + var var_hides_var; + var declare_hides_var; + + /*jsl:declare arg_hides_declare*/ + /*jsl:declare function_hides_declare*/ + /*jsl:declare var_hides_declare*/ + /*jsl:declare declare_hides_declare*/ + + function inner(arg_hides_arg, + arg_hides_function, + arg_hides_var, + arg_hides_declare) { /*warning:identifier_hides_another*//*warning:identifier_hides_another*//*warning:identifier_hides_another*//*warning:identifier_hides_another*/ + + function function_hides_arg() { return true; } /*warning:identifier_hides_another*/ + function function_hides_function() { return true; } /*warning:identifier_hides_another*/ + function function_hides_var() { return true; } /*warning:identifier_hides_another*/ + function function_hides_declare() { return true; } /*warning:identifier_hides_another*/ + + var var_hides_arg; /*warning:identifier_hides_another*/ + var var_hides_function; /*warning:identifier_hides_another*/ + var var_hides_var; /*warning:identifier_hides_another*/ + var var_hides_declare; /*warning:identifier_hides_another*/ + + /*jsl:declare declare_hides_arg*/ /*warning:identifier_hides_another*/ + /*jsl:declare declare_hides_function*/ /*warning:identifier_hides_another*/ + /*jsl:declare declare_hides_var*/ /*warning:identifier_hides_another*/ + /*jsl:declare declare_hides_declare*/ /*warning:identifier_hides_another*/ + } +} + Property changes on: trunk/tests/warnings/identifier_hides_another.js ___________________________________________________________________ Added: svn:mergeinfo + Modified: trunk/tests/warnings/var_hides_arg.js =================================================================== --- trunk/tests/warnings/var_hides_arg.js 2009-10-22 11:52:52 UTC (rev 284) +++ trunk/tests/warnings/var_hides_arg.js 2009-10-22 13:30:51 UTC (rev 285) @@ -2,6 +2,6 @@ function var_hides_arg(duplicate1, duplicate2) { var duplicate1; /*warning:var_hides_arg*/ function inner() { - var duplicate2; /*warning:var_hides_arg*/ + var duplicate2; /*warning:identifier_hides_another*/ } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mat...@us...> - 2009-11-18 12:07:08
|
Revision: 291 http://javascriptlint.svn.sourceforge.net/javascriptlint/?rev=291&view=rev Author: matthiasmiller Date: 2009-11-18 12:06:56 +0000 (Wed, 18 Nov 2009) Log Message: ----------- #2890901: Support Unicode characters in scripts. Modified Paths: -------------- trunk/javascriptlint/pyspidermonkey/pyspidermonkey.c trunk/spidermonkey/src/jsapi.c trunk/spidermonkey/src/jsapi.h Added Paths: ----------- trunk/tests/bugs/ Modified: trunk/javascriptlint/pyspidermonkey/pyspidermonkey.c =================================================================== --- trunk/javascriptlint/pyspidermonkey/pyspidermonkey.c 2009-11-18 11:11:00 UTC (rev 290) +++ trunk/javascriptlint/pyspidermonkey/pyspidermonkey.c 2009-11-18 12:06:56 UTC (rev 291) @@ -19,7 +19,6 @@ #define ARRAY_COUNT(a) (sizeof(a) / sizeof(a[0])) - /** CONSTANTS */ static const char* tokens[] = { @@ -47,7 +46,21 @@ #define TOK_TO_NUM(tok) (tok+1000) #define OPCODE_TO_NUM(op) (op+2000) +static jschar* +tojschar(const char* buf) { + return (jschar*)buf; +} +static int +tojscharlen(int buflen) { + /* The buffer length shouldn't be an odd number, buf if it is, the buffer + will be truncated to exclude it. + */ + JS_STATIC_ASSERT(sizeof(char) == 1); + JS_STATIC_ASSERT(sizeof(jschar) == 2); + return buflen / 2; +} + /** MODULE INITIALIZATION */ @@ -415,7 +428,8 @@ static PyObject* module_parse(PyObject *self, PyObject *args) { struct { - const char* script; + char* scriptbuf; + int scriptbuflen; PyObject* pynode; JSRuntime* runtime; @@ -423,7 +437,6 @@ JSObject* global; JSTokenStream* token_stream; JSParseNode* jsnode; - JSString* contents; JSContextData ctx_data; } m; @@ -433,9 +446,9 @@ error = "encountered an unknown error"; /* validate arguments */ - if (!PyArg_ParseTuple(args, "sOOll", &m.script, &m.ctx_data.node_class, - &m.ctx_data.error_callback, &m.ctx_data.first_lineno, - &m.ctx_data.first_index)) { + if (!PyArg_ParseTuple(args, "es#OOll", "utf16", &m.scriptbuf, + &m.scriptbuflen, &m.ctx_data.node_class, &m.ctx_data.error_callback, + &m.ctx_data.first_lineno, &m.ctx_data.first_index)) { return NULL; } @@ -453,13 +466,8 @@ if (error) goto cleanup; - m.contents = JS_NewStringCopyZ(m.context, m.script); - if (m.contents == NULL) { - error = "cannot create script contents"; - goto cleanup; - } - - m.token_stream = js_NewBufferTokenStream(m.context, JS_GetStringChars(m.contents), JS_GetStringLength(m.contents)); + m.token_stream = js_NewBufferTokenStream(m.context, tojschar(m.scriptbuf), + tojscharlen(m.scriptbuflen)); if (!m.token_stream) { error = "cannot create token stream"; goto cleanup; @@ -486,6 +494,8 @@ JS_DestroyContext(m.context); if (m.runtime) JS_DestroyRuntime(m.runtime); + if (m.scriptbuf) + PyMem_Free(m.scriptbuf); if (error) { if (*error) { @@ -499,7 +509,8 @@ static PyObject* is_compilable_unit(PyObject *self, PyObject *args) { struct { - const char* script; + char* scriptbuf; + int scriptbuflen; JSRuntime* runtime; JSContext* context; JSObject* global; @@ -510,15 +521,16 @@ memset(&m, 0, sizeof(m)); error = "encountered an unknown error"; - if (!PyArg_ParseTuple(args, "s", &m.script)) + if (!PyArg_ParseTuple(args, "es#", "utf16", &m.scriptbuf, &m.scriptbuflen)) return NULL; error = create_jscontext(NULL, &m.runtime, &m.context, &m.global); if (error) goto cleanup; - m.is_compilable = JS_BufferIsCompilableUnit(m.context, m.global, - m.script, strlen(m.script)); + m.is_compilable = JS_UCBufferIsCompilableUnit(m.context, m.global, + tojschar(m.scriptbuf), + tojscharlen(m.scriptbuflen)); error = NULL; cleanup: @@ -526,6 +538,8 @@ JS_DestroyContext(m.context); if (m.runtime) JS_DestroyRuntime(m.runtime); + if (m.scriptbuf) + PyMem_Free(m.scriptbuf); if (error) { if (*error) Modified: trunk/spidermonkey/src/jsapi.c =================================================================== --- trunk/spidermonkey/src/jsapi.c 2009-11-18 11:11:00 UTC (rev 290) +++ trunk/spidermonkey/src/jsapi.c 2009-11-18 12:06:56 UTC (rev 291) @@ -3877,15 +3877,28 @@ { jschar *chars; JSBool result; + + CHECK_REQUEST(cx); + chars = js_InflateString(cx, bytes, &length); + if (!chars) + return JS_TRUE; + + result = JS_UCBufferIsCompilableUnit(cx, obj, chars, length); + JS_free(cx, chars); + return result; +} + +JS_PUBLIC_API(JSBool) +JS_UCBufferIsCompilableUnit(JSContext *cx, JSObject *obj, + const jschar *chars, size_t length) +{ + JSBool result; JSExceptionState *exnState; void *tempMark; JSTokenStream *ts; JSErrorReporter older; CHECK_REQUEST(cx); - chars = js_InflateString(cx, bytes, &length); - if (!chars) - return JS_TRUE; /* * Return true on any out-of-memory error, so our caller doesn't try to @@ -3912,7 +3925,6 @@ JS_ARENA_RELEASE(&cx->tempPool, tempMark); } - JS_free(cx, chars); JS_RestoreExceptionState(cx, exnState); return result; } Modified: trunk/spidermonkey/src/jsapi.h =================================================================== --- trunk/spidermonkey/src/jsapi.h 2009-11-18 11:11:00 UTC (rev 290) +++ trunk/spidermonkey/src/jsapi.h 2009-11-18 12:06:56 UTC (rev 291) @@ -1606,6 +1606,10 @@ JS_BufferIsCompilableUnit(JSContext *cx, JSObject *obj, const char *bytes, size_t length); +JS_PUBLIC_API(JSBool) +JS_UCBufferIsCompilableUnit(JSContext *cx, JSObject *obj, + const jschar *chars, size_t length); + /* * The JSScript objects returned by the following functions refer to string and * other kinds of literals, including doubles and RegExp objects. These This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mat...@us...> - 2009-11-18 12:20:04
|
Revision: 293 http://javascriptlint.svn.sourceforge.net/javascriptlint/?rev=293&view=rev Author: matthiasmiller Date: 2009-11-18 12:19:50 +0000 (Wed, 18 Nov 2009) Log Message: ----------- #2891908: Fix exception when using finally without catch. Patch submitted on tracker. Modified Paths: -------------- trunk/javascriptlint/warnings.py Added Paths: ----------- trunk/tests/bugs/sf-2891908-finally_without_catch.js Modified: trunk/javascriptlint/warnings.py =================================================================== --- trunk/javascriptlint/warnings.py 2009-11-18 12:15:40 UTC (rev 292) +++ trunk/javascriptlint/warnings.py 2009-11-18 12:19:50 UTC (rev 293) @@ -193,15 +193,19 @@ elif node.kind == tok.TRY: try_, catch_, finally_ = node.kids - assert catch_.kind == tok.RESERVED - catch_, = catch_.kids - assert catch_.kind == tok.LEXICALSCOPE - catch_, = catch_.kids - assert catch_.kind == tok.CATCH - ignored, ignored, catch_ = catch_.kids - assert catch_.kind == tok.LC + exit_points = _get_exit_points(try_) - exit_points = _get_exit_points(try_) | _get_exit_points(catch_) + if catch_: + assert catch_.kind == tok.RESERVED + catch_, = catch_.kids + assert catch_.kind == tok.LEXICALSCOPE + catch_, = catch_.kids + assert catch_.kind == tok.CATCH + ignored, ignored, catch_ = catch_.kids + assert catch_.kind == tok.LC + + exit_points |= _get_exit_points(catch_) + if finally_: finally_exit_points = _get_exit_points(finally_) if None in finally_exit_points: Added: trunk/tests/bugs/sf-2891908-finally_without_catch.js =================================================================== --- trunk/tests/bugs/sf-2891908-finally_without_catch.js (rev 0) +++ trunk/tests/bugs/sf-2891908-finally_without_catch.js 2009-11-18 12:19:50 UTC (rev 293) @@ -0,0 +1,8 @@ +function f() { + try { + /*jsl:pass*/ + } + finally { + /*jsl:pass*/ + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mat...@us...> - 2009-12-16 17:23:32
|
Revision: 294 http://javascriptlint.svn.sourceforge.net/javascriptlint/?rev=294&view=rev Author: matthiasmiller Date: 2009-12-16 17:23:22 +0000 (Wed, 16 Dec 2009) Log Message: ----------- Embed the revision number in Windows executables. Also, add a config file to build on Windows 7. Modified Paths: -------------- trunk/setup.py Added Paths: ----------- trunk/spidermonkey/src/config/WINNT6.1.mk Modified: trunk/setup.py =================================================================== --- trunk/setup.py 2009-11-18 12:19:50 UTC (rev 293) +++ trunk/setup.py 2009-12-16 17:23:22 UTC (rev 294) @@ -10,6 +10,16 @@ class _BuildError(Exception): pass +def _getrevnum(): + path = os.path.dirname(os.path.abspath(__file__)) + p = subprocess.Popen(['svnversion', path], stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout, stderr = p.communicate() + if p.returncode != 0: + raise _BuildError, 'Error running svnversion: %s' % stderr + version = stdout.strip().rstrip('M') + return int(version) + def _runmakefiles(distutils_dir, build_opt=1, target=None): args = ['BUILD_OPT=%i' % build_opt] if distutils_dir: @@ -67,12 +77,12 @@ args = {} args.update( name = 'javascriptlint', - version = '1.0', + version = '0.0.0.%i' % _getrevnum(), author = 'Matthias Miller', author_email = 'in...@ja...', url = 'http://www.javascriptlint.com/', cmdclass = cmdclass, - description = 'JavaScript Lint', + description = 'JavaScript Lint (pyjsl beta r%i)' % _getrevnum(), ext_modules = [pyspidermonkey], packages = ['javascriptlint'], scripts = ['jsl'] Added: trunk/spidermonkey/src/config/WINNT6.1.mk =================================================================== --- trunk/spidermonkey/src/config/WINNT6.1.mk (rev 0) +++ trunk/spidermonkey/src/config/WINNT6.1.mk 2009-12-16 17:23:22 UTC (rev 294) @@ -0,0 +1 @@ +include $(DEPTH)/config/WINNT5.2.mk This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mat...@us...> - 2010-04-19 15:19:49
|
Revision: 295 http://javascriptlint.svn.sourceforge.net/javascriptlint/?rev=295&view=rev Author: matthiasmiller Date: 2010-04-19 15:19:43 +0000 (Mon, 19 Apr 2010) Log Message: ----------- Fixes for Windows build. Modified Paths: -------------- trunk/javascriptlint/lint.py trunk/javascriptlint/visitation.py trunk/setup.py Modified: trunk/javascriptlint/lint.py =================================================================== --- trunk/javascriptlint/lint.py 2009-12-16 17:23:22 UTC (rev 294) +++ trunk/javascriptlint/lint.py 2010-04-19 15:19:43 UTC (rev 295) @@ -531,7 +531,9 @@ scopes = [scope] class scope_checks: - ' ' + """ This is a non-standard visitation class to track scopes. The + docstring is unused since this class never throws lint errors. + """ @visitation.visit('push', tok.NAME) def _name(self, node): if node.node_index == 0 and node.parent.kind == tok.COLON and node.parent.parent.kind == tok.RC: Modified: trunk/javascriptlint/visitation.py =================================================================== --- trunk/javascriptlint/visitation.py 2009-12-16 17:23:22 UTC (rev 294) +++ trunk/javascriptlint/visitation.py 2010-04-19 15:19:43 UTC (rev 295) @@ -29,7 +29,7 @@ if klass.__name__.lower() != klass.__name__: raise ValueError, 'class names must be lowercase' if not klass.__doc__: - raise ValueError, 'missing docstring on class' + raise ValueError, 'missing docstring on class %s' % klass.__name__ # Look for functions with the "_visit_nodes" property. visitor = klass() Modified: trunk/setup.py =================================================================== --- trunk/setup.py 2009-12-16 17:23:22 UTC (rev 294) +++ trunk/setup.py 2010-04-19 15:19:43 UTC (rev 295) @@ -107,7 +107,7 @@ 'py2exe': { 'excludes': ['javascriptlint.spidermonkey_'], 'bundle_files': 1, - 'optimize': 2, + 'optimize': 1, # requires 1 to preserve docstrings } }, zipfile = None This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mat...@us...> - 2010-04-23 20:06:04
|
Revision: 296 http://javascriptlint.svn.sourceforge.net/javascriptlint/?rev=296&view=rev Author: matthiasmiller Date: 2010-04-23 20:05:58 +0000 (Fri, 23 Apr 2010) Log Message: ----------- Fix exception when passing arguments to a "new function() {};" statement. Modified Paths: -------------- trunk/javascriptlint/warnings.py trunk/tests/warnings/want_assign_or_call.js Modified: trunk/javascriptlint/warnings.py =================================================================== --- trunk/javascriptlint/warnings.py 2010-04-19 15:19:43 UTC (rev 295) +++ trunk/javascriptlint/warnings.py 2010-04-23 20:05:58 UTC (rev 296) @@ -516,7 +516,8 @@ return # Allow new function() { } as statements. if child.kind == tok.NEW: - grandchild, = child.kids + # The first kid is the constructor, followed by its arguments. + grandchild = child.kids[0] if grandchild.kind == tok.FUNCTION: return raise LintWarning, child Modified: trunk/tests/warnings/want_assign_or_call.js =================================================================== --- trunk/tests/warnings/want_assign_or_call.js 2010-04-19 15:19:43 UTC (rev 295) +++ trunk/tests/warnings/want_assign_or_call.js 2010-04-23 20:05:58 UTC (rev 296) @@ -21,5 +21,10 @@ delete a; a.b(); + + /* Test with arguments to the constructor. */ + new function(x) { + this.x = x; + }(42); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mat...@us...> - 2010-04-23 20:58:18
|
Revision: 299 http://javascriptlint.svn.sourceforge.net/javascriptlint/?rev=299&view=rev Author: matthiasmiller Date: 2010-04-23 20:58:11 +0000 (Fri, 23 Apr 2010) Log Message: ----------- Add /*jsl:unused <identifier>*/ control comment. Modified Paths: -------------- trunk/javascriptlint/lint.py trunk/tests/warnings/unreferenced_identifier.js Modified: trunk/javascriptlint/lint.py =================================================================== --- trunk/javascriptlint/lint.py 2010-04-23 20:38:04 UTC (rev 298) +++ trunk/javascriptlint/lint.py 2010-04-23 20:58:11 UTC (rev 299) @@ -61,7 +61,8 @@ 'import': (True), 'fallthru': (False), 'pass': (False), - 'declare': (True) + 'declare': (True), + 'unused': (True), } if control_comment.lower() in control_comments: keyword = control_comment.lower() @@ -82,6 +83,7 @@ self._kids = [] self._identifiers = {} self._references = [] + self._unused = [] self._node = None def add_scope(self, node): assert not node is None @@ -98,6 +100,8 @@ } def add_reference(self, name, node): self._references.append((name, node)) + def set_unused(self, name, node): + self._unused.append((name, node)) def get_identifier(self, name): if name in self._identifiers: return self._identifiers[name]['node'] @@ -183,6 +187,14 @@ if not is_in_with_scope: undeclared.append((self, name, node)) + # Remove all variables that have been set as "unused". + for name, node in self._unused: + resolved = self.resolve_identifier(name) + if resolved: + unreferenced.pop((resolved[0], name), None) + else: + undeclared.append((self, name, node)) + for child in self._kids: child._find_warnings(unreferenced, undeclared, obstructive, is_in_with_scope) @@ -355,6 +367,7 @@ parse_errors = [] declares = [] + unused_identifiers = [] import_paths = [] fallthrus = [] passes = [] @@ -380,6 +393,11 @@ report(node, 'jsl_cc_not_understood') else: declares.append((parms, node)) + elif keyword == 'unused': + if not util.isidentifier(parms): + report(node, 'jsl_cc_not_understood') + else: + unused_identifiers.append((parms, node)) elif keyword == 'ignore': if start_ignore: report(node, 'mismatch_ctrl_comments') @@ -449,6 +467,10 @@ declare_scope = script_cache.scope.find_scope(node) _warn_or_declare(declare_scope, name, 'var', node, report) + for name, node in unused_identifiers: + unused_scope = script_cache.scope.find_scope(node) + unused_scope.set_unused(name, node) + def _lint_script_parts(script_parts, script_cache, lint_error, conf, import_callback): def report_lint(node, errname, pos=None, **errargs): errdesc = warnings.format_error(errname, **errargs) Modified: trunk/tests/warnings/unreferenced_identifier.js =================================================================== --- trunk/tests/warnings/unreferenced_identifier.js 2010-04-23 20:38:04 UTC (rev 298) +++ trunk/tests/warnings/unreferenced_identifier.js 2010-04-23 20:58:11 UTC (rev 299) @@ -84,5 +84,19 @@ return parm; }; } + + function test_unused(parm) { /*warning:unreferenced_function*/ + /*jsl:unused parm*/ + /*jsl:unused bogus_outer*/ /*warning:undeclared_identifier*/ + + var unused_var; + /*jsl:unused unused_var*/ + + with (parm) { /*warning:with_statement*/ + /*jsl:unused bogus_inner*/ /*warning:undeclared_identifier*/ + x = 42; + } + } + return get_callback(42); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |