about summary refs log tree commit diff stats
path: root/src/display
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2023-05-16 13:17:41 +0200
committerbptato <nincsnevem662@gmail.com>2023-05-16 13:18:47 +0200
commit4e0fd8c7ef2ad2f61c1ac0572e02b92b1c42b688 (patch)
tree83adafc3a2046bb8af09d7c57340dc9374eebbd6 /src/display
parent951d587f7edf3544d30ba039530a1d19b7e9db78 (diff)
downloadchawan-4e0fd8c7ef2ad2f61c1ac0572e02b92b1c42b688.tar.gz
Refactor config, add charset opts
Only document-charset supported for now.
Diffstat (limited to 'src/display')
-rw-r--r--src/display/client.nim25
-rw-r--r--src/display/pager.nim49
-rw-r--r--src/display/term.nim24
3 files changed, 56 insertions, 42 deletions
diff --git a/src/display/client.nim b/src/display/client.nim
index d0f618e1..6e9f6331 100644
--- a/src/display/client.nim
+++ b/src/display/client.nim
@@ -16,6 +16,7 @@ import bindings/quickjs
 import buffer/container
 import css/sheet
 import config/config
+import data/charset
 import display/pager
 import display/term
 import html/dom
@@ -450,7 +451,8 @@ proc newConsole(pager: Pager, tty: File): Console =
     if pipe(pipefd) == -1:
       raise newException(Defect, "Failed to open console pipe.")
     let url = newURL("javascript:console.show()")
-    result.container = pager.readPipe0(some("text/plain"), pipefd[0], option(url), "Browser console")
+    result.container = pager.readPipe0(some("text/plain"), none(Charset),
+      pipefd[0], option(url), "Browser console")
     var f: File
     if not open(f, pipefd[1], fmWrite):
       raise newException(Defect, "Failed to open file for console pipe.")
@@ -477,7 +479,8 @@ proc dumpBuffers(client: Client) =
       quit(1)
   stdout.close()
 
-proc launchClient*(client: Client, pages: seq[string], ctype: Option[string], dump: bool) =
+proc launchClient*(client: Client, pages: seq[string], ctype: Option[string],
+    cs: Option[Charset], dump: bool) =
   var tty: File
   var dump = dump
   if not dump:
@@ -499,26 +502,26 @@ proc launchClient*(client: Client, pages: seq[string], ctype: Option[string], du
   client.console = newConsole(client.pager, tty)
   client.alive = true
   addExitProc((proc() = client.quit()))
-  if client.config.startup != "":
-    let s = if fileExists(client.config.startup):
-      readFile(client.config.startup)
+  if client.config.start.startup_script != "":
+    let s = if fileExists(client.config.start.startup_script):
+      readFile(client.config.start.startup_script)
     else:
-      client.config.startup
-    client.command0(s, client.config.startup, silence = true)
-  client.userstyle = client.config.stylesheet.parseStylesheet()
+      client.config.start.startup_script
+    client.command0(s, client.config.start.startup_script, silence = true)
+  client.userstyle = client.config.css.stylesheet.parseStylesheet()
 
   if not stdin.isatty():
-    client.pager.readPipe(ctype, stdin.getFileHandle())
+    client.pager.readPipe(ctype, cs, stdin.getFileHandle())
 
   for page in pages:
-    client.pager.loadURL(page, ctype = ctype)
+    client.pager.loadURL(page, ctype = ctype, cs = cs)
   client.acceptBuffers()
   client.pager.refreshStatusMsg()
   if not dump:
     client.inputLoop()
   else:
     client.dumpBuffers()
-  if client.config.headless:
+  if client.config.start.headless:
     client.headlessLoop()
   client.quit()
 
diff --git a/src/display/pager.nim b/src/display/pager.nim
index 805f0f51..bd07d52e 100644
--- a/src/display/pager.nim
+++ b/src/display/pager.nim
@@ -12,6 +12,7 @@ when defined(posix):
 import buffer/cell
 import buffer/container
 import config/config
+import data/charset
 import display/term
 import io/lineedit
 import io/promise
@@ -120,16 +121,16 @@ proc getter(pager: Pager, s: string): Option[JSValue] {.jsgetprop.} =
 proc searchNext(pager: Pager) {.jsfunc.} =
   if pager.regex.issome:
     if not pager.reverseSearch:
-      pager.container.cursorNextMatch(pager.regex.get, pager.config.searchwrap)
+      pager.container.cursorNextMatch(pager.regex.get, pager.config.search.wrap)
     else:
-      pager.container.cursorPrevMatch(pager.regex.get, pager.config.searchwrap)
+      pager.container.cursorPrevMatch(pager.regex.get, pager.config.search.wrap)
 
 proc searchPrev(pager: Pager) {.jsfunc.} =
   if pager.regex.issome:
     if not pager.reverseSearch:
-      pager.container.cursorPrevMatch(pager.regex.get, pager.config.searchwrap)
+      pager.container.cursorPrevMatch(pager.regex.get, pager.config.search.wrap)
     else:
-      pager.container.cursorNextMatch(pager.regex.get, pager.config.searchwrap)
+      pager.container.cursorNextMatch(pager.regex.get, pager.config.search.wrap)
 
 proc getLineHist(pager: Pager, mode: LineMode): LineHistory =
   if pager.linehist[mode] == nil:
@@ -245,7 +246,7 @@ proc refreshDisplay(pager: Pager, container = pager.container) =
       let area = hl.colorArea(container.fromy + by, startw .. startw + aw)
       for i in area:
         var hlformat = pager.display[dls + i - startw].format
-        hlformat.bgcolor = pager.config.hlcolor.cellColor()
+        hlformat.bgcolor = pager.config.display.highlight_color.cellColor()
         pager.display[dls + i - startw].format = hlformat
     inc by
 
@@ -544,6 +545,7 @@ proc applySiteconf(pager: Pager, request: Request): BufferConfig =
   var cookiejar: CookieJar
   var headers: HeaderList
   var scripting: bool
+  var charsets = pager.config.encoding.document_charset
   for sc in pager.siteconf:
     if sc.url.isSome and not sc.url.get.match(url):
       continue
@@ -566,12 +568,15 @@ proc applySiteconf(pager: Pager, request: Request): BufferConfig =
       scripting = sc.scripting.get
     if sc.refererfrom.isSome:
       refererfrom = sc.refererfrom.get
-  return pager.config.getBufferConfig(request.url, cookiejar, headers, refererfrom, scripting)
+    if sc.document_charset.len > 0:
+      charsets = sc.document_charset
+  return pager.config.getBufferConfig(request.url, cookiejar, headers,
+    refererfrom, scripting, charsets)
 
 # Load request in a new buffer.
 proc gotoURL(pager: Pager, request: Request, prevurl = none(URL),
-              ctype = none(string), replace: Container = nil,
-              redirectdepth = 0, referrer: Container = nil) =
+    ctype = none(string), cs = none(Charset), replace: Container = nil,
+    redirectdepth = 0, referrer: Container = nil) =
   if referrer != nil and referrer.config.refererfrom:
     request.referer = referrer.source.location
   var bufferconfig = pager.applySiteconf(request)
