summary refs log tree commit diff stats
path: root/web/nimblepkglist.nim
blob: 870944ab020b4d0e031e7e5a6841694ba27d2389 (plain) (blame)
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
import base64, strutils, json, htmlgen, dom, algorithm

type
  TData = object
    content {.importc.}: cstring

proc decodeContent(content: string): string =
  result = ""
  for line in content.splitLines:
    if line != "":
      result.add decode(line)

proc contains(x: seq[JSonNode], s: string): bool =
  for i in x:
    assert i.kind == JString
    if i.str == s: return true

proc processContent(content: string) =
  var jsonDoc = parseJson(content)
  assert jsonDoc.kind == JArray
  var jsonArr = jsonDoc.elems

  jsonArr.sort do (x, y: JsonNode) -> int:
    strutils.cmpIgnoreCase(x["name"].str, y["name"].str)

  var
    officialList = ""
    officialCount = 0
    unofficialList = ""
    unofficialCount = 0
  let
    endings = {'.', '!'}

  for pkg in jsonArr:
    assert pkg.kind == JObject
    if not pkg.hasKey"url": continue
    let pkgWeb =
      if pkg.hasKey("web"): pkg["web"].str
      else: pkg["url"].str
    let
      desc = pkg["description"].str
      dot = if desc.high > 0 and desc[desc.high] in endings: "" else: "."
      listItem = li(a(href=pkgWeb, pkg["name"].str), " ", desc & dot)
    if pkg["url"].str.startsWith("https://github.com/nim-lang") or
       pkg["url"].str.startsWith("git://github.com/nim-lang") or
       "official" in pkg["tags"].elems:
      officialCount.inc
      officialList.add listItem & "\n"
    else:
      unofficialCount.inc
      unofficialList.add listItem & "\n"

  var officialPkgListDiv = document.getElementById("officialPkgList")

  officialPkgListDiv.innerHTML =
    p("There are currently " & $officialCount &
      " official packages in the Nimble package repository.") &
    ul(officialList)

  var unofficialPkgListDiv = document.getElementById("unofficialPkgList")

  unofficialPkgListDiv.innerHTML =
    p("There are currently " & $unofficialCount &
      " unofficial packages in the Nimble package repository.") &
    ul(unofficialList)

proc gotPackageList(apiReply: TData) {.exportc.} =
  let decoded = decodeContent($apiReply.content)
  try:
    processContent(decoded)
  except:
    var officialPkgListDiv = document.getElementById("officialPkgList")
    var unofficialPkgListDiv = document.getElementById("unofficialPkgList")
    let msg = p("Unable to retrieve package list: ",
      code(getCurrentExceptionMsg()))
    officialPkgListDiv.innerHTML = msg
    unofficialPkgListDiv.innerHTML = msg