Merge pull request #8047 from kaushalmodi/add-styledWrite
Add styledWrite macro
This commit is contained in:
commit
0da87939d1
1 changed files with 59 additions and 25 deletions
|
|
@ -692,8 +692,8 @@ template styledEchoProcessArg(f: File, cmd: TerminalCmd) =
|
||||||
when cmd == bgColor:
|
when cmd == bgColor:
|
||||||
fgSetColor = false
|
fgSetColor = false
|
||||||
|
|
||||||
macro styledWriteLine*(f: File, m: varargs[typed]): untyped =
|
macro styledWrite*(f: File, m: varargs[typed]): untyped =
|
||||||
## Similar to ``writeLine``, but treating terminal style arguments specially.
|
## Similar to ``write``, but treating terminal style arguments specially.
|
||||||
## When some argument is ``Style``, ``set[Style]``, ``ForegroundColor``,
|
## When some argument is ``Style``, ``set[Style]``, ``ForegroundColor``,
|
||||||
## ``BackgroundColor`` or ``TerminalCmd`` then it is not sent directly to
|
## ``BackgroundColor`` or ``TerminalCmd`` then it is not sent directly to
|
||||||
## ``f``, but instead corresponding terminal style proc is called.
|
## ``f``, but instead corresponding terminal style proc is called.
|
||||||
|
|
@ -702,8 +702,8 @@ macro styledWriteLine*(f: File, m: varargs[typed]): untyped =
|
||||||
##
|
##
|
||||||
## .. code-block:: nim
|
## .. code-block:: nim
|
||||||
##
|
##
|
||||||
## proc error(msg: string) =
|
## stdout.styledWrite(fgRed, "red text ")
|
||||||
## styledWriteLine(stderr, fgRed, "Error: ", resetStyle, msg)
|
## stdout.styledWrite(fgGreen, "green text")
|
||||||
##
|
##
|
||||||
let m = callsite()
|
let m = callsite()
|
||||||
var reset = false
|
var reset = false
|
||||||
|
|
@ -714,8 +714,8 @@ macro styledWriteLine*(f: File, m: varargs[typed]): untyped =
|
||||||
case item.kind
|
case item.kind
|
||||||
of nnkStrLit..nnkTripleStrLit:
|
of nnkStrLit..nnkTripleStrLit:
|
||||||
if i == m.len - 1:
|
if i == m.len - 1:
|
||||||
# optimize if string literal is last, just call writeLine
|
# optimize if string literal is last, just call write
|
||||||
result.add(newCall(bindSym"writeLine", f, item))
|
result.add(newCall(bindSym"write", f, item))
|
||||||
if reset: result.add(newCall(bindSym"resetAttributes", f))
|
if reset: result.add(newCall(bindSym"resetAttributes", f))
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
|
|
@ -724,16 +724,24 @@ macro styledWriteLine*(f: File, m: varargs[typed]): untyped =
|
||||||
else:
|
else:
|
||||||
result.add(newCall(bindSym"styledEchoProcessArg", f, item))
|
result.add(newCall(bindSym"styledEchoProcessArg", f, item))
|
||||||
reset = true
|
reset = true
|
||||||
|
|
||||||
result.add(newCall(bindSym"write", f, newStrLitNode("\n")))
|
|
||||||
if reset: result.add(newCall(bindSym"resetAttributes", f))
|
if reset: result.add(newCall(bindSym"resetAttributes", f))
|
||||||
|
|
||||||
macro styledEcho*(args: varargs[untyped]): untyped =
|
template styledWriteLine*(f: File, args: varargs[untyped]) =
|
||||||
|
## Calls ``styledWrite`` and appends a newline at the end.
|
||||||
|
##
|
||||||
|
## Example:
|
||||||
|
##
|
||||||
|
## .. code-block:: nim
|
||||||
|
##
|
||||||
|
## proc error(msg: string) =
|
||||||
|
## styledWriteLine(stderr, fgRed, "Error: ", resetStyle, msg)
|
||||||
|
##
|
||||||
|
styledWrite(f, args)
|
||||||
|
write(f, "\n")
|
||||||
|
|
||||||
|
template styledEcho*(args: varargs[untyped]) =
|
||||||
## Echoes styles arguments to stdout using ``styledWriteLine``.
|
## Echoes styles arguments to stdout using ``styledWriteLine``.
|
||||||
result = newCall(bindSym"styledWriteLine")
|
stdout.styledWriteLine(args)
|
||||||
result.add(bindSym"stdout")
|
|
||||||
for arg in children(args):
|
|
||||||
result.add(arg)
|
|
||||||
|
|
||||||
proc getch*(): char =
|
proc getch*(): char =
|
||||||
## Read a single character from the terminal, blocking until it is entered.
|
## Read a single character from the terminal, blocking until it is entered.
|
||||||
|
|
@ -781,7 +789,7 @@ when defined(windows):
|
||||||
inc i, x
|
inc i, x
|
||||||
password.string.setLen(max(password.len - x, 0))
|
password.string.setLen(max(password.len - x, 0))
|
||||||
of chr(0x0):
|
of chr(0x0):
|
||||||
# modifier key - ignore - for details see
|
# modifier key - ignore - for details see
|
||||||
# https://github.com/nim-lang/Nim/issues/7764
|
# https://github.com/nim-lang/Nim/issues/7764
|
||||||
continue
|
continue
|
||||||
else:
|
else:
|
||||||
|
|
@ -840,17 +848,6 @@ proc resetAttributes*() {.noconv.} =
|
||||||
## ``system.addQuitProc(resetAttributes)``.
|
## ``system.addQuitProc(resetAttributes)``.
|
||||||
resetAttributes(stdout)
|
resetAttributes(stdout)
|
||||||
|
|
||||||
when not defined(testing) and isMainModule:
|
|
||||||
#system.addQuitProc(resetAttributes)
|
|
||||||
write(stdout, "never mind")
|
|
||||||
stdout.eraseLine()
|
|
||||||
stdout.styledWriteLine("styled text ", {styleBright, styleBlink, styleUnderscore})
|
|
||||||
stdout.styledWriteLine("italic text ", {styleItalic})
|
|
||||||
stdout.setBackGroundColor(bgCyan, true)
|
|
||||||
stdout.setForeGroundColor(fgBlue)
|
|
||||||
stdout.writeLine("ordinary text")
|
|
||||||
stdout.resetAttributes()
|
|
||||||
|
|
||||||
proc isTrueColorSupported*(): bool =
|
proc isTrueColorSupported*(): bool =
|
||||||
## Returns true if a terminal supports true color.
|
## Returns true if a terminal supports true color.
|
||||||
return trueColorIsSupported
|
return trueColorIsSupported
|
||||||
|
|
@ -901,3 +898,40 @@ proc disableTrueColors*() =
|
||||||
trueColorIsEnabled = false
|
trueColorIsEnabled = false
|
||||||
else:
|
else:
|
||||||
trueColorIsEnabled = false
|
trueColorIsEnabled = false
|
||||||
|
|
||||||
|
when not defined(testing) and isMainModule:
|
||||||
|
#system.addQuitProc(resetAttributes)
|
||||||
|
write(stdout, "never mind")
|
||||||
|
stdout.eraseLine()
|
||||||
|
stdout.styledWriteLine({styleBright, styleBlink, styleUnderscore}, "styled text ")
|
||||||
|
stdout.styledWriteLine("italic text ", {styleItalic})
|
||||||
|
stdout.setBackGroundColor(bgCyan, true)
|
||||||
|
stdout.setForeGroundColor(fgBlue)
|
||||||
|
stdout.write("blue text in cyan background")
|
||||||
|
stdout.resetAttributes()
|
||||||
|
echo ""
|
||||||
|
stdout.writeLine("ordinary text")
|
||||||
|
echo "more ordinary text"
|
||||||
|
styledEcho styleBright, fgGreen, "[PASS]", resetStyle, fgGreen, " Yay!"
|
||||||
|
echo "ordinary text again"
|
||||||
|
styledEcho styleBright, fgRed, "[FAIL]", resetStyle, fgRed, " Nay :("
|
||||||
|
echo "ordinary text again"
|
||||||
|
setForeGroundColor(fgGreen)
|
||||||
|
echo "green text"
|
||||||
|
echo "more green text"
|
||||||
|
setForeGroundColor(fgBlue)
|
||||||
|
echo "blue text"
|
||||||
|
resetAttributes()
|
||||||
|
echo "ordinary text"
|
||||||
|
|
||||||
|
stdout.styledWriteLine(fgRed, "red text ")
|
||||||
|
stdout.styledWriteLine(fgWhite, bgRed, "white text in red background")
|
||||||
|
stdout.styledWriteLine(" ordinary text ")
|
||||||
|
stdout.styledWriteLine(fgGreen, "green text")
|
||||||
|
|
||||||
|
stdout.styledWrite(fgRed, "red text ")
|
||||||
|
stdout.styledWrite(fgWhite, bgRed, "white text in red background")
|
||||||
|
stdout.styledWrite(" ordinary text ")
|
||||||
|
stdout.styledWrite(fgGreen, "green text")
|
||||||
|
echo ""
|
||||||
|
echo "ordinary text"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue