| Index: convert_js.py |
| =================================================================== |
| --- a/convert_js.py |
| +++ b/convert_js.py |
| @@ -2,70 +2,78 @@ |
| # coding: utf-8 |
| import sys, os, codecs, re, json, argparse |
| import xml.dom.minidom as minidom |
| baseDir = os.path.abspath(os.path.dirname(__file__)) |
| sys.path.append(os.path.join(baseDir, 'adblockplus', 'buildtools', 'jshydra')) |
| from abp_rewrite import doRewrite |
| -def toCString(string): |
| - string = string.replace('\\', '\\\\').replace('"', '\\"') |
| - string = string.replace('\r', '').replace('\n', '\\n') |
| - # Work around MSVC line length limitation |
| - #(see http://msdn.microsoft.com/en-us/library/dddywwsc(v=vs.80).aspx) |
| - string = re.sub(r'((?:[^\\]|\\.){16000})(.)', r'\1"\n"\2', string, re.S) |
| - return '"%s"' % string.encode('utf-8') |
| +class CStringArray: |
| + def __init__(self): |
| + self._buffer = [] |
| + self._strings = [] |
| -def printFilesVerbatim(outHandle, files): |
| + def add(self, string): |
| + string = string.encode('utf-8').replace('\r', '') |
| + self._strings.append('std::string(buffer + %i, %i)' % (len(self._buffer), len(string))) |
| + self._buffer.extend(map(lambda c: str(ord(c)), string)) |
| + |
| + def write(self, outHandle, arrayName): |
| + print >>outHandle, '#include <string>' |
| + print >>outHandle, 'namespace {' |
|
Felix Dahlke
2013/04/29 09:53:41
Nit pick: Newline before {
|
| + print >>outHandle, ' const char buffer[] = {%s};' % ', '.join(self._buffer) |
| + print >>outHandle, '}' |
| + print >>outHandle, 'std::string %s[] = {%s, std::string()};' % (arrayName, ', '.join(self._strings)) |
| + |
| +def addFilesVerbatim(array, files): |
| for file in files: |
| fileHandle = codecs.open(file, 'rb', encoding='utf-8') |
| - print >>outHandle, toCString(os.path.basename(file)) + ',' |
| - print >>outHandle, toCString(fileHandle.read()) + ',' |
| + array.add(os.path.basename(file)) |
| + array.add(fileHandle.read()) |
| fileHandle.close() |
| -def convertXMLFile(outHandle, file): |
| +def convertXMLFile(array, file): |
| fileHandle = codecs.open(file, 'rb', encoding='utf-8') |
| doc = minidom.parse(file) |
| fileHandle.close() |
| data = [] |
| for node in doc.documentElement.childNodes: |
| if node.nodeType != node.ELEMENT_NODE: |
| continue |
| result = {'type': node.tagName} |
| for name, value in node.attributes.items(): |
| result[name] = value |
| data.append(result) |
| - fileNameString = toCString(os.path.basename(file)) |
| - print >>outHandle, fileNameString + ',' |
| - print >>outHandle, toCString('require.scopes[%s] = %s;' % (fileNameString, json.dumps(data))) + ',' |
| + fileName = os.path.basename(file) |
| + array.add(fileName) |
| + array.add('require.scopes["%s"] = %s;' % (fileName, json.dumps(data))) |
| fileHandle.close() |
| -def convertJsFile(outHandle, file): |
| +def convertJsFile(array, file): |
| converted = doRewrite([os.path.abspath(file)], ['module=true', 'source_repo=https://hg.adblockplus.org/adblockplus/']) |
| - print >>outHandle, toCString(os.path.basename(file)) + ',' |
| - print >>outHandle, toCString(converted) + ',' |
| + array.add(os.path.basename(file)) |
| + array.add(converted) |
| def convert(verbatimBefore, convertFiles, verbatimAfter, outFile): |
| - outHandle = open(outFile, 'wb') |
| - print >>outHandle, 'const char* jsSources[] = {' |
| - |
| - printFilesVerbatim(outHandle, verbatimBefore) |
| + array = CStringArray() |
| + addFilesVerbatim(array, verbatimBefore) |
| for file in convertFiles: |
| if file.endswith('.xml'): |
| - convertXMLFile(outHandle, file) |
| + convertXMLFile(array, file) |
| else: |
| - convertJsFile(outHandle, file) |
| + convertJsFile(array, file) |
| - printFilesVerbatim(outHandle, verbatimAfter) |
| + addFilesVerbatim(array, verbatimAfter) |
| - print >>outHandle, '0, 0' |
| - print >>outHandle, '};' |
| + outHandle = open(outFile, 'wb') |
| + array.write(outHandle, 'jsSources') |
| + outHandle.close() |
| if __name__ == '__main__': |
| parser = argparse.ArgumentParser(description='Convert JavaScript files') |
| parser.add_argument('--before', metavar='verbatim_file', nargs='+', |
| help='JavaScript file to include verbatim at the beginning') |
| parser.add_argument('--convert', metavar='file_to_convert', nargs='+', |
| help='JavaScript files to convert') |
| parser.add_argument('--after', metavar='verbatim_file', nargs='+', |