├── .gitignore ├── CHANGELOG.md ├── CSSLint.py ├── CSSLint.sublime-settings ├── Default (Linux).sublime-keymap ├── Default (OSX).sublime-keymap ├── Default (Windows).sublime-keymap ├── Default.sublime-commands ├── LICENSE.md ├── Main.sublime-menu ├── README.md ├── Side Bar.sublime-menu ├── copyToST3.sh ├── messages.json ├── messages ├── 1.1.1.txt ├── 1.1.2.txt ├── 1.1.3.txt ├── 1.1.4.txt ├── 1.1.5.txt └── install.txt ├── scripts ├── csslint │ ├── LICENSE │ └── csslint-rhino.js └── rhino │ ├── LICENSE.txt │ └── js.jar ├── test_files ├── bigtestfile.css └── testfile.css └── version_file_checker.py /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *.pyc 3 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ### Sepetmber 2, 2013 - v1.1.4 2 | 3 | * Path fixes to ensure CSSLint executable runs correctly in ST3 as a sublime-package 4 | * Added "run on save" feature. 5 | 6 | 7 | ### Sepetmber 2, 2013 - v1.1.3 8 | 9 | * Path fixes for Windows 10 | 11 | 12 | ### September 2, 2013 - v1.1.2 13 | 14 | * Tweaked file paths for calling the jarfile 15 | * renamed csslint.py to CSSLint.py 16 | 17 | 18 | ### August 31, 2013 - v1.1.1 19 | 20 | * Added Sublime Text 3 support 21 | * Clicking outside of the errors list will remove the highlighted errors in 22 | the editor 23 | * Added messages :) 24 | * Refactored plugin so only one python file is needed. (Instead of 3) 25 | 26 | 27 | ### April 3, 2012 - v1.0.1 28 | 29 | * Plugin supports CSSLint Error and Warning flags, configurable in the settings file. 30 | 31 | 32 | ### March 29, 2012 - v1.0.0 33 | 34 | * Added sidebar context menu to csslint multiple files. 35 | * Fixed preferences support 36 | 37 | 38 | ### March 18, 2012 - v0.1.0 39 | 40 | * Initial release -------------------------------------------------------------------------------- /CSSLint.py: -------------------------------------------------------------------------------- 1 | import os 2 | import re 3 | import sublime 4 | import sublime_plugin 5 | import subprocess 6 | import zipfile 7 | try: # ST2 8 | from version_file_checker import check_file_match 9 | except ImportError: # ST3 10 | from .version_file_checker import check_file_match 11 | 12 | RESULT_VIEW_NAME = 'csslint_result_view' 13 | RESULT_REGION_NAME = 'csslint_highlighted_region' 14 | SETTINGS_FILE = "CSSLint.sublime-settings" 15 | PLUGIN_PATH = os.path.abspath(os.path.dirname(__file__)) 16 | PACKAGE_PATH = os.path.abspath(os.path.join(sublime.packages_path(), 'CSSLint')) 17 | SCRIPT_PATH = os.path.join(PACKAGE_PATH, 'scripts') 18 | MANIFEST = '' 19 | 20 | 21 | def plugin_loaded(): 22 | """ 23 | ST3: If run from a zip file, this method verifies the checksums 24 | of the CSSLint and Rhino scripts and extracts them to the packages 25 | folder if necessary. 26 | """ 27 | global PLUGIN_PATH 28 | global PACKAGE_PATH 29 | global SCRIPT_PATH 30 | 31 | PLUGIN_PATH = os.path.abspath(os.path.dirname(__file__)) 32 | PACKAGE_PATH = os.path.abspath(os.path.join(sublime.packages_path(), 'CSSLint')) 33 | SCRIPT_PATH = os.path.join(PACKAGE_PATH, 'scripts') 34 | 35 | manifest = [ 36 | { 37 | 'file_path': 'scripts/csslint/csslint-rhino.js', 38 | 'checksum': '71d63e12a904771978ddf06f22933e1f3e3812155545b844769703926f9dc027' 39 | }, 40 | { 41 | 'file_path': 'scripts/rhino/js.jar', 42 | 'checksum': '7ade44513268f7cfe08579f8ef69e4ea663b8613d3923491000784c650c67c8b' 43 | } 44 | ] 45 | 46 | file_matches = check_file_match(manifest, path_prefix=PACKAGE_PATH) 47 | 48 | if '.sublime-package' in PLUGIN_PATH: 49 | print('CSSLint is a .sublime-package; Verifying required files.') 50 | package = zipfile.ZipFile(PLUGIN_PATH, 'r') 51 | 52 | for match in file_matches: 53 | if match['isMatch'] is False: 54 | print('CSSLint: extracting {0} into {1}'.format(match['file_path'], PACKAGE_PATH)) 55 | package.extract(match['file_path'], PACKAGE_PATH) 56 | 57 | 58 | class CsslintCommand(sublime_plugin.TextCommand): 59 | 60 | def run(self, edit, paths=False, quiet=False): 61 | settings = sublime.load_settings(SETTINGS_FILE) 62 | self.edit = edit 63 | self.file_path = None 64 | file_paths = None 65 | self.file_paths = None 66 | cssFiles = [] 67 | self.use_console = True 68 | 69 | def add_css_to_list(path): 70 | if path.endswith('.css'): 71 | cssFiles.append('"' + path + '"') 72 | 73 | # Make new document for lint results - we're linting multiple files. 74 | if paths is not False: 75 | self.use_console = False 76 | 77 | # Walk through any directories and make a list of css files 78 | for path in paths: 79 | if os.path.isdir(path) is True: 80 | for path, subdirs, files in os.walk(path): 81 | for name in files: 82 | add_css_to_list(os.path.join(path, name)) 83 | 84 | else: 85 | add_css_to_list(path) 86 | 87 | # Generate the command line paths argument 88 | if len(cssFiles) < 1: 89 | sublime.error_message("No CSS files selected.") 90 | return 91 | 92 | else: 93 | self.file_paths = cssFiles 94 | file_paths = ' '.join(cssFiles) 95 | 96 | # set up new file for lint results 97 | self.current_document = sublime.active_window().new_file() 98 | self.current_document.insert(self.edit, 99 | self.current_document.size(), 100 | 'CSSLint Results\n\n') 101 | 102 | # Invoke console - we're linting a single file. 103 | else: 104 | if self.view.window().active_view().file_name() is None: 105 | if quiet is False: 106 | sublime.error_message("CSSLint: Please save your file before linting.") 107 | return 108 | 109 | if self.view.window().active_view().file_name().endswith('css') is not True: 110 | if quiet is False: 111 | sublime.error_message("CSSLint: This is not a css file.") 112 | return 113 | 114 | self.file_path = '"' + self.view.window().active_view().file_name() + '"' 115 | # init_tests_panel(self) 116 | show_tests_panel(self) 117 | 118 | # Begin linting. 119 | file_name = os.path.basename(self.file_path) if self.file_path else ', '.join(self.file_paths) 120 | self.buffered_data = '' 121 | self.file_name = file_name 122 | path_argument = file_paths if file_paths else self.file_path 123 | self.is_running = True 124 | rhino_path = settings.get('rhino_path') if settings.has('rhino_path') and settings.get('rhino_path') != False else '"{0}"'.format(os.path.join(SCRIPT_PATH, 'rhino', 'js.jar')) 125 | csslint_rhino_js = settings.get('csslint_rhino_js') if settings.has('csslint_rhino_js') and settings.get('csslint_rhino_js') != False else '"{0}"'.format(os.path.join(SCRIPT_PATH, 'csslint', 'csslint-rhino.js')) 126 | errors = ' --errors=' + ','.join(settings.get('errors')) if isinstance(settings.get('errors'), list) and len(settings.get('errors')) > 0 else '' 127 | warnings = ' --warnings=' + ','.join(settings.get('warnings')) if isinstance(settings.get('warnings'), list) and len(settings.get('warnings')) > 0 else '' 128 | ignores = ' --ignore=' + ','.join(settings.get('ignore')) if isinstance(settings.get('ignore'), list) and len(settings.get('ignore')) > 0 else '' 129 | options = '--format=compact' + errors + warnings + ignores 130 | cmd = 'java -jar ' + rhino_path + ' ' + csslint_rhino_js + ' ' + options + ' ' + path_argument 131 | 132 | self.run_linter(cmd) 133 | 134 | 135 | def update_status(self, msg, progress): 136 | sublime.status_message(msg + " " + progress) 137 | 138 | def process_data(self, data, end=False): 139 | 140 | # truncate file paths but save them in an array. 141 | # add error number to each line - needed for finding full path. 142 | def munge_errors(data): 143 | data_all_lines = data.split('\n') 144 | data_nonempty_lines = [] 145 | self.errors = [] 146 | 147 | # remove empty lines 148 | for line in data_all_lines: 149 | if len(line) > 0: 150 | data_nonempty_lines.append(line) 151 | 152 | # truncate path for display, save full path in array. 153 | for line in data_nonempty_lines: 154 | full_path_string = line[0:line.find('css:') + 3] 155 | path_to_remove = full_path_string + ': ' 156 | cleaned_error_item = line.replace(path_to_remove, '') 157 | found_error = False 158 | 159 | def add_new_error(): 160 | new_error_stylesheet = { 161 | 'full_path': full_path_string, 162 | 'items': [cleaned_error_item] 163 | } 164 | self.errors.append(new_error_stylesheet) 165 | 166 | for error in self.errors: 167 | if error['full_path'] == full_path_string: 168 | found_error = True 169 | error['items'].append(cleaned_error_item) 170 | break 171 | 172 | if found_error is False: 173 | add_new_error() 174 | 175 | # Concatenate buffered data but prevent duplicates. 176 | self.buffered_data = self.buffered_data + data.decode("utf-8") 177 | data = self.buffered_data.replace('\r\n', '\n').replace('\r', '\n') 178 | 179 | if end is False: 180 | rsep_pos = data.rfind('\n') 181 | if rsep_pos == -1: 182 | # not found full line. 183 | return 184 | self.buffered_data = data[rsep_pos+1:] 185 | data = data[:rsep_pos+1] 186 | 187 | munge_errors(data) 188 | 189 | # Push to display. 190 | if self.use_console is True: 191 | self.output_to_console() 192 | else: 193 | self.output_to_document() 194 | 195 | def output_to_console(self): 196 | self.output_view.set_read_only(False) 197 | 198 | for error_section in self.errors: 199 | self.output_view.insert(self.edit, self.output_view.size(), '\n'.join(error_section['items'])) 200 | 201 | self.output_view.set_read_only(True) 202 | CsslintEventListener.disabled = False 203 | 204 | def output_to_document(self): 205 | for error_section in self.errors: 206 | error_output = error_section['full_path'] + '\n\t' + '\n\t'.join(error_section['items']) + '\n\n' 207 | self.current_document.insert(self.edit, self.current_document.size(), error_output) 208 | 209 | def run_linter(self, cmd): 210 | self.proc = subprocess.Popen(cmd, 211 | env={"PATH": os.environ['PATH']}, 212 | shell=True, 213 | stdout=subprocess.PIPE, 214 | stderr=subprocess.STDOUT) 215 | 216 | result = self.proc.communicate()[0] 217 | 218 | if result is not None: 219 | sublime.set_timeout(self.process_data(result), 0) 220 | 221 | 222 | class CsslintSelectionCommand(sublime_plugin.WindowCommand): 223 | def run(self, paths=[]): 224 | self.view.window().run_command('csslint', {"paths": paths}) 225 | 226 | 227 | class CsslintEventListener(sublime_plugin.EventListener): 228 | disabled = False 229 | 230 | def __init__(self): 231 | self.previous_region = None 232 | self.file_view = None 233 | 234 | def on_post_save(self, view): 235 | settings = sublime.load_settings(SETTINGS_FILE) 236 | 237 | if settings.get('run_on_save') is True: 238 | view.window().run_command("csslint", {'quiet': True}) 239 | 240 | # for some reason on_selection_modified_async does not fire any events, 241 | # but this one does. 242 | def on_selection_modified(self, view): 243 | if CsslintEventListener.disabled: 244 | return 245 | if view.name() != RESULT_VIEW_NAME: 246 | return 247 | region = view.line(view.sel()[0]) 248 | 249 | # make sure call once. 250 | if self.previous_region == region: 251 | return 252 | self.previous_region = region 253 | 254 | # extract line from csslint result. 255 | text = view.substr(region) 256 | 257 | if len(text) < 1: 258 | return 259 | 260 | line = re.search('(?<=line\s)[0-9]+', text).group(0) 261 | 262 | # hightlight view line. 263 | view.add_regions(RESULT_VIEW_NAME, [region], "comment") 264 | 265 | # highlight the selected line in the active view. 266 | file_view = sublime.active_window().active_view() # if self.file_view is None else self.file_view 267 | file_view.run_command("goto_line", {"line": line}) 268 | file_region = file_view.line(file_view.sel()[0]) 269 | 270 | # highlight file_view line 271 | region_settings = sublime.DRAW_NO_FILL if hasattr(sublime, 'DRAW_NOFILL') else sublime.DRAW_OUTLINED 272 | file_view.add_regions(RESULT_REGION_NAME, [file_region], "string", "", region_settings) 273 | 274 | if hasattr(self, 'file_view') is True: 275 | self.file_view = file_view 276 | 277 | def on_deactivated(self, view): 278 | if view.name() == RESULT_VIEW_NAME: 279 | if hasattr(self, 'file_view'): 280 | self.file_view.erase_regions(RESULT_REGION_NAME) 281 | 282 | 283 | def show_tests_panel(self): 284 | """Initializes (if not already initialized) and shows the results output panel.""" 285 | 286 | if not hasattr(self, 'output_view'): 287 | try: # ST3 288 | self.output_view = self.view.window().create_output_panel(RESULT_VIEW_NAME) 289 | except AttributeError: # ST2 290 | self.output_view = self.view.window().get_output_panel(RESULT_VIEW_NAME) 291 | 292 | self.output_view.set_name(RESULT_VIEW_NAME) 293 | 294 | # self.output_view.settings().set("file_path", self.file_path) 295 | 296 | clear_test_view(self) 297 | 298 | self.view.window().run_command("show_panel", {"panel": "output." + RESULT_VIEW_NAME}) 299 | 300 | 301 | def clear_test_view(self): 302 | self.output_view.set_read_only(False) 303 | self.output_view.erase(self.edit, sublime.Region(0, self.output_view.size())) 304 | self.output_view.set_read_only(True) 305 | -------------------------------------------------------------------------------- /CSSLint.sublime-settings: -------------------------------------------------------------------------------- 1 | { 2 | // Path to the csslint jar. 3 | // Leave false to use bundled version of CSSLint. 4 | "csslint_rhino_js": false, 5 | 6 | // Path to Rhino. 7 | // Leave false to use bundled version of Rhino. 8 | "rhino_path": false, 9 | 10 | // Errors/Warnings/Ignore: refer to https://github.com/stubbornella/csslint/wiki/Command-line-interface 11 | 12 | // CSSLint rules you wish to define as errors. Must be an array. Leave blank to include all default rules. 13 | "errors": [], 14 | 15 | // CSSLint rules you wish to define as warnings. Must be an array. Leave blank to include all default rules. 16 | "warnings": [], 17 | 18 | // CSSLint rules you wish to ignore. Must be an array. Leave blank to include all default rules. 19 | "ignore": [], 20 | 21 | // Whether or not you want to lint every time a document is saved. 22 | "run_on_save": false 23 | } -------------------------------------------------------------------------------- /Default (Linux).sublime-keymap: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "keys": ["ctrl+alt+c"], 4 | "__doc__": "Run CSSLint", 5 | "command": "csslint" 6 | } 7 | ] -------------------------------------------------------------------------------- /Default (OSX).sublime-keymap: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "keys": ["ctrl+alt+c"], 4 | "__doc__": "Run CSSLint", 5 | "command": "csslint" 6 | } 7 | ] -------------------------------------------------------------------------------- /Default (Windows).sublime-keymap: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "keys": ["ctrl+alt+c"], 4 | "__doc__": "Run CSSLint", 5 | "command": "csslint" 6 | } 7 | ] -------------------------------------------------------------------------------- /Default.sublime-commands: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "caption": "CSSLint: Run CSSLint", 4 | "command": "csslint" 5 | }, 6 | { 7 | "caption": "Preferences: CSSLint Settings – Default", 8 | "command": "open_file", "args": 9 | { 10 | "file": "${packages}/CSSLint/CSSLint.sublime-settings" 11 | } 12 | }, 13 | { 14 | "caption": "Preferences: CSSLint Settings – User", 15 | "command": "open_file", "args": 16 | { 17 | "file": "${packages}/User/CSSLint.sublime-settings" 18 | } 19 | } 20 | ] -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | # License for CSSLint 2 | 3 | New BSD License 4 | 5 | Copyright (c) 2012, Austin Happel 6 | All rights reserved. 7 | 8 | Redistribution and use in source and binary forms, with or without 9 | modification, are permitted provided that the following conditions are met: 10 | * Redistributions of source code must retain the above copyright 11 | notice, this list of conditions and the following disclaimer. 12 | * Redistributions in binary form must reproduce the above copyright 13 | notice, this list of conditions and the following disclaimer in the 14 | documentation and/or other materials provided with the distribution. 15 | * Neither the name of the Austin Happel nor the 16 | names of its contributors may be used to endorse or promote products 17 | derived from this software without specific prior written permission. 18 | 19 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 20 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 21 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 22 | DISCLAIMED. IN NO EVENT SHALL AUSTIN HAPPEL BE LIABLE FOR ANY 23 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 24 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 26 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 28 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 | 30 | # License for code derived from sublime-jslint 31 | 32 | New BSD License 33 | 34 | Copyright (c) 2011, Robin Zhong 35 | All rights reserved. 36 | 37 | Redistribution and use in source and binary forms, with or without 38 | modification, are permitted provided that the following conditions are met: 39 | * Redistributions of source code must retain the above copyright 40 | notice, this list of conditions and the following disclaimer. 41 | * Redistributions in binary form must reproduce the above copyright 42 | notice, this list of conditions and the following disclaimer in the 43 | documentation and/or other materials provided with the distribution. 44 | * Neither the name of the Robin Zhong nor the 45 | names of its contributors may be used to endorse or promote products 46 | derived from this software without specific prior written permission. 47 | 48 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 49 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 50 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 51 | DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY 52 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 53 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 54 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 55 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 56 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 57 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /Main.sublime-menu: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "preferences", 4 | "children": 5 | [ 6 | { 7 | "caption": "Package Settings", 8 | "id": "package-settings", 9 | "children": 10 | [ 11 | { 12 | "caption": "CSSLint", 13 | "children": 14 | [ 15 | { 16 | "caption": "Settings – Default", 17 | "command": "open_file", 18 | "args": 19 | { 20 | "file": "${packages}/CSSLint/CSSLint.sublime-settings" 21 | } 22 | }, 23 | { 24 | "caption": "Settings – User", 25 | "command": "open_file", 26 | "args": 27 | { 28 | "file": "${packages}/User/CSSLint.sublime-settings" 29 | } 30 | }, 31 | { 32 | "command": "open_file", 33 | "args": { 34 | "file": "${packages}/CSSLint/Default (OSX).sublime-keymap", 35 | "platform": "OSX" 36 | }, 37 | "caption": "Key Bindings – Default" 38 | }, 39 | { 40 | "command": "open_file", 41 | "args": { 42 | "file": "${packages}/CSSLint/Default (Linux).sublime-keymap", 43 | "platform": "Linux" 44 | }, 45 | "caption": "Key Bindings – Default" 46 | }, 47 | { 48 | "command": "open_file", 49 | "args": { 50 | "file": "${packages}/CSSLint/Default (Windows).sublime-keymap", 51 | "platform": "Windows" 52 | }, 53 | "caption": "Key Bindings – Default" 54 | }, 55 | { 56 | "command": "open_file", 57 | "args": { 58 | "file": "${packages}/User/Default (OSX).sublime-keymap", 59 | "platform": "OSX" 60 | }, 61 | "caption": "Key Bindings – User" 62 | }, 63 | { 64 | "command": "open_file", 65 | "args": { 66 | "file": "${packages}/User/Default (Linux).sublime-keymap", 67 | "platform": "Linux" 68 | }, 69 | "caption": "Key Bindings – User" 70 | }, 71 | { 72 | "command": "open_file", 73 | "args": { 74 | "file": "${packages}/User/Default (Windows).sublime-keymap", 75 | "platform": "Windows" 76 | }, 77 | "caption": "Key Bindings – User" 78 | } 79 | ] 80 | } 81 | ] 82 | } 83 | ] 84 | } 85 | ] -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CSSLint plugin for Sublime Text 2 2 | 3 | Takes the power of [csslint.net](http://csslint.net) and puts it into Sublime Text. Instead of copying and pasting your CSS into the [csslint.net](http://csslint.net) static analysis tool, all you have to do is hit `ctrl + alt + c` and any warnings are displayed in your console. You can also click on those warnings in the console, and the specific line will be highlighted in your code. 4 | 5 | You can also lint multiple files at a time by selecting them in the sidebar and selecing `CSSLint Selection`. A new document will open and display the lint data, sorted by filename. 6 | 7 | ## Installation 8 | 9 | 1. Copy this project folder to your Sublime Text Packages folder: 10 | 11 | > Windows: %APPDATA%\Sublime Text 2\Packages 12 | 13 | > Mac OS X: ~/Library/Application\ Support/Sublime\ Text\ 2/Packages/ 14 | 15 | > Linux: ~/.config/sublime-text-2/Packages 16 | 17 | 2. Make sure Java is installed, and that `java` is in your PATH. 18 | 19 | 3. Rename the package folder from "sublime-csslint" to "CSSLint". 20 | 21 | ## Usage 22 | 23 | * Use the Command Pallete (Windows and Linux: Ctrl+Shift+P, OSX: Command+Shift+P) and search for: 24 | 25 | > CSSLint: Run CSSLint 26 | 27 | * Use a keyboard shortcut. By default this is `ctrl + alt + c`. Change this by adding something like the following to your key bindings: 28 | 29 | { "keys": ["ctrl+alt+c"], "command": "csslint" } 30 | 31 | ### Advanced Usage 32 | 33 | * Each CSS Lint rule has an ID that can be found in [this file](https://github.com/austinhappel/sublime-csslint/blob/master/scripts/csslint/csslint-rhino.js). (Look for blocks starting with `CSSLint.addRule`). 34 | * To ignore certain rules of CSS Lint, you will need to amend the Preferences > Package Settings > CSS Lint > User Preferences file. This will be blank by default. Just copy/paste the Default preferences file and then amend to suit. 35 | * Therefore as an example: 36 | 37 | ```` 38 | { 39 | // CSSLint rules you wish to ignore. Must be an array. Leave blank to include all default rules. 40 | "ignore": ["floats","universal-selector","box-model","unqualified-attributes"] 41 | } 42 | ```` 43 | 44 | This would ignore messages about **floats**, the **universal selector**, **box-model** and **unqualified attributes**. 45 | 46 | ## Thanks 47 | 48 | Much of this plugin has been copied from the [sublime-jslint](https://github.com/fbzhong/sublime-jslint) project. I liked how that plugin worked, and based this project off of it. Much thanks to [fbzhong](https://github.com/fbzhong) for that! 49 | 50 | ## Other Notes 51 | 52 | This plugin uses the [Rhino](http://www.mozilla.org/rhino/download.html) command-line version of CSSLint, and includes the Rhino library. 53 | -------------------------------------------------------------------------------- /Side Bar.sublime-menu: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "caption": "CSSLint Selection", 4 | "id": "csslint-selection", 5 | "command": "csslint_selection", 6 | "args": {"paths": []} 7 | } 8 | ] -------------------------------------------------------------------------------- /copyToST3.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # MAC ONLY: This script does the following: 4 | # 1. Deletes your sublime text 3 CSSLint.sublime-package file from Installed Packages 5 | # 2. Creates a new CSSLint.sublime-package of the current directory and 6 | # places it in your ST3 Installed Packages folder 7 | # WARNING: This must only be used in the CSSLint project folder. It will break 8 | # if used elsewhere (without proper modification) 9 | # WARNING: This is for testing only. 10 | # WARNING: Package Control may overwrite this file when ST3 is first launched. 11 | # WARNING: This script is for use on OSX only. 12 | 13 | PACKAGE_PATH='Library/Application Support/Sublime Text 3/Installed Packages/CSSLint.sublime-package' 14 | 15 | # Delete CSSLint.sublime-package in ST3 16 | echo 'Deleting ~/'${PACKAGE_PATH} 17 | rm ~/"${PACKAGE_PATH}" 18 | 19 | # Create a new zip file and copy it to ST3 20 | echo 'Creating new CSSLint.sublime-package into ~/'${PACKAGE_PATH} 21 | zip -r ~/"${PACKAGE_PATH}" --exclude=*.git* --exclude=*.pyc* . 22 | 23 | -------------------------------------------------------------------------------- /messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "install": "messages/install.txt", 3 | "1.1.1": "messages/1.1.1.txt", 4 | "1.1.2": "messages/1.1.2.txt", 5 | "1.1.3": "messages/1.1.3.txt", 6 | "1.1.4": "messages/1.1.4.txt", 7 | "1.1.5": "messages/1.1.5.txt" 8 | } -------------------------------------------------------------------------------- /messages/1.1.1.txt: -------------------------------------------------------------------------------- 1 | CSSLint v1.1.1 changelog 2 | ======================== 3 | 4 | * Added Sublime Text 3 support 5 | * Clicking outside of the errors list will remove the highlighted errors in 6 | the editor 7 | * Added messages :) 8 | * Refactored plugin so only one python file is needed. (Instead of 3) -------------------------------------------------------------------------------- /messages/1.1.2.txt: -------------------------------------------------------------------------------- 1 | CSSLint v1.1.2 changelog 2 | ======================== 3 | 4 | * Minor tweaks for consistency -------------------------------------------------------------------------------- /messages/1.1.3.txt: -------------------------------------------------------------------------------- 1 | CSSLint v1.1.3 changelog 2 | ======================== 3 | 4 | * Path fixes for Windows -------------------------------------------------------------------------------- /messages/1.1.4.txt: -------------------------------------------------------------------------------- 1 | CSSLint v1.1.4 changelog 2 | ======================== 3 | 4 | * Path fixes to ensure CSSLint executable runs correctly in ST3 as a sublime-package 5 | * Added "run on save" feature. -------------------------------------------------------------------------------- /messages/1.1.5.txt: -------------------------------------------------------------------------------- 1 | CSSLint v1.1.5 changelog 2 | ======================== 3 | 4 | * ST3 Updates: 5 | * If CSSLint is a .sublime-package (zipped file) and the required files it 6 | needs do not exist on disk, it will automatically extract them from the 7 | package into `Packages/CSSLint`. This _should_ fix issue 12. -------------------------------------------------------------------------------- /messages/install.txt: -------------------------------------------------------------------------------- 1 | CSSLint for Sublime Text 2 | ======================== 3 | 4 | Thanks for downloading this plugin! For information on how to use it, please 5 | refer to the readme: 6 | 7 | https://github.com/austinhappel/sublime-csslint/blob/master/README.md -------------------------------------------------------------------------------- /scripts/csslint/LICENSE: -------------------------------------------------------------------------------- 1 | CSSLint 2 | Copyright (c) 2011 Nicole Sullivan and Nicholas C. Zakas. All rights reserved. 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in 12 | all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | THE SOFTWARE. -------------------------------------------------------------------------------- /scripts/rhino/LICENSE.txt: -------------------------------------------------------------------------------- 1 | The majority of Rhino is MPL 1.1 / GPL 2.0 dual licensed: 2 | 3 | The Mozilla Public License (http://www.mozilla.org/MPL/MPL-1.1.txt): 4 | ============================================================================ 5 | MOZILLA PUBLIC LICENSE 6 | Version 1.1 7 | 8 | --------------- 9 | 10 | 1. Definitions. 11 | 12 | 1.0.1. "Commercial Use" means distribution or otherwise making the 13 | Covered Code available to a third party. 14 | 15 | 1.1. "Contributor" means each entity that creates or contributes to 16 | the creation of Modifications. 17 | 18 | 1.2. "Contributor Version" means the combination of the Original 19 | Code, prior Modifications used by a Contributor, and the Modifications 20 | made by that particular Contributor. 21 | 22 | 1.3. "Covered Code" means the Original Code or Modifications or the 23 | combination of the Original Code and Modifications, in each case 24 | including portions thereof. 25 | 26 | 1.4. "Electronic Distribution Mechanism" means a mechanism generally 27 | accepted in the software development community for the electronic 28 | transfer of data. 29 | 30 | 1.5. "Executable" means Covered Code in any form other than Source 31 | Code. 32 | 33 | 1.6. "Initial Developer" means the individual or entity identified 34 | as the Initial Developer in the Source Code notice required by Exhibit 35 | A. 36 | 37 | 1.7. "Larger Work" means a work which combines Covered Code or 38 | portions thereof with code not governed by the terms of this License. 39 | 40 | 1.8. "License" means this document. 41 | 42 | 1.8.1. "Licensable" means having the right to grant, to the maximum 43 | extent possible, whether at the time of the initial grant or 44 | subsequently acquired, any and all of the rights conveyed herein. 45 | 46 | 1.9. "Modifications" means any addition to or deletion from the 47 | substance or structure of either the Original Code or any previous 48 | Modifications. When Covered Code is released as a series of files, a 49 | Modification is: 50 | A. Any addition to or deletion from the contents of a file 51 | containing Original Code or previous Modifications. 52 | 53 | B. Any new file that contains any part of the Original Code or 54 | previous Modifications. 55 | 56 | 1.10. "Original Code" means Source Code of computer software code 57 | which is described in the Source Code notice required by Exhibit A as 58 | Original Code, and which, at the time of its release under this 59 | License is not already Covered Code governed by this License. 60 | 61 | 1.10.1. "Patent Claims" means any patent claim(s), now owned or 62 | hereafter acquired, including without limitation, method, process, 63 | and apparatus claims, in any patent Licensable by grantor. 64 | 65 | 1.11. "Source Code" means the preferred form of the Covered Code for 66 | making modifications to it, including all modules it contains, plus 67 | any associated interface definition files, scripts used to control 68 | compilation and installation of an Executable, or source code 69 | differential comparisons against either the Original Code or another 70 | well known, available Covered Code of the Contributor's choice. The 71 | Source Code can be in a compressed or archival form, provided the 72 | appropriate decompression or de-archiving software is widely available 73 | for no charge. 74 | 75 | 1.12. "You" (or "Your") means an individual or a legal entity 76 | exercising rights under, and complying with all of the terms of, this 77 | License or a future version of this License issued under Section 6.1. 78 | For legal entities, "You" includes any entity which controls, is 79 | controlled by, or is under common control with You. For purposes of 80 | this definition, "control" means (a) the power, direct or indirect, 81 | to cause the direction or management of such entity, whether by 82 | contract or otherwise, or (b) ownership of more than fifty percent 83 | (50%) of the outstanding shares or beneficial ownership of such 84 | entity. 85 | 86 | 2. Source Code License. 87 | 88 | 2.1. The Initial Developer Grant. 89 | The Initial Developer hereby grants You a world-wide, royalty-free, 90 | non-exclusive license, subject to third party intellectual property 91 | claims: 92 | (a) under intellectual property rights (other than patent or 93 | trademark) Licensable by Initial Developer to use, reproduce, 94 | modify, display, perform, sublicense and distribute the Original 95 | Code (or portions thereof) with or without Modifications, and/or 96 | as part of a Larger Work; and 97 | 98 | (b) under Patents Claims infringed by the making, using or 99 | selling of Original Code, to make, have made, use, practice, 100 | sell, and offer for sale, and/or otherwise dispose of the 101 | Original Code (or portions thereof). 102 | 103 | (c) the licenses granted in this Section 2.1(a) and (b) are 104 | effective on the date Initial Developer first distributes 105 | Original Code under the terms of this License. 106 | 107 | (d) Notwithstanding Section 2.1(b) above, no patent license is 108 | granted: 1) for code that You delete from the Original Code; 2) 109 | separate from the Original Code; or 3) for infringements caused 110 | by: i) the modification of the Original Code or ii) the 111 | combination of the Original Code with other software or devices. 112 | 113 | 2.2. Contributor Grant. 114 | Subject to third party intellectual property claims, each Contributor 115 | hereby grants You a world-wide, royalty-free, non-exclusive license 116 | 117 | (a) under intellectual property rights (other than patent or 118 | trademark) Licensable by Contributor, to use, reproduce, modify, 119 | display, perform, sublicense and distribute the Modifications 120 | created by such Contributor (or portions thereof) either on an 121 | unmodified basis, with other Modifications, as Covered Code 122 | and/or as part of a Larger Work; and 123 | 124 | (b) under Patent Claims infringed by the making, using, or 125 | selling of Modifications made by that Contributor either alone 126 | and/or in combination with its Contributor Version (or portions 127 | of such combination), to make, use, sell, offer for sale, have 128 | made, and/or otherwise dispose of: 1) Modifications made by that 129 | Contributor (or portions thereof); and 2) the combination of 130 | Modifications made by that Contributor with its Contributor 131 | Version (or portions of such combination). 132 | 133 | (c) the licenses granted in Sections 2.2(a) and 2.2(b) are 134 | effective on the date Contributor first makes Commercial Use of 135 | the Covered Code. 136 | 137 | (d) Notwithstanding Section 2.2(b) above, no patent license is 138 | granted: 1) for any code that Contributor has deleted from the 139 | Contributor Version; 2) separate from the Contributor Version; 140 | 3) for infringements caused by: i) third party modifications of 141 | Contributor Version or ii) the combination of Modifications made 142 | by that Contributor with other software (except as part of the 143 | Contributor Version) or other devices; or 4) under Patent Claims 144 | infringed by Covered Code in the absence of Modifications made by 145 | that Contributor. 146 | 147 | 3. Distribution Obligations. 148 | 149 | 3.1. Application of License. 150 | The Modifications which You create or to which You contribute are 151 | governed by the terms of this License, including without limitation 152 | Section 2.2. The Source Code version of Covered Code may be 153 | distributed only under the terms of this License or a future version 154 | of this License released under Section 6.1, and You must include a 155 | copy of this License with every copy of the Source Code You 156 | distribute. You may not offer or impose any terms on any Source Code 157 | version that alters or restricts the applicable version of this 158 | License or the recipients' rights hereunder. However, You may include 159 | an additional document offering the additional rights described in 160 | Section 3.5. 161 | 162 | 3.2. Availability of Source Code. 163 | Any Modification which You create or to which You contribute must be 164 | made available in Source Code form under the terms of this License 165 | either on the same media as an Executable version or via an accepted 166 | Electronic Distribution Mechanism to anyone to whom you made an 167 | Executable version available; and if made available via Electronic 168 | Distribution Mechanism, must remain available for at least twelve (12) 169 | months after the date it initially became available, or at least six 170 | (6) months after a subsequent version of that particular Modification 171 | has been made available to such recipients. You are responsible for 172 | ensuring that the Source Code version remains available even if the 173 | Electronic Distribution Mechanism is maintained by a third party. 174 | 175 | 3.3. Description of Modifications. 176 | You must cause all Covered Code to which You contribute to contain a 177 | file documenting the changes You made to create that Covered Code and 178 | the date of any change. You must include a prominent statement that 179 | the Modification is derived, directly or indirectly, from Original 180 | Code provided by the Initial Developer and including the name of the 181 | Initial Developer in (a) the Source Code, and (b) in any notice in an 182 | Executable version or related documentation in which You describe the 183 | origin or ownership of the Covered Code. 184 | 185 | 3.4. Intellectual Property Matters 186 | (a) Third Party Claims. 187 | If Contributor has knowledge that a license under a third party's 188 | intellectual property rights is required to exercise the rights 189 | granted by such Contributor under Sections 2.1 or 2.2, 190 | Contributor must include a text file with the Source Code 191 | distribution titled "LEGAL" which describes the claim and the 192 | party making the claim in sufficient detail that a recipient will 193 | know whom to contact. If Contributor obtains such knowledge after 194 | the Modification is made available as described in Section 3.2, 195 | Contributor shall promptly modify the LEGAL file in all copies 196 | Contributor makes available thereafter and shall take other steps 197 | (such as notifying appropriate mailing lists or newsgroups) 198 | reasonably calculated to inform those who received the Covered 199 | Code that new knowledge has been obtained. 200 | 201 | (b) Contributor APIs. 202 | If Contributor's Modifications include an application programming 203 | interface and Contributor has knowledge of patent licenses which 204 | are reasonably necessary to implement that API, Contributor must 205 | also include this information in the LEGAL file. 206 | 207 | (c) Representations. 208 | Contributor represents that, except as disclosed pursuant to 209 | Section 3.4(a) above, Contributor believes that Contributor's 210 | Modifications are Contributor's original creation(s) and/or 211 | Contributor has sufficient rights to grant the rights conveyed by 212 | this License. 213 | 214 | 3.5. Required Notices. 215 | You must duplicate the notice in Exhibit A in each file of the Source 216 | Code. If it is not possible to put such notice in a particular Source 217 | Code file due to its structure, then You must include such notice in a 218 | location (such as a relevant directory) where a user would be likely 219 | to look for such a notice. If You created one or more Modification(s) 220 | You may add your name as a Contributor to the notice described in 221 | Exhibit A. You must also duplicate this License in any documentation 222 | for the Source Code where You describe recipients' rights or ownership 223 | rights relating to Covered Code. You may choose to offer, and to 224 | charge a fee for, warranty, support, indemnity or liability 225 | obligations to one or more recipients of Covered Code. However, You 226 | may do so only on Your own behalf, and not on behalf of the Initial 227 | Developer or any Contributor. You must make it absolutely clear than 228 | any such warranty, support, indemnity or liability obligation is 229 | offered by You alone, and You hereby agree to indemnify the Initial 230 | Developer and every Contributor for any liability incurred by the 231 | Initial Developer or such Contributor as a result of warranty, 232 | support, indemnity or liability terms You offer. 233 | 234 | 3.6. Distribution of Executable Versions. 235 | You may distribute Covered Code in Executable form only if the 236 | requirements of Section 3.1-3.5 have been met for that Covered Code, 237 | and if You include a notice stating that the Source Code version of 238 | the Covered Code is available under the terms of this License, 239 | including a description of how and where You have fulfilled the 240 | obligations of Section 3.2. The notice must be conspicuously included 241 | in any notice in an Executable version, related documentation or 242 | collateral in which You describe recipients' rights relating to the 243 | Covered Code. You may distribute the Executable version of Covered 244 | Code or ownership rights under a license of Your choice, which may 245 | contain terms different from this License, provided that You are in 246 | compliance with the terms of this License and that the license for the 247 | Executable version does not attempt to limit or alter the recipient's 248 | rights in the Source Code version from the rights set forth in this 249 | License. If You distribute the Executable version under a different 250 | license You must make it absolutely clear that any terms which differ 251 | from this License are offered by You alone, not by the Initial 252 | Developer or any Contributor. You hereby agree to indemnify the 253 | Initial Developer and every Contributor for any liability incurred by 254 | the Initial Developer or such Contributor as a result of any such 255 | terms You offer. 256 | 257 | 3.7. Larger Works. 258 | You may create a Larger Work by combining Covered Code with other code 259 | not governed by the terms of this License and distribute the Larger 260 | Work as a single product. In such a case, You must make sure the 261 | requirements of this License are fulfilled for the Covered Code. 262 | 263 | 4. Inability to Comply Due to Statute or Regulation. 264 | 265 | If it is impossible for You to comply with any of the terms of this 266 | License with respect to some or all of the Covered Code due to 267 | statute, judicial order, or regulation then You must: (a) comply with 268 | the terms of this License to the maximum extent possible; and (b) 269 | describe the limitations and the code they affect. Such description 270 | must be included in the LEGAL file described in Section 3.4 and must 271 | be included with all distributions of the Source Code. Except to the 272 | extent prohibited by statute or regulation, such description must be 273 | sufficiently detailed for a recipient of ordinary skill to be able to 274 | understand it. 275 | 276 | 5. Application of this License. 277 | 278 | This License applies to code to which the Initial Developer has 279 | attached the notice in Exhibit A and to related Covered Code. 280 | 281 | 6. Versions of the License. 282 | 283 | 6.1. New Versions. 284 | Netscape Communications Corporation ("Netscape") may publish revised 285 | and/or new versions of the License from time to time. Each version 286 | will be given a distinguishing version number. 287 | 288 | 6.2. Effect of New Versions. 289 | Once Covered Code has been published under a particular version of the 290 | License, You may always continue to use it under the terms of that 291 | version. You may also choose to use such Covered Code under the terms 292 | of any subsequent version of the License published by Netscape. No one 293 | other than Netscape has the right to modify the terms applicable to 294 | Covered Code created under this License. 295 | 296 | 6.3. Derivative Works. 297 | If You create or use a modified version of this License (which you may 298 | only do in order to apply it to code which is not already Covered Code 299 | governed by this License), You must (a) rename Your license so that 300 | the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", 301 | "MPL", "NPL" or any confusingly similar phrase do not appear in your 302 | license (except to note that your license differs from this License) 303 | and (b) otherwise make it clear that Your version of the license 304 | contains terms which differ from the Mozilla Public License and 305 | Netscape Public License. (Filling in the name of the Initial 306 | Developer, Original Code or Contributor in the notice described in 307 | Exhibit A shall not of themselves be deemed to be modifications of 308 | this License.) 309 | 310 | 7. DISCLAIMER OF WARRANTY. 311 | 312 | COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, 313 | WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, 314 | WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF 315 | DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. 316 | THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE 317 | IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, 318 | YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE 319 | COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER 320 | OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF 321 | ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. 322 | 323 | 8. TERMINATION. 324 | 325 | 8.1. This License and the rights granted hereunder will terminate 326 | automatically if You fail to comply with terms herein and fail to cure 327 | such breach within 30 days of becoming aware of the breach. All 328 | sublicenses to the Covered Code which are properly granted shall 329 | survive any termination of this License. Provisions which, by their 330 | nature, must remain in effect beyond the termination of this License 331 | shall survive. 332 | 333 | 8.2. If You initiate litigation by asserting a patent infringement 334 | claim (excluding declatory judgment actions) against Initial Developer 335 | or a Contributor (the Initial Developer or Contributor against whom 336 | You file such action is referred to as "Participant") alleging that: 337 | 338 | (a) such Participant's Contributor Version directly or indirectly 339 | infringes any patent, then any and all rights granted by such 340 | Participant to You under Sections 2.1 and/or 2.2 of this License 341 | shall, upon 60 days notice from Participant terminate prospectively, 342 | unless if within 60 days after receipt of notice You either: (i) 343 | agree in writing to pay Participant a mutually agreeable reasonable 344 | royalty for Your past and future use of Modifications made by such 345 | Participant, or (ii) withdraw Your litigation claim with respect to 346 | the Contributor Version against such Participant. If within 60 days 347 | of notice, a reasonable royalty and payment arrangement are not 348 | mutually agreed upon in writing by the parties or the litigation claim 349 | is not withdrawn, the rights granted by Participant to You under 350 | Sections 2.1 and/or 2.2 automatically terminate at the expiration of 351 | the 60 day notice period specified above. 352 | 353 | (b) any software, hardware, or device, other than such Participant's 354 | Contributor Version, directly or indirectly infringes any patent, then 355 | any rights granted to You by such Participant under Sections 2.1(b) 356 | and 2.2(b) are revoked effective as of the date You first made, used, 357 | sold, distributed, or had made, Modifications made by that 358 | Participant. 359 | 360 | 8.3. If You assert a patent infringement claim against Participant 361 | alleging that such Participant's Contributor Version directly or 362 | indirectly infringes any patent where such claim is resolved (such as 363 | by license or settlement) prior to the initiation of patent 364 | infringement litigation, then the reasonable value of the licenses 365 | granted by such Participant under Sections 2.1 or 2.2 shall be taken 366 | into account in determining the amount or value of any payment or 367 | license. 368 | 369 | 8.4. In the event of termination under Sections 8.1 or 8.2 above, 370 | all end user license agreements (excluding distributors and resellers) 371 | which have been validly granted by You or any distributor hereunder 372 | prior to termination shall survive termination. 373 | 374 | 9. LIMITATION OF LIABILITY. 375 | 376 | UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT 377 | (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL 378 | DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, 379 | OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR 380 | ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY 381 | CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, 382 | WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER 383 | COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN 384 | INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF 385 | LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY 386 | RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW 387 | PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE 388 | EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO 389 | THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. 390 | 391 | 10. U.S. GOVERNMENT END USERS. 392 | 393 | The Covered Code is a "commercial item," as that term is defined in 394 | 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer 395 | software" and "commercial computer software documentation," as such 396 | terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 397 | C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), 398 | all U.S. Government End Users acquire Covered Code with only those 399 | rights set forth herein. 400 | 401 | 11. MISCELLANEOUS. 402 | 403 | This License represents the complete agreement concerning subject 404 | matter hereof. If any provision of this License is held to be 405 | unenforceable, such provision shall be reformed only to the extent 406 | necessary to make it enforceable. This License shall be governed by 407 | California law provisions (except to the extent applicable law, if 408 | any, provides otherwise), excluding its conflict-of-law provisions. 409 | With respect to disputes in which at least one party is a citizen of, 410 | or an entity chartered or registered to do business in the United 411 | States of America, any litigation relating to this License shall be 412 | subject to the jurisdiction of the Federal Courts of the Northern 413 | District of California, with venue lying in Santa Clara County, 414 | California, with the losing party responsible for costs, including 415 | without limitation, court costs and reasonable attorneys' fees and 416 | expenses. The application of the United Nations Convention on 417 | Contracts for the International Sale of Goods is expressly excluded. 418 | Any law or regulation which provides that the language of a contract 419 | shall be construed against the drafter shall not apply to this 420 | License. 421 | 422 | 12. RESPONSIBILITY FOR CLAIMS. 423 | 424 | As between Initial Developer and the Contributors, each party is 425 | responsible for claims and damages arising, directly or indirectly, 426 | out of its utilization of rights under this License and You agree to 427 | work with Initial Developer and Contributors to distribute such 428 | responsibility on an equitable basis. Nothing herein is intended or 429 | shall be deemed to constitute any admission of liability. 430 | 431 | 13. MULTIPLE-LICENSED CODE. 432 | 433 | Initial Developer may designate portions of the Covered Code as 434 | "Multiple-Licensed". "Multiple-Licensed" means that the Initial 435 | Developer permits you to utilize portions of the Covered Code under 436 | Your choice of the NPL or the alternative licenses, if any, specified 437 | by the Initial Developer in the file described in Exhibit A. 438 | 439 | EXHIBIT A -Mozilla Public License. 440 | 441 | ``The contents of this file are subject to the Mozilla Public License 442 | Version 1.1 (the "License"); you may not use this file except in 443 | compliance with the License. You may obtain a copy of the License at 444 | http://www.mozilla.org/MPL/ 445 | 446 | Software distributed under the License is distributed on an "AS IS" 447 | basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the 448 | License for the specific language governing rights and limitations 449 | under the License. 450 | 451 | The Original Code is ______________________________________. 452 | 453 | The Initial Developer of the Original Code is ________________________. 454 | Portions created by ______________________ are Copyright (C) ______ 455 | _______________________. All Rights Reserved. 456 | 457 | Contributor(s): ______________________________________. 458 | 459 | Alternatively, the contents of this file may be used under the terms 460 | of the _____ license (the "[___] License"), in which case the 461 | provisions of [______] License are applicable instead of those 462 | above. If you wish to allow use of your version of this file only 463 | under the terms of the [____] License and not to allow others to use 464 | your version of this file under the MPL, indicate your decision by 465 | deleting the provisions above and replace them with the notice and 466 | other provisions required by the [___] License. If you do not delete 467 | the provisions above, a recipient may use your version of this file 468 | under either the MPL or the [___] License." 469 | 470 | [NOTE: The text of this Exhibit A may differ slightly from the text of 471 | the notices in the Source Code files of the Original Code. You should 472 | use the text of this Exhibit A rather than the text found in the 473 | Original Code Source Code for Your Modifications.] 474 | ============================================================================ 475 | 476 | ============================================================================ 477 | GNU GENERAL PUBLIC LICENSE 478 | Version 2, June 1991 479 | 480 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 481 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 482 | Everyone is permitted to copy and distribute verbatim copies 483 | of this license document, but changing it is not allowed. 484 | 485 | Preamble 486 | 487 | The licenses for most software are designed to take away your 488 | freedom to share and change it. By contrast, the GNU General Public 489 | License is intended to guarantee your freedom to share and change free 490 | software--to make sure the software is free for all its users. This 491 | General Public License applies to most of the Free Software 492 | Foundation's software and to any other program whose authors commit to 493 | using it. (Some other Free Software Foundation software is covered by 494 | the GNU Lesser General Public License instead.) You can apply it to 495 | your programs, too. 496 | 497 | When we speak of free software, we are referring to freedom, not 498 | price. Our General Public Licenses are designed to make sure that you 499 | have the freedom to distribute copies of free software (and charge for 500 | this service if you wish), that you receive source code or can get it 501 | if you want it, that you can change the software or use pieces of it 502 | in new free programs; and that you know you can do these things. 503 | 504 | To protect your rights, we need to make restrictions that forbid 505 | anyone to deny you these rights or to ask you to surrender the rights. 506 | These restrictions translate to certain responsibilities for you if you 507 | distribute copies of the software, or if you modify it. 508 | 509 | For example, if you distribute copies of such a program, whether 510 | gratis or for a fee, you must give the recipients all the rights that 511 | you have. You must make sure that they, too, receive or can get the 512 | source code. And you must show them these terms so they know their 513 | rights. 514 | 515 | We protect your rights with two steps: (1) copyright the software, and 516 | (2) offer you this license which gives you legal permission to copy, 517 | distribute and/or modify the software. 518 | 519 | Also, for each author's protection and ours, we want to make certain 520 | that everyone understands that there is no warranty for this free 521 | software. If the software is modified by someone else and passed on, we 522 | want its recipients to know that what they have is not the original, so 523 | that any problems introduced by others will not reflect on the original 524 | authors' reputations. 525 | 526 | Finally, any free program is threatened constantly by software 527 | patents. We wish to avoid the danger that redistributors of a free 528 | program will individually obtain patent licenses, in effect making the 529 | program proprietary. To prevent this, we have made it clear that any 530 | patent must be licensed for everyone's free use or not licensed at all. 531 | 532 | The precise terms and conditions for copying, distribution and 533 | modification follow. 534 | 535 | GNU GENERAL PUBLIC LICENSE 536 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 537 | 538 | 0. This License applies to any program or other work which contains 539 | a notice placed by the copyright holder saying it may be distributed 540 | under the terms of this General Public License. The "Program", below, 541 | refers to any such program or work, and a "work based on the Program" 542 | means either the Program or any derivative work under copyright law: 543 | that is to say, a work containing the Program or a portion of it, 544 | either verbatim or with modifications and/or translated into another 545 | language. (Hereinafter, translation is included without limitation in 546 | the term "modification".) Each licensee is addressed as "you". 547 | 548 | Activities other than copying, distribution and modification are not 549 | covered by this License; they are outside its scope. The act of 550 | running the Program is not restricted, and the output from the Program 551 | is covered only if its contents constitute a work based on the 552 | Program (independent of having been made by running the Program). 553 | Whether that is true depends on what the Program does. 554 | 555 | 1. You may copy and distribute verbatim copies of the Program's 556 | source code as you receive it, in any medium, provided that you 557 | conspicuously and appropriately publish on each copy an appropriate 558 | copyright notice and disclaimer of warranty; keep intact all the 559 | notices that refer to this License and to the absence of any warranty; 560 | and give any other recipients of the Program a copy of this License 561 | along with the Program. 562 | 563 | You may charge a fee for the physical act of transferring a copy, and 564 | you may at your option offer warranty protection in exchange for a fee. 565 | 566 | 2. You may modify your copy or copies of the Program or any portion 567 | of it, thus forming a work based on the Program, and copy and 568 | distribute such modifications or work under the terms of Section 1 569 | above, provided that you also meet all of these conditions: 570 | 571 | a) You must cause the modified files to carry prominent notices 572 | stating that you changed the files and the date of any change. 573 | 574 | b) You must cause any work that you distribute or publish, that in 575 | whole or in part contains or is derived from the Program or any 576 | part thereof, to be licensed as a whole at no charge to all third 577 | parties under the terms of this License. 578 | 579 | c) If the modified program normally reads commands interactively 580 | when run, you must cause it, when started running for such 581 | interactive use in the most ordinary way, to print or display an 582 | announcement including an appropriate copyright notice and a 583 | notice that there is no warranty (or else, saying that you provide 584 | a warranty) and that users may redistribute the program under 585 | these conditions, and telling the user how to view a copy of this 586 | License. (Exception: if the Program itself is interactive but 587 | does not normally print such an announcement, your work based on 588 | the Program is not required to print an announcement.) 589 | 590 | These requirements apply to the modified work as a whole. If 591 | identifiable sections of that work are not derived from the Program, 592 | and can be reasonably considered independent and separate works in 593 | themselves, then this License, and its terms, do not apply to those 594 | sections when you distribute them as separate works. But when you 595 | distribute the same sections as part of a whole which is a work based 596 | on the Program, the distribution of the whole must be on the terms of 597 | this License, whose permissions for other licensees extend to the 598 | entire whole, and thus to each and every part regardless of who wrote it. 599 | 600 | Thus, it is not the intent of this section to claim rights or contest 601 | your rights to work written entirely by you; rather, the intent is to 602 | exercise the right to control the distribution of derivative or 603 | collective works based on the Program. 604 | 605 | In addition, mere aggregation of another work not based on the Program 606 | with the Program (or with a work based on the Program) on a volume of 607 | a storage or distribution medium does not bring the other work under 608 | the scope of this License. 609 | 610 | 3. You may copy and distribute the Program (or a work based on it, 611 | under Section 2) in object code or executable form under the terms of 612 | Sections 1 and 2 above provided that you also do one of the following: 613 | 614 | a) Accompany it with the complete corresponding machine-readable 615 | source code, which must be distributed under the terms of Sections 616 | 1 and 2 above on a medium customarily used for software interchange; or, 617 | 618 | b) Accompany it with a written offer, valid for at least three 619 | years, to give any third party, for a charge no more than your 620 | cost of physically performing source distribution, a complete 621 | machine-readable copy of the corresponding source code, to be 622 | distributed under the terms of Sections 1 and 2 above on a medium 623 | customarily used for software interchange; or, 624 | 625 | c) Accompany it with the information you received as to the offer 626 | to distribute corresponding source code. (This alternative is 627 | allowed only for noncommercial distribution and only if you 628 | received the program in object code or executable form with such 629 | an offer, in accord with Subsection b above.) 630 | 631 | The source code for a work means the preferred form of the work for 632 | making modifications to it. For an executable work, complete source 633 | code means all the source code for all modules it contains, plus any 634 | associated interface definition files, plus the scripts used to 635 | control compilation and installation of the executable. However, as a 636 | special exception, the source code distributed need not include 637 | anything that is normally distributed (in either source or binary 638 | form) with the major components (compiler, kernel, and so on) of the 639 | operating system on which the executable runs, unless that component 640 | itself accompanies the executable. 641 | 642 | If distribution of executable or object code is made by offering 643 | access to copy from a designated place, then offering equivalent 644 | access to copy the source code from the same place counts as 645 | distribution of the source code, even though third parties are not 646 | compelled to copy the source along with the object code. 647 | 648 | 4. You may not copy, modify, sublicense, or distribute the Program 649 | except as expressly provided under this License. Any attempt 650 | otherwise to copy, modify, sublicense or distribute the Program is 651 | void, and will automatically terminate your rights under this License. 652 | However, parties who have received copies, or rights, from you under 653 | this License will not have their licenses terminated so long as such 654 | parties remain in full compliance. 655 | 656 | 5. You are not required to accept this License, since you have not 657 | signed it. However, nothing else grants you permission to modify or 658 | distribute the Program or its derivative works. These actions are 659 | prohibited by law if you do not accept this License. Therefore, by 660 | modifying or distributing the Program (or any work based on the 661 | Program), you indicate your acceptance of this License to do so, and 662 | all its terms and conditions for copying, distributing or modifying 663 | the Program or works based on it. 664 | 665 | 6. Each time you redistribute the Program (or any work based on the 666 | Program), the recipient automatically receives a license from the 667 | original licensor to copy, distribute or modify the Program subject to 668 | these terms and conditions. You may not impose any further 669 | restrictions on the recipients' exercise of the rights granted herein. 670 | You are not responsible for enforcing compliance by third parties to 671 | this License. 672 | 673 | 7. If, as a consequence of a court judgment or allegation of patent 674 | infringement or for any other reason (not limited to patent issues), 675 | conditions are imposed on you (whether by court order, agreement or 676 | otherwise) that contradict the conditions of this License, they do not 677 | excuse you from the conditions of this License. If you cannot 678 | distribute so as to satisfy simultaneously your obligations under this 679 | License and any other pertinent obligations, then as a consequence you 680 | may not distribute the Program at all. For example, if a patent 681 | license would not permit royalty-free redistribution of the Program by 682 | all those who receive copies directly or indirectly through you, then 683 | the only way you could satisfy both it and this License would be to 684 | refrain entirely from distribution of the Program. 685 | 686 | If any portion of this section is held invalid or unenforceable under 687 | any particular circumstance, the balance of the section is intended to 688 | apply and the section as a whole is intended to apply in other 689 | circumstances. 690 | 691 | It is not the purpose of this section to induce you to infringe any 692 | patents or other property right claims or to contest validity of any 693 | such claims; this section has the sole purpose of protecting the 694 | integrity of the free software distribution system, which is 695 | implemented by public license practices. Many people have made 696 | generous contributions to the wide range of software distributed 697 | through that system in reliance on consistent application of that 698 | system; it is up to the author/donor to decide if he or she is willing 699 | to distribute software through any other system and a licensee cannot 700 | impose that choice. 701 | 702 | This section is intended to make thoroughly clear what is believed to 703 | be a consequence of the rest of this License. 704 | 705 | 8. If the distribution and/or use of the Program is restricted in 706 | certain countries either by patents or by copyrighted interfaces, the 707 | original copyright holder who places the Program under this License 708 | may add an explicit geographical distribution limitation excluding 709 | those countries, so that distribution is permitted only in or among 710 | countries not thus excluded. In such case, this License incorporates 711 | the limitation as if written in the body of this License. 712 | 713 | 9. The Free Software Foundation may publish revised and/or new versions 714 | of the General Public License from time to time. Such new versions will 715 | be similar in spirit to the present version, but may differ in detail to 716 | address new problems or concerns. 717 | 718 | Each version is given a distinguishing version number. If the Program 719 | specifies a version number of this License which applies to it and "any 720 | later version", you have the option of following the terms and conditions 721 | either of that version or of any later version published by the Free 722 | Software Foundation. If the Program does not specify a version number of 723 | this License, you may choose any version ever published by the Free Software 724 | Foundation. 725 | 726 | 10. If you wish to incorporate parts of the Program into other free 727 | programs whose distribution conditions are different, write to the author 728 | to ask for permission. For software which is copyrighted by the Free 729 | Software Foundation, write to the Free Software Foundation; we sometimes 730 | make exceptions for this. Our decision will be guided by the two goals 731 | of preserving the free status of all derivatives of our free software and 732 | of promoting the sharing and reuse of software generally. 733 | 734 | NO WARRANTY 735 | 736 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 737 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 738 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 739 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 740 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 741 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 742 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 743 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 744 | REPAIR OR CORRECTION. 745 | 746 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 747 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 748 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 749 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 750 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 751 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 752 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 753 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 754 | POSSIBILITY OF SUCH DAMAGES. 755 | 756 | END OF TERMS AND CONDITIONS 757 | 758 | How to Apply These Terms to Your New Programs 759 | 760 | If you develop a new program, and you want it to be of the greatest 761 | possible use to the public, the best way to achieve this is to make it 762 | free software which everyone can redistribute and change under these terms. 763 | 764 | To do so, attach the following notices to the program. It is safest 765 | to attach them to the start of each source file to most effectively 766 | convey the exclusion of warranty; and each file should have at least 767 | the "copyright" line and a pointer to where the full notice is found. 768 | 769 | 770 | Copyright (C) 771 | 772 | This program is free software; you can redistribute it and/or modify 773 | it under the terms of the GNU General Public License as published by 774 | the Free Software Foundation; either version 2 of the License, or 775 | (at your option) any later version. 776 | 777 | This program is distributed in the hope that it will be useful, 778 | but WITHOUT ANY WARRANTY; without even the implied warranty of 779 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 780 | GNU General Public License for more details. 781 | 782 | You should have received a copy of the GNU General Public License along 783 | with this program; if not, write to the Free Software Foundation, Inc., 784 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 785 | 786 | Also add information on how to contact you by electronic and paper mail. 787 | 788 | If the program is interactive, make it output a short notice like this 789 | when it starts in an interactive mode: 790 | 791 | Gnomovision version 69, Copyright (C) year name of author 792 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 793 | This is free software, and you are welcome to redistribute it 794 | under certain conditions; type `show c' for details. 795 | 796 | The hypothetical commands `show w' and `show c' should show the appropriate 797 | parts of the General Public License. Of course, the commands you use may 798 | be called something other than `show w' and `show c'; they could even be 799 | mouse-clicks or menu items--whatever suits your program. 800 | 801 | You should also get your employer (if you work as a programmer) or your 802 | school, if any, to sign a "copyright disclaimer" for the program, if 803 | necessary. Here is a sample; alter the names: 804 | 805 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 806 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 807 | 808 | , 1 April 1989 809 | Ty Coon, President of Vice 810 | 811 | This General Public License does not permit incorporating your program into 812 | proprietary programs. If your program is a subroutine library, you may 813 | consider it more useful to permit linking proprietary applications with the 814 | library. If this is what you want to do, use the GNU Lesser General 815 | Public License instead of this License. 816 | ============================================================================ 817 | 818 | Additionally, some files (currently the contents of 819 | toolsrc/org/mozilla/javascript/tools/debugger/treetable/) are available 820 | only under the following license: 821 | 822 | ============================================================================ 823 | * Copyright 1997, 1998 Sun Microsystems, Inc. All Rights Reserved. 824 | * 825 | * Redistribution and use in source and binary forms, with or without 826 | * modification, are permitted provided that the following conditions 827 | * are met: 828 | * 829 | * - Redistributions of source code must retain the above copyright 830 | * notice, this list of conditions and the following disclaimer. 831 | * 832 | * - Redistributions in binary form must reproduce the above copyright 833 | * notice, this list of conditions and the following disclaimer in the 834 | * documentation and/or other materials provided with the distribution. 835 | * 836 | * - Neither the name of Sun Microsystems nor the names of its 837 | * contributors may be used to endorse or promote products derived 838 | * from this software without specific prior written permission. 839 | * 840 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 841 | * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 842 | * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 843 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 844 | * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 845 | * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 846 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 847 | * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 848 | * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 849 | * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 850 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 851 | ============================================================================ 852 | -------------------------------------------------------------------------------- /scripts/rhino/js.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/austinhappel/sublime-csslint/9301d75a4d476f22a4c6306bd9a38bb52386493f/scripts/rhino/js.jar -------------------------------------------------------------------------------- /test_files/bigtestfile.css: -------------------------------------------------------------------------------- 1 | .clearfix { *zoom: 1 } 2 | .clearfix:before, 3 | .clearfix:after { 4 | display: table; 5 | content: ""; 6 | line-height: 0; 7 | } 8 | .clearfix:after { clear: both } 9 | .hide-text { 10 | font: 0/0 a; 11 | color: transparent; 12 | text-shadow: none; 13 | background-color: transparent; 14 | border: 0; 15 | } 16 | .new-hide-text { 17 | text-indent: 100%; 18 | white-space: nowrap; 19 | overflow: hidden; 20 | } 21 | .unselectable { 22 | -webkit-touch-callout: none; 23 | -webkit-user-select: none; 24 | -khtml-user-select: none; 25 | -moz-user-select: none; 26 | -ms-user-select: none; 27 | user-select: none; 28 | } 29 | .plain-list { 30 | margin: 0; 31 | padding: 0; 32 | list-style: none; 33 | } 34 | .font-stack-etica { font-family: "lft-etica","Helvetica Neue",Helvetica,Arial,sans-serif } 35 | .font-stack-sourcesanspro { font-family: "source-sans-pro","Helvetica Neue",sans-serif } 36 | .font-stack-helveticaneue { font-family: "Helvetica Neue",Helvetica,Arial,sans-serif } 37 | .font-stack-helveticaneuelight { font-family: "HelveticaNeue-Light","Helvetica Neue Light","lft-etica","Helvetica Neue",Helvetica,Arial,sans-serif } 38 | .font-stack-georgia { font-family: Georgia,"Times New Roman",Times,serif } 39 | .profile-image-rounded-corners { border-radius: 3px } /*! normalize.css v2.0.1 | MIT License | git.io/normalize */ 40 | article, 41 | aside, 42 | details, 43 | figcaption, 44 | figure, 45 | footer, 46 | header, 47 | hgroup, 48 | nav, 49 | section, 50 | summary { display: block } 51 | audio, 52 | canvas, 53 | video { display: inline-block } 54 | audio:not([controls]) { display: none;height:0 } 55 | [hidden] { display: none } 56 | html { font-family: sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100% } 57 | body { margin: 0 } 58 | a:focus { outline: thin dotted } 59 | a:active, 60 | a:hover { outline: 0 } 61 | h1 { font-size: 2em } 62 | abbr[title] { border-bottom: 1px dotted } 63 | b, 64 | strong { font-weight: bold } 65 | dfn { font-style: italic } 66 | mark { background: #ff0;color:#000 } 67 | code, 68 | kbd, 69 | pre, 70 | samp { font-family: monospace,serif;font-size:1em } 71 | pre { white-space: pre;white-space:pre-wrap;word-wrap:break-word } 72 | q { quotes: "\201C" "\201D" "\2018" "\2019" } 73 | small { font-size: 80% } 74 | sub, 75 | sup { font-size: 75%;line-height:0;position:relative;vertical-align:baseline } 76 | sup { top: -0.5em } 77 | sub { bottom: -0.25em } 78 | img { border: 0 } 79 | svg:not(:root) { overflow: hidden } 80 | figure { margin: 0 } 81 | fieldset { border: 1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em } 82 | legend { border: 0;padding:0 } 83 | button, 84 | input, 85 | select, 86 | textarea { font-family: inherit;font-size:100%;margin:0 } 87 | button, 88 | input { line-height: normal } 89 | button, 90 | html input[type="button"], 91 | input[type="reset"], 92 | input[type="submit"] { -webkit-appearance: button;cursor:pointer } 93 | button[disabled], 94 | input[disabled] { cursor: default } 95 | input[type="checkbox"], 96 | input[type="radio"] { box-sizing: border-box;padding:0 } 97 | input[type="search"] { -webkit-appearance: textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box } 98 | input[type="search"]::-webkit-search-cancel-button, 99 | input[type="search"]::-webkit-search-decoration { -webkit-appearance: none } 100 | button::-moz-focus-inner, 101 | input::-moz-focus-inner { border: 0;padding:0 } 102 | textarea { overflow: auto;vertical-align:top } 103 | table { border-collapse: collapse;border-spacing:0 } 104 | html, 105 | body { background: 0;font-family:"source-sans-pro","Helvetica Neue",sans-serif;font-size:100%;line-height:120%;margin:0;padding:0;font-smoothing:antialiased;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility } 106 | a img { border: 0 } 107 | .story-action a, 108 | .tooltip-story-share li a, 109 | .story-score-details-list li.story-score-thumb, 110 | .story-score-details-list li.story-score-twitter, 111 | .story-score-details-list li.story-score-facebook, 112 | .btn-story-action-delete-save, 113 | .story-row:hover .btn-story-action-off, 114 | .ipad .story-row .btn-story-action-off, 115 | .btn-story-action-digg .story-digg-label, 116 | .btn-story-action-off, 117 | .btn-story-action-on, 118 | #no-saved-stories .ico-readlater, 119 | .btn-story-action-digg .story-digg-label, 120 | .story-embedded-share-timestamp { background-image: url("data:image/png;base64,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");background-size:14px 800px } 121 | @media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-resolution:2dppx),only screen and (min-resolution:192dpi) { 122 | .story-action a, 123 | .tooltip-story-share li a, 124 | .story-score-details-list li.story-score-thumb, 125 | .story-score-details-list li.story-score-twitter, 126 | .story-score-details-list li.story-score-facebook, 127 | .btn-story-action-delete-save, 128 | .story-row:hover .btn-story-action-off, 129 | .ipad .story-row .btn-story-action-off, 130 | .btn-story-action-digg .story-digg-label, 131 | .btn-story-action-off, 132 | .btn-story-action-on, 133 | #no-saved-stories .ico-readlater, 134 | .btn-story-action-digg .story-digg-label, 135 | .story-embedded-share-timestamp { background-image: url("data:image/png;base64,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") } 136 | } 137 | .no-js .lazy-image-img { display: none;background-color:transparent } 138 | .lazy-image-img { background-color: #fafafa } 139 | .story-link { color: #191919;text-decoration:none } 140 | .proxy-iframe { width: 1px;height:1px;visibility:hidden;display:none } 141 | .btn-service-auth { display: block;position:relative;color:#fff;padding:9px 10px;font-weight:bold;font-size:13px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;padding-left:42px;text-shadow:0 -1px 0 rgba(0,0,0,0.25);cursor:pointer;text-decoration:none } -------------------------------------------------------------------------------- /test_files/testfile.css: -------------------------------------------------------------------------------- 1 | /* "don't use ID's in selectors" */ 2 | #foo { 3 | completelyWrong: 'yep'; 4 | } 5 | 6 | /* missing semicolon */ 7 | .bar { 8 | border: 1px solid #000 9 | color: '#ff0000'; 10 | } -------------------------------------------------------------------------------- /version_file_checker.py: -------------------------------------------------------------------------------- 1 | import os 2 | from hashlib import sha256 3 | from pprint import pprint 4 | 5 | FILE_LIST = [ 6 | os.path.join('scripts/csslint/csslint-rhino.js'), 7 | os.path.join('scripts/rhino/js.jar'), 8 | ] 9 | 10 | def generate_sha256(file_path, block_size=1024): 11 | """Generates a sha256 checksum of the file passed in.""" 12 | 13 | if os.path.exists(file_path): 14 | f = open(file_path, 'rb') 15 | hash = sha256() 16 | 17 | while True: 18 | data = f.read(block_size) 19 | if not data: 20 | break 21 | 22 | hash.update(data) 23 | 24 | return hash.hexdigest() 25 | else: 26 | return False 27 | 28 | 29 | def check_file_match(file_list, path_prefix=''): 30 | """ 31 | Takes an array of file path/checksum objects and verifies that 32 | the checksum matches the file in the target_dir. 33 | """ 34 | ret = [] 35 | 36 | for file_details in file_list: 37 | fp = os.path.join(path_prefix, file_details['file_path']) 38 | hash = file_details['checksum'] 39 | isMatch = False 40 | 41 | if (hash == generate_sha256(fp)): 42 | isMatch = True 43 | 44 | ret.append({ 45 | 'file_path': file_details['file_path'], 46 | 'isMatch': isMatch 47 | }) 48 | 49 | return ret 50 | 51 | 52 | def create_hashes(file_list): 53 | """ 54 | Creates sha256 checksums of every file in the list passed in. 55 | Expecting a list of file paths that can be opened for reading. 56 | """ 57 | files_and_hashes = []; 58 | 59 | for file_path in file_list: 60 | files_and_hashes.append({ 61 | 'file_path': file_path, 62 | 'checksum': generate_sha256(file_path) 63 | }) 64 | 65 | return files_and_hashes 66 | 67 | 68 | if __name__ == "__main__" : 69 | """ 70 | This subroutine generates a new manifest object for the 2 scripts that need to be 71 | extracted from the .sublime-package file. 72 | 73 | This is meant to be run from within the CSSLint folder, top level. 74 | 75 | To run in Sublime, just hit cmd + b to build and check the console. 76 | 77 | Otherwise, you can run it in a terminal via `python version_file_checker.py` 78 | 79 | Place the result into CSSLint.py as the variable `manifest` (you'll see it in CSSLint.py) 80 | """ 81 | 82 | print("===Creating CSSLint file manifest.===") 83 | print("Copy this into CSSLint.py if any of your scripts have changed.") 84 | pprint(create_hashes(FILE_LIST), indent=4) 85 | --------------------------------------------------------------------------------