diff options
author | bptato <nincsnevem662@gmail.com> | 2023-05-16 13:17:41 +0200 |
---|---|---|
committer | bptato <nincsnevem662@gmail.com> | 2023-05-16 13:18:47 +0200 |
commit | 4e0fd8c7ef2ad2f61c1ac0572e02b92b1c42b688 (patch) | |
tree | 83adafc3a2046bb8af09d7c57340dc9374eebbd6 /src/display | |
parent | 951d587f7edf3544d30ba039530a1d19b7e9db78 (diff) | |
download | chawan-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.nim | 25 | ||||
-rw-r--r-- | src/display/pager.nim | 49 | ||||
-rw-r--r-- | src/display/term.nim | 24 |
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: |