-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathSnippetStore.py
149 lines (126 loc) · 5.28 KB
/
SnippetStore.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#!/usr/bin/env python
"""SnippetStore
Add text snippets as md file in folder, search them, and copy to clipboard."""
from albertv0 import *
import glob
import re
import os
from send2trash import send2trash
from subprocess import call
__iid__ = 'PythonInterface/v0.1'
__prettyname__ = 'SnippetStore'
__version__ = '0.1'
__trigger__ = 'sn '
__author__ = 'dynobo'
__bin__ = 'sh'
__dependencies__ = ['send2trash','xdotool']
SNIPPET_PATH = '/home/holger/cirrus/notes'
RECURSIVE = True
SNIPPET_EXT = 'md'
iconPath = iconLookup('gedit')
class snippets():
def __init__(self, *args, **kwargs):
self.path = args[0].rstrip('/')
self.snippets_store = []
def score(self, query, text):
score = 0
score += len(re.findall('\b{}\b'.format(query), text.lower()))
score += len(re.findall('\b{}'.format(query), text.lower()))
score += text.lower().count(query)
return score
def search(self, query):
results = []
# Calculate scores
for snippet in self.snippets_store:
temp = snippet.copy()
temp['score'] = self.score(query, snippet['title']) * 2
temp['score'] += self.score(query, snippet['subtitle']) * 1.5
temp['score'] += self.score(query, snippet['text'])
temp['score'] += self.score(query, snippet['file']) * 0.5
if temp['score'] > 0:
results.append(temp)
# Sort by scores
results = sorted(results, key=lambda k: k['score'], reverse=True)
return results
def update_store(self):
# Clear snippets
self.snippets_store = []
# Find markdown files
files = []
for filename in glob.iglob(self.path + '**/*.{}'.format(SNIPPET_EXT), recursive=RECURSIVE):
files.append(filename)
# Read markdown files
for snippet_file in files:
with open(snippet_file, 'r') as f:
# Parse snippet
content = f.readlines()
filepath = snippet_file.strip()
title = content[0].strip('>').strip()
if content[1][0] == '>': # has subtitle
subtitle = content[1][1:].strip()
text = os.linesep.join(content[2:]).strip()
else:
subtitle = content[1].strip()
text = os.linesep.join(content[1:]).strip()
# Append to snippet store
self.snippets_store.append({
'file': filepath,
'title': title,
'subtitle': subtitle,
'text': text,
})
info('[{}] Indexed {} snippet files.'.format(__prettyname__, len(self.snippets_store)))
snippets = snippets(SNIPPET_PATH)
def paste_directly(text):
text = text.replace('\n\n','\r')
os.system('sleep 0.02 && xdotool type "'+ text + '" &')
return
def initialize():
try:
snippets.update_store()
except Exception as e:
critical(str(e))
def handleQuery(query):
results = []
if query.isTriggered:
try:
if query.string.strip():
def copyToClipboard(text):
p = subprocess.Popen(
['xclip', '-selection', 'c'], stdin=subprocess.PIPE)
p.communicate(input=bytes(text, 'utf-8'))
for snippet in snippets.search(query.string.lower()):
results.append(
Item(id='%s%s' % (__prettyname__, snippet),
icon=iconPath,
#text=str(snippet['score']) + ' - ' + snippet['title'],
text=snippet['title'],
subtext=snippet['subtitle'][:120],
completion=query.rawString,
actions=[
FuncAction('Paste directly',
lambda snippet=snippet: paste_directly(snippet['text'])),
ClipAction(text='Copy to Clipboard',
clipboardText=snippet['text']),
UrlAction(
'Open in Editor', 'file://{}'.format(snippet['file'])),
FuncAction('Move to Recycle Bin',
lambda snippet=snippet: send2trash(snippet['file']))
]))
else:
results.append(Item(id='%s-create' % __prettyname__,
icon=iconPath,
text=__prettyname__,
subtext='Open Folder containing Snippets',
completion=query.rawString,
actions=[
UrlAction(
'Open', 'file://{}'.format(SNIPPET_PATH)),
FuncAction(
'Update Index', snippets.update_store)
]
)
)
except Exception as e:
critical(str(e))
return results