-
-
Save zhuqling/fb76a40d110a3e29d417870a0627b077 to your computer and use it in GitHub Desktop.
FontInstaller
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# FontInstaller (by @olemoritz) | |
# This script installs a custom TTF font on iOS (system-wide). | |
# It can be used in one of two ways: | |
# 1. Simply run it in Pythonista, you'll be prompted for the URL of the font | |
# you'd like to install (if there's a URL in the clipboard, it'll be used by default) | |
# 2. Use it as an 'Open in...' handler, i.e. select this file in Pythonista's 'Open in... | |
# menu' setting. This way, you can simply download a ttf file in Safari and open it in | |
# Pythonista. The script will then automatically install the downloaded font. | |
# The script is inspired by the AnyFont app (https://itunes.apple.com/us/app/anyfont/id821560738) | |
# and the iOS integration of MyFonts (http://meta.myfonts.com/post/80802984786/install-fonts-from-myfonts-on-ios-7-devices) | |
import plistlib | |
import BaseHTTPServer | |
import webbrowser | |
import uuid | |
import urllib | |
import sys | |
import console | |
import clipboard | |
import os | |
# Request handler for serving the config profile: | |
class ConfigProfileHandler (BaseHTTPServer.BaseHTTPRequestHandler): | |
config = None | |
def do_GET(s): | |
s.send_response(200) | |
s.send_header('Content-Type', 'application/x-apple-aspen-config') | |
s.end_headers() | |
plist_string = plistlib.writePlistToString(ConfigProfileHandler.config) | |
s.wfile.write(plist_string) | |
def log_message(self, format, *args): | |
pass | |
def run_server(config): | |
ConfigProfileHandler.config = config | |
server_address = ('', 0) | |
httpd = BaseHTTPServer.HTTPServer(server_address, ConfigProfileHandler) | |
sa = httpd.socket.getsockname() | |
# Point Safari to the local http server: | |
webbrowser.open('safari-http://localhost:' + str(sa[1])) | |
# Handle a single request, then stop the server: | |
httpd.handle_request() | |
def main(): | |
label = 'Custom Font' | |
if len(sys.argv) < 2: | |
# No command-line argument, use an input dialog for entering a URL: | |
default_url = 'http://' | |
clip = clipboard.get() | |
if clip and clip.startswith('http'): | |
default_url = clip | |
font_url = console.input_alert('Font URL', 'Please enter the full URL of the TTF file.', default_url) | |
font_data = urllib.urlopen(font_url).read() | |
label = font_url.split('/')[-1].split('.')[0] | |
else: | |
# The script was triggered by the 'Open in...' menu: | |
font_path = sys.argv[1] | |
label = os.path.split(font_path)[1] | |
if os.path.splitext(font_path)[1].lower() != '.ttf': | |
print 'Not a ttf file.' | |
return | |
with open(font_path, 'r') as f: | |
font_data = f.read() | |
# Create the configuration profile: | |
unique_id = uuid.uuid4().urn[9:].upper() | |
config = {'PayloadContent': [{ | |
'Font': plistlib.Data(font_data), | |
'PayloadIdentifier': 'com.omz-software.font.' + unique_id, | |
'PayloadOrganization': 'omz:software', | |
'PayloadType': 'com.apple.font', | |
'PayloadUUID': unique_id, 'PayloadVersion': 1}], | |
'PayloadDescription': label, | |
'PayloadDisplayName': label, | |
'PayloadIdentifier': 'com.omz-software.font.' + unique_id, | |
'PayloadOrganization': 'omz:software', | |
'PayloadRemovalDisallowed': False, | |
'PayloadType': 'Configuration', | |
'PayloadUUID': unique_id, | |
'PayloadVersion': 1} | |
run_server(config) | |
if __name__ == '__main__': | |
main() | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment