mirror of https://github.com/google/pebble
				
				
				
			
		
			
				
	
	
		
			213 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			213 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Python
		
	
	
	
| # Add tools directory to path
 | |
| import sys
 | |
| sys.path.append('../../../tools')
 | |
| 
 | |
| import json, re, os, waflib, sys, string, subprocess, tempfile
 | |
| import pbpack
 | |
| import polib
 | |
| from collections import OrderedDict
 | |
| 
 | |
| from resources.resource_map.resource_generator_font import FontResourceGenerator
 | |
| 
 | |
| def make_lang(ctx):
 | |
|     lang_code = waflib.Options.options.lang
 | |
|     lang_path = os.path.join(ctx.path.abspath(), lang_code)
 | |
|     pot_path = os.path.abspath('build/src/fw/tintin.pot');
 | |
|     if not os.path.exists(pot_path):
 | |
|         waflib.Logs.pprint('RED', 'Error: could not find tintin.pot. Please run ./waf build first')
 | |
|         return
 | |
|     po_path = os.path.join(lang_path, 'tintin.po')
 | |
|     msginit_cmd = ['msginit', '-l', lang_code, '--no-translator', '-i', pot_path]
 | |
|     if not os.path.exists(lang_path):
 | |
|         # create folders and init po file from template
 | |
|         os.mkdir(lang_path)
 | |
|         with open(os.path.join(lang_path, "lang_map.json"), "w") as f:
 | |
|             f.write(FILE_LANG_MAP.substitute({'lang': lang_code}))
 | |
| 
 | |
|     if not os.path.exists(po_path):
 | |
|         msginit_cmd += ['-o', po_path]
 | |
|         subprocess.call(msginit_cmd)
 | |
|     else:
 | |
|         # Save the existing po file header
 | |
|         po_file_header_entry = polib.pofile(po_path).metadata_as_entry()
 | |
|         po_file_header = str(po_file_header_entry)
 | |
| 
 | |
|         # Empty the po file and write back the header
 | |
|         with open(po_path, 'w') as po_file:
 | |
|             po_file.write(po_file_header)
 | |
| 
 | |
|         # Generate the new po file and merge it with the existing file
 | |
|         new_po_file = tempfile.NamedTemporaryFile(delete=True)
 | |
|         msginit_cmd += ['-o', new_po_file.name]
 | |
|         subprocess.call(msginit_cmd)
 | |
|         subprocess.call(['msgmerge', '--lang=' + lang_code, '--update', po_path, new_po_file.name])
 | |
| 
 | |
| def pack_all_langs(ctx):
 | |
|     language_codes = os.walk(ctx.path.abspath()).next()[1]
 | |
| 
 | |
|     for language_code in language_codes:
 | |
|         pack_lang_code(ctx, language_code)
 | |
| 
 | |
| def pack_lang(ctx):
 | |
|     lang_code = waflib.Options.options.lang
 | |
|     pack_lang_code(ctx, lang_code)
 | |
| 
 | |
| def pack_lang_code(ctx, lang_code):
 | |
|     lang_path = os.path.join(ctx.path.abspath(), lang_code)
 | |
|     build_path = os.path.join(ctx.path.get_bld().abspath(), lang_code)
 | |
| 
 | |
|     resource_path = os.path.join(lang_path, 'lang_map.json')
 | |
|     resource_map = json.loads(open(resource_path, mode='r').read());
 | |
| 
 | |
|     resource_data = OrderedDict()
 | |
| 
 | |
|     if not os.path.exists(build_path):
 | |
|         os.makedirs(build_path)
 | |
| 
 | |
|     # Handle the "strings" object. Has the attributes "lang", "name", and "file".
 | |
|     # We need to write the first entry into our pbpack for the .mo file
 | |
|     strings = resource_map['strings']
 | |
|     name = strings['name']
 | |
| 
 | |
|     if strings['file'] == "":
 | |
|         # No .mo file?
 | |
|         resource_data[name] = b''
 | |
|     else:
 | |
|         po_path = os.path.join(lang_path, strings['file'])
 | |
| 
 | |
|         # Check that the file contains no untranslated strings
 | |
|         if subprocess.check_output(['msgattrib', '--untranslated', po_path]) != '':
 | |
|             waflib.Logs.pprint('RED', 'Warning: This PO file contains untranslated strings!')
 | |
| 
 | |
| 
 | |
|         mo_path = os.path.join(build_path, strings['file'] + '.' + name + '.mo')
 | |
|         os.system('msgfmt -c -v -o {} {}'.format(mo_path, po_path))
 | |
| 
 | |
|         waflib.Logs.pprint('CYAN', 'Created mo at {}'.format(mo_path))
 | |
| 
 | |
|         with open(mo_path, 'r') as f:
 | |
|             resource_data[name] = f.read()
 | |
| 
 | |
|         ui_codepoints_path = os.path.join(build_path, 'codepoints.json')
 | |
|         os.system('python {} {} --output={}'.format('tools/generate_codepoint_requirements.py', po_path, ui_codepoints_path))
 | |
| 
 | |
|     # Generate a resource for each entry in the "fonts" list.
 | |
|     for entry in resource_map['fonts']:
 | |
|         name = entry['name']
 | |
| 
 | |
|         if 'alias' in entry:
 | |
|             # Aliased resource
 | |
