예제 #1
0
 def __init__(self):
     """Workflow data represenative
     """
     self.wf_directory = Tools.getEnv('alfred_preferences') + "/workflows"
     exclude_disabled = Tools.getEnv('exclude_disabled').lower()
     self.exclude_disabled = True if exclude_disabled == "true" else False
     self.workflows = self._get_workflows_list()
def getDefaultTemplate():
    """
    Read default template setting from environment variable
    :return: default template file name
    """
    template = Tools.getEnv('default_template')
    return 'template.md' if template == str() else template
def getTemplate():
    # Get template path from previous wf step
    template = Tools.getEnv('template_path')
    notes_path = md.getNotesPath()
    default_template = getDefaultTemplate()
    return Tools.strJoin(notes_path,
                         default_template) if template == str() else template
def getDefaultDate():
    """
    Read default date format from environment variable
    :return: default date format file name or default format
    """
    d = Tools.getEnv('default_date_format')
    return "%d.%m.%Y %H.%M" if d == str() else d
예제 #5
0
def get_cache_directory():
    """Get Alfreds Cache Directory, if not existent the directory will be created

    Returns:
        str: Cache Directory
    """
    target_dir = Tools.getEnv('alfred_workflow_cache')
    if not (os.path.isdir(target_dir)):
        os.mkdir(target_dir)
    return target_dir
예제 #6
0
    def getUrlScheme(f):
        """
        Gets the URL Scheme setup in Alfred Preferences

        Args:
            f(str): md file to add at the end of url scheme

        Returns:
            str: URL scheme
        """
        url_scheme = Tools.getEnv('url_scheme')
        return Tools.strJoin(url_scheme, urllib.pathname2url(f))
def create_hint_file(wf_dir,content):
        target_dir = Tools.getEnv('alfred_workflow_cache')
        if not(os.path.isdir(target_dir)):
                os.mkdir(target_dir)
        spath = os.path.normpath(wf_dir).split(os.sep)
        wf_dir_name = ''.join([i for i in spath if str(i).startswith('user.workflow')])
        if wf_dir_name != str():
                target_file = target_dir + '/' + wf_dir_name + '.md'
                if os.path.isfile(target_file):
                        os.remove(target_file)
                with open(target_file, "w+") as f:
                        f.write(content)
                        return target_file
def readTemplate(file_path, **kwargs):
    template_tag = Tools.getEnv('template_tag')
    if '#' not in template_tag or template_tag == str():
        template_tag = '#Template'
    if os.path.exists(file_path):
        with open(file_path, "r") as f:
            content = f.read()
    else:
        content = fallback_content()
    content = content.replace(template_tag, '')
    for k, v in kwargs.iteritems():
        content = content.replace('{' + k + '}', v)
    return content
예제 #9
0
#!/usr/bin/env python
# encoding: utf-8

from Alfred import Items, Tools
from Notes import Search
from urllib import pathname2url
import os

items = Items()
query = Tools.getEnv("path_query2")
search = Search()
note_path = Tools.getEnv("path_query1")
note_title = search.getNoteTitle(note_path)
filename = pathname2url(os.path.basename(note_path))
back_query = "<EMPTY>" if not query else query

