| OLD | NEW | 
|---|
| (Empty) |  | 
|  | 1 # coding: utf-8 | 
|  | 2 | 
|  | 3 # This file is part of the Adblock Plus build tools, | 
|  | 4 # Copyright (C) 2006-2013 Eyeo GmbH | 
|  | 5 # | 
|  | 6 # Adblock Plus is free software: you can redistribute it and/or modify | 
|  | 7 # it under the terms of the GNU General Public License version 3 as | 
|  | 8 # published by the Free Software Foundation. | 
|  | 9 # | 
|  | 10 # Adblock Plus is distributed in the hope that it will be useful, | 
|  | 11 # but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | 12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | 13 # GNU General Public License for more details. | 
|  | 14 # | 
|  | 15 # You should have received a copy of the GNU General Public License | 
|  | 16 # along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>. | 
|  | 17 | 
|  | 18 import re, json | 
|  | 19 from urlparse import urlparse | 
|  | 20 from collections import OrderedDict | 
|  | 21 | 
|  | 22 from packager import readMetadata, getDefaultFileName, getBuildVersion, getTempl
     ate, Files | 
|  | 23 from buildtools.packagerChrome import convertJS, importGeckoLocales, getIgnoredF
     iles, getPackageFiles, ImageConverter | 
|  | 24 | 
|  | 25 def createPlist(params, files): | 
|  | 26   template = getTemplate('Info.plist.tmpl') | 
|  | 27   metadata = params['metadata'] | 
|  | 28   catalog = json.loads(files['_locales/en_US/messages.json']) | 
|  | 29 | 
|  | 30   def toxml(val, indent=0): | 
|  | 31     if isinstance(val, bool): | 
|  | 32       return '<true/>' if val else '<false/>' | 
|  | 33     if isinstance(val, (int, long)): | 
|  | 34       return '<real>%d</real>' % val | 
|  | 35     if isinstance(val, basestring): | 
|  | 36       return '<string>%s</string>' % val | 
|  | 37 | 
|  | 38   def parse_section(section, levels=1): | 
|  | 39     rv = OrderedDict() | 
|  | 40 | 
|  | 41     if not metadata.has_section(section): | 
|  | 42       return rv | 
|  | 43 | 
|  | 44     for opt in metadata.options(section): | 
|  | 45       bits = opt.split('_', levels) | 
|  | 46       key = bits.pop(-1).replace('_', ' ').title() | 
|  | 47       d = rv | 
|  | 48 | 
|  | 49       for x in bits: | 
|  | 50         try: | 
|  | 51           d = d[x] | 
|  | 52         except KeyError: | 
|  | 53           d[x] = d = OrderedDict() | 
|  | 54 | 
|  | 55       d[key] = metadata.get(section, opt) | 
|  | 56 | 
|  | 57     return rv | 
|  | 58 | 
|  | 59   allowedDomains = set() | 
|  | 60   allowAllDomains = False | 
|  | 61   allowSecurePages = False | 
|  | 62 | 
|  | 63   for perm in re.split(r'\s+', metadata.get('general', 'permissions')): | 
|  | 64     if perm == '<all_urls>': | 
|  | 65       allowAllDomains = True | 
|  | 66       allowSecurePages = True | 
|  | 67       continue | 
|  | 68 | 
|  | 69     url = urlparse(perm) | 
|  | 70 | 
|  | 71     if url.scheme == 'https': | 
|  | 72       allowSecurePages = True | 
|  | 73     elif url.scheme != 'http': | 
|  | 74       continue | 
|  | 75 | 
|  | 76     if '*' in url.hostname: | 
|  | 77       allowAllDomains = True | 
|  | 78       continue | 
|  | 79 | 
|  | 80     allowedDomains.add(url.hostname) | 
|  | 81 | 
|  | 82   menus = parse_section('menus', 2) | 
|  | 83   toolbarItems = parse_section('toolbar_items') | 
|  | 84 | 
|  | 85   return template.render( | 
|  | 86     author=metadata.get('general', 'author'), | 
|  | 87     version=params['version'], | 
|  | 88     name=catalog['name']['message'], | 
|  | 89     description=catalog['description']['message'], | 
|  | 90     website=metadata.get('general', 'website'), | 
|  | 91     identifier=metadata.get('general', 'identifier'), | 
|  | 92     allowedDomains=allowedDomains, | 
|  | 93     allowAllDomains=allowAllDomains, | 
|  | 94     allowSecurePages=allowSecurePages, | 
|  | 95     contentScripts={ | 
|  | 96       'start': metadata.get('contentScripts', 'document_start').split(), | 
|  | 97       'end':   metadata.get('contentScripts', 'document_end'  ).split(), | 
|  | 98     }, | 
|  | 99     menus=parse_section('menus', 2), | 
|  | 100     toolbarItems=parse_section('toolbar_items'), | 
|  | 101     popovers=parse_section('popovers'), | 
|  | 102     toxml=toxml | 
|  | 103   ).encode('utf-8') | 
|  | 104 | 
|  | 105 def createBackgroundPage(params): | 
|  | 106   template = getTemplate('background.html.tmpl') | 
|  | 107   return template.render( | 
|  | 108     backgroundScripts=re.split(r'\s+', params['metadata'].get( | 
|  | 109       'general', 'backgroundScripts' | 
|  | 110     )) | 
|  | 111   ).encode('utf-8') | 
|  | 112 | 
|  | 113 def createInfoModule(params): | 
|  | 114   template = getTemplate('safariInfo.js.tmpl') | 
|  | 115   return template.render(params).encode('utf-8'); | 
|  | 116 | 
|  | 117 def createBuild(baseDir, type, outFile=None, buildNum=None, releaseBuild=False): | 
|  | 118   metadata = readMetadata(baseDir, type) | 
|  | 119   version = getBuildVersion(baseDir, metadata, releaseBuild, buildNum) | 
|  | 120 | 
|  | 121   if outFile == None: | 
|  | 122     outFile = getDefaultFileName(baseDir, metadata, version, 'zip') | 
|  | 123 | 
|  | 124   params = { | 
|  | 125     'type': type, | 
|  | 126     'baseDir': baseDir, | 
|  | 127     'releaseBuild': releaseBuild, | 
|  | 128     'version': version, | 
|  | 129     'devenv': False, | 
|  | 130     'metadata': metadata, | 
|  | 131   } | 
|  | 132 | 
|  | 133   files = Files(getPackageFiles(params), getIgnoredFiles(params), | 
|  | 134                 process=lambda path, data: data) | 
|  | 135   if metadata.has_section('mapping'): | 
|  | 136     files.readMappedFiles(metadata.items('mapping')) | 
|  | 137   files.read(baseDir) | 
|  | 138 | 
|  | 139   if metadata.has_section('convert_js'): | 
|  | 140     convertJS(params, files) | 
|  | 141 | 
|  | 142   if metadata.has_section('convert_img'): | 
|  | 143     ImageConverter().convert(params, files) | 
|  | 144 | 
|  | 145   if metadata.has_section('import_locales'): | 
|  | 146     importGeckoLocales(params, files) | 
|  | 147 | 
|  | 148   files['lib/info.js'] = createInfoModule(params) | 
|  | 149   files['background.html'] = createBackgroundPage(params) | 
|  | 150   files['Info.plist'] = createPlist(params, files) | 
|  | 151 | 
|  | 152   with open(outFile, 'wb') as f: | 
|  | 153     f.write(files.zipToString()) | 
| OLD | NEW | 
|---|