|             # Handle aliases here by copying the data and adding it to the pbpack multiple times,
 | |
|             # as the pbpack will handle the deduplication.
 | |
|             waflib.Logs.pprint('CYAN', 'Aliasing {} to {}'.format(entry['alias'], name))
 | |
| 
 | |
|             resource_data[name] = resource_data[entry['alias']]
 | |
|         elif entry['file'] == '':
 | |
|             # Empty resource, just write an empty resource to the pbpack
 | |
|             waflib.Logs.pprint('CYAN', 'Building empty resource {}'.format(name))
 | |
| 
 | |
|             resource_data[name] = b''
 | |
|         else:
 | |
|             # Finally, a real font resource! Generate it using the same tools as our normal
 | |
|             # resource build.
 | |
|             waflib.Logs.pprint('CYAN', 'Building font resource {}'.format(name))
 | |
| 
 | |
|             # Make the lang_map.json look more like the usual resource_map.json file format
 | |
|             entry['type'] = 'font'
 | |
| 
 | |
|             # Normally definitions_from_dict returns a list to handle entries that define multiple
 | |
|             # resources, but we only ever expect to get one definition per entry here.
 | |
|             d = FontResourceGenerator.definitions_from_dict(ctx, entry, '')[0]
 | |
| 
 | |
|             if d.character_list is None:
 | |
|                 # By default, we only include codepoints needed for the UI, but it can be overridden
 | |
|                 d.character_list = ui_codepoints_path
 | |
|             else:
 | |
|                 d.character_list = os.path.join(lang_path, d.character_list)
 | |
| 
 | |
|             # Now build the font data
 | |
|             font_path = os.path.join(lang_path, entry['file'])
 | |
|             font_data = FontResourceGenerator.build_font_data(font_path, d)
 | |
|             resource_data[name] = font_data
 | |
| 
 | |
| 
 | |
|     # Now write all the resource data to a pbpack
 | |
|     lp = pbpack.ResourcePack(False)
 | |
| 
 | |
|     for r in resource_data.values():
 | |
|         lp.add_resource(r)
 | |
| 
 | |
|     language_pack = os.path.join(build_path, lang_code + '.pbl')
 | |
|     with open(language_pack, 'wb+') as lp_file:
 | |
|         lp.serialize(lp_file)
 | |
| 
 | |
|     waflib.Logs.pprint('CYAN', 'Created language pack at {}'.format(language_pack))
 | |
| 
 | |
| FILE_LANG_MAP = string.Template("""
 | |
| {
 | |
|     "strings": {
 | |
|         "lang": "${lang}",
 | |
|         "name": "STRINGS",
 | |
|         "file": "tintin.po"
 | |
|     },
 | |
|     "fonts": [{
 | |
|         "name": "GOTHIC_14_EXTENDED",
 | |
|         "file": ""
 | |
|     }, {
 | |
|         "name": "GOTHIC_14_BOLD_EXTENDED",
 | |
|         "file": ""
 | |
|     }, {
 | |
|         "name": "GOTHIC_18_EXTENDED",
 | |
|         "file": ""
 | |
|     }, {
 | |
|         "name": "GOTHIC_18_BOLD_EXTENDED",
 | |
|         "file": ""
 | |
|     }, {
 | |
|         "name": "GOTHIC_24_EXTENDED",
 | |
|         "file": ""
 | |
|     }, {
 | |
|         "name": "GOTHIC_24_BOLD_EXTENDED",
 | |
|         "file": ""
 | |
|     }, {
 | |
|         "name": "GOTHIC_28_EXTENDED",
 | |
|         "file": ""
 | |
|     }, {
 | |
|         "name": "GOTHIC_28_BOLD_EXTENDED",
 | |
|         "file": ""
 | |
|     }, {
 | |
|         "name": "BITHAM_18_LIGHT_SUBSET_EXTENDED",
 | |
|         "file": ""
 | |
|     }, {
 | |
|         "name": "BITHAM_30_BLACK_EXTENDED",
 | |
|         "file": ""
 | |
|     }, {
 | |
|         "name": "BITHAM_34_LIGHT_SUBSET_EXTENDED",
 | |
|         "file": ""
 | |
|     }, {
 | |
|         "name": "BITHAM_34_MEDIUM_NUMBERS_EXTENDED",
 | |
|         "file": ""
 | |
|     }, {
 | |
|         "name": "BITHAM_42_BOLD_EXTENDED",
 | |
|         "file": ""
 | |
|     }, {
 | |
|         "name": "BITHAM_42_LIGHT_EXTENDED",
 | |
|         "file": ""
 | |
|     }, {
 | |
|         "name": "BITHAM_42_MEDIUM_NUMBERS_EXTENDED",
 | |
|         "file": ""
 | |
|     }, {
 | |
|         "name": "ROBOTO_CONDENSED_21_EXTENDED",
 | |
|         "file": ""
 | |
|     }, {
 | |
|         "name": "ROBOTO_BOLD_SUBSET_49_EXTENDED",
 | |
|         "file": ""
 | |
|     }, {
 | |
|         "name": "DROID_SERIF_28_BOLD_EXTENDED",
 | |
|         "file": ""
 | |
|     }],
 | |
|     "images": []
 | |
| }
 | |
| """)
 | |
| 
 | |
| # vim:filetype=python
 |