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)
Пример #2
0
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
Пример #3
0
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
Пример #4
0
 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')
Пример #6
0
  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')
Пример #7
0
  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)
Пример #8
0
    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)