vim_completer.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import vim
  2. from vim_pandoc.bib.util import make_title_ascii, dict_to_info
  3. from vim_pandoc.bib.collator import SourceCollator
  4. from vim_pandoc.bib.citeproc import CiteprocCollator
  5. from vim_pandoc.bib.fallback import FallbackCollator
  6. def find_bibfiles():
  7. """
  8. Returns list of available bibliographies, using the generic collator.
  9. """
  10. args = { "fname" : vim.current.buffer.name,
  11. "sources" : vim.eval("g:pandoc#biblio#sources"),
  12. "extra_sources" : (vim.eval("g:pandoc#biblio#bibs"), vim.eval("b:pandoc_biblio_bibs")) }
  13. collator = SourceCollator(**args)
  14. return collator.find_bibfiles()
  15. class VimCompleter(object):
  16. def parse_suggestions(self, data):
  17. """
  18. Turns the output of the collators get_suggestions() methods into a dict
  19. like what vim completion functions use.
  20. """
  21. vim_suggestions = []
  22. for item in data:
  23. item_base = {"word": item['id'], "menu": make_title_ascii(item['title'])}
  24. if bool(int(vim.eval('g:pandoc#completion#bib#use_preview'))):
  25. item_base['info'] = dict_to_info(item)
  26. vim_suggestions.append(item_base)
  27. return vim_suggestions
  28. def get_suggestions(self, query):
  29. """
  30. Returns a dict with the suggestions available for the given query.
  31. """
  32. query = query.strip() # spaces around the query shouldn't be significant
  33. mode = vim.eval("g:pandoc#completion#bib#mode")
  34. args = { "fname" : vim.current.buffer.name,
  35. "query": query,
  36. "sources" : vim.eval("g:pandoc#biblio#sources"),
  37. "extra_sources" : (vim.eval("g:pandoc#biblio#bibs"), vim.eval("b:pandoc_biblio_bibs")) }
  38. if mode == "citeproc":
  39. collator = CiteprocCollator(**args)
  40. return self.parse_suggestions(collator.collate())
  41. elif mode == "fallback":
  42. collator = FallbackCollator(use_bibtool=bool(int(vim.eval("g:pandoc#biblio#use_bibtool"))), **args)
  43. # fallback methods output the correct data, so we don't need to parse.
  44. # NOTE: this will change in the future, so the completion backend
  45. # is frontend-agnostic.
  46. return collator.collate()