Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: convert_js.py

Issue 10259051: Fixed: Compiler error due to string length limit in Visual C++ (Closed)
Patch Set: Created April 27, 2013, 11:33 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/FilterEngine.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 {'
Felix Dahlke 2013/04/29 09:53:41 Nit pick: Newline before {
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)
OLDNEW
« no previous file with comments | « no previous file | src/FilterEngine.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld