Rename ttf/woff/woff2 file to PostScript Font Name with Script

3.6k views Asked by At

I am a typographer working with many fonts that have incorrect or incomplete filenames. I am on a Mac and have been using Hazel, AppleScript, and Automator workflows, attempting to automate renaming these files*. I require a script to replace the existing filename of ttf, woff, or woff2 files in Finder with the font's postscriptName. I know of tools (fc-scan/fontconfig, TTX, etc) which can retrieve the PostScript name-values I require, but lack the programming knowhow to code a script for my purposes. I've only managed to setup a watched directory that can run a script when any files matching certain parameters are added.

*To clarify, I am talking about changing the filename only, not the actual names stored within the font. Also I am open to a script of any compatible language or workflow of scripts if possible, e.g. this post references embedding AppleScript within Shell scripts via osascript.

StackExchange Posts I've Consulted:
How to get Fontname from OTF or TTF File?
How to get PostScript name of TTF font in OS X?
How to Change Name of Font?
Automate Renaming Files in macOS

Others:
https://github.com/dtinth/JXA-Cookbook/wiki/Using-JavaScript-for-Automation
https://github.com/fonttools/fonttools
https://github.com/devongovett/fontkit
https://www.npmjs.com/package/rename-js
https://opentype.js.org/font-inspector.html
http://www.fontgeek.net/blog/?p=343
https://www.lantean.co/osx-renaming-fonts-for-free

Edit: Added the following by request.
1) Screenshot of a somewhat typical webfont, illustrating how the form fields for font family and style names are often incomplete, blank, or contain illegal characters.
2) The woff file depicted (also, as base64). Screenshot Thank you all in advance!

1

There are 1 answers

9
Mockman On

Since you mentioned Automator in your question, I thought I'd try and solve this while using that to rename the file, along with standard Mac bash to get the font name. Hopefully, it beats learning a whole programming language.

I don't know what your workflow is so I'll leave any deviations to you but here is a method to select a font file and from Services, rename the file to the font's postscript name… based on Apple's metadata, specifically "com_apple_ats_name_postscript". This is one of the pieces of data retrieved using 'mdls' from the Terminal on the font file. To focus on the postscript name, grep the output for name_postscript. For simplicity here, I'll exclude the path to the selected file.

Font Name Aquisition

So… running this command…

mdls GenBkBasBI.ttf | grep -A1 name_postscript

… generates this output, which contains FontBook's Postscript name. The 'A1' in grep returns the found line and the first line after, which is the one containing the actual font name.

com_apple_ats_name_postscript  = (
    "GentiumBookBasic-BoldItalic"

Clean this up with some more bash (tr, tail)…

tr -d \  | tail -n 1 | tr -d \"

In order, these strip spaces, all lines excepting the last, and quotation marks. So for the first 'tr' instance, there is an extra space after the backslash.

In a single line, it looks like this…

mdls GenBkBasBI.ttf | grep -A1 name_postscript | tr -d \  | tail -n 1 | tr -d \" 

…and produces this…

GentiumBookBasic-BoldItalic

Now, here is the workflow that includes the above bash command. I got the idea for variable usage from the answer to this question…

Apple Automator “New PDF from Images” maintaining same filename

Automator Workflow

Automator Workflow screenshot

At the top; Service receives selected 'files or folders' in 'Finder'.

  1. Get Selected Finder Items

This (or Get Specified…) is there to allow testing. It is obviated by using this as a Service.

  1. Set Value of Variable (File)

This is to remember which file you want to rename

  1. Run Shell Script

This is where we use the bash stuff. The $f is the selected/specified file. I'm running 'zsh' for whatever reason. You can set it to whatever you're running, presumably 'bash'.

  1. Set Value of Variable (Text)

Assign the bash output to a variable. This will be used by the last action for the new filename.

  1. Get Value of Variable (File)

Recall the specified/selected file to rename.

  1. Rename Finder Items: Name Single Item

I have it set to 'Basename only' so it will leave the extension alone. Enter the 'Text' variable from action 4 in here.