Compare commits

..

4 commits

Author SHA1 Message Date
56bb2bb7c1
reference correct module
Some checks failed
GitHub Pages / build (push) Has been cancelled
GitHub Pages / deploy (push) Has been cancelled
2024-10-30 22:24:15 -05:00
c8c66648cc
update logger name 2024-10-30 22:15:59 -05:00
9462d99d95
remove side effects 2024-10-30 22:10:27 -05:00
d66e2ed5e2
delete old file 2024-10-30 21:32:20 -05:00
4 changed files with 52 additions and 40 deletions

View file

@ -4,8 +4,7 @@
use BB style markup to add color to strings using VT100 escape codes
]##
# TODO:
#{.push raises:[].}
{.push raises:[].}
import std/[
macros, os, sequtils, strformat, strutils, terminal
@ -72,7 +71,41 @@ const ColorXTermNames = enumNames(ColorXterm).mapIt(firstCapital(it))
const BbStyleNames = enumNames(BbStyle).mapIt(firstCapital(it))
const ColorDigitStrings = (1..255).toSeq().mapIt($it)
# TODO: write non-fallible parseStyle(s) procedure
template parseUnsafe(body: untyped): untyped =
try: body
except: discard
proc parseStyle(codes: var seq[string], style: string) =
var style = normalizeStyle(style)
if style in ["B", "I", "U"]:
parseUnsafe: codes.add parseEnum[BbStyleAbbr](style).toCode()
elif style in BbStyleNames:
parseUnsafe: codes.add parseEnum[BbStyle](style).toCode()
if not (bbMode == On): return
if style in ColorXtermNames:
parseUnsafe: codes.add parseEnum[ColorXterm](style).toCode()
elif style.isHex():
codes.add style.hexToRgb.toCode()
elif style in ColorDigitStrings:
parseUnsafe: codes.add parseInt(style).toCode()
else:
when defined(debugBB): echo "unknown style: " & normalizedStyle
func parseBgStyle(codes: var seq[string], style: string) =
var style = normalizeStyle(style)
if style in ColorXtermNames:
parseUnsafe: codes.add parseEnum[ColorXTerm](style).toBgCode()
elif style.isHex():
codes.add style.hexToRgb().toBgCode()
elif style in ColorDigitStrings:
parseUnsafe: codes.add parseInt(style).toBgCode()
else:
when defined(debugBB): echo "unknown bg style: " & style
proc toAnsiCode*(s: string): string =
if bbMode == Off: return
var
@ -86,33 +119,10 @@ proc toAnsiCode*(s: string): string =
else:
styles = s.splitWhitespace()
for style in styles:
let normalizedStyle = normalizeStyle(style)
if normalizedStyle in ["B", "I", "U"]:
codes.add parseEnum[BbStyleAbbr](normalizedStyle).toCode()
elif normalizedStyle in BbStyleNames:
codes.add parseEnum[BbStyle](normalizedStyle).toCode()
if not (bbMode == On): continue
if normalizedStyle in ColorXtermNames:
codes.add parseEnum[ColorXterm](normalizedStyle).toCode()
elif normalizedStyle.isHex():
codes.add normalizedStyle.hexToRgb.toCode()
elif normalizedStyle in ColorDigitStrings:
codes.add parseInt(normalizedStyle).toCode()
else:
when defined(debugBB): echo "unknown style: " & normalizedStyle
parseStyle codes, style
if bbMode == On and bgStyle != "":
let normalizedBgStyle = normalizeStyle(bgStyle)
if normalizedBgStyle in ColorXtermNames:
codes.add parseEnum[ColorXTerm](normalizedBgStyle).toBgCode()
elif normalizedBgStyle.isHex():
codes.add normalizedBgStyle.hexToRgb().toBgCode()
elif normalizedBgStyle in ColorDigitStrings:
codes.add parseInt(normalizedBgStyle).toBgCode()
else:
when defined(debugBB): echo "unknown bg style: " & normalizedBgStyle
parseBgStyle codes, bgStyle
if codes.len > 0:
result.add "\e["
@ -325,7 +335,7 @@ proc `&`*(x: BbString, y: BbString): Bbstring =
proc bbEscape*(s: string): string {.inline.} =
s.replace("[", "[[").replace("\\", "\\\\")
proc bbEcho*(args: varargs[string, `$`]) {.sideEffect.} =
proc bbEcho*(args: varargs[string, `$`]) {.raises: [IOError]} =
for x in args:
stdout.write(x.bb)
stdout.write('\n')

View file

@ -1 +0,0 @@

View file

@ -19,7 +19,7 @@ import ./bbansi
template tryImport(x, body) =
when not (compiles do: import x): body else: import x
tryImport pkg/cligen:
{.fatal: "hwylterm/cli requires cligen>=1.7.5".}
{.fatal: "hwylterm/cligen requires cligen>=1.7.5".}
type

View file

@ -1,6 +1,9 @@
## hwylterm/logging
##
## wrapper around std/logging to provide a fancy console logger
import std/[logging, strutils]
export logging
import ./bbansi
var
@ -19,10 +22,10 @@ Level* = enum ## \
]#
type
FancyConsoleLogger* = ref object of Logger
HwylConsoleLogger* = ref object of Logger
## A logger that writes log messages to the console.
##
## Create a new ``FancyConsoleLogger`` with the `newFancyConsoleLogger proc
## Create a new ``HwylConsoleLogger`` with the `newHwylConsoleLogger proc
## <#newConsoleLogger>`_.
##
useStderr*: bool ## If true, writes to stderr; otherwise, writes to stdout
@ -50,11 +53,11 @@ proc genFmtStr(
): string =
var parts: seq[string]
if fmtPrefix != "": parts.add fmtPrefix
parts.add $LevelNames[level].bb(levelStyle)
parts.add $LevelNames[level].alignLeft(6).bb(levelStyle)
return parts.join(fmtSep) & fmtSuffix
proc newFancyConsoleLogger*(
proc newHwylConsoleLogger*(
levelThreshold = lvlAll,
fmtPrefix = "",
fmtSep = "|",
@ -67,8 +70,8 @@ proc newFancyConsoleLogger*(
warnStyle = "bold yellow",
errorStyle = "bold red",
fatalStyle = "bold red"
): FancyConsoleLogger =
## Creates a new `FancyConsoleLogger<#ConsoleLogger>`_.
): HwylConsoleLogger =
## Creates a new `HwylConsoleLogger<#HwylConsoleLogger>`_.
new result
## log needs to be gcsafe so we pregenerate the log formats when making the handler
let fmtStrs: array[Level, string] = [
@ -89,8 +92,8 @@ proc newFancyConsoleLogger*(
result.fmtStrs = fmtStrs
method log*(logger: FancyConsoleLogger, level: Level, args: varargs[string, `$`]) {.gcsafe.} =
## Logs to the console with the given `FancyConsoleLogger<#ConsoleLogger>`_ only.
method log*(logger: HwylConsoleLogger, level: Level, args: varargs[string, `$`]) {.gcsafe.} =
## Logs to the console with the given `HwylConsoleLogger<#HwylConsoleLogger>`_ only.
##
## This method ignores the list of registered handlers.
##