def _convertPath(self, path, destDir, saveOTF=True, saveTTF=True, saveWOFF=True, saveWOFFFormat=WOFF_TTF_FORMAT, saveWOFF2=True, saveWOFF2Format=WOFF_TTF_FORMAT, saveEOT=True, saveSVG=False, suffix="", report=None, preserveTTFhints=False): fileName = os.path.basename(path) fileName, ext = os.path.splitext(fileName) ext = ext.lower() if ext in [".ttf", ".otf"]: font = CompositorFont(path) else: font = RFont(path, document=False, showInterface=False) familyName = font.info.familyName styleName = font.info.styleName if not self.controller.keepFileNames(): fileName = "%s-%s" % (familyName, styleName) fileName += suffix fileName = fileName.replace(" ", "_") if self.controller.exportInFolders(): fontDir = os.path.join(destDir, familyName.replace(" ", ""), styleName.replace(" ", "")) else: fontDir = destDir otfPath = os.path.join(fontDir, fileName + ".otf") ttfPath = os.path.join(fontDir, fileName + ".ttf") woffPath = os.path.join(fontDir, fileName + ".woff") woff2Path = os.path.join(fontDir, fileName + ".woff2") eotPath = os.path.join(fontDir, fileName + ".eot") svgPath = os.path.join(fontDir, fileName + ".svg") # save otf if saveOTF: report.writeTitle("Build OTF", "'") report.indent() report.write("path: %s" % otfPath) buildTree(fontDir) temp = self._getTempOTF(path, report=report, preserveTTFhints=preserveTTFhints) shutil.copyfile(temp, otfPath) report.dedent() report.newLine() # save ttf if saveTTF: report.writeTitle("Build TTF", "'") report.indent() report.write("path: %s" % ttfPath) buildTree(fontDir) temp = self._getTempTTF(path, report=report, preserveTTFhints=preserveTTFhints) shutil.copyfile(temp, ttfPath) report.dedent() report.newLine() # convert to woff if saveWOFF: if saveWOFFFormat == WOFF_TTF_FORMAT: func = self._getTempTTF reportFormat = "TTF" elif saveWOFFFormat == WOFF_OTF_FORMAT: func = self._getTempOTF reportFormat = "OTF" report.writeTitle("Build WOFF (%s)" % reportFormat, "'") report.indent() report.write("path: %s" % woffPath) buildTree(fontDir) temp = func(path, report=report, preserveTTFhints=preserveTTFhints) convertToWoff(temp, woffPath) report.dedent() report.newLine() # convert to woff2 if saveWOFF2: if saveWOFFFormat == WOFF_TTF_FORMAT: func = self._getTempTTF reportFormat = "TTF" elif saveWOFFFormat == WOFF_OTF_FORMAT: func = self._getTempOTF reportFormat = "OTF" report.writeTitle("Build WOFF2 (%s)" % reportFormat, "'") report.indent() report.write("path: %s" % woff2Path) buildTree(fontDir) temp = func(path, report=report, preserveTTFhints=preserveTTFhints) convertToWoff2(temp, woff2Path) report.dedent() report.newLine() # convert to eot if saveEOT: report.writeTitle("Build EOT", "'") report.indent() report.write("path: %s" % eotPath) buildTree(fontDir) temp = self._getTempTTF(path, report=report, preserveTTFhints=preserveTTFhints) convertToEot(temp, eotPath) report.dedent() report.newLine() # convert to svg if saveSVG: report.writeTitle("Build SVG", "'") report.indent() report.write("path: %s" % svgPath) buildTree(fontDir) convertToSVG(path, svgPath) report.dedent() report.newLine() self._removeTempFiles() self._writeHTMLPreview(report.html, report.css, fileName, familyName, styleName, saveTTF, saveWOFF, saveWOFF2, saveEOT, saveSVG)
def run(self, destDir, progress, report=None): paths = self.controller.get() decompose = self.decompose.get() removeOverlap = self.remove_overlap.get() autohint = self.autohint.get() releaseMode = self.release_mode.get() suffix = self.generateSuffix.get() suffix = time.strftime(suffix) formats = [i for i in doodleSupportedExportFileTypes if getattr(self, i).get()] if report is None: report = Report() report.writeTitle("Batch Generated Fonts:") report.newLine() progress.update("Collecting Data...") fonts = [] for path in paths: font = RFont(path, document=False, showInterface=False) # check font info requiredFontInfo = dict(descender=-250, xHeight=500, ascender=750, capHeight=750, unitsPerEm=1000) for attr, value in requiredFontInfo.items(): existingValue = getattr(font.info, attr) if existingValue is None: setattr(font.info, attr, value) fonts.append(font) if decompose: report.writeTitle("Decompose:") report.indent() progress.update("Decompose...") progress.setTickCount(len(fonts)) for font in fonts: report.write("%s %s" % (font.info.familyName, font.info.styleName)) progress.update() font.decompose() progress.setTickCount(None) report.dedent() report.newLine() decompose = False if removeOverlap: report.writeTitle("Remove Overlap:") progress.update("Remove Overlap...") report.indent() progress.setTickCount(len(fonts)) for font in fonts: report.write("%s %s" % (font.info.familyName, font.info.styleName)) progress.update() font.removeOverlap() progress.setTickCount(None) report.dedent() report.newLine() removeOverlap = False report.writeTitle("Generate:") exportPaths = [] for index, font in enumerate(fonts): report.writeTitle((os.path.basename(paths[index]))) report.newLine() report.write("source: %s" % paths[index]) report.newLine() for format in formats: report.writeTitle("Generate %s" % format, "'") report.indent() familyName = font.info.familyName or "familyName-%s" % index familyName = familyName.replace(" ", "") styleName = font.info.styleName or "styleName-%s" % index styleName = styleName.replace(" ", "") if not self.controller.keepFileNames(): fileName = "%s-%s%s.%s" % (familyName, styleName, suffix, format) else: fileName = os.path.basename(paths[index]) fileName, _ = os.path.splitext(fileName) fileName = "%s%s.%s" % (fileName, suffix, format) progress.update("Generating ... %s" % fileName) if self.controller.exportInFolders(): fontDir = os.path.join(destDir, format) else: fontDir = destDir buildTree(fontDir) path = os.path.join(fontDir, fileName) report.write("path: %s" % path) result = font.generate(path=path, format=format, decompose=decompose, checkOutlines=removeOverlap, autohint=autohint, releaseMode=releaseMode, progressBar=progress, glyphOrder=font.glyphOrder) report.indent() report.write(result) report.dedent() exportPaths.append(path) report.dedent() report.newLine() if not font.hasInterface(): font.close() reportPath = os.path.join(destDir, "Batch Generate Report.txt") report.save(reportPath) return exportPaths