Как найти все доступные шрифты в OSX, используя оболочку по умолчанию

Пытаюсь написать скрипт для Adobe After Effects с помощью extendscript (проприетарный диалект ECMAScript, но в основном ≈ javascript). Я могу использовать встроенную команду system.callSystem() для выполнения команды по умолчанию( ?), но я не могу найти один лайнер bash или команду AppleScript, которую я могу использовать для вывода списка доступных шрифтов.

Есть ли способ получить все шрифты в командной строке в OSX?


person stib    schedule 13.08.2019    source источник
comment
попробуйте это: atsutil fonts -list. Кажется, он выводит два списка — системные шрифты и семейства системных шрифтов — так что вам придется массировать вывод.   -  person Ted Wrigley    schedule 13.08.2019
comment
Я не эксперт, но мне интересно, может ли быть разница между установленными шрифтами, о которых знают и могут использовать приложения, и файлами, которые содержат шрифты и существуют в файловой системе, но приложения не знают о... просто мысль.   -  person Mark Setchell    schedule 14.08.2019
comment
@MarkSetchell хорошая мысль. Я думал, что ОС будет знать об установленных шрифтах, поэтому будет какой-то способ узнать, что установлено. Меня интересуют только те шрифты, которые доступны приложению   -  person stib    schedule 14.08.2019
comment
Похоже, что Font Book поддерживает Applescript... macscripter.net/viewtopic.php?id=41022   -  person Mark Setchell    schedule 14.08.2019


Ответы (2)


Из AppleScript вы можете использовать этот код ASOC, чтобы получить имена всех шрифтов или семейств шрифтов, доступных в системе:

use framework "AppKit"
set fontFamilyNames to (current application's NSFontManager's sharedFontManager's availableFontFamilies) as list
set fontNames to (current application's NSFontManager's sharedFontManager's availableFonts) as list

Я не уверен, какой из них вам нужен, поэтому я включил код для обоих. Если вы хотите получить доступ к этому сценарию из bash, используйте команду osascript:

fontFamilyNames=$(osascript << SCPT
    use framework "AppKit"
    set fontFamilyNames to (current application's NSFontManager's sharedFontManager's availableFontFamilies) as list
    return fontFamilyNames
SCPT)
person Ted Wrigley    schedule 13.08.2019
comment
Подскажите, пожалуйста, что такое АСОК? И где мне поместить этот код, чтобы запустить его, пожалуйста? И как? - person Mark Setchell; 14.08.2019
comment
ASOC — это просто сокращение от AppleScript Objective-C — AppleScript, который использует объекты и команды Objective C — это то, что я написал. Вы можете использовать первый сценарий из приложения «Редактор сценариев», а второй — из командной строки или сценария оболочки. - person Ted Wrigley; 14.08.2019

Решение 1: AppleScript

tell application "Font Book" to set activeFontsList to name of every font family --- whose enabled is true

Обратите внимание, что фильтр whose enabled is true закомментирован, поскольку он значительно замедляет выполнение запроса.

Решение 2: AppleScript и Bash

Вы можете выполнить приведенный выше AppleScript из Bash следующим образом:

#!/usr/bin/env bash

# Query the list of fonts with AppleScript.
font_list=$(osascript << SCPT
    tell application "Font Book" to set activeFontsList to name of every font family --- whose enabled is true
SCPT)

# Convert the list to column and sort it.
font_list=$(echo $font_list | awk -e 'gsub(", ", "\n")' | sort -f)

# Display the list.
echo -e "$font_list"

# Display the list size.
echo -e "$font_list" | wc -l | xargs printf "\nFont count: %d\n"

Тот же скрипт, но однострочный:

font_list=$(osascript -e 'tell application "Font Book" to set activeFontsList to name of every font family --- whose enabled is true') && font_list=$(echo $font_list | awk -e 'gsub(", ", "\n")' | sort -f) && echo -e "$font_list"

Решение 3: fc-list

fc-list : family | sort -f
fc-list : family | wc -l | xargs printf "\nFont count: %d\n"

Здесь вы найдете несколько примеров: https://www.geeksforgeeks.org/fc-list-command-in-linux-with-examples/.

person nico    schedule 15.08.2020