#!/usr/bin/env python

# ---
# weinre is available under *either* the terms of the modified BSD license *or* the
# MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
#
# Copyright (c) 2010, 2011 IBM Corporation
# ---

import os
import re
import sys
import json
import optparse

#--------------------------------------------------------------------
# reads:
#   http://svn.webkit.org/repository/webkit/trunk/WebCore/css/CSSPropertyNames.in
# writes:
#   json array
#--------------------------------------------------------------------
def main():
    if len(sys.argv) < 3:
        error("expecting parameters inputFile outputFile")

    iFileName = sys.argv[1]
    oFileName = sys.argv[2]

    if not os.path.exists(iFileName): error("input file not found: '" + iFileName + "'")

    with open(iFileName, "r") as iFile:
        lines = iFile.readlines()

    properties = [line.strip() for line in lines if not line.strip().startswith("#")]
    properties = [property for property in properties if property != ""]
    properties.sort()

    jsonString = json.dumps(properties, indent=4)
    jsString = 'require("weinre/common/Weinre").addCSSProperties(%s)' % jsonString

    oFile = open(oFileName, "w")
    oFile.write(jsString)
    oFile.close()

    log("generated css properties in: " + oFileName)

#--------------------------------------------------------------------
def log(message):
    message = "%s: %s" % (PROGRAM_NAME, message)
    print >>sys.stderr, message

#--------------------------------------------------------------------
def error(message):
    log(message)
    sys.exit(-1)

#--------------------------------------------------------------------
PROGRAM_NAME = os.path.basename(sys.argv[0])

main()
