diff options
author | Kaushal Modi <kaushal.modi@gmail.com> | 2018-06-15 12:41:25 -0400 |
---|---|---|
committer | Kaushal Modi <kaushal.modi@gmail.com> | 2018-06-18 09:09:23 -0400 |
commit | abbf9ba9f74fa2415efcad4d1792d68527eba09d (patch) | |
tree | fcaecd8fa9b7acc55dc934caa321c2a181317879 | |
parent | 3b5b3deecd8d49515dfa4836c452647c7ab7a506 (diff) | |
download | Nim-abbf9ba9f74fa2415efcad4d1792d68527eba09d.tar.gz |
Convert styledWriteLine and styledEcho to templates
This also fixes a bug in the styledWriteLine behavior where the background color leaked onto the next newline if that command did not end with resetStyle. Now it is not necessary to end styledWriteLine calls that set BackgroundColor to end in resetStyle.
-rw-r--r-- | lib/pure/terminal.nim | 42 |
1 files changed, 7 insertions, 35 deletions
diff --git a/lib/pure/terminal.nim b/lib/pure/terminal.nim index 3cdfe466d..7ad243150 100644 --- a/lib/pure/terminal.nim +++ b/lib/pure/terminal.nim @@ -726,11 +726,8 @@ macro styledWrite*(f: File, m: varargs[typed]): untyped = reset = true if reset: result.add(newCall(bindSym"resetAttributes", f)) -macro styledWriteLine*(f: File, m: varargs[typed]): untyped = - ## Similar to ``writeLine``, 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. +template styledWriteLine*(f: File, args: varargs[untyped]) = + ## Calls ``styledWrite`` and appends a newline at the end. ## ## Example: ## @@ -739,35 +736,12 @@ macro styledWriteLine*(f: File, m: varargs[typed]): untyped = ## proc error(msg: string) = ## styledWriteLine(stderr, fgRed, "Error: ", resetStyle, msg) ## - let m = callsite() - var reset = false - result = newNimNode(nnkStmtList) - - for i in countup(2, m.len - 1): - let item = m[i] - 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)) - if reset: result.add(newCall(bindSym"resetAttributes", f)) - return - else: - # if it is string literal just call write, do not enable reset - result.add(newCall(bindSym"write", f, item)) - 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)) + styledWrite(f, args) + write(f, "\n") -macro styledEcho*(args: varargs[untyped]): untyped = +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. @@ -951,9 +925,7 @@ when not defined(testing) and isMainModule: echo "ordinary text" stdout.styledWriteLine(fgRed, "red text ") - # Below, resetStyle is needed to prevent leaking the set bgRed to the next - # newline. - stdout.styledWriteLine(fgWhite, bgRed, "white text in red background", resetStyle) + stdout.styledWriteLine(fgWhite, bgRed, "white text in red background") stdout.styledWriteLine(" ordinary text ") stdout.styledWriteLine(fgGreen, "green text") |