Skip to content

Commit

Permalink
add scripting support
Browse files Browse the repository at this point in the history
  • Loading branch information
typemytype committed Nov 20, 2024
1 parent fb4c303 commit 54a0dec
Show file tree
Hide file tree
Showing 6 changed files with 148 additions and 17 deletions.
6 changes: 3 additions & 3 deletions source/lib/batch.py
Original file line number Diff line number Diff line change
Expand Up @@ -230,10 +230,10 @@ def settingsCallback(self, sender):

def generateCallback(self, sender):
generateOptions = self.w.getItemValues()
generateOptions["sourceUFOPaths"], designspaceDocuments = self.getAllUFOPaths()
generateOptions["sourceDesignspacePaths"] = self.getAllDesignspacePaths()
generateOptions["sourceUFOs"], designspaceDocuments = self.getAllUFOPaths()
generateOptions["sourceDesignspaces"] = self.getAllDesignspacePaths()

if not generateOptions["sourceUFOPaths"] and not generateOptions["sourceDesignspacePaths"]:
if not generateOptions["sourceUFOs"] and not generateOptions["sourceDesignspaces"]:
# no fonts found in the source table
return

Expand Down
111 changes: 111 additions & 0 deletions source/lib/batchCompileTools.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
from batchGenerators.batchTools import Report, DummyProgress
import batchGenerators
import batchSettings


def generateDesktopFonts(ufoPathsOrObjects, destinationRoot, format="ttf", decompose=True, removeOverlap=True, autohint=False, releaseMode=True, suffix=""):
if not isinstance(ufoPathsOrObjects, list):
ufoPathsOrObjects = [ufoPathsOrObjects]
report = Report()
generateOptions = dict(
sourceUFOs=ufoPathsOrObjects,
)
settings = dict(batchSettings.defaultSettings)
settings.update(
dict(
batchSettingExportInSubFolders=False,
desktopFontsAutohint=autohint,
desktopFontsDecompose=decompose,
desktopFontsReleaseMode=releaseMode,
desktopFontsRemoveOverlap=removeOverlap,
desktopFontsSuffix=suffix
)
)
if format == "ttf":
generateOptions["desktopFontGenerate_TTF"] = True
if format == "otf":
generateOptions["desktopFontGenerate_OTF"] = True

batchGenerators.desktopFontsGenerator.build(
root=destinationRoot,
generateOptions=generateOptions,
settings=settings,
progress=DummyProgress(),
report=report
)
return report.get()


def generateWebFonts(ufoPathsOrObjects, destinationRoot, format="ttf", woff=False, decompose=True, removeOverlap=True, autohint=False, releaseMode=True, suffix="", html=False, htmlPreview=None):
if not isinstance(ufoPathsOrObjects, list):
ufoPathsOrObjects = [ufoPathsOrObjects]
report = Report()
generateOptions = dict(
sourceUFOs=ufoPathsOrObjects,
)
settings = dict(batchSettings.defaultSettings)
settings.update(
dict(
batchSettingExportInSubFolders=False,
webFontsAutohint=autohint,
webFontsDecompose=decompose,
webFontsGenerateHTML=html,
webFontsReleaseMode=releaseMode,
webFontsRemoveOverlap=removeOverlap,
webFontsSuffix=suffix
)
)
if htmlPreview:
settings["webFontsHtmlPreview"] = htmlPreview
if format == "ttf" and woff:
generateOptions["webFontGenerate_TTFWOFF2"] = True
if format == "otf" and woff:
generateOptions["webFontGenerate_OTFWOFF2"] = True
if format == "ttf" and not woff:
generateOptions["webFontGenerate_TTF"] = True
if format == "otf" and not woff:
generateOptions["webFontGenerate_OTF"] = True

batchGenerators.webFontsGenerator.build(
root=destinationRoot,
generateOptions=generateOptions,
settings=settings,
progress=DummyProgress(),
report=report
)
return report.get()


def generateVariableFonts(designspacePathsOrObjects, destinationRoot, format="ttf", woff=False, autohint=False, fitToExtremes=False, suffix=""):
if not isinstance(designspacePathsOrObjects, list):
designspacePathsOrObjects = [designspacePathsOrObjects]
report = Report()
generateOptions = dict(
sourceDesignspaces=designspacePathsOrObjects,
)
settings = dict(batchSettings.defaultSettings)
settings.update(
dict(
batchSettingExportInSubFolders=False,
variableFontsAutohint=autohint,
variableFontsInterpolateToFitAxesExtremes=fitToExtremes,
variableFontsSuffix=suffix
)
)
if format == "ttf" and woff:
generateOptions["variableFontGenerate_TTFWOFF2"] = True
if format == "otf" and woff:
generateOptions["variableFontGenerate_OTFWOFF2"] = True
if format == "ttf" and not woff:
generateOptions["variableFontGenerate_TTF"] = True
if format == "otf" and not woff:
generateOptions["variableFontGenerate_OTF"] = True

