| OLD | NEW | 
|   1 #!/usr/bin/env python |   1 #!/usr/bin/env python | 
|   2 # coding: utf-8 |   2 # coding: utf-8 | 
|   3  |   3  | 
|   4 import sys, os, codecs, re, json, argparse |   4 import sys, os, codecs, re, json, argparse | 
|   5 import xml.dom.minidom as minidom |   5 import xml.dom.minidom as minidom | 
|   6 baseDir = os.path.abspath(os.path.dirname(__file__)) |   6 baseDir = os.path.abspath(os.path.dirname(__file__)) | 
|   7 sys.path.append(os.path.join(baseDir, 'adblockplus', 'buildtools', 'jshydra')) |   7 sys.path.append(os.path.join(baseDir, 'adblockplus', 'buildtools', 'jshydra')) | 
|   8 from abp_rewrite import doRewrite |   8 from abp_rewrite import doRewrite | 
|   9  |   9  | 
|  10 def toCString(string): |  10 class CStringArray: | 
|  11   string = string.replace('\\', '\\\\').replace('"', '\\"') |  11   def __init__(self): | 
|  12   string = string.replace('\r', '').replace('\n', '\\n') |  12     self._buffer = [] | 
|  13   # Work around MSVC line length limitation |  13     self._strings = [] | 
|  14   #(see http://msdn.microsoft.com/en-us/library/dddywwsc(v=vs.80).aspx) |  | 
|  15   string = re.sub(r'((?:[^\\]|\\.){16000})(.)', r'\1"\n"\2', string, re.S) |  | 
|  16   return '"%s"' % string.encode('utf-8') |  | 
|  17  |  14  | 
|  18 def printFilesVerbatim(outHandle, files): |  15   def add(self, string): | 
 |  16     string = string.encode('utf-8').replace('\r', '') | 
 |  17     self._strings.append('std::string(buffer + %i, %i)' % (len(self._buffer), le
    n(string))) | 
 |  18     self._buffer.extend(map(lambda c: str(ord(c)), string)) | 
 |  19  | 
 |  20   def write(self, outHandle, arrayName): | 
 |  21     print >>outHandle, '#include <string>' | 
 |  22     print >>outHandle, 'namespace {' | 
 |  23     print >>outHandle, '  const char buffer[] = {%s};' % ', '.join(self._buffer) | 
 |  24     print >>outHandle, '}' | 
 |  25     print >>outHandle, 'std::string %s[] = {%s, std::string()};' % (arrayName, '
    , '.join(self._strings)) | 
 |  26  | 
 |  27 def addFilesVerbatim(array, files): | 
|  19   for file in files: |  28   for file in files: | 
|  20     fileHandle = codecs.open(file, 'rb', encoding='utf-8') |  29     fileHandle = codecs.open(file, 'rb', encoding='utf-8') | 
|  21     print >>outHandle, toCString(os.path.basename(file)) + ',' |  30     array.add(os.path.basename(file)) | 
|  22     print >>outHandle, toCString(fileHandle.read()) + ',' |  31     array.add(fileHandle.read()) | 
|  23     fileHandle.close() |  32     fileHandle.close() | 
|  24  |  33  | 
|  25 def convertXMLFile(outHandle, file): |  34 def convertXMLFile(array, file): | 
|  26     fileHandle = codecs.open(file, 'rb', encoding='utf-8') |  35     fileHandle = codecs.open(file, 'rb', encoding='utf-8') | 
|  27     doc = minidom.parse(file) |  36     doc = minidom.parse(file) | 
|  28     fileHandle.close() |  37     fileHandle.close() | 
|  29  |  38  | 
|  30     data = [] |  39     data = [] | 
|  31     for node in doc.documentElement.childNodes: |  40     for node in doc.documentElement.childNodes: | 
|  32       if node.nodeType != node.ELEMENT_NODE: |  41       if node.nodeType != node.ELEMENT_NODE: | 
|  33         continue |  42         continue | 
|  34       result = {'type': node.tagName} |  43       result = {'type': node.tagName} | 
|  35       for name, value in node.attributes.items(): |  44       for name, value in node.attributes.items(): | 
|  36         result[name] = value |  45         result[name] = value | 
|  37       data.append(result) |  46       data.append(result) | 
|  38     fileNameString = toCString(os.path.basename(file)) |  47       fileName = os.path.basename(file) | 
|  39     print >>outHandle, fileNameString + ',' |  48     array.add(fileName) | 
|  40     print >>outHandle, toCString('require.scopes[%s] = %s;' % (fileNameString, j
    son.dumps(data))) + ',' |  49     array.add('require.scopes["%s"] = %s;' % (fileName, json.dumps(data))) | 
|  41     fileHandle.close() |  50     fileHandle.close() | 
|  42  |  51  | 
|  43 def convertJsFile(outHandle, file): |  52 def convertJsFile(array, file): | 
|  44   converted = doRewrite([os.path.abspath(file)], ['module=true', 'source_repo=ht
    tps://hg.adblockplus.org/adblockplus/']) |  53   converted = doRewrite([os.path.abspath(file)], ['module=true', 'source_repo=ht
    tps://hg.adblockplus.org/adblockplus/']) | 
|  45   print >>outHandle, toCString(os.path.basename(file)) + ',' |  54   array.add(os.path.basename(file)) | 
|  46   print >>outHandle, toCString(converted) + ',' |  55   array.add(converted) | 
|  47  |  56  | 
|  48 def convert(verbatimBefore, convertFiles, verbatimAfter, outFile): |  57 def convert(verbatimBefore, convertFiles, verbatimAfter, outFile): | 
|  49   outHandle = open(outFile, 'wb') |  58   array = CStringArray() | 
|  50   print >>outHandle, 'const char* jsSources[] = {' |  59   addFilesVerbatim(array, verbatimBefore) | 
|  51  |  | 
|  52   printFilesVerbatim(outHandle, verbatimBefore) |  | 
|  53  |  60  | 
|  54   for file in convertFiles: |  61   for file in convertFiles: | 
|  55     if file.endswith('.xml'): |  62     if file.endswith('.xml'): | 
|  56       convertXMLFile(outHandle, file) |  63       convertXMLFile(array, file) | 
|  57     else: |  64     else: | 
|  58       convertJsFile(outHandle, file) |  65       convertJsFile(array, file) | 
|  59  |  66  | 
|  60   printFilesVerbatim(outHandle, verbatimAfter) |  67   addFilesVerbatim(array, verbatimAfter) | 
|  61  |  68  | 
|  62   print >>outHandle, '0, 0' |  69   outHandle = open(outFile, 'wb') | 
|  63   print >>outHandle, '};' |  70   array.write(outHandle, 'jsSources') | 
 |  71   outHandle.close() | 
|  64  |  72  | 
|  65 if __name__ == '__main__': |  73 if __name__ == '__main__': | 
|  66   parser = argparse.ArgumentParser(description='Convert JavaScript files') |  74   parser = argparse.ArgumentParser(description='Convert JavaScript files') | 
|  67   parser.add_argument('--before', metavar='verbatim_file', nargs='+', |  75   parser.add_argument('--before', metavar='verbatim_file', nargs='+', | 
|  68       help='JavaScript file to include verbatim at the beginning') |  76       help='JavaScript file to include verbatim at the beginning') | 
|  69   parser.add_argument('--convert', metavar='file_to_convert', nargs='+', |  77   parser.add_argument('--convert', metavar='file_to_convert', nargs='+', | 
|  70       help='JavaScript files to convert') |  78       help='JavaScript files to convert') | 
|  71   parser.add_argument('--after', metavar='verbatim_file', nargs='+', |  79   parser.add_argument('--after', metavar='verbatim_file', nargs='+', | 
|  72       help='JavaScript file to include verbatim at the end') |  80       help='JavaScript file to include verbatim at the end') | 
|  73   parser.add_argument('output_file', |  81   parser.add_argument('output_file', | 
|  74       help='output from the conversion') |  82       help='output from the conversion') | 
|  75   args = parser.parse_args() |  83   args = parser.parse_args() | 
|  76   convert(args.before, args.convert, args.after, args.output_file) |  84   convert(args.before, args.convert, args.after, args.output_file) | 
| OLD | NEW |