the function to display bars of given percentage from given width (#478)

* function to display bars of given percentage from given width

* adding --progress, moving width to options

thanks @amtoine

* typos of ESL studnet

* added examples and tests

* feat(nano): add completions (#479)

* feat(nano): add completions

* feat(nano): add readme

* removed escape symbols from tests, fixed fraction indexing

* fixed tests

Fixed tests, although they need escape sequences, as the bar function has the ability to change the colors of both the background and foreground and uses the default color by default.

* Rename bar_fn.nu to bar.nu

---------

Co-authored-by: Emily Grace Seville <EmilySeville7cfg@gmail.com>
This commit is contained in:
Maxim Uvarov 2023-05-12 22:11:20 +08:00 committed by GitHub
parent 58a05e91da
commit b2fadc0ea8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 71 additions and 0 deletions

View File

@ -0,0 +1,10 @@
# `nano` custom completions
This script provides custom completions for `nano`.
It can be used by importing its exported commands via:
```
use path/to/nano/nano-completions.nu *
```
With `path/to/` being either the relative path of the file to your current working directory or its absolute path.

View File

@ -0,0 +1,61 @@
# construct bars based of a given percentage from a given width (5 is default)
# > bar 0.2
# █
# > bar 0.71 --width 10
# ███████
def 'bar' [
percentage: float
--background (-b): string = 'default'
--foreground (-f): string = 'default'
--progress (-p) # output the result using 'print -n' with '\r' at the end
--width (-w): int = 5
] {
let blocks = [null "▏" "▎" "▍" "▌" "▋" "▊" "▉" "█"]
let $whole_part = (($blocks | last) * ($percentage * $width // 1))
let $fraction = (
$blocks
| get (
($percentage * $width) mod 1
| $in * ($blocks | length)
| math floor
)
)
let $result = (
$"($whole_part)($fraction)"
| fill -c $' ' -w $width
| $"(ansi -e {fg: ($foreground), bg: ($background)})($in)(ansi reset)"
)
if $progress {
print -n $"($result)\r"
} else {
$result
}
}
def assert_eq [num: int, expected: string, input_1: float, input_2?] {
let actual = (
if ($input_2 == null) {bar $input_1} else {
bar $input_1 --width $input_2
}
)
let span = (metadata $expected).span;
if $actual != $expected {
error make {
msg: "Actual != Expected",
label: {
text: $"expected ($expected) but got ($actual)", start: $span.start, end: $span.end
}
}
} else {
print $"Test ($num) (ansi green)passed(ansi reset) ✓"
}
}
def bar_tests [] {
assert_eq 1 "▏ " 0.03
assert_eq 2 "▎ " 0.03 10
assert_eq 3 "▊" 0.71 1
assert_eq 4 "███████ " 0.71 10
}