def _makeFeatureBlocks(self, lookups): features = {} if "kern" in self.context.todo: kern = ast.FeatureBlock("kern") self._registerKernLookups(kern, lookups) if kern.statements: features["kern"] = kern if "dist" in self.context.todo: dist = ast.FeatureBlock("dist") self._registerDistLookups(dist, lookups) if dist.statements: features["dist"] = dist return features
def _makeMarkFeature(self, include): baseLkps = [] for i, attachments in enumerate( self.context.groupedMarkToBaseAttachments): lookup = self._makeMarkLookup( f"mark2base{'_' + str(i) if i > 0 else ''}", attachments, include) if lookup: baseLkps.append(lookup) ligaLkps = [] for i, attachments in enumerate( self.context.groupedMarkToLigaAttachments): lookup = self._makeMarkLookup( f"mark2liga{'_' + str(i) if i > 0 else ''}", attachments, include) if lookup: ligaLkps.append(lookup) if not baseLkps and not ligaLkps: return feature = ast.FeatureBlock("mark") for baseLkp in baseLkps: feature.statements.append(baseLkp) for ligaLkp in ligaLkps: feature.statements.append(ligaLkp) return feature
def write(self, font, feaFile, compiler=None): foo = ast.FeatureBlock("FOO ") foo.statements.append( ast.SingleSubstStatement("a", "v", prefix="", suffix="", forceChain=None)) feaFile.statements.append(foo)
def _makeMkmkFeature(self, include): feature = ast.FeatureBlock("mkmk") for anchorName, attachments in sorted( self.context.markToMarkAttachments.items()): lkp = self._makeMarkToMarkLookup(anchorName, attachments, include) if lkp is not None: feature.statements.append(lkp) return feature if feature.statements else None
def _makeAbvmOrBlwmFeature(self, tag, include): if tag == "abvm": marksFilter = self._isAboveMark elif tag == "blwm": marksFilter = self._isBelowMark else: raise AssertionError(tag) baseLkps = [] for i, attachments in enumerate( self.context.groupedMarkToBaseAttachments): lookup = self._makeMarkLookup( f"{tag}_mark2base{'_' + str(i) if i > 0 else ''}", attachments, include=include, marksFilter=marksFilter, ) if lookup: baseLkps.append(lookup) ligaLkps = [] for i, attachments in enumerate( self.context.groupedMarkToLigaAttachments): lookup = self._makeMarkLookup( f"{tag}_mark2liga{'_' + str(i) if i > 0 else ''}", attachments, include=include, marksFilter=marksFilter, ) if lookup: ligaLkps.append(lookup) mkmkLookups = [] for anchorName, attachments in sorted( self.context.markToMarkAttachments.items()): lkp = self._makeMarkToMarkLookup( anchorName, attachments, include=include, marksFilter=marksFilter, featureTag=tag, ) if lkp is not None: mkmkLookups.append(lkp) if not any([baseLkps, ligaLkps, mkmkLookups]): return feature = ast.FeatureBlock(tag) for baseLkp in baseLkps: feature.statements.append(baseLkp) for ligaLkp in ligaLkps: feature.statements.append(ligaLkp) feature.statements.extend(mkmkLookups) return feature
def _makeMarkFeature(self, include): baseLkp = self._makeMarkLookup("mark2base", self.context.markToBaseAttachments, include) ligaLkp = self._makeMarkLookup("mark2liga", self.context.markToLigaAttachments, include) if baseLkp is None and ligaLkp is None: return feature = ast.FeatureBlock("mark") if baseLkp: feature.statements.append(baseLkp) if ligaLkp: feature.statements.append(ligaLkp) return feature
def _makeMarkFeature(self, markClasses, isMkmk=False): """ Return a mark or mkmk FeatureBlock statement, or None if there is nothing to generate. """ anchorList = (self.context.mkmkAnchorList if isMkmk else self.context.anchorList) if not anchorList and (isMkmk or not self.context.ligaAnchorList): # nothing to do, don't write empty feature return featureName = "mkmk" if isMkmk else "mark" lookups = [] used = self.context.usedMarkClasses for i, (anchorName, accentAnchorName) in enumerate(anchorList, 1): className = self._generateClassName(accentAnchorName) markClass = markClasses[className] lookup = self._makeMarkLookup( "%s%d" % (featureName, i), isMkmk, anchorName, accentAnchorName, markClass, ) if lookup: lookups.append(lookup) used.add(className) if not isMkmk: ligaAnchors = self.context.ligaAnchorList for i, (anchorName, accentAnchorName) in enumerate(ligaAnchors, 1): className = self._generateClassName(accentAnchorName) markClass = markClasses[className] lookup = self._makeMarkToLigaLookup("mark2liga%d" % i, anchorName, accentAnchorName, markClass) if lookup: lookups.append(lookup) used.add(className) if lookups: feature = ast.FeatureBlock(featureName) feature.statements.extend(lookups) return feature
def _makeAbvmOrBlwmFeature(self, tag, include): if tag == "abvm": marksFilter = self._isAboveMark elif tag == "blwm": marksFilter = self._isBelowMark else: raise AssertionError(tag) baseLkp = self._makeMarkLookup( "%s_mark2base" % tag, self.context.markToBaseAttachments, include=include, marksFilter=marksFilter, ) ligaLkp = self._makeMarkLookup( "%s_mark2liga" % tag, self.context.markToLigaAttachments, include=include, marksFilter=marksFilter, ) mkmkLookups = [] for anchorName, attachments in sorted( self.context.markToMarkAttachments.items() ): lkp = self._makeMarkToMarkLookup( anchorName, attachments, include=include, marksFilter=marksFilter, featureTag=tag, ) if lkp is not None: mkmkLookups.append(lkp) if not any([baseLkp, ligaLkp, mkmkLookups]): return feature = ast.FeatureBlock(tag) if baseLkp: feature.statements.append(baseLkp) if ligaLkp: feature.statements.append(ligaLkp) feature.statements.extend(mkmkLookups) return feature