Skip to content

Instantly share code, notes, and snippets.

View connordavenport's full-sized avatar

Connor Davenport connordavenport

View GitHub Profile
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
@connordavenport
connordavenport / custom_xHeight_manager.py
Last active March 10, 2025 16:09
draw custom metric guides in the glyph view
import math
from mojo.events import postEvent
from mojo.subscriber import Subscriber, registerGlyphEditorSubscriber, unregisterGlyphEditorSubscriber, listRegisteredSubscribers
from lib.tools.defaults import getDefault
from fontTools.misc import transform
border = getDefault("glyphViewVerticalPadding")
fontsize = getDefault("textFontSize")
metricsStroke = getDefault("glyphViewFontMetricsStrokeColor")
@connordavenport
connordavenport / RGlyph_Export.py
Created February 21, 2025 21:28
RGlyph getter/setter for skip export
from mojo.roboFont import RGlyph
def _setExport(self, export):
skipExportGlyphs = set(self.font.lib.get("public.skipExportGlyphs", []))
if export == False:
skipExportGlyphs.add(self.name)
elif export == True:
if self.name in skipExportGlyphs:
skipExportGlyphs.remove(self.name)
else:
@connordavenport
connordavenport / set_contextual_mark_colors.py
Last active February 21, 2025 18:56
a contextual menu for setting glyph mark colors
from mojo.subscriber import Subscriber, registerRoboFontSubscriber, unregisterRoboFontSubscriber
from mojo.UI import getDefault
from AppKit import NSMenuItem
from mojo.tools import CallbackWrapper
import ezui
class set_contextual_mark_colors(Subscriber):
debug = True
@connordavenport
connordavenport / RGlyph_FullBounds.py
Created February 20, 2025 19:24
Custom RGlyph `bounds` property that takes anchors into account
'''
Custom RGlyph `bounds` property that takes anchors into account
'''
@property
def full_bounds(self):
bounds = list(self.bounds)
for anchor in self.anchors:
if anchor.x < bounds[0]:
bounds[0] = anchor.x
if anchor.x > bounds[2]:
@connordavenport
connordavenport / set_feature_smart_sets_on_open.py
Created February 19, 2025 18:29
add smart sets from internal feature file on opening
from mojo.subscriber import Subscriber, registerRoboFontSubscriber
from vanilla import *
import AppKit
import os
from compositor.textUtilities import convertCase
from defconAppKit.windows.baseWindow import BaseWindowController
from defconAppKit.controls.openTypeControlsView import OpenTypeControlsView
from defconAppKit.controls.glyphSequenceEditText import GlyphSequenceEditText
@connordavenport
connordavenport / CustomMeasureTool.py
Last active May 11, 2024 09:58
custom measure tool to include guidelines
import math
import merz
from mojo.UI import PostBannerNotification, getDefault, setDefault, UpdateCurrentGlyphView, getGlyphViewDisplaySettings, setGlyphViewDisplaySettings, preferencesChanged, inDarkMode
from mojo.subscriber import Subscriber, registerGlyphEditorSubscriber, unregisterGlyphEditorSubscriber, listRegisteredSubscribers
from ufoProcessor.emptyPen import DecomposePointPen
class CustomMeasureTool(Subscriber):
debug = True
font("Zapata-Light")
w,h,b,o,i,q=width(),height(),(0,.05,.1),(.9,.2,0),0,.75
def nfs(wi,wd):
fontSize(20)
return(wd/textSize(wi)[0])*20
fill(*b)
rect(0,0,w,h)
for wr in "YOU NEED PYTHON".split():
fill(*o)if wr[0]!="P"else fill(1)
fs=nfs(wr,w-40)