# This file is dedicated to the public domain. # Gopher directory -> HTML converter for Chawan. import std/os import std/strutils include ../gophertypes import utils/twtstr const ControlPercentEncodeSet = {char(0x00)..char(0x1F), char(0x7F)..char(0xFF)} const QueryPercentEncodeSet = (ControlPercentEncodeSet + {' ', '"', '#', '<', '>'}) const PathPercentEncodeSet = (QueryPercentEncodeSet + {'?', '`', '{', '}'}) const HexCharsUpper = "0123456789ABCDEF" proc percentEncode(s: string): string = result = "" for c in s: if c notin PathPercentEncodeSet: result &= c else: result &= '%' result &= HexCharsUpper[uint8(c) shr 4] result &= HexCharsUpper[uint8(c) and 0xF] # returns URL proc parseParams(): string = result = "" let params = commandLineParams() var was_u = false for param in params: if was_u: result = param was_u = false elif param == "-h" or param == "--help": stdout.write("Usage: gopher2html [-u URL]") quit(0) elif param == "-u": was_u = true else: stdout.write("Usage: gopher2html [-u URL]") quit(1) proc main() = let url = parseParams() let escapedURL = htmlEscape(url) stdout.write("""
" ispre = true outs &= htmlEscape(name) & '\n' else: if ispre: outs &= "" ispre = false let ts = $t var names = "" if ts != "": names &= '[' & ts & ']' names &= htmlEscape(name) let ourls = if not file.startsWith("URL:"): if file.len == 0 or file[0] != '/': file = '/' & file let pefile = percentEncode(file) "gopher://" & host & ":" & port & "/" & tc & pefile else: file.substr("URL:".len) outs &= "" & names & "