Home Download Buy Blog Forum Support

Validate HTML / CSS

Re: Validate HTML / CSS

Postby Fannon on Mon Mar 05, 2012 8:21 am

Not working for me either. The Console isn't giving me error messages, strange.

Windows 7, CURL installed, latest Sublime DEV
Posts: 18
Joined: Mon Aug 08, 2011 8:13 pm

Re: Validate HTML / CSS

Postby Marin on Fri Mar 30, 2012 2:36 pm

All I have is this error
[Error 2] The system cannot find the file specified

Can anyone help?
Posts: 5
Joined: Tue Mar 27, 2012 9:51 am

Re: Validate HTML / CSS

Postby rondure on Wed Jun 13, 2012 11:50 am

Ok, took me a while to figure out the instructions, but I hope this clears it up for people. You will need to do 3 things.

1. download w3c-validator.py and add it to ~/library/Application Support/Sublime Text 2/Packages/User.
2. create a file validate.py and add it to ~/library/Application Support/Sublime Text 2/Packages/User.
3. open Key Bindings (Sublime Text 2 > Preferences > Key Bindings - User) then enter { "keys": ["alt+shift+v"], "command": "validate" }

I hope that helps. I had to read the instructions a couple times before I figured it out.
Posts: 2
Joined: Wed Jun 13, 2012 11:38 am

Re: Validate HTML / CSS

Postby ianbrfid on Thu Sep 13, 2012 7:44 pm

This needed some work to get going on Windows and python 2.7.3.
Firstly as mentioned above python and the validator and curl need to be on the path.
I got the basic (without ssl etc) from here :http://www.paehl.com/open_source/?download=curl_727_0.zip
The w3c script then had to be modified to change the deprecated commands.getstatusoutput, also found for me at least that the urllib.quote wasn't needed on the filename, my version of curl liked regular '\' s not %2C etc. (Not tried it on spaces though but it looks like its all quoted anyway)
So this worked for me: w3c-validator.py
Code: Select all
#!/usr/bin/env python
w3c-validator - Validate HTML and CSS files using the WC3 validators

Copyright: Stuart Rackham (c) 2011
License:   MIT
Email:     srackham@gmail.com

import os
import sys
import time
import json
import subprocess
import urllib

html_validator_url = 'http://validator.w3.org/check'
css_validator_url = 'http://jigsaw.w3.org/css-validator/validator'

verbose_option = False

def message(msg):
    print >> sys.stderr, msg

def verbose(msg):
    if verbose_option:

def validate(filename):
    Validate file and return JSON result as dictionary.
    'filename' can be a file name or an HTTP URL.
    Return '' if the validator does not return valid JSON.
    Raise OSError if curl command returns an error status.
    quoted_filename = filename #urllib.quote(filename)
    if filename.startswith('http://'):
        # Submit URI with GET.
        if filename.endswith('.css'):
            cmd = ('curl -sG -d uri=%s -d output=json -d warning=0 %s'
                    % (quoted_filename, css_validator_url))
            cmd = ('curl -sG -d uri=%s -d output=json %s'
                    % (quoted_filename, html_validator_url))
        # Upload file as multipart/form-data with POST.
        if filename.endswith('.css'):
            cmd = ('curl -sF "file=@%s;type=text/css" -F output=json -F warning=0 %s'
                    % (quoted_filename, css_validator_url))
            cmd = ('curl -sF "uploaded_file=@%s;type=text/html" -F output=json %s'
                    % (quoted_filename, html_validator_url))
    try :
        output = subprocess.check_output(cmd)
    except subprocess.CalledProcessError, e:
        raise OSError (e.returncode, 'failed: %s' % cmd)
    #status,output = commands.getstatusoutput(cmd)
    # if status != 0:
    #     raise OSError (status, 'failed: %s' % cmd)
        result = json.loads(output)
    except ValueError:
        result = ''
    time.sleep(2)   # Be nice and don't hog the free validator service.
    return result

if __name__ == '__main__':
    if len(sys.argv) >= 2 and sys.argv[1] == '--verbose':
        verbose_option = True
        args = sys.argv[2:]
        args = sys.argv[1:]
    if len(args) == 0:
        message('usage: %s [--verbose] FILE|URL...' % os.path.basename(sys.argv[0]))
    errors = 0
    warnings = 0
    for f in args:
        message('validating: %s ...' % f)
        retrys = 0
        while retrys < 2:
            result = validate(f)
            if result:
            retrys += 1
            message('retrying: %s ...' % f)
            message('failed: %s' % f)
            errors += 1
        if f.endswith('.css'):
            errorcount = result['cssvalidation']['result']['errorcount']
            warningcount = result['cssvalidation']['result']['warningcount']
            errors += errorcount
            warnings += warningcount
            if errorcount > 0:
                message('errors: %d' % errorcount)
            if warningcount > 0:
                message('warnings: %d' % warningcount)
            for msg in result['messages']:
                if 'lastLine' in msg:
                    message('%(type)s: line %(lastLine)d: %(message)s' % msg)
                    message('%(type)s: %(message)s' % msg)
                if msg['type'] == 'error':
                    errors += 1
                    warnings += 1
    if errors:

But I thought it better to install the validator as a build system so created a new build system from the Tools menu and defined it as follows:
Code: Select all
   "cmd": ["python.exe", "c:\\Tools\\w3c-validator.py", "$file"],
   "file_regex": "^validating: (.+)\\.\\.\\.",
   "line_regex": "^error: line ([0-9]+):"

c:\Tools is the path to my copy of the python script, replace it with your loaction. This embedded path could probably be removed by defining PYTHONPATH in the environment but its getting late now and I've had enough.

Anyway F4 and ShiftF4 now move forward and back through the reported errors from the w3c validator (providing the network connection is working), which is rather nice.
Posts: 1
Joined: Thu Sep 13, 2012 7:24 pm

Re: Validate HTML / CSS

Postby milw0rm on Sat Dec 01, 2012 8:43 pm

Thanks to ian's post above this I managed to get it working in Sublime Text 2. I have simplified the process by zipping up the files you'll need... this is what I did (windows only):

1. Downloaded and installed Activestate Python (free, community version): http://www.activestate.com/activepython/downloads
2. Created the .py files needed and downloaded curl, for your convenience I put them all in one zip file here: http://bitshare.com/?f=kxrxueem
3. Put the "curl.exe" file in the folder where I installed Python, in my case it was C:\Python27 you will have to replace that with where you installed it.
4. Put the validate.py and w3c-validator.py files in my sublime packages user folder: C:\Users\myusername\AppData\Roaming\Sublime Text 2\Packages\User
5. In sublime I setup my key-bindings "Preferences Keybindings - User": { "keys": ["alt+shift+v"], "command": "validate" }
6. Now when I hit alt+shift+v it connects to the w3c validator and validates the file with any error output in the console.

-hope this helps!!
Posts: 7
Joined: Fri Nov 09, 2012 1:34 pm


Return to Plugin Announcements

Who is online

Users browsing this forum: No registered users and 10 guests