diff --git a/generate_emoji_html.py b/generate_emoji_html.py index a837b6290..5d3a80b99 100755 --- a/generate_emoji_html.py +++ b/generate_emoji_html.py @@ -29,6 +29,8 @@ from os import path import re import shutil import sys + +from nototools import tool_utils from nototools import unicode_data _default_dir = 'png/128' @@ -51,7 +53,7 @@ def _merge_keys(dicts): keys.extend(d.keys()) return frozenset(keys) -def _generate_row_cells(key, font, dir_infos, basepaths, colors): +def _generate_row_cells(key, canonical_key, font, dir_infos, basepaths, colors): CELL_PREFIX = '' indices = range(len(basepaths)) def _cell(key, info, basepath): @@ -60,13 +62,7 @@ def _generate_row_cells(key, font, dir_infos, basepaths, colors): basepath, info.filemap[key]) return '-missing-' def _text_cell(key, text_dir): - def _cp_seq(cp): - # comment this out for now - if False and cp in [ord('*'), 0x2640, 0x2642, 0x2695]: - return unichr(cp) + unichr(0xfe0f) - else: - return unichr(cp) - text = ''.join(_cp_seq(cp) for cp in key) + text = ''.join(unichr(cp) for cp in canonical_key) return '%s' % (text_dir, text) if font: @@ -99,17 +95,25 @@ def _get_desc(key_tuple, dir_infos, basepaths): def _get_part(cp): if cp == 0x200d: # zwj, common so replace with '+' return '+' - if cp == 0xfe0f: # emoji variation selector, we ignore it - return None + if unicode_data.is_regional_indicator(cp): + return unicode_data.regional_indicator_to_ascii(cp) + if unicode_data.is_tag(cp): + return unicode_data.tag_character_to_ascii(cp) fname = _get_filepath(cp) if fname: return '' % fname - return '%04X' % cp + raise Exception() if len(key_tuple) == 1: - desc = 'U+%04X' % key_tuple + desc = '%04x' % key_tuple else: - desc = ' '.join(filter(None, [_get_part(cp) for cp in key_tuple])) + desc = ' '.join('%04x' % cp for cp in key_tuple) + if len(unicode_data.strip_emoji_vs(key_tuple)) > 1: + try: + desc += ' (%s)' % ''.join( + _get_part(cp) for cp in key_tuple if cp != 0xfe0f) + except: + pass return CELL_PREFIX + desc @@ -118,15 +122,16 @@ def _get_name(key_tuple, annotated_tuples): '' if annotated_tuples is None or key_tuple not in annotated_tuples else ' class="aname"') - if len(key_tuple) != 1: - name = '(' + ' '.join('U+%04X' % cp for cp in key_tuple) + ')' - else: - cp = key_tuple[0] - if cp in unicode_data.proposed_emoji_cps(): - name = '(proposed) ' + unicode_data.proposed_emoji_name(cp) + seq_name = unicode_data.get_emoji_sequence_name(key_tuple) + if seq_name == None: + if key_tuple == (0x20e3,): + seq_name = '(combining enlosing keycap)' + elif key_tuple == (0xfe82b,): + seq_name = '(unknown flag PUA codepoint)' else: - name = unicode_data.name(cp, '(error)') - return CELL_PREFIX + name + print 'no name for %s' % unicode_data.seq_to_string(key_tuple) + seq_name = '(oops)' + return CELL_PREFIX + seq_name def _collect_aux_info(dir_infos, all_keys): @@ -221,15 +226,24 @@ def _generate_content( header_row.extend([info.title for info in dir_infos]) if len(colors) > 1: header_row.extend([dir_infos[-1].title] * (len(colors) - 1)) - header_row.extend(['Description', 'Name']) + header_row.extend(['Sequence', 'Name']) lines.append(''.join(header_row)) for key in sorted(all_keys): row = [] - row.extend(_generate_row_cells(key, font, dir_infos, basepaths, colors)) - row.append(_get_desc(key, dir_infos, basepaths)) - row.append(_get_name(key, annotate)) - lines.append(''.join(row)) + canonical_key = unicode_data.get_canonical_emoji_sequence(key) + if not canonical_key: + canonical_key = key + + row.extend( + _generate_row_cells( + key, canonical_key, font, dir_infos, basepaths, colors)) + row.append(_get_desc(canonical_key, dir_infos, basepaths)) + row.append(_get_name(canonical_key, annotate)) + try: + lines.append(''.join(row)) + except: + raise Exception('couldn\'t decode %s' % row) return '\n '.join(lines) + '\n' @@ -365,10 +379,10 @@ STYLE = """ th { background-color: rgb(210, 210, 210) } td img { width: 64px; height: 64px } td:nth-last-of-type(2) { - font-size: 20pt; font-weight: bold; background-color: rgb(210, 210, 210) + font-size: 18pt; font-weight: regular; background-color: rgb(210, 210, 210) } td:nth-last-of-type(2) img { - vertical-align: middle; width: 32px; height: 32px + vertical-align: bottom; width: 32px; height: 32px } td:last-of-type { background-color: white } td.aname { background-color: rgb(250, 65, 75) } @@ -377,6 +391,29 @@ STYLE = """ def write_html_page( filename, page_title, font, dir_infos, limit, annotate, standalone, colors): + + out_dir = path.dirname(filename) + if font: + if standalone: + # the assumption with standalone is that the source data and + # output directory don't overlap, this should probably be checked... + + rel_fontpath = path.join('font', path.basename(font)) + new_font = path.join(out_dir, rel_fontpath) + tool_utils.ensure_dir_exists(path.dirname(new_font)) + shutil.copy2(font, new_font) + font = rel_fontpath + else: + common_prefix, (rel_dir, rel_font) = tool_utils.commonpathprefix( + [out_dir, font]) + if rel_dir == '': + # font is in a subdirectory of the target, so just use the relative + # path + font = rel_font + else: + # use the absolute path + font = path.normpath(path.join(common_prefix, rel_font)) + content = _generate_content( path.dirname(filename), font, dir_infos, limit, annotate, standalone, colors) @@ -461,7 +498,6 @@ def main(): args.colors = """eceff1 f5f5f5 e4e7e9 d9dbdd 080808 263238 21272b 3c474c 4db6ac 80cbc4 5e35b1""".split() - dir_infos = _get_dir_infos( args.image_dirs, args.exts, args.prefixes, args.titles, args.default_ext, args.default_prefix)