-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Lee
committed
Nov 29, 2017
1 parent
4bd35a8
commit 6decae2
Showing
9 changed files
with
1,135 additions
and
0 deletions.
There are no files selected for viewing
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
# -*- coding: utf-8 -*- | ||
import itertools | ||
import os | ||
import plistlib | ||
import unicodedata | ||
import sys | ||
|
||
from xml.etree.ElementTree import Element, SubElement, tostring | ||
|
||
""" | ||
You should run your script via /bin/bash with all escape options ticked. | ||
The command line should be | ||
python yourscript.py "{query}" arg2 arg3 ... | ||
""" | ||
UNESCAPE_CHARACTERS = u""" ;()""" | ||
|
||
_MAX_RESULTS_DEFAULT = 9 | ||
|
||
preferences = plistlib.readPlist('info.plist') | ||
bundleid = preferences['bundleid'] | ||
|
||
class Item(object): | ||
@classmethod | ||
def unicode(cls, value): | ||
try: | ||
items = value.iteritems() | ||
except AttributeError: | ||
return unicode(value) | ||
else: | ||
return dict(map(unicode, item) for item in items) | ||
|
||
def __init__(self, attributes, title, subtitle, icon=None): | ||
self.attributes = attributes | ||
self.title = title | ||
self.subtitle = subtitle | ||
self.icon = icon | ||
|
||
def __str__(self): | ||
return tostring(self.xml(), encoding='utf-8') | ||
|
||
def xml(self): | ||
item = Element(u'item', self.unicode(self.attributes)) | ||
for attribute in (u'title', u'subtitle', u'icon'): | ||
value = getattr(self, attribute) | ||
if value is None: | ||
continue | ||
if len(value) == 2 and isinstance(value[1], dict): | ||
(value, attributes) = value | ||
else: | ||
attributes = {} | ||
SubElement(item, attribute, self.unicode(attributes)).text = unicode(value) | ||
return item | ||
|
||
def args(characters=None): | ||
return tuple(unescape(decode(arg), characters) for arg in sys.argv[1:]) | ||
|
||
def config(): | ||
return _create('config') | ||
|
||
def decode(s): | ||
return unicodedata.normalize('NFD', s.decode('utf-8')) | ||
|
||
def uid(uid): | ||
return u'-'.join(map(unicode, (bundleid, uid))) | ||
|
||
def unescape(query, characters=None): | ||
for character in (UNESCAPE_CHARACTERS if (characters is None) else characters): | ||
query = query.replace('\\%s' % character, character) | ||
return query | ||
|
||
def work(volatile): | ||
path = { | ||
True: '~/Library/Caches/com.runningwithcrayons.Alfred-2/Workflow Data', | ||
False: '~/Library/Application Support/Alfred 2/Workflow Data' | ||
}[bool(volatile)] | ||
return _create(os.path.join(os.path.expanduser(path), bundleid)) | ||
|
||
def write(text): | ||
sys.stdout.write(text) | ||
|
||
def xml(items, maxresults=_MAX_RESULTS_DEFAULT): | ||
root = Element('items') | ||
for item in itertools.islice(items, maxresults): | ||
root.append(item.xml()) | ||
return tostring(root, encoding='utf-8') | ||
|
||
def _create(path): | ||
if not os.path.isdir(path): | ||
os.mkdir(path) | ||
if not os.access(path, os.W_OK): | ||
raise IOError('No write access: %s' % path) | ||
return path |
Oops, something went wrong.