searchcode_code.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. # SPDX-License-Identifier: AGPL-3.0-or-later
  2. # lint: pylint
  3. """Searchcode (IT)
  4. """
  5. from json import loads
  6. from urllib.parse import urlencode
  7. # about
  8. about = {
  9. "website": 'https://searchcode.com/',
  10. "wikidata_id": None,
  11. "official_api_documentation": 'https://searchcode.com/api/',
  12. "use_official_api": True,
  13. "require_api_key": False,
  14. "results": 'JSON',
  15. }
  16. # engine dependent config
  17. categories = ['it']
  18. search_api = 'https://searchcode.com/api/codesearch_I/?'
  19. # special code-endings which are not recognised by the file ending
  20. code_endings = {'cs': 'c#', 'h': 'c', 'hpp': 'cpp', 'cxx': 'cpp'}
  21. # paging is broken in searchcode.com's API .. not sure it will ever been fixed
  22. # paging = True
  23. def request(query, params):
  24. args = urlencode(
  25. {
  26. 'q': query,
  27. # paging is broken in searchcode.com's API
  28. # 'p': params['pageno'] - 1,
  29. # 'per_page': 10,
  30. }
  31. )
  32. params['url'] = search_api + args
  33. logger.debug("query_url --> %s", params['url'])
  34. return params
  35. def response(resp):
  36. results = []
  37. search_results = loads(resp.text)
  38. # parse results
  39. for result in search_results.get('results', []):
  40. href = result['url']
  41. title = "" + result['name'] + " - " + result['filename']
  42. repo = result['repo']
  43. lines = {}
  44. for line, code in result['lines'].items():
  45. lines[int(line)] = code
  46. code_language = code_endings.get(
  47. result['filename'].split('.')[-1].lower(), result['filename'].split('.')[-1].lower()
  48. )
  49. # append result
  50. results.append(
  51. {
  52. 'url': href,
  53. 'title': title,
  54. 'content': '',
  55. 'repository': repo,
  56. 'codelines': sorted(lines.items()),
  57. 'code_language': code_language,
  58. 'template': 'code.html',
  59. }
  60. )
  61. # return results
  62. return results