actions = [
    {
        "arg": "back|{0}".format(query),
        "icon": "icons/back.png",
        "subtitle": "Back to Search with query: {0}".format(back_query),
        "title": "Back",
    },
    {
        "arg": u"markdown_link|[{0}]({1})".format(note_title, filename),
        "icon": "icons/link.png",
        "subtitle": u"Copy a Markdown Link for \"{0}\" to the Clipboard".format(note_title),
        "title": "Markdown Link",
    },
    {
        "arg": u"wiki_link|[[{0}]]".format(note_title),
예제 #10
0
#!/usr/bin/python

import os
import sys

from Alfred import Tools

f_path = Tools.getEnv('path')

if os.path.isdir(f_path):
    sys.stdout.write("DIR")
if f_path.endswith(".code-workspace") and os.path.isfile(f_path):
    sys.stdout.write("FILE")
else:
    pass
예제 #11
0
 def getTemplateTag(self):
     tt = Tools.getEnv('template_tag')
     if '#' not in tt or tt == str():
         tt = '#template'
     return tt
        file_list.extend(f_lst)
    return file_list


def get_dirs(r_path):
    dir_list = list()
    for p in os.listdir(r_path):
        if os.path.isdir(r_path):
            d = "{0}/{1}".format(r_path, p)
            dir_list.append(d)
    return dir_list


sys.stderr.write(platform.python_version())

f_path = Tools.getEnv('path')
ws_home = f_path if f_path else os.path.expanduser(
    Tools.getEnv('workspaces_home'))
p_path = str(
    PurePath(f_path).parent
) if f_path and f_path != Tools.getEnv('workspaces_home') else str()

query = Tools.getArgv(1)
if query == str():
    it = sorted(get_dirs(ws_home))
else:
    it = sorted(get_files(ws_home))

wf = Items()
if p_path:
    wf.setItem(title='Back', arg=p_path)
예제 #13
0
 def getUrlScheme(f):
     url_scheme = Tools.getEnv('url_scheme')
     return Tools.strJoin(url_scheme, urllib.pathname2url(f))
예제 #14
0
    tt = Tools.getEnv('template_tag')
    if '#' not in tt or tt == str():
        tt = '#Template'
    return tt


SUFFIX = " (DEFAULT)"

# create MD search object
my_notes = MyNotes.Search()

# Load env variables
ext = my_notes.getNotesExtension()
p = my_notes.getNotesPath()
query = Tools.getArgv(1)
default_template = Tools.getEnv('default_template')
template_tag = get_template_tag()

# Get Files sorted in Notes directory
all_files = my_notes.getFilesListSorted()
template_files = sorted(all_files, key=lambda x: x['filename'] != default_template)

wf = Items()
for md_file in template_files:
    if my_notes.isNoteTagged(md_file['path'], template_tag) and query in md_file['filename']:
        suffix = str()
        if md_file['filename'] == default_template:
            suffix = SUFFIX
        wf.setItem(
            title=md_file['filename'] + suffix,
            subtitle="Create new file based on \"{0}\"".format(md_file['filename']),
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import sys

from Alfred import Tools
from MyNotes import NewNote
from QuerySplitter import QuerySplitter

reload(sys)
sys.setdefaultencoding('utf-8')
query = Tools.getArgv(1).encode('utf-8')
# Read template path from previous wf step in case template ws choosen
template = Tools.getEnv('template_path')
if query.isspace():
    query = "My Note {today}".format(today=NewNote.getTodayDate(
        fmt='%d-%m-%Y %H-%M-%S'))
qs = QuerySplitter(query)

if query:
    Note = NewNote(qs.title, template_path=template, tags=qs.tags)
    fPath = Note.create_note()
    sys.stdout.write(fPath)
예제 #16
0
                subtitle=u"Value: {0} (\u21E7 for Help)".format(v_subtitle),
                title=variable,
            )
            icon = 'icons/check.png' if value != str(
            ) else 'icons/question.png'
            items.setIcon(icon, 'image')
            items.addItem()


def write_config(key, val):
    value = Tools.normalize(val)
    Plist().setVariable(key, value)


query = Tools.getArgv(1)
action_key_value = Tools.getEnv('action_key_value')
[action, key,
 value] = action_key_value.split('|') if action_key_value != str() else [
     str(), str(), str()
 ]
workflow_dir = os.getcwd()
query = Tools.getArgv(1)

items = Items()

if action == str():
    print_config(query)
elif action == 'selection':
    get_selection(key, query)
else:
    write_config(key, value)
예제 #17
0
#!/usr/bin/python

import json
import os

from Alfred import Items, Tools

# 1Password Cache Dir
CACHE_BASE_DIR = "Library/Containers/com.agilebits.onepassword7/Data/Library/Caches/Metadata/1Password"
user_dir = os.path.expanduser('~')
pass_lib = os.path.join(user_dir, CACHE_BASE_DIR)

query = Tools.getArgv(1)
vaults = Tools.getEnv('vaultNames').split(',')


def get_passwords(pass_lib):
    """
    Get all Password items stored in 1Password

    Args:
        pass_lib (str): Path to 1Password libraries including user roort

    Returns:
        list(dict): list of dictonaries contain all Passwords
    """
    passwords = list()
    for r, d, f in os.walk(pass_lib):
        for file in f:
            file_path = os.path.join(r, file)
            with open(file_path, 'r') as content:
def get_workflow_plist_paths():
        alfred_dir = Tools.getEnv('alfred_preferences') + "/workflows"
        workflow_dir_names = os.listdir(alfred_dir)
        return [alfred_dir + '/' + f + '/info.plist' for f in workflow_dir_names if os.path.isfile(alfred_dir + '/' + f + '/info.plist')]
        spath = os.path.normpath(wf_dir).split(os.sep)
        wf_dir_name = ''.join([i for i in spath if str(i).startswith('user.workflow')])
        if wf_dir_name != str():
                target_file = target_dir + '/' + wf_dir_name + '.md'
                if os.path.isfile(target_file):
                        os.remove(target_file)
                with open(target_file, "w+") as f:
                        f.write(content)
                        return target_file

INPUT_TYPES = [
        'alfred.workflow.input.scriptfilter',
        'alfred.workflow.input.keyword'
        ]
alf = Items()
exclude_disabled = Tools.getEnv('exclude_disabled').lower()
exclude_disabled = True if exclude_disabled == "true" else False
workflow_plist_lists =  get_workflow_plist_paths()
for wf in workflow_plist_lists:
        plist_config = get_plist_info(wf)
        if exclude_disabled and plist_config['disabled']:
                continue
        wf_object = plist_config['objects']
        kf = KeywordFormatter()
        for o in wf_object:
                item_type = o.get('type')
                if item_type in INPUT_TYPES:
                        item_config = o.get('config')
                        keyword = item_config.get('keyword')
                        title = item_config.get('title')
                        text = item_config.get('text')
예제 #20
0
def get_template_tag():
    tt = Tools.getEnv('template_tag')
    if '#' not in tt or tt == str():
        tt = '#Template'
    return tt
예제 #21
0
    def search(query, dict_list):
        """
        Search string in a list of Dict
        :param query: str()
        :param dict_list: list(dict())
        :return: list(dict())
        """
        seq = list()
        for d in dict_list:
            if d['filename'].lower().startswith(query.lower()):
                seq.append(d)
        return seq


# Load Env, Argv and set working path
t_dir = Tools.getEnv('directory')
search_subfolders = True if Tools.getEnv(
    'search_subfolders') == "True" else False
working_path = t_dir
query = Tools.getArgv(1)
date_format = Tools.getEnv('date_format')

# Read file list deep and normal
files_in_directory = None
file_list = list()
if working_path:
    rf = RecentFiles(working_path)
    files_in_directory = rf.getRecentFilesDeep(
        reverse=True) if search_subfolders else rf.getRecentFiles(reverse=True)
    file_list = RecentFiles.search(query, files_in_directory) if bool(
        query) and files_in_directory else files_in_directory
예제 #22
0
#!/usr/bin/python
from Alfred import Items, Tools
from Workflows import Workflows

wf = Workflows()
alf = Items()
wpath = Tools.getEnv('plist_path') + "/info.plist"

keyword_list = wf.get_item(wpath).get('keywords')
if keyword_list:
    for k in keyword_list:
        withspace = k.get('withspace')
        keyw = k.get('keyword')
        keyword = '{0} '.format(keyw) if withspace and keyw else keyw
        title = k.get('title')
        text = k.get('text')
        if keyword:
            alf.setItem(title=title,
                        subtitle=u'Press \u23CE to proceed with Keyword: %s' %
                        keyword,
                        arg=keyword)
            alf.setIcon('icons/start.png', m_type='image')
            alf.addItem()
else:
    alf.setItem(title="This workflow has not keywords defined", valid=False)
alf.write()
예제 #23
0
#!/usr/bin/env python
# encoding: utf-8

from Alfred import Tools
import re
import sys

def replace(file, pattern, subst):
    file_handle = open(file, 'r')
    file_string = file_handle.read()
    file_handle.close()
    file_string = (re.sub(pattern, subst, file_string))
    file_handle = open(file, 'w')
    file_handle.write(file_string)
    file_handle.close()

path = Tools.getArgv(1)
todo = Tools.getEnv('todo')
status = Tools.getEnv('todo_status')
query = Tools.getEnv('todo_query')

old_val = ' ' if status == 'pending' else 'x'
new_val = ' ' if old_val == 'x' else 'x'

replace(path, "([-|\*] \[){0}(\] {1})".format(old_val, todo), "\\1{0}\\2".format(new_val))

sys.stdout.write(query)
예제 #24
0
#!/usr/bin/python

from Alfred import Items, Tools

target_dir = Tools.getEnv('directory')

wf = Items()
# Back Item
wf.setItem(title="BACK",
           subtitle="Back to List",
           arg='{0}|{1}'.format(target_dir, "BACK"))
wf.setIcon(m_path="back.png", m_type="image")
wf.addItem()

# Purge Dir Item
wf.setItem(title="Purge Directory",
           subtitle='Purge "{}"'.format(target_dir),
           arg='{0}|{1}'.format(target_dir, "PURGE"))
wf.setIcon(m_path="purge.png", m_type="image")
wf.addItem()

# Delete Item
wf.setItem(title="Remove Folder",
           subtitle='Remove "{}" from configuration'.format(target_dir),
           arg='{0}|{1}'.format(target_dir, "DELETE"))
wf.setIcon(m_path="delete.png", m_type="image")
wf.addItem()

wf.write()
예제 #25
0
#!/usr/bin/env python
# encoding: utf-8

from Alfred import Tools
from Notes import Note, Search
from QuerySplitter import QuerySplitter
import sys

reload(sys)
sys.setdefaultencoding('utf-8')

query = Tools.getArgv(1).encode('utf-8')
clipboard = Tools.getEnv('clipboard')
template = Tools.getEnv('template')
paste = Tools.getEnv('paste')

qs = QuerySplitter(query)

if query:
    note = Note(
        content=str() if not paste else clipboard,
        tags=qs.tags,
        template_path=template,
        title=qs.title,
        zettel_id=qs.zettel_id,
    )
    file_path = note.createNote()
    output = Search().getNoteFilename(file_path)

    sys.stdout.write(output)
예제 #26
0
    @staticmethod
    def console_log(msg):
        # Create a custom logger
        logger = logging.getLogger(__name__)
        # Create handlers
        c_handler = logging.StreamHandler()
        c_handler.setLevel(logging.WARN)
        # Create formatters and add it to handlers
        c_format = logging.Formatter('%(message)s')
        c_handler.setFormatter(c_format)
        # Add handlers to the logger
        logger.addHandler(c_handler)
        logger.warn(msg)


auth_token = Tools.getEnv('evernote_auth_token')
f_path = Tools.getArgv(1)
# f_path = '/Users/jjung/Documents/Notes/test evernote import.md'
if auth_token == str():
    Tools.notify('Evernote authentication error',
                 'Set Evernote AuthToken in worfklow configuration!')
    sys.exit("Error")
elif f_path != str():
    p = EvernoteUpload(auth_token)
    note_app_link = p.upload_to_notebook(f_path, 'Inbox')
    if note_app_link is not str():
        Tools.notify('Upload in progress',
                     'The Note will be opened once uploaded!')
        sys.stdout.write(note_app_link)
    else:
        Tools.notify("Something went wrong")
#!/usr/bin/python
# -*- coding: utf-8 -*-

import os
from urllib import pathname2url

from Alfred import Items, Tools
from MyNotes import Search

# Get NotePath as path_query env variable
note_path = Tools.getEnv("path_query1")
# Get query used in search markdown notes as path_query env variable
query = Tools.getEnv("path_query2")
md_notes = Search()
# Get NoteTitle for specific note
note_title = md_notes.getNoteTitle(note_path)
file_name = pathname2url(os.path.basename(note_path))
# If query in notes search was empty subtitle uses following string
back_query = "<EMPTY>" if not query else query

# Actions in ScriptFilter menu data
ACTIONS = [
    {
        "title": "Back",
        "subtitle": "Back to Search with query: {0}".format(back_query),
        "arg": "{0}|{1}".format("back", query),
        "icon": "icons/back.png",
        "visible": True
    },
    {
        "title": "Markdown Link",
예제 #28
0
#!/usr/bin/python
# -*- coding: utf-8 -*-

from Alfred import Items, Tools
from MyNotes import Search

query = Tools.getArgv(1)
bmt = Tools.getEnv('bookmark_tag')
bookmark_tag = bmt if bmt.startswith('#') else '#' + bmt

search_terms = '{0}&{1}'.format(bookmark_tag, query) if query else bookmark_tag

notes = Search()
search_terms, _ = notes.get_search_config(search_terms)
matches = notes.url_search(search_terms)

alf = Items()
if matches:
    for m in matches:
        note_title = m.get('title')
        note_path = m.get('path')
        links = m.get('links')
        for l in links:
            url_title = l.get('url_title')
            url = l.get('url')
            # subtitle = '%s > %s' % (url_title, url) if url_title != url else url
            subtitle = 'NOTE: {0} URL: {1}...'.format(note_title, url[:30])
            alf.setItem(
                title=url_title,
                subtitle=subtitle,
                arg=url,
#!/usr/bin/python

from Alfred import Items, Tools
from MyNotes import Search

query = Tools.getArgv(1)
bookmark_tag = '#' + Tools.getEnv('bookmark_tag')

search_terms = [bookmark_tag, query] if query else [bookmark_tag]

notes = Search()
matches = notes.url_search(search_terms)

alf = Items()
if matches:
    for m in matches:
        note_title = m['title']
        note_path = m['path']
        links = m['links']
        for l in links:
            url_title = l['url_title']
            url = l['url']
            # subtitle = '%s > %s' % (url_title, url) if url_title != url else url
            subtitle = 'NOTE: {0} URL: {1}...'.format(note_title, url[:30])
            alf.setItem(title=url_title,
                        subtitle=subtitle,
                        arg=url,
                        quicklookurl=url)
            alf.addMod('cmd',
                       note_path,
                       'Open MD Note',