@@ -587,6 +592,7 @@ proc gotoURL(pager: Pager, request: Request, prevurl = none(URL),
       t: LOAD_REQUEST,
       request: request,
       contenttype: ctype,
+      charset: cs,
       location: request.url
     )
     if referrer != nil:
@@ -615,7 +621,8 @@ proc omniRewrite(pager: Pager, s: string): string =
 # * file://$PWD/<file>
 # * https://<url>
 # So we attempt to load both, and see what works.
-proc loadURL*(pager: Pager, url: string, ctype = none(string)) =
+proc loadURL*(pager: Pager, url: string, ctype = none(string),
+    cs = none(Charset)) =
   let url0 = pager.omniRewrite(url)
   let url = if url[0] == '~': expandPath(url0) else: url0
   let firstparse = parseURL(url)
@@ -624,10 +631,10 @@ proc loadURL*(pager: Pager, url: string, ctype = none(string)) =
       some(pager.container.source.location)
     else:
       none(URL)
-    pager.gotoURL(newRequest(firstparse.get), prev, ctype)
+    pager.gotoURL(newRequest(firstparse.get), prev, ctype, cs)
     return
   var urls: seq[URL]
-  if pager.config.prependhttps and url[0] != '/':
+  if pager.config.network.prepend_https and url[0] != '/':
     let pageurl = parseURL("https://" & url)
     if pageurl.isSome: # attempt to load remote page
       urls.add(pageurl.get)
@@ -640,22 +647,25 @@ proc loadURL*(pager: Pager, url: string, ctype = none(string)) =
     pager.alert("Invalid URL " & url)
   else:
     let prevc = pager.container
-    pager.gotoURL(newRequest(urls.pop()), ctype = ctype)
+    pager.gotoURL(newRequest(urls.pop()), ctype = ctype, cs = cs)
     if pager.container != prevc:
       pager.container.retry = urls
 
-proc readPipe0*(pager: Pager, ctype: Option[string], fd: FileHandle, location: Option[URL], title: string): Container =
+proc readPipe0*(pager: Pager, ctype: Option[string], cs: Option[Charset],
+    fd: FileHandle, location: Option[URL], title: string): Container =
   let source = BufferSource(
     t: LOAD_PIPE,
     fd: fd,
     contenttype: some(ctype.get("text/plain")),
+    charset: cs,
     location: location.get(newURL("file://-"))
   )
   let bufferconfig = pager.config.getBufferConfig(source.location)
   return pager.dispatcher.newBuffer(bufferconfig, source, title = title)
 
