def load_encoding(self, encodingname): """Loads encoding""" # is encoding file? if os.path.isfile(encodingname): fullpath = encodingname path, file = os.path.split(fullpath) if file[-4:] == '.enc': encodingname = file[:-4] else: encodingname = file self.loaded_enc[encodingname] = read_ENC(open(fullpath, 'r'))[1] return self.loaded_enc[encodingname] # try to load encoding from our base directory filename = os.path.join(self.search_path, encodingname + ".enc") if os.path.exists(filename): self.loaded_enc[encodingname] = read_ENC(open(filename, 'r'))[1] return self.loaded_enc[encodingname] # locate encoding in the user filesystem filename = findfile.locate(encodingname + ".enc", setup.tex_paths) if filename: self.loaded_enc[encodingname] = read_ENC(open(filename, 'r'))[1] return self.loaded_enc[encodingname] raise EncodingDBError("Can not find '%s' file." % encodingname)
def get_designsize(fontname): """ Function (tries to) determine designsize of given font. First checks a cache (loaded from setup.font_lookup), then seeks for corresponding TFM file and reads designsize. """ if fontname in config.fonts_lookup: encoding, designsize = config.fonts_lookup[fontname] log.debug("Getting designsize for '%s' from file cache" % fontname) return designsize # read TFM, if any log.debug('Checking TFM file...') filename = findfile.locate(fontname + '.tfm', setup.tex_paths) if filename: log.debug("Using file '%s'" % filename) file = binfile(filename, 'rb') try: _, designsize, _, _ = read_TFM(file) except TFMError, e: log.error("TFM error" + str(TFMError)) else: file.close() return designsize / (2.0**20)
def load_encoding(self, encodingname): """Loads encoding""" # is encoding file? if os.path.isfile(encodingname): fullpath = encodingname path, file = os.path.split(fullpath) if file[-4:] == ".enc": encodingname = file[:-4] else: encodingname = file self.loaded_enc[encodingname] = read_ENC(open(fullpath, "r"))[1] return self.loaded_enc[encodingname] # try to load encoding from our base directory filename = os.path.join(self.search_path, encodingname + ".enc") if os.path.exists(filename): self.loaded_enc[encodingname] = read_ENC(open(filename, "r"))[1] return self.loaded_enc[encodingname] # locate encoding in the user filesystem filename = findfile.locate(encodingname + ".enc", setup.tex_paths) if filename: self.loaded_enc[encodingname] = read_ENC(open(filename, "r"))[1] return self.loaded_enc[encodingname] raise EncodingDBError("Can not find '%s' file." % encodingname)
def get_encoding_from_TFM(fontname): log.debug('checking TFM file') filename = findfile.locate(fontname + '.tfm', setup.tex_paths) if filename: log.debug("... using '%s'" % filename) file = binfile(filename, 'rb') try: _, _, encodingname, _ = read_TFM(file) except TFMError, e: log.error("... TFM error: %s" % str(TFMError)) else: file.close() try: encoding = config.encoding_lookup[encodingname] log.debug("... encoding %s" % encoding) return encoding except KeyError: log.error("... font %s: unknown TeX encoding: '%s'" % (fontname, encodingname))
def get_encoding_from_AFM(fontname): log.debug('checking AFM file') filename = findfile.locate(fontname + '.afm', setup.tex_paths) if filename: log.debug("... using '%s'" % filename) file = open(filename, 'r') try: encodingname, _, _ = read_AFM(file) except AFMError, e: log.error("... AFM error" + str(AFMError)) else: file.close() try: if encodingname: encoding = config.encoding_lookup[encodingname] log.debug("... ... encoding %s" % encoding) return encoding else: log.error("... unknown AFM encoding: '%s'" % encodingname) except KeyError: log.error("... unknown AFM encoding: '%s'" % encodingname)
def make_cache_file(fontname): font = Font() font.name = fontname # # 1. Locate/create SVG font # svgname = fontname.lower() + '.svg' def svgpred(path, filename): return filename.lower() == svgname filename = findfile.find_file(setup.svg_font_path, svgpred) if not filename: type1file = findfile.locate(fontname + '.pfb') or \ findfile.locate(fontname + '.pfa') if not type1file: # there is no pfa/pfb named fontname, # try to find pfa/pfb with some prefix as fontname # XXX: rewrite import string prefix = fontname.translate( string.maketrans("0123456789", " " * 10)).split()[0] if prefix: def pred(path, filename): f = filename.lower() return f.startswith(prefix) and\ (f.endswith(".pfa") or f.endswith(".pfb")) type1file = findfile.find_file(setup.tex_paths, pred) if type1file: log.info("Found Type1 font: %s" % type1file) if setup.options.use_fontforge and fontforge_available: log.info("... trying FontForge") if fontforge_convert(type1file): filename = findfile.find_file(setup.svg_font_path, svgpred) log.info("... ... conversion successful!") else: log.info("... ... conversion failed") if not filename and setup.options.use_fnt2meta and fnt2meta_available: log.info("... trying fnt2meta") meta = load_metadata(type1file) if meta: font = parse_metadata(meta) font.designsize = get_designsize(fontname) log.debug("Font '%s' designed at %spt" % (fontname, str(font.designsize))) log.info("... conversion successful") # pickle f = open(setup.cache_path + fontname + '.cache', 'wb') cPickle.dump(font, f, protocol=cPickle.HIGHEST_PROTOCOL) f.close() return else: log.info("... ... conversion failed") #fi if not filename and not type1file: mffile = findfile.locate(fontname + '.mf') if mffile: log.info("METAFONT source found, trying mftrace...") if mftrace_convert(mffile): filename = findfile.find_file(setup.svg_font_path, svgpred) if filename: log.info("... ... conversion successful") else: log.info("... ... conversion failed") else: log.info("... ... conversion failed") if filename: log.debug("Using SVG font '%s' as '%s'", filename, font.name) else: if type1file: raise FontError( "%s: suitable vector font found, but conversion failed (are FontForge or/and fnt2meta installed?)" % font.name) else: raise FontError("%s: can't find SVG font" % font.name) # get designsize font.designsize = get_designsize(fontname) log.debug("Font '%s' designed at %spt" % (fontname, str(font.designsize))) # # 2. Process SVG file # # a. load file from xml.dom.minidom import parse data = parse(filename) # b. get font element try: fontnode = data.getElementsByTagName('font')[0] # get default horizontal advance (if any) if fontnode.hasAttribute('horiz-adv-x'): default_hadvx = float(fontnode.getAttribute('horiz-adv-x')) else: default_hadvx = None except IndexError: raise FontError( "There should be at least one <font> element in SVG file") # d. get font face name if fontnode.getAttribute('font-family'): font.fontfamily = fontnode.getAttribute('font-family') else: font.fontfamily = fontname try: fontface = data.getElementsByTagName('font-face')[0] if fontface.getAttribute('bbox') and fontface.getAttribute( 'units-per-em'): xmin, ymin, xmax, ymax = map( float, fontface.getAttribute('bbox').replace(",", " ").split()) upem = float(fontface.getAttribute('units-per-em')) # raise str((upem, (ymax-ymin))) except IndexError: pass # e. load fonts font.glyphs_dict = {} for node in fontnode.getElementsByTagName('glyph'): # 1. read path info glyph = Glyph() if node.hasAttribute('d'): # is defined as <glyph> attribute glyph.path = node.getAttribute('d') else: # XXX: glyph is defined with path child element and I assume # there is just one element path_elements = node.getElementsByTagName('path') if len(path_elements) == 0: # no path elements at all pass elif len(path_elements) == 1: # one path element glyph.path = path_elements[0].getAttribute('d') else: # more paths... pass # XXX: join them? # 2. get character name glyph.name = node.getAttribute('glyph-name') if glyph.name == '': log.error("There is a glyph without name, skipping it") continue # 2a. transcode if glyph.name not in name_lookup: try: glyph.name = transcode[glyph.name] except KeyError: log.error("Don't know what is '%s', skipping it", glyph.name) continue # 3. get horiz-adv-x if node.hasAttribute('horiz-adv-x'): glyph.hadv = float(node.getAttribute('horiz-adv-x')) elif default_hadvx != None: glyph.hadv = default_hadvx else: # XXX: calculate glyphs extends? raise FontError("Can't determine width of character '%s'", glyph.name) if glyph.name in font.glyphs_dict: log.error("Character '%s' already defined, skipping", glyph.name) else: font.glyphs_dict[glyph.name] = glyph #rof # f. write the cache file cPickle.dump(font, open(setup.cache_path + fontname + '.cache', 'wb'), protocol=cPickle.HIGHEST_PROTOCOL)
def make_cache_file(fontname): font = Font() font.name = fontname # # 1. Locate/create SVG font # svgname = fontname.lower() + '.svg' def svgpred(path, filename): return filename.lower() == svgname filename = findfile.find_file(setup.svg_font_path, svgpred) if not filename: type1file = findfile.locate(fontname + '.pfb') or \ findfile.locate(fontname + '.pfa') if not type1file: # there is no pfa/pfb named fontname, # try to find pfa/pfb with some prefix as fontname # XXX: rewrite import string prefix = fontname.translate(string.maketrans("0123456789", " "*10)).split()[0] if prefix: def pred(path, filename): f = filename.lower() return f.startswith(prefix) and\ (f.endswith(".pfa") or f.endswith(".pfb")) type1file = findfile.find_file(setup.tex_paths, pred) if type1file: log.info("Found Type1 font: %s" % type1file) if setup.options.use_fontforge and fontforge_available: log.info("... trying FontForge") if fontforge_convert(type1file): filename = findfile.find_file(setup.svg_font_path, svgpred) log.info("... ... conversion successful!") else: log.info("... ... conversion failed") if not filename and setup.options.use_fnt2meta and fnt2meta_available: log.info("... trying fnt2meta") meta = load_metadata(type1file) if meta: font = parse_metadata(meta) font.designsize = get_designsize(fontname) log.debug("Font '%s' designed at %spt" % (fontname, str(font.designsize))) log.info("... conversion successful") # pickle f = open(setup.cache_path + fontname + '.cache', 'wb') cPickle.dump(font, f, protocol=cPickle.HIGHEST_PROTOCOL) f.close() return else: log.info("... ... conversion failed") #fi if not filename and not type1file: mffile = findfile.locate(fontname + '.mf') if mffile: log.info("METAFONT source found, trying mftrace...") if mftrace_convert(mffile): filename = findfile.find_file(setup.svg_font_path, svgpred) if filename: log.info("... ... conversion successful") else: log.info("... ... conversion failed") else: log.info("... ... conversion failed") if filename: log.debug("Using SVG font '%s' as '%s'", filename, font.name) else: if type1file: raise FontError("%s: suitable vector font found, but conversion failed (are FontForge or/and fnt2meta installed?)" % font.name) else: raise FontError("%s: can't find SVG font" % font.name) # get designsize font.designsize = get_designsize(fontname) log.debug("Font '%s' designed at %spt" % (fontname, str(font.designsize))) # # 2. Process SVG file # # a. load file from xml.dom.minidom import parse data = parse(filename) # b. get font element try: fontnode = data.getElementsByTagName('font')[0] # get default horizontal advance (if any) if fontnode.hasAttribute('horiz-adv-x'): default_hadvx = float(fontnode.getAttribute('horiz-adv-x')) else: default_hadvx = None except IndexError: raise FontError("There should be at least one <font> element in SVG file") # d. get font face name if fontnode.getAttribute('font-family'): font.fontfamily = fontnode.getAttribute('font-family') else: font.fontfamily = fontname try: fontface = data.getElementsByTagName('font-face')[0] if fontface.getAttribute('bbox') and fontface.getAttribute('units-per-em'): xmin,ymin, xmax,ymax = map(float, fontface.getAttribute('bbox').replace(",", " ").split()) upem = float(fontface.getAttribute('units-per-em')) # raise str((upem, (ymax-ymin))) except IndexError: pass # e. load fonts font.glyphs_dict = {} for node in fontnode.getElementsByTagName('glyph'): # 1. read path info glyph = Glyph() if node.hasAttribute('d'): # is defined as <glyph> attribute glyph.path = node.getAttribute('d') else: # XXX: glyph is defined with path child element and I assume # there is just one element path_elements = node.getElementsByTagName('path') if len(path_elements) == 0: # no path elements at all pass elif len(path_elements) == 1: # one path element glyph.path = path_elements[0].getAttribute('d') else: # more paths... pass # XXX: join them? # 2. get character name glyph.name = node.getAttribute('glyph-name') if glyph.name == '': log.error("There is a glyph without name, skipping it") continue # 2a. transcode if glyph.name not in name_lookup: try: glyph.name = transcode[glyph.name] except KeyError: log.error("Don't know what is '%s', skipping it", glyph.name) continue # 3. get horiz-adv-x if node.hasAttribute('horiz-adv-x'): glyph.hadv = float(node.getAttribute('horiz-adv-x')) elif default_hadvx != None: glyph.hadv = default_hadvx else: # XXX: calculate glyphs extends? raise FontError("Can't determine width of character '%s'", glyph.name) if glyph.name in font.glyphs_dict: log.error("Character '%s' already defined, skipping", glyph.name) else: font.glyphs_dict[glyph.name] = glyph #rof # f. write the cache file cPickle.dump(font, open(setup.cache_path + fontname + '.cache', 'wb'), protocol=cPickle.HIGHEST_PROTOCOL)