You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
1.7 KiB
77 lines
1.7 KiB
import re
|
|
try:
|
|
import argcomplete
|
|
except ImportError:
|
|
|
|
class FakeModule:
|
|
|
|
@staticmethod
|
|
def _fun(*args, **kwargs):
|
|
pass
|
|
|
|
def __getattr__(self, _):
|
|
return self._fun
|
|
|
|
argcomplete = FakeModule()
|
|
|
|
from . import repo
|
|
|
|
|
|
def autocomplete(parser):
|
|
argcomplete.autocomplete(parser)
|
|
|
|
|
|
class BaseCompleter(object):
|
|
|
|
def __init__(self, conf):
|
|
self.conf = conf
|
|
|
|
def __call__(self, **kwargs):
|
|
try:
|
|
return self._complete(**kwargs)
|
|
except Exception as e:
|
|
argcomplete.warn(e)
|
|
|
|
|
|
class CiteKeyCompletion(BaseCompleter):
|
|
|
|
def _complete(self, **kwargs):
|
|
rp = repo.Repository(self.conf)
|
|
return rp.citekeys
|
|
|
|
|
|
class CiteKeyOrTagCompletion(BaseCompleter):
|
|
|
|
def _complete(self, **kwargs):
|
|
rp = repo.Repository(self.conf)
|
|
return rp.citekeys.union(rp.get_tags())
|
|
|
|
|
|
class TagModifierCompletion(BaseCompleter):
|
|
|
|
regxp = r"[^:+-]*$" # prefix of tag after last separator
|
|
|
|
def _complete(self, prefix, **kwargs):
|
|
tags = repo.Repository(self.conf).get_tags()
|
|
start, _ = re.search(self.regxp, prefix).span()
|
|
partial_expr = prefix[:start]
|
|
t_prefix = prefix[start:]
|
|
return [partial_expr + t for t in tags if t.startswith(t_prefix)]
|
|
|
|
|
|
class CommaSeparatedTagsCompletion(TagModifierCompletion):
|
|
|
|
regxp = r"[^,]*$"
|
|
|
|
|
|
class CommaSeparatedListCompletion(BaseCompleter):
|
|
|
|
values = []
|
|
|
|
def _complete(self, prefix, **kwargs):
|
|
split = prefix.split(',')
|
|
item_prefix = split[-1]
|
|
partial = split[:-1]
|
|
return [','.join(partial + [x]) for x in self.values
|
|
if x.startswith(item_prefix)]
|