about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/config/mailcap.nim65
-rw-r--r--src/local/pager.nim10
2 files changed, 32 insertions, 43 deletions
diff --git a/src/config/mailcap.nim b/src/config/mailcap.nim
index fd4e1f0d..1d81b20a 100644
--- a/src/config/mailcap.nim
+++ b/src/config/mailcap.nim
@@ -15,17 +15,17 @@ type
     buf: char
     line: int
 
-  MailcapFlags* = enum
-    NEEDSTERMINAL = "needsterminal"
-    COPIOUSOUTPUT = "copiousoutput"
-    HTMLOUTPUT = "x-htmloutput" # from w3m
-    ANSIOUTPUT = "x-ansioutput" # Chawan extension
+  MailcapFlag* = enum
+    mfNeedsterminal = "needsterminal"
+    mfCopiousoutput = "copiousoutput"
+    mfHtmloutput = "x-htmloutput" # from w3m
+    mfAnsioutput = "x-ansioutput" # Chawan extension
 
   MailcapEntry* = object
     mt*: string
     subt*: string
     cmd*: string
-    flags*: set[MailcapFlags]
+    flags*: set[MailcapFlag]
     nametemplate*: string
     edit*: string
     test*: string
@@ -123,58 +123,47 @@ proc consumeCommand(state: var MailcapParser): Result[string, string] =
   return ok(s)
 
 type NamedField = enum
-  NO_NAMED_FIELD, NAMED_FIELD_TEST, NAMED_FIELD_NAMETEMPLATE, NAMED_FIELD_EDIT
+  nmNone = "none"
+  nmTest = "test"
+  nmNametemplate = "nametemplate"
+  nmEdit = "edit"
 
 proc parseFieldKey(entry: var MailcapEntry; k: string): NamedField =
-  case k
-  of "needsterminal":
-    entry.flags.incl(NEEDSTERMINAL)
-  of "copiousoutput":
-    entry.flags.incl(COPIOUSOUTPUT)
-  of "x-htmloutput":
-    entry.flags.incl(HTMLOUTPUT)
-  of "x-ansioutput":
-    entry.flags.incl(ANSIOUTPUT)
-  of "test":
-    return NAMED_FIELD_TEST
-  of "nametemplate":
-    return NAMED_FIELD_NAMETEMPLATE
-  of "edit":
-    return NAMED_FIELD_EDIT
-  return NO_NAMED_FIELD
+  if (let x = parseEnumNoCase[MailcapFlag](k); x.isSome):
+    entry.flags.incl(x.get)
+    return nmNone
+  if (let x = parseEnumNoCase[NamedField](k); x.isSome):
+    return x.get
+  return nmNone
 
 proc consumeField(state: var MailcapParser; entry: var MailcapEntry):
     Result[bool, string] =
   state.skipBlanks()
-  if not state.has():
-    return ok(false)
   var buf = ""
+  var res = false
   while state.has():
-    let c = state.consume()
-    case c
+    case (let c = state.consume(); c)
     of ';', '\n':
-      if parseFieldKey(entry, buf) != NO_NAMED_FIELD:
-        return err("Expected command")
-      return ok(c == ';')
+      res = c == ';'
+      break
     of '\r':
       continue
     of '=':
       let f = parseFieldKey(entry, buf)
       let cmd = ?state.consumeCommand()
       case f
-      of NO_NAMED_FIELD:
-        discard
-      of NAMED_FIELD_TEST:
-        entry.test = cmd
-      of NAMED_FIELD_NAMETEMPLATE:
-        entry.nametemplate = cmd
-      of NAMED_FIELD_EDIT:
-        entry.edit = cmd
+      of nmNone: discard
+      of nmTest: entry.test = cmd
+      of nmNametemplate: entry.nametemplate = cmd
+      of nmEdit: entry.edit = cmd
       return ok(state.consume() == ';')
     else:
       if c in Controls:
         return err("line " & $state.line & ": invalid character in field: " & c)
       buf &= c
+  if parseFieldKey(entry, buf) != nmNone:
+    return err("Expected command")
+  return ok(res)
 
 proc parseMailcap*(stream: Stream): Result[Mailcap, string] =
   var state = MailcapParser(stream: stream, line: 1)
diff --git a/src/local/pager.nim b/src/local/pager.nim
index 354b1dc5..a0c2d221 100644
--- a/src/local/pager.nim
+++ b/src/local/pager.nim
@@ -1603,7 +1603,7 @@ proc ansiDecode(pager: Pager; url: URL; ishtml: var bool; fdin: cint): cint =
   else:
     discard close(pipefdOutAnsi[1])
     discard close(fdin)
-    ishtml = HTMLOUTPUT in entry.flags
+    ishtml = mfHtmloutput in entry.flags
     return pipefdOutAnsi[0]
 
 # Pipe input into the mailcap command, then read its output into a buffer.
@@ -1800,11 +1800,11 @@ proc checkMailcap(pager: Pager; container: Container; stream: SocketStream;
     tempfile
   var canpipe = true
   let cmd = unquoteCommand(entry.cmd, contentType, outpath, url, canpipe)
-  var ishtml = HTMLOUTPUT in entry.flags
-  let needsterminal = NEEDSTERMINAL in entry.flags
+  var ishtml = mfHtmloutput in entry.flags
+  let needsterminal = mfNeedsterminal in entry.flags
   putEnv("MAILCAP_URL", $url)
   block needsConnect:
-    if entry.flags * {COPIOUSOUTPUT, HTMLOUTPUT, ANSIOUTPUT} == {}:
+    if entry.flags * {mfCopiousoutput, mfHtmloutput, mfAnsioutput} == {}:
       # No output. Resume here, so that blocking needsterminal filters work.
       pager.loader.resume(istreamOutputId)
       if canpipe:
@@ -1823,7 +1823,7 @@ proc checkMailcap(pager: Pager; container: Container; stream: SocketStream;
     else:
       pager.runMailcapReadFile(stream, cmd, outpath, pipefdOut)
     discard close(pipefdOut[1]) # close write
-    let fdout = if not ishtml and ANSIOUTPUT in entry.flags:
+    let fdout = if not ishtml and mfAnsioutput in entry.flags:
       pager.ansiDecode(url, ishtml, pipefdOut[0])
     else:
       pipefdOut[0]