def build_family_images(self, family, lang_scr, sample_text, attrib, sample_key): family_id = family.family_id is_cjk = family.rep_member.is_cjk is_rtl = cldr_data.is_rtl(lang_scr) displayed_members = self._sorted_displayed_members(family) for font in displayed_members: weight = css_weight(font.weight) style = css_style(font.slope) image_file_name = '%s_%s_%d_%s.svg' % (family_id, lang_scr, weight, style) if is_cjk: family_suffix = ' ' + font.weight else: family_suffix = '' image_location = path.join(self.samples, image_file_name) if path.isfile(image_location): # Don't rebuild images when continuing. print "Continue: assuming image file '%s' is valid." % image_location continue print 'create %s' % image_file_name create_image.create_svg( sample_text, image_location, family=family.name + family_suffix, language=lang_scr, rtl=is_rtl, width=685, # text is coming out bigger than we expect, perhaps this is why? font_size=int(20 * (72.0/96.0)), line_spacing=int(32 * (72.0/96.0)), weight=weight, style=style)
def get_lang_tag_to_sample_data(used_lang_tags): """Return a mapping from lang tag to tuple of: - rtl - sample text - attribution """ lang_tag_to_sample_data = {} for lang_tag in used_lang_tags: rtl = cldr_data.is_rtl(lang_tag) sample, attrib, src_key = get_sample_and_attrib(ensure_script(lang_tag)) lang_tag_to_sample_data[lang_tag] = (rtl, sample, attrib, src_key) return lang_tag_to_sample_data
def get_lang_tag_to_sample_data(used_lang_tags): """Return a mapping from lang tag to tuple of: - rtl - sample text - attribution """ lang_tag_to_sample_data = {} for lang_tag in used_lang_tags: rtl = cldr_data.is_rtl(lang_tag) sample, attrib, src_key = get_sample_and_attrib( ensure_script(lang_tag)) lang_tag_to_sample_data[lang_tag] = (rtl, sample, attrib, src_key) return lang_tag_to_sample_data
def build_family_images( self, family, lang_scr, sample_text, attrib, sample_key): family_id = family.family_id is_cjk = family.rep_member.is_cjk is_rtl = cldr_data.is_rtl(lang_scr) displayed_members = self._sorted_displayed_members(family) for font in displayed_members: weight = css_weight(font.weight) style = css_style(font.slope) if font.variant == 'color': imgtype = 'png' fsize = 36 lspc = 44 else: imgtype = 'svg' fsize = 20 lspc = 32 image_file_name = '%s_%s_%d_%s.%s' % ( family_id, lang_scr, weight, style, imgtype) if is_cjk: family_suffix = ' ' + font.weight else: family_suffix = '' image_location = path.join(self.samples, image_file_name) if path.isfile(image_location): # Don't rebuild images when continuing. print "Continue: assuming image file '%s' is valid." % image_location continue print 'create %s' % image_file_name create_image.create_img( sample_text, image_location, family=family.name + family_suffix, language=lang_scr, rtl=is_rtl, width=685, # text is coming out bigger than we expect, perhaps this is why? font_size=int(fsize * (72.0/96.0)), line_spacing=int(lspc * (72.0/96.0)), weight=weight, style=style)
def build_data_json(self, family_id_to_lang_scr_to_sample_key, families, family_zip_info, universal_zip_info, family_id_to_regions, region_to_family_ids): data_obj = collections.OrderedDict() families_obj = collections.OrderedDict() # Sort families by English name, except 'Noto Sans' and 'Noto Serif' come first family_ids = [family_id for family_id in family_id_to_lang_scr_to_sample_key if family_id != 'sans-lgc' and family_id != 'serif-lgc'] family_ids = sorted(family_ids, key=lambda f: families[f].name) sorted_ids = ['sans-lgc', 'serif-lgc'] sorted_ids.extend(family_ids) for k in sorted_ids: family = families[k] family_obj = {} family_obj['name'] = family.name name, hinted_size, unhinted_size = family_zip_info[k] pkg_obj = collections.OrderedDict() if hinted_size: pkg_obj['hinted'] = hinted_size if unhinted_size: pkg_obj['unhinted'] = unhinted_size family_obj['pkgSize'] = pkg_obj # special case number of fonts for CJK if family.rep_member.is_cjk: num_fonts = 7 #ignore mono else: num_fonts = len(family.hinted_members or family.unhinted_members) family_obj['fonts'] = num_fonts # only displayed langs -- see build_family_json lang_scrs lang_scrs_map = family_id_to_lang_scr_to_sample_key[k] family_obj['langs'] = sum([1 for l in lang_scrs_map if not l.startswith('und-')]) family_obj['regions'] = len(family_id_to_regions[k]) families_obj[k] = family_obj data_obj['family'] = families_obj data_obj['familyOrder'] = sorted_ids # get inverse map from lang_scr to family_id lang_scr_to_family_ids = collections.defaultdict(set) for family_id, lang_scrs in family_id_to_lang_scr_to_sample_key.iteritems(): for lang_scr in lang_scrs: lang_scr_to_family_ids[lang_scr].add(family_id) # Dont list 'und-' lang tags, these are for default samples and not listed in the UI lang_scrs = [l for l in lang_scr_to_family_ids if not l.startswith('und-')] langs_obj = collections.OrderedDict() # sort by english name for lang_scr in sorted(lang_scrs, key=lambda l: lang_data.lang_script_to_names(l)[0]): lang_obj = collections.OrderedDict() names = lang_data.lang_script_to_names(lang_scr) english_name = names[0] lang_obj['name'] = english_name if cldr_data.is_rtl(lang_scr): lang_obj['rtl'] = True lang_obj['families'] = sorted(lang_scr_to_family_ids[lang_scr]) native_names = [n for n in names[1:] if n != english_name] if native_names: lang_obj['keywords'] = native_names langs_obj[lang_scr] = lang_obj data_obj['lang'] = langs_obj regions_obj = collections.OrderedDict() for region in sorted(region_to_family_ids, key=lambda r: cldr_data.get_english_region_name(r)): region_obj = collections.OrderedDict() region_obj['families'] = sorted(region_to_family_ids[region]) region_obj['keywords'] = [cldr_data.get_english_region_name(region)] regions_obj[region] = region_obj data_obj['region'] = regions_obj pkg_obj = collections.OrderedDict() pkg_obj['hinted'] = universal_zip_info[1] pkg_obj['unhinted'] = universal_zip_info[2] data_obj['pkgSize'] = pkg_obj self.write_json(data_obj, 'data')
def build_data_json(self, family_id_to_lang_scr_to_sample_key, families, family_zip_info, universal_zip_info, family_id_to_regions, region_to_family_ids): data_obj = collections.OrderedDict() families_obj = collections.OrderedDict() # Sort families by English name, except 'Noto Sans', 'Noto Serif', and # 'Noto Mono' come first, in that order initial_ids = ['sans-lgc', 'serif-lgc', 'mono-mono'] family_ids = [family_id for family_id in family_id_to_lang_scr_to_sample_key if family_id not in initial_ids] family_ids = sorted(family_ids, key=lambda f: families[f].name) sorted_ids = [fid for fid in initial_ids if fid in family_id_to_lang_scr_to_sample_key] sorted_ids.extend(family_ids) for k in sorted_ids: family = families[k] family_obj = {} family_obj['name'] = family.name name, hinted_size, unhinted_size = family_zip_info[k] pkg_obj = collections.OrderedDict() if hinted_size: pkg_obj['hinted'] = hinted_size if unhinted_size: pkg_obj['unhinted'] = unhinted_size family_obj['pkgSize'] = pkg_obj # special case number of fonts for CJK if family.rep_member.is_cjk: num_fonts = 7 #ignore mono else: num_fonts = len(family.hinted_members or family.unhinted_members) family_obj['fonts'] = num_fonts # only displayed langs -- see build_family_json lang_scrs lang_scrs_map = family_id_to_lang_scr_to_sample_key[k] family_obj['langs'] = sum( [1 for l in lang_scrs_map if not l.startswith('und-')]) family_obj['regions'] = len(family_id_to_regions[k]) families_obj[k] = family_obj data_obj['family'] = families_obj data_obj['familyOrder'] = sorted_ids # get inverse map from lang_scr to family_id lang_scr_to_family_ids = collections.defaultdict(set) for family_id, lang_scrs in family_id_to_lang_scr_to_sample_key.iteritems(): for lang_scr in lang_scrs: lang_scr_to_family_ids[lang_scr].add(family_id) # Dont list 'und-' lang tags, these are for default samples and not # listed in the UI lang_scrs = [l for l in lang_scr_to_family_ids if not l.startswith('und-')] langs_obj = collections.OrderedDict() # sort by english name for lang_scr in sorted(lang_scrs, key=lambda l: lang_data.lang_script_to_names(l)[0]): lang_obj = collections.OrderedDict() names = lang_data.lang_script_to_names(lang_scr) english_name = names[0] lang_obj['name'] = english_name if cldr_data.is_rtl(lang_scr): lang_obj['rtl'] = True lang_obj['families'] = sorted(lang_scr_to_family_ids[lang_scr]) native_names = [n for n in names[1:] if n != english_name] if native_names: lang_obj['keywords'] = native_names langs_obj[lang_scr] = lang_obj data_obj['lang'] = langs_obj regions_obj = collections.OrderedDict() for region in sorted(region_to_family_ids, key=lambda r: cldr_data.get_english_region_name(r)): region_obj = collections.OrderedDict() region_obj['families'] = sorted(region_to_family_ids[region]) region_obj['keywords'] = [cldr_data.get_english_region_name(region)] regions_obj[region] = region_obj data_obj['region'] = regions_obj pkg_obj = collections.OrderedDict() pkg_obj['hinted'] = universal_zip_info[1] pkg_obj['unhinted'] = universal_zip_info[2] data_obj['pkgSize'] = pkg_obj self.write_json(data_obj, 'data')
def generate(self): if self.clean: self.clean_target_dir() if not self.no_build: self.ensure_target_dirs_exist() # debug/print # ['families', 'script_to_family_ids', 'used_lang_data', # 'family_id_to_lang_scrs', 'family_id_to_default_lang_scr'] debug = frozenset([]) def use_in_web(font): return (not font.subset and not font.is_UI and not font.fmt == 'ttc' and not font.script in {'CJK', 'HST', 'Qaae'} and not font.family in {'Arimo', 'Cousine', 'Tinos'}) fonts = [font for font in noto_fonts.get_noto_fonts() if use_in_web(font)] families = noto_fonts.get_families(fonts) if 'families' in debug: print '\nfamilies' for family_id, family in sorted(families.iteritems()): print family_id, family.rep_member.script script_to_family_ids = get_script_to_family_ids(families) if 'script_to_family_ids' in debug: print '\nscript to family ids' for script, family_ids in sorted(script_to_family_ids.iteritems()): print script, family_ids all_lang_scrs = set(['und-' + script for script in script_to_family_ids]) all_lang_scrs.update(lang_data.lang_scripts()) lang_scr_to_sample_infos = {} for lang_scr in all_lang_scrs: lang, script = lang_scr.split('-') if not script in script_to_family_ids: print 'no family supports script in %s' % lang_scr continue rtl = cldr_data.is_rtl(lang_scr) sample_infos = get_sample_infos(lang_scr, rtl) if not sample_infos: continue lang_scr_to_sample_infos[lang_scr] = sample_infos if 'lang_scr_to_sample_infos' in debug: print '\nlang+script to sample infos' for lang_scr, info_list in sorted(lang_scr_to_sample_infos.iteritems()): for info in info_list: print '%s key: %s rtl: %s attrib: %s len: %d' % ( lang_scr, info[3], info[0], info[2], len(info[1])) family_id_to_lang_scrs = get_family_id_to_lang_scrs( lang_scr_to_sample_infos.keys(), script_to_family_ids) family_id_to_lang_scr_to_sample_key, sample_key_to_info = get_family_id_to_lang_scr_to_sample_key( family_id_to_lang_scrs, families, lang_scr_to_sample_infos) family_id_to_regions = get_family_id_to_regions(family_id_to_lang_scr_to_sample_key) region_to_family_ids = get_region_to_family_ids(family_id_to_regions) family_id_to_default_lang_scr = get_family_id_to_default_lang_scr( family_id_to_lang_scrs, families) if 'family_id_to_default_lang_scr' in debug: print '\nfamily id to default lang scr' for family_id, lang_scr in family_id_to_default_lang_scr.iteritems(): print family_id, lang_scr region_data = get_region_lat_lng_data(region_to_family_ids.keys()) lang_scrs = get_named_lang_scrs(family_id_to_lang_scr_to_sample_key) lang_scr_sort_order = get_lang_scr_sort_order(lang_scrs) # sanity checks # all families have languages, and all those have samples. # all families have a default language, and that is in the sample list error_list = [] for family in families.values(): family_id = family.family_id if not family_id in family_id_to_lang_scr_to_sample_key: error_list.append('no entry for family %s' % family_id) continue lang_scr_to_sample_key = family_id_to_lang_scr_to_sample_key[family_id] if not lang_scr_to_sample_key: error_list.append('no langs for family %s' % family_id) continue for lang_scr in lang_scr_to_sample_key: sample_key = lang_scr_to_sample_key[lang_scr] if not sample_key: error_list.append('no sample key for lang %s in family %s' % (lang_scr, sample_key)) continue if not sample_key in sample_key_to_info: error_list.append('no sample for sample key: %s' % sample_key) if not family_id in family_id_to_default_lang_scr: error_list.append('no default lang for family %s' % family_id) continue default_lang_scr = family_id_to_default_lang_scr[family_id] if not default_lang_scr in lang_scr_to_sample_key: error_list.append('default lang %s not in samples for family %s' % (default_lang_scr, family_id)) if error_list: print 'Errors:\n' + '\n '.join(error_list) if error_list or self.no_build: print 'skipping build output' return # build outputs if self.no_zips: print 'skipping zip output' else: family_zip_info = self.build_zips(families) universal_zip_info = self.build_universal_zips(families) # build outputs not used by the json but linked to from the web page self.build_ttc_zips() if self.no_css: print 'skipping css output' else: family_css_info = self.build_css(families) if self.no_data: print 'skipping data output%s' % reason else: self.build_data_json(family_id_to_lang_scr_to_sample_key, families, family_zip_info, universal_zip_info, family_id_to_regions, region_to_family_ids) self.build_families_json(family_id_to_lang_scr_to_sample_key, families, family_id_to_default_lang_scr, family_id_to_regions, family_css_info, lang_scr_sort_order) self.build_misc_json(sample_key_to_info, region_data) if self.no_images: print 'skipping image output' else: self.build_images(family_id_to_lang_scr_to_sample_key, families, family_id_to_default_lang_scr, sample_key_to_info)
def generate(self): if self.clean: self.clean_target_dir() if not self.no_build: self.ensure_target_dirs_exist() # debug/print # ['families', 'script_to_family_ids', 'used_lang_data', # 'family_id_to_lang_scrs', 'family_id_to_default_lang_scr'] debug = frozenset([]) def use_in_web(font): return (not font.subset and not font.is_UI and not font.fmt == 'ttc' and not font.script in {'CJK', 'HST', 'Qaae'} and not font.family in {'Arimo', 'Cousine', 'Tinos'}) fonts = [ font for font in noto_fonts.get_noto_fonts() if use_in_web(font) ] families = noto_fonts.get_families(fonts) if 'families' in debug: print '\nfamilies' for family_id, family in sorted(families.iteritems()): print family_id, family.rep_member.script script_to_family_ids = get_script_to_family_ids(families) if 'script_to_family_ids' in debug: print '\nscript to family ids' for script, family_ids in sorted(script_to_family_ids.iteritems()): print script, family_ids all_lang_scrs = set( ['und-' + script for script in script_to_family_ids]) all_lang_scrs.update(lang_data.lang_scripts()) lang_scr_to_sample_infos = {} for lang_scr in all_lang_scrs: lang, script = lang_scr.split('-') if not script in script_to_family_ids: print 'no family supports script in %s' % lang_scr continue rtl = cldr_data.is_rtl(lang_scr) sample_infos = get_sample_infos(lang_scr, rtl) if not sample_infos: continue lang_scr_to_sample_infos[lang_scr] = sample_infos if 'lang_scr_to_sample_infos' in debug: print '\nlang+script to sample infos' for lang_scr, info_list in sorted( lang_scr_to_sample_infos.iteritems()): for info in info_list: print '%s key: %s rtl: %s attrib: %s len: %d' % ( lang_scr, info[3], info[0], info[2], len(info[1])) family_id_to_lang_scrs = get_family_id_to_lang_scrs( lang_scr_to_sample_infos.keys(), script_to_family_ids) family_id_to_lang_scr_to_sample_key, sample_key_to_info = get_family_id_to_lang_scr_to_sample_key( family_id_to_lang_scrs, families, lang_scr_to_sample_infos) family_id_to_regions = get_family_id_to_regions( family_id_to_lang_scr_to_sample_key) region_to_family_ids = get_region_to_family_ids(family_id_to_regions) family_id_to_default_lang_scr = get_family_id_to_default_lang_scr( family_id_to_lang_scrs, families) if 'family_id_to_default_lang_scr' in debug: print '\nfamily id to default lang scr' for family_id, lang_scr in family_id_to_default_lang_scr.iteritems( ): print family_id, lang_scr region_data = get_region_lat_lng_data(region_to_family_ids.keys()) lang_scrs = get_named_lang_scrs(family_id_to_lang_scr_to_sample_key) lang_scr_sort_order = get_lang_scr_sort_order(lang_scrs) # sanity checks # all families have languages, and all those have samples. # all families have a default language, and that is in the sample list error_list = [] for family in families.values(): family_id = family.family_id if not family_id in family_id_to_lang_scr_to_sample_key: error_list.append('no entry for family %s' % family_id) continue lang_scr_to_sample_key = family_id_to_lang_scr_to_sample_key[ family_id] if not lang_scr_to_sample_key: error_list.append('no langs for family %s' % family_id) continue for lang_scr in lang_scr_to_sample_key: sample_key = lang_scr_to_sample_key[lang_scr] if not sample_key: error_list.append( 'no sample key for lang %s in family %s' % (lang_scr, sample_key)) continue if not sample_key in sample_key_to_info: error_list.append('no sample for sample key: %s' % sample_key) if not family_id in family_id_to_default_lang_scr: error_list.append('no default lang for family %s' % family_id) continue default_lang_scr = family_id_to_default_lang_scr[family_id] if not default_lang_scr in lang_scr_to_sample_key: error_list.append( 'default lang %s not in samples for family %s' % (default_lang_scr, family_id)) if error_list: print 'Errors:\n' + '\n '.join(error_list) if error_list or self.no_build: print 'skipping build output' return # build outputs if self.no_zips: print 'skipping zip output' else: family_zip_info = self.build_zips(families) universal_zip_info = self.build_universal_zips(families) # build outputs not used by the json but linked to from the web page self.build_ttc_zips() if self.no_css: print 'skipping css output' else: family_css_info = self.build_css(families) if self.no_data: print 'skipping data output%s' % reason else: self.build_data_json(family_id_to_lang_scr_to_sample_key, families, family_zip_info, universal_zip_info, family_id_to_regions, region_to_family_ids) self.build_families_json(family_id_to_lang_scr_to_sample_key, families, family_id_to_default_lang_scr, family_id_to_regions, family_css_info, lang_scr_sort_order) self.build_misc_json(sample_key_to_info, region_data) if self.no_images: print 'skipping image output' else: self.build_images(family_id_to_lang_scr_to_sample_key, families, family_id_to_default_lang_scr, sample_key_to_info)