def _executeCodeInNamespace(code, namespace): """ Execute the code in the given namespace. """ # This was adapted from DrawBot's scriptTools.py. saveStdout = sys.stdout saveStderr = sys.stderr tempStdout = StringIO() tempStderr = StringIO() try: sys.stdout = tempStdout sys.stderr = tempStderr try: code = compile(code, "", "exec", 0) except: traceback.print_exc(0) else: try: exec(code, namespace) except: etype, value, tb = sys.exc_info() if tb.tb_next is not None: tb = tb.tb_next traceback.print_exception(etype, value, tb) etype = value = tb = None finally: sys.stdout = saveStdout sys.stderr = saveStderr output = tempStdout.getvalue() errors = tempStderr.getvalue() return output, errors
def __init__(self, text, glyph_set): feature_file = StringIO(text) parser_ = parser.Parser(feature_file, glyph_set, followIncludes=False) self._doc = parser_.parse() self.statements = self._doc.statements self._lines = text.splitlines(True) # keepends=True self._build_end_locations()
def pformat_tti(program, preserve=True): from fontTools.ttLib.tables.ttProgram import _pushCountPat assembly = program.getAssembly(preserve=preserve) stream = StringIO() i = 0 indent = 0 nInstr = len(assembly) while i < nInstr: instr = assembly[i] if _unindentRE.match(instr): indent -= 1 stream.write(' ' * indent) stream.write(instr) stream.write("\n") m = _pushCountPat.match(instr) i = i + 1 if m: nValues = int(m.group(1)) line = [] j = 0 for j in range(nValues): if j and not (j % 25): stream.write(' '.join(line)) stream.write("\n") line = [] line.append(assembly[i + j]) stream.write(' ' * indent) stream.write(' '.join(line)) stream.write("\n") i = i + j + 1 if _indentRE.match(instr): indent += 1 return stream.getvalue()
def __init__(self, filename, features, version): self._font = fontforge.open(filename) self._version = version self._features = StringIO() if features: preprocessor = Preprocessor() for d in ("italic", "sans", "display", "math"): if d in filename.lower(): preprocessor.define(d.upper()) with open(features) as f: preprocessor.parse(f) preprocessor.write(self._features)
def generateFeatures(font, args): """Generates feature text by merging feature file with mark positioning lookups (already in the font) and making sure they come after kerning lookups (from the feature file), which is required by Uniscribe to get correct mark positioning for kerned glyphs.""" oldfea = "" for lookup in font.gpos_lookups: oldfea += generateFeatureString(font, lookup) for lookup in font.gpos_lookups + font.gsub_lookups: font.removeLookup(lookup) # open feature file and insert the generated GPOS features in place of the # placeholder text with open(args.features) as f: o = StringIO() preprocessor = Preprocessor() if args.quran: preprocessor.define("QURAN") elif args.slant: preprocessor.define("ITALIC") preprocessor.parse(f) preprocessor.write(o) fea_text = tounicode(o.getvalue(), "utf-8") fea_text = fea_text.replace("{%anchors%}", oldfea) bases = [g.glyphname for g in font.glyphs() if g.glyphclass != "mark"] marks = [g.glyphname for g in font.glyphs() if g.glyphclass == "mark"] carets = {g.glyphname: g.lcarets for g in font.glyphs() if any(g.lcarets)} gdef = [] gdef.append("@GDEFBase = [%s];" % " ".join(bases)) gdef.append("@GDEFMark = [%s];" % " ".join(marks)) gdef.append("table GDEF {") gdef.append(" GlyphClassDef @GDEFBase, , @GDEFMark, ;") for k, v in carets.items(): gdef.append(" LigatureCaretByPos %s %s;" % (k, " ".join(map(str, v)))) gdef.append("} GDEF;") fea_text += "\n".join(gdef) return fea_text
def __init__(self): self._file = StringIO() self._writer = XMLWriter(self._file, encoding="utf-8")