Skip to content

Instantly share code, notes, and snippets.

View connordavenport's full-sized avatar

Connor Davenport connordavenport

View GitHub Profile
@connordavenport
connordavenport / force_same_window.py
Created March 24, 2026 14:29
when opening a new glyph window, with shift down, force glyph to use current glyph window, regardless of the font
from mojo.subscriber import Subscriber, registerRoboFontSubscriber, unregisterRoboFontSubscriber
from mojo.UI import CurrentGlyphWindow
import AppKit
class force_same_window(Subscriber):
debug = True
def build(self):
self.windowToClose = None
@connordavenport
connordavenport / glyph_editor_component_breadcrumbs.py
Last active March 4, 2026 22:11
add breadcrumb trail when traversing nested components, based on Counterpunch's features
from mojo.subscriber import *
from vanilla import *
from mojo.UI import CurrentGlyphWindow, SetCurrentGlyphByName
class crumbponents(Subscriber):
def started(self):
self._path = [] # keep the path as a list and join on set
self.glyph = None # Current Glyph to keep track of
self.editor = CurrentGlyphWindow()
from mojo.subscriber import Subscriber, registerRoboFontSubscriber
import AppKit
class MargielaTabs(Subscriber):
def fontDocumentWantsToolbarItems(self, info):
image = AppKit.NSImage.imageWithSystemSymbolName_accessibilityDescription_("arrow.trianglehead.merge", "")
newItem = {'itemIdentifier': 'MargielaTabsButton',
'label': 'Margiela',
@connordavenport
connordavenport / new_font_manager.py
Last active October 17, 2025 13:50
custom manager for opening new fonts
import ezui
from mojo.UI import getDefault
from mojo.subscriber import *
import AppKit
from lib.fontObjects.doodleFont import DoodleFont
CHARACTER_SETS = getDefault("charsets")
WIDTH, HEIGHT = 400, 400
@connordavenport
connordavenport / untitled_tabs.py
Created August 15, 2025 15:53
rename all tabs + unsaved fonts with valid attrs
from mojo.subscriber import Subscriber, registerRoboFontSubscriber, registerCurrentFontSubscriber, unregisterRoboFontSubscriber, unregisterCurrentFontSubscriber
import AppKit
class BASE:
def update_tabs(self, font):
if font:
has_values = True
for val in "familyName styleName".split(" "):
if not hasattr(font.info, val):
has_values = False
@connordavenport
connordavenport / open_font_with_ttx.py
Created June 17, 2025 16:33
a plugin for sublime text to open and edit a binary font as a ttx file
import sublime
import sublime_plugin
import os
import tempfile
from fontTools import ttx
PREFIX = ".st3_ttx."
SFNT_SUFFIXES = ".otf .ttf .woff .woff2".split(" ")
class OpenTTX(sublime_plugin.EventListener):
import more_itertools
def _as_list(item):
return list(more_itertools.always_iterable(item))
def _get_designspaces(self) -> list[str]:
return _as_list(self.lib.get('public.designspaces', []))
def _set_designspaces(self, new_designspace:str | list[str]):
self.lib['public.designspaces'] = _as_list(new_designspaces)
from mojo.subscriber import Subscriber, registerGlyphEditorSubscriber, unregisterGlyphEditorSubscriber, listRegisteredSubscribers
from mojo.UI import inDarkMode
class anchor_scrubber(Subscriber):
debug = False
def build(self):
editor = self.getGlyphEditor()
@connordavenport
connordavenport / space_center_alt_manager.py
Created April 24, 2025 16:27
swap out individual alternates in space center
from mojo.subscriber import Subscriber, registerRoboFontSubscriber
from mojo.UI import GlyphRecord
class space_center_alts_manager(Subscriber):
def started(self):
self.glyph = None
self.alternates = []
self.space_center = None
@connordavenport
connordavenport / real_world_pair_list.py
Last active March 18, 2025 13:20
a script to check if a touching pair exists in the real world
from touche import Touche
# uses Ondrej Jób's source data from Context of Diacritics via Setup Type
# and Nina Stössinger's Touche to check touching pairs in the current font.
# https://www.setuptype.com/x/cod/source/lists
real_world_pairs = '''
a aacute
a adieresis
a agrave