def run_from_designspace(self, designspace_path, interpolate=False, masters_as_instances=False, instance_data=None, interpolate_binary_layout=False, **kwargs): """Run toolchain from a MutatorMath design space document. Args: designspace_path: Path to designspace document. interpolate: If True output instance fonts, otherwise just masters. masters_as_instances: If True, output master fonts as instances. instance_data: Data to be applied to instance UFOs, as returned from glyphsLib's parsing function (ignored unless interpolate is True). interpolate_binary_layout: Interpolate layout tables from compiled master binaries. kwargs: Arguments passed along to run_from_ufos. Raises: TypeError: "variable" output is incompatible with arguments "interpolate", "masters_as_instances", and "interpolate_binary_layout". """ if "variable" in kwargs.get("output", ()): for argname in ("interpolate", "masters_as_instances", "interpolate_binary_layout"): if locals()[argname]: raise TypeError( '"%s" argument incompatible with "variable" output' % argname) from glyphsLib.interpolation import apply_instance_data from mutatorMath.ufo import build as build_designspace from mutatorMath.ufo.document import DesignSpaceDocumentReader ufos = [] if not interpolate or masters_as_instances: reader = DesignSpaceDocumentReader(designspace_path, ufoVersion=3) ufos.extend(reader.getSourcePaths()) if interpolate: logger.info('Interpolating master UFOs from designspace') results = build_designspace(designspace_path, outputUFOFormatVersion=3) if instance_data is not None: ufos.extend(apply_instance_data(instance_data)) else: for result in results: ufos.extend(result.values()) interpolate_layout_from = (designspace_path if interpolate_binary_layout else None) self.run_from_ufos(ufos, designspace_path=designspace_path, is_instance=(interpolate or masters_as_instances), interpolate_layout_from=interpolate_layout_from, **kwargs)
def epoch(args): reader = DesignSpaceDocumentReader(args.designspace, ufoVersion=3) paths = reader.getSourcePaths() + [args.designspace] # We want to check the original masters in the source not build directory. paths = [os.path.join(args.source, os.path.basename(p)) for p in paths] # Not all masters exist in the source directory. paths = [p for p in paths if os.path.exists(p)] epoch = max([os.stat(p).st_mtime for p in paths]) return str(int(epoch))
def run_from_designspace( self, designspace_path, interpolate=False, **kwargs): """Run toolchain from a MutatorMath design space document to OpenType binaries. """ if interpolate: print('>> Interpolating master UFOs from design space') results = build_designspace( designspace_path, outputUFOFormatVersion=3) ufos = [] for result in results: ufos.extend(result.values()) else: reader = DesignSpaceDocumentReader(designspace_path, ufoVersion=3) ufos = reader.getSourcePaths() self.run_from_ufos(ufos, is_instance=True, **kwargs)
def run_from_designspace(self, designspace_path, interpolate=False, masters_as_instances=False, instance_data=None, interpolate_binary_layout=False, **kwargs): """Run toolchain from a MutatorMath design space document. Args: designspace_path: Path to designspace document. interpolate: If True output instance fonts, otherwise just masters. masters_as_instances: If True, output master fonts as instances. instance_data: Data to be applied to instance UFOs, as returned from glyphsLib's parsing function. interpolate_binary_layout: Interpolate layout tables from compiled master binaries. kwargs: Arguments passed along to run_from_ufos. """ from glyphsLib.interpolation import apply_instance_data from mutatorMath.ufo import build as build_designspace from mutatorMath.ufo.document import DesignSpaceDocumentReader ufos = [] if not interpolate or masters_as_instances: reader = DesignSpaceDocumentReader(designspace_path, ufoVersion=3) ufos.extend(reader.getSourcePaths()) if interpolate: logger.info('Interpolating master UFOs from designspace') results = build_designspace(designspace_path, outputUFOFormatVersion=3) if instance_data is not None: ufos.extend(apply_instance_data(instance_data)) else: for result in results: ufos.extend(result.values()) interpolate_layout_from = (designspace_path if interpolate_binary_layout else None) self.run_from_ufos(ufos, designspace_path=designspace_path, is_instance=(interpolate or masters_as_instances), interpolate_layout_from=interpolate_layout_from, **kwargs)
def run_from_designspace( self, designspace_path, interpolate=False, **kwargs): """Run toolchain from a MutatorMath design space document to OpenType binaries. """ if interpolate: print('>> Interpolating master UFOs from design space') results = build_designspace( designspace_path, outputUFOFormatVersion=3) ufos = [] for result in results: ufos.extend(result.values()) else: reader = DesignSpaceDocumentReader(designspace_path, ufoVersion=3) ufos = reader.getSourcePaths() self.run_from_ufos(ufos, is_instance=True, **kwargs)
def run_from_designspace( self, designspace_path, interpolate=False, masters_as_instances=False, instance_data=None, interpolate_binary_layout=False, **kwargs): """Run toolchain from a MutatorMath design space document. Args: designspace_path: Path to designspace document. interpolate: If True output instance fonts, otherwise just masters. masters_as_instances: If True, output master fonts as instances. instance_data: Data to be applied to instance UFOs, as returned from glyphsLib's parsing function. interpolate_binary_layout: Interpolate layout tables from compiled master binaries. kwargs: Arguments passed along to run_from_ufos. """ from glyphsLib.interpolation import apply_instance_data from mutatorMath.ufo import build as build_designspace from mutatorMath.ufo.document import DesignSpaceDocumentReader ufos = [] if not interpolate or masters_as_instances: reader = DesignSpaceDocumentReader(designspace_path, ufoVersion=3) ufos.extend(reader.getSourcePaths()) if interpolate: self.info('Interpolating master UFOs from designspace') results = build_designspace( designspace_path, outputUFOFormatVersion=3) if instance_data is not None: ufos.extend(apply_instance_data(instance_data)) else: for result in results: ufos.extend(result.values()) interpolate_layout_from = ( designspace_path if interpolate_binary_layout else None) self.run_from_ufos( ufos, designspace_path=designspace_path, is_instance=(interpolate or masters_as_instances), interpolate_layout_from=interpolate_layout_from, **kwargs)
def run_from_designspace( self, designspace_path, interpolate=False, masters_as_instances=False, **kwargs): """Run toolchain from a MutatorMath design space document to OpenType binaries. """ from mutatorMath.ufo import build as build_designspace from mutatorMath.ufo.document import DesignSpaceDocumentReader ufos = [] if not interpolate or masters_as_instances: reader = DesignSpaceDocumentReader(designspace_path, ufoVersion=3) ufos.extend(reader.getSourcePaths()) if interpolate: print('>> Interpolating master UFOs from design space') results = build_designspace( designspace_path, outputUFOFormatVersion=3) for result in results: ufos.extend(result.values()) self.run_from_ufos( ufos, is_instance=(interpolate or masters_as_instances), **kwargs)
def run_from_designspace(self, designspace_path, interpolate=False, masters_as_instances=False, interpolate_binary_layout=False, round_instances=False, **kwargs): """Run toolchain from a MutatorMath design space document. Args: designspace_path: Path to designspace document. interpolate: If True output all instance fonts, otherwise just masters. If the value is a string, only build instance(s) that match given name. The string is compiled into a regular expression and matched against the "name" attribute of designspace instances using `re.fullmatch`. masters_as_instances: If True, output master fonts as instances. interpolate_binary_layout: Interpolate layout tables from compiled master binaries. round_instances: apply integer rounding when interpolating with MutatorMath. kwargs: Arguments passed along to run_from_ufos. Raises: TypeError: "variable" output is incompatible with arguments "interpolate", "masters_as_instances", and "interpolate_binary_layout". """ if "variable" in kwargs.get("output", ()): for argname in ("interpolate", "masters_as_instances", "interpolate_binary_layout"): if locals()[argname]: raise TypeError( '"%s" argument incompatible with "variable" output' % argname) from glyphsLib.interpolation import apply_instance_data from mutatorMath.ufo.document import DesignSpaceDocumentReader ufos = [] reader = DesignSpaceDocumentReader(designspace_path, ufoVersion=3, roundGeometry=round_instances, verbose=True) if not interpolate or masters_as_instances: ufos.extend(reader.getSourcePaths()) if interpolate: logger.info('Interpolating master UFOs from designspace') if isinstance(interpolate, basestring): instances = self._search_instances(designspace_path, pattern=interpolate) for instance_name in instances: reader.readInstance(("name", instance_name)) filenames = set(instances.values()) else: reader.readInstances() filenames = None # will include all instances logger.info('Applying instance data from designspace') ufos.extend( apply_instance_data(designspace_path, include_filenames=filenames)) if interpolate_binary_layout is False: interpolate_layout_from = interpolate_layout_dir = None else: interpolate_layout_from = designspace_path if isinstance(interpolate_binary_layout, basestring): interpolate_layout_dir = interpolate_binary_layout else: interpolate_layout_dir = None self.run_from_ufos(ufos, designspace_path=designspace_path, is_instance=(interpolate or masters_as_instances), interpolate_layout_from=interpolate_layout_from, interpolate_layout_dir=interpolate_layout_dir, **kwargs)
def run_from_designspace(self, designspace_path, interpolate=False, masters_as_instances=False, instance_data=None, interpolate_binary_layout=False, round_instances=False, **kwargs): """Run toolchain from a MutatorMath design space document. Args: designspace_path: Path to designspace document. interpolate: If True output instance fonts, otherwise just masters. masters_as_instances: If True, output master fonts as instances. instance_data: Data to be applied to instance UFOs, as returned from glyphsLib's parsing function (ignored unless interpolate is True). interpolate_binary_layout: Interpolate layout tables from compiled master binaries. round_instances: apply integer rounding when interpolating with MutatorMath. kwargs: Arguments passed along to run_from_ufos. Raises: TypeError: "variable" output is incompatible with arguments "interpolate", "masters_as_instances", and "interpolate_binary_layout". """ if "variable" in kwargs.get("output", ()): for argname in ("interpolate", "masters_as_instances", "interpolate_binary_layout"): if locals()[argname]: raise TypeError( '"%s" argument incompatible with "variable" output' % argname) from glyphsLib.interpolation import apply_instance_data from mutatorMath.ufo import build as build_designspace from mutatorMath.ufo.document import DesignSpaceDocumentReader ufos = [] if not interpolate or masters_as_instances: reader = DesignSpaceDocumentReader(designspace_path, ufoVersion=3) ufos.extend(reader.getSourcePaths()) if interpolate: logger.info('Interpolating master UFOs from designspace') _, ilocs = self._designspace_locations(designspace_path) for ipath in ilocs.keys(): # mutatorMath does not remove the existing instance UFOs # so we do it ourselves, or else strange things happen... # https://github.com/googlei18n/fontmake/issues/372 if ipath.endswith(".ufo") and os.path.isdir(ipath): logger.debug("Removing %s" % ipath) shutil.rmtree(ipath) results = build_designspace(designspace_path, outputUFOFormatVersion=3, roundGeometry=round_instances) if instance_data is not None: ufos.extend(apply_instance_data(instance_data)) else: for result in results: ufos.extend(result.values()) interpolate_layout_from = (designspace_path if interpolate_binary_layout else None) self.run_from_ufos(ufos, designspace_path=designspace_path, is_instance=(interpolate or masters_as_instances), interpolate_layout_from=interpolate_layout_from, **kwargs)