-proc readPipe*(pager: Pager, ctype: Option[string], fd: FileHandle) =
-  let container = pager.readPipe0(ctype, fd, none(URL), "*pipe*")
+proc readPipe*(pager: Pager, ctype: Option[string], cs: Option[Charset],
+    fd: FileHandle) =
+  let container = pager.readPipe0(ctype, cs, fd, none(URL), "*pipe*")
   pager.addContainer(container)
 
 proc command(pager: Pager) {.jsfunc.} =
@@ -680,9 +690,9 @@ proc updateReadLineISearch(pager: Pager, linemode: LineMode) =
     if pager.iregex.isSome:
       pager.container.hlon = true
       if linemode == ISEARCH_F:
-        pager.container.cursorNextMatch(pager.iregex.get, pager.config.searchwrap)
+        pager.container.cursorNextMatch(pager.iregex.get, pager.config.search.wrap)
       else:
-        pager.container.cursorPrevMatch(pager.iregex.get, pager.config.searchwrap)
+        pager.container.cursorPrevMatch(pager.iregex.get, pager.config.search.wrap)
     pager.container.pushCursorPos()
   of FINISH:
     if pager.iregex.isSome:
@@ -754,7 +764,8 @@ proc load(pager: Pager, s = "") {.jsfunc.} =
 
 # Reload the page in a new buffer, then kill the previous buffer.
 proc reload(pager: Pager) {.jsfunc.} =
-  pager.gotoURL(newRequest(pager.container.source.location), none(URL), pager.container.contenttype, pager.container)
+  pager.gotoURL(newRequest(pager.container.source.location), none(URL),
+    pager.container.contenttype, replace = pager.container)
 
 proc authorize(pager: Pager) =
   pager.setLineEdit("Username: ", USERNAME)
@@ -799,7 +810,7 @@ proc handleEvent0(pager: Pager, container: Container, event: ContainerEvent): bo
     if pager.container == container:
       pager.authorize()
   of REDIRECT:
-    if container.redirectdepth < pager.config.maxredirect:
+    if container.redirectdepth < pager.config.network.max_redirect:
       pager.alert("Redirecting to " & $event.request.url)
       pager.gotoURL(event.request, some(container.source.location),
         replace = container, redirectdepth = container.redirectdepth + 1,
diff --git a/src/display/term.nim b/src/display/term.nim
index 239b1a53..ce518428 100644
--- a/src/display/term.nim
+++ b/src/display/term.nim
@@ -390,8 +390,8 @@ proc showCursor*(term: Terminal) =
   term.outfile.showCursor()
 
 func emulateOverline(term: Terminal): bool =
-  term.config.emulateoverline and FLAG_OVERLINE notin term.formatmode and
-  FLAG_UNDERLINE in term.formatmode
+  term.config.display.emulate_overline and
+    FLAG_OVERLINE notin term.formatmode and FLAG_UNDERLINE in term.formatmode
 
 proc writeGrid*(term: Terminal, grid: FixedGrid, x = 0, y = 0) =
   for ly in y ..< y + grid.height:
@@ -412,28 +412,28 @@ proc writeGrid*(term: Terminal, grid: FixedGrid, x = 0, y = 0) =
           j += cell[].width()
 
 proc applyConfig(term: Terminal) =
-  if term.config.colormode.isSome:
-    term.colormode = term.config.colormode.get
+  if term.config.display.color_mode.isSome:
+    term.colormode = term.config.display.color_mode.get
   elif term.isatty():
     term.colormode = ANSI
     let colorterm = getEnv("COLORTERM")
     case colorterm
     of "24bit", "truecolor": term.colormode = TRUE_COLOR
-  if term.config.formatmode.isSome:
-    term.formatmode = term.config.formatmode.get
+  if term.config.display.format_mode.isSome:
+    term.formatmode = term.config.display.format_mode.get
   for fm in FormatFlags:
-    if fm in term.config.noformatmode:
+    if fm in term.config.display.no_format_mode:
       term.formatmode.excl(fm)
-  if term.isatty() and term.config.altscreen.isSome:
-    term.smcup = term.config.altscreen.get
-  term.mincontrast = term.config.mincontrast
+  if term.isatty() and term.config.display.alt_screen.isSome:
+    term.smcup = term.config.display.alt_screen.get
+  term.mincontrast = term.config.display.minimum_contrast
 
 proc outputGrid*(term: Terminal) =
-  if term.config.termreload:
+  if term.config.display.force_clear:
     term.applyConfig()
   term.outfile.write(term.resetFormat())
   let samesize = term.canvas.width == term.pcanvas.width and term.canvas.height == term.pcanvas.height
-  if term.config.forceclear or not term.cleared or not samesize:
+  if term.config.display.force_clear or not term.cleared or not samesize:
     term.outfile.write(term.generateFullOutput(term.canvas))
     term.cleared = true
   else: