summary refs log tree commit diff stats
path: root/lib/std/jsheaders.nim
blob: 6fd3b3468d049eae6363ef75dd51ce161a0c7aad (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
78
79
80
81
82
83
## - HTTP Headers for the JavaScript target: https://developer.mozilla.org/en-US/docs/Web/API/Headers
when not defined(js):
  {.fatal: "Module jsheaders is designed to be used with the JavaScript backend.".}

type Headers* = ref object of JsRoot ## HTTP Headers API.

func newHeaders*(): Headers {.importjs: "new Headers()".}
  ## https://developer.mozilla.org/en-US/docs/Web/API/Headers

func add*(self: Headers; key: cstring; value: cstring) {.importjs: "#.append(#, #)".}
  ## Allows duplicated keys.
  ## https://developer.mozilla.org/en-US/docs/Web/API/Headers/append

func delete*(self: Headers; key: cstring) {.importjs: "#.$1(#)".}
  ## https://developer.mozilla.org/en-US/docs/Web/API/Headers/delete
  ##
  ## .. warning:: Delete *all* items with `key` from the headers, including duplicated keys.

func hasKey*(self: Headers; key: cstring): bool {.importjs: "#.has(#)".}
  ## https://developer.mozilla.org/en-US/docs/Web/API/Headers/has

func keys*(self: Headers): seq[cstring] {.importjs: "Array.from(#.$1())".}
  ## https://developer.mozilla.org/en-US/docs/Web/API/Headers/keys

func values*(self: Headers): seq[cstring] {.importjs: "Array.from(#.$1())".}
  ## https://developer.mozilla.org/en-US/docs/Web/API/Headers/values

func entries*(self: Headers): seq[tuple[key, value: cstring]] {.importjs: "Array.from(#.$1())".}
  ## https://developer.mozilla.org/en-US/docs/Web/API/Headers/entries

func `[]`*(self: Headers; key: cstring): cstring {.importjs: "#.get(#)".}
  ## Get *all* items with `key` from the headers, including duplicated values.
  ## https://developer.mozilla.org/en-US/docs/Web/API/Headers/get

func `[]=`*(self: Headers; key: cstring; value: cstring) {.importjs: "#.set(#, #)".}
  ## Do *not* allow duplicated keys, overwrites duplicated keys.
  ## https://developer.mozilla.org/en-US/docs/Web/API/Headers/set

func clear*(self: Headers) {.importjs:
  "(() => { const header = #; Array.from(header.keys()).forEach((key) => header.delete(key)) })()".}
  ## Convenience func to delete all items from `Headers`.

func toCstring*(self: Headers): cstring {.importjs: "JSON.stringify(Array.from(#.entries()))".}
  ## Returns a `cstring` representation of `Headers`.

func `$`*(self: Headers): string = $toCstring(self)

func len*(self: Headers): int {.importjs: "Array.from(#.entries()).length".}


runnableExamples("-r:off"):

  block:
    let header: Headers = newHeaders()
    header.add("key", "value")
    assert header.hasKey("key")
    assert header.keys() == @["key".cstring]
    assert header.values() == @["value".cstring]
    assert header["key"] == "value".cstring
    header["other"] = "another".cstring
    assert header["other"] == "another".cstring
    assert header.entries() == @[("key".cstring, "value".cstring), ("other".cstring, "another".cstring)]
    assert header.toCstring() == """[["key","value"],["other","another"]]""".cstring
    header.delete("other")
    assert header.entries() == @[("key".cstring, "value".cstring)]
    header.clear()
    assert header.entries() == @[]
    assert header.len == 0

  block:
    let header: Headers = newHeaders()
    header.add("key", "a")
    header.add("key", "b")  ## Duplicated.
    header.add("key", "c")  ## Duplicated.
    assert header["key"] == "a, b, c".cstring
    header["key"] = "value".cstring
    assert header["key"] == "value".cstring

  block:
    let header: Headers = newHeaders()
    header["key"] = "a"
    header["key"] = "b"  ## Overwrites.
    assert header["key"] == "b".cstring
pan>= c->prev; if(c == clients) clients = c->next; c->next = c->prev = NULL; } void dofloat(Arg *arg) { Client *c; for(c = clients; c; c = c->next) { c->ismax = False; if(isvisible(c)) { resize(c, True, TopLeft); } else ban(c); } if((sel = getnext(clients))) focus(sel); else XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); restack(); } void dotile(Arg *arg) { int h, i, n, w; Client *c; w = sw - mw; for(n = 0, c = clients; c; c = c->next) if(isvisible(c) && !c->isfloat) n++; if(n > 1) h = (sh - bh) / (n - 1); else h = sh - bh; for(i = 0, c = clients; c; c = c->next) { c->ismax = False; if(isvisible(c)) { if(c->isfloat) { resize(c, True, TopLeft); continue; } if(n == 1) { c->x = sx; c->y = sy + bh; c->w = sw - 2; c->h = sh - 2 - bh; } else if(i == 0) { c->x = sx; c->y = sy + bh; c->w = mw - 2; c->h = sh - 2 - bh; } else if(h > bh) { c->x = sx + mw; c->y = sy + (i - 1) * h + bh; c->w = w - 2; if(i + 1 == n) c->h = sh - c->y - 2; else c->h = h - 2; } else { /* fallback if h < bh */ c->x = sx + mw; c->y = sy + bh; c->w = w - 2; c->h = sh - 2 - bh; } resize(c, False, TopLeft); i++; } else ban(c); } if((sel = getnext(clients))) focus(sel); else XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); restack(); } void focusnext(Arg *arg) { Client *c; if(!sel) return; if(!(c = getnext(sel->next))) c = getnext(clients); if(c) { focus(c); restack(); } } void focusprev(Arg *arg) { Client *c; if(!sel) return; if(!(c = getprev(sel->prev))) { for(c = clients; c && c->next; c = c->next); c = getprev(c); } if(c) { focus(c); restack(); } } Bool isvisible(Client *c) { unsigned int i; for(i = 0; i < ntags; i++) if(c->tags[i] && seltag[i]) return True; return False; } void restack() { static unsigned int nwins = 0; static Window *wins = NULL; unsigned int f, fi, m, mi, n; Client *c; XEvent ev; for(f = 0, m = 0, c = clients; c; c = c->next) if(isvisible(c)) { if(c->isfloat || arrange == dofloat) f++; else m++; } if(!(n = 2 * (f + m))) { drawstatus(); return; } if(nwins < n) { nwins = n; wins = erealloc(wins, nwins * sizeof(Window)); } fi = 0; mi = 2 * f; if(sel->isfloat || arrange == dofloat) { wins[fi++] = sel->twin; wins[fi++] = sel->win; } else { wins[mi++] = sel->twin; wins[mi++] = sel->win; } for(c = clients; c; c = c->next) if(isvisible(c) && c != sel) { if(c->isfloat || arrange == dofloat) { wins[fi++] = c->twin; wins[fi++] = c->win; } else { wins[mi++] = c->twin; wins[mi++] = c->win; } } XRestackWindows(dpy, wins, n); drawall(); XSync(dpy, False); while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); } void togglemode(Arg *arg) { arrange = (arrange == dofloat) ? dotile : dofloat; if(sel) arrange(NULL); else drawstatus(); } void toggleview(Arg *arg) { unsigned int i; seltag[arg->i] = !seltag[arg->i]; for(i = 0; i < ntags && !seltag[i]; i++); if(i == ntags) seltag[arg->i] = True; /* cannot toggle last view */ reorder(); arrange(NULL); } void view(Arg *arg) { unsigned int i; Client *c; for(i = 0; i < ntags; i++) seltag[i] = False; seltag[arg->i] = True; reorder(); arrange(NULL); } void zoom(Arg *arg) { Client *c = sel; if(!c || (arrange != dotile) || c->isfloat || c->ismax) return; if(c == getnext(clients)) if(!(c = getnext(c->next))) return; detach(c); c->next = clients; clients->prev = c; clients = c; focus(c); arrange(NULL); }