batchGenerators.variableFontsGenerator.build(
root=destinationRoot,
generateOptions=generateOptions,
settings=settings,
progress=DummyProgress(),
report=report
)
return report.get()
35 changes: 26 additions & 9 deletions source/lib/batchGenerators/batchTools.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,13 @@ def _instantiateFont(self, path):
return internalFontClasses.createFontObject(path)


def loadFonts(ufoPaths):
def loadFonts(sourceUFOs):
fonts = []
for path in ufoPaths:
font = RFont(path, document=False, showInterface=False)
for sourceUFO in sourceUFOs:
if isinstance(sourceUFO, str):
font = RFont(sourceUFO, document=False, showInterface=False)
else:
font = sourceUFO
# check font info
requiredFontInfo = dict(descender=-250, xHeight=500, ascender=750, capHeight=750, unitsPerEm=1000)
for attr, value in requiredFontInfo.items():
Expand Down Expand Up @@ -104,6 +107,19 @@ def get(self):
return "\n".join(self._data)


class DummyProgress:

def __dummy(self, *args, **kwargs):
pass

setText = __dummy
update = __dummy
increment = __dummy
setMaxValue = __dummy
setTickCount = __dummy
close = __dummy


blankFontCss = """<style>
@font-face {
font-family: AdobeBlank;
Expand Down Expand Up @@ -166,7 +182,7 @@ def __bool__(self):


def generatePaths(
ufoPaths,
sourceUFOs,
binaryFormats,
decompose,
removeOverlap,
Expand All @@ -179,7 +195,7 @@ def generatePaths(
report,
progress
):
fonts = loadFonts(ufoPaths)
fonts = loadFonts(sourceUFOs)

if decompose:
report.writeTitle("Decompose:")
Expand Down Expand Up @@ -215,11 +231,12 @@ def generatePaths(
report.indent()

for index, font in enumerate(fonts):
fontPath = font.path
progress.increment()
report.writeTitle((os.path.basename(ufoPaths[index])))
report.writeTitle((os.path.basename(fontPath)))
report.indent()
report.newLine()
report.write(f"source: {ufoPaths[index]}")
report.write(f"source: {fontPath}")
report.newLine()
for binaryFormat, postProcessCallback in binaryFormats:
binaryExtention = binaryFormat.split("-")[0]
Expand All @@ -229,8 +246,8 @@ def generatePaths(
familyName = familyName.replace(" ", "")
styleName = font.info.styleName or f"styleName-{index}"
styleName = styleName.replace(" ", "")
if keepFileNames:
fileName = os.path.basename(ufoPaths[index])
if keepFileNames and fontPath is not None:
fileName = os.path.basename(fontPath)
fileName, _ = os.path.splitext(fileName)
fileName = f"{fileName}{suffix}.{binaryExtention}"
else:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ def build(root, generateOptions, settings, progress, report):
removeTree(desktopFontsRoot)

generatePaths(
ufoPaths=generateOptions["sourceUFOPaths"],
sourceUFOs=generateOptions["sourceUFOs"],
binaryFormats=binaryFormats,
decompose=settings["desktopFontsDecompose"],
removeOverlap=settings["desktopFontsRemoveOverlap"],
Expand Down
7 changes: 5 additions & 2 deletions source/lib/batchGenerators/variableFontsGenerator/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -477,8 +477,11 @@ def build(root, generateOptions, settings, progress, report):
variableFontsRoot = os.path.join(root, "Variable")
removeTree(variableFontsRoot)

for sourceDesignspacePath in generateOptions["sourceDesignspacePaths"]:
operator = BatchEditorOperator(sourceDesignspacePath)
for sourceDesignspace in generateOptions["sourceDesignspaces"]:
if isinstance(sourceDesignspace, str):
operator = BatchEditorOperator(sourceDesignspace)
else:
operator = sourceDesignspace
# loop over all interpolable operators based on the given variable fonts
for name, interpolableOperator in operator.getInterpolableUFOOperators(useVariableFonts=True):
for binaryFormat, postProcessCallback in binaryFormats:
Expand Down
4 changes: 2 additions & 2 deletions source/lib/batchGenerators/webFontsGenerator/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,10 +107,10 @@ def build(root, generateOptions, settings, progress, report):
removeTree(webFontsRoot)

report.writeTitle("Batch Generated Web Fonts:")
progress.update("Collecting Data...")
progress.setText("Collecting Data...")

generatePaths(
ufoPaths=generateOptions["sourceUFOPaths"],
sourceUFOs=generateOptions["sourceUFOs"],
binaryFormats=binaryFormats,
decompose=settings["webFontsDecompose"],
removeOverlap=settings["webFontsRemoveOverlap"],
Expand Down

0 comments on commit 54a0dec

Please sign in to comment.