mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-29 01:14:41 +00:00
Merge pull request #8047 from kaushalmodi/add-styledWrite
Add styledWrite macro
This commit is contained in:
@@ -692,8 +692,8 @@ template styledEchoProcessArg(f: File, cmd: TerminalCmd) =
|
||||
when cmd == bgColor:
|
||||
fgSetColor = false
|
||||
|
||||
macro styledWriteLine*(f: File, m: varargs[typed]): untyped =
|
||||
## Similar to ``writeLine``, but treating terminal style arguments specially.
|
||||
macro styledWrite*(f: File, m: varargs[typed]): untyped =
|
||||
## Similar to ``write``, but treating terminal style arguments specially.
|
||||
## When some argument is ``Style``, ``set[Style]``, ``ForegroundColor``,
|
||||
## ``BackgroundColor`` or ``TerminalCmd`` then it is not sent directly to
|
||||
## ``f``, but instead corresponding terminal style proc is called.
|
||||
@@ -702,8 +702,8 @@ macro styledWriteLine*(f: File, m: varargs[typed]): untyped =
|
||||
##
|
||||
## .. code-block:: nim
|
||||
##
|
||||
## proc error(msg: string) =
|
||||
## styledWriteLine(stderr, fgRed, "Error: ", resetStyle, msg)
|
||||
## stdout.styledWrite(fgRed, "red text ")
|
||||
## stdout.styledWrite(fgGreen, "green text")
|
||||
##
|
||||
let m = callsite()
|
||||
var reset = false
|
||||
@@ -714,8 +714,8 @@ macro styledWriteLine*(f: File, m: varargs[typed]): untyped =
|
||||
case item.kind
|
||||
of nnkStrLit..nnkTripleStrLit:
|
||||
if i == m.len - 1:
|
||||
# optimize if string literal is last, just call writeLine
|
||||
result.add(newCall(bindSym"writeLine", f, item))
|
||||
# optimize if string literal is last, just call write
|
||||
result.add(newCall(bindSym"write", f, item))
|
||||
if reset: result.add(newCall(bindSym"resetAttributes", f))
|
||||
return
|
||||
else:
|
||||
@@ -724,16 +724,24 @@ macro styledWriteLine*(f: File, m: varargs[typed]): untyped =
|
||||
else:
|
||||
result.add(newCall(bindSym"styledEchoProcessArg", f, item))
|
||||
reset = true
|
||||
|
||||
result.add(newCall(bindSym"write", f, newStrLitNode("\n")))
|
||||
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``.
|
||||
result = newCall(bindSym"styledWriteLine")
|
||||
result.add(bindSym"stdout")
|
||||
for arg in children(args):
|
||||
result.add(arg)
|
||||
stdout.styledWriteLine(args)
|
||||
|
||||
proc getch*(): char =
|
||||
## Read a single character from the terminal, blocking until it is entered.
|
||||
@@ -781,7 +789,7 @@ when defined(windows):
|
||||
inc i, x
|
||||
password.string.setLen(max(password.len - x, 0))
|
||||
of chr(0x0):
|
||||
# modifier key - ignore - for details see
|
||||
# modifier key - ignore - for details see
|
||||
# https://github.com/nim-lang/Nim/issues/7764
|
||||
continue
|
||||
else:
|
||||
@@ -840,17 +848,6 @@ proc resetAttributes*() {.noconv.} =
|
||||
## ``system.addQuitProc(resetAttributes)``.
|
||||
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 =
|
||||
## Returns true if a terminal supports true color.
|
||||
return trueColorIsSupported
|
||||
@@ -901,3 +898,40 @@ proc disableTrueColors*() =
|
||||
trueColorIsEnabled = false
|
||||
else:
|
||||
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"
|
||||
|
||||
Reference in New Issue
Block a user