350 lines
12 KiB
Plaintext
350 lines
12 KiB
Plaintext
# process_bar.nas
|
|
# ValKmjolnir 2022/6/14
|
|
# this file is inspired by a Python lib: alive_progress
|
|
use std.os;
|
|
use std.unix;
|
|
|
|
var bar = func() {
|
|
var bar = {
|
|
solid_triangle_right: "▶",
|
|
hollow_triangle_right: "▷",
|
|
solid_triangle_left: "◀",
|
|
hollow_triangle_left: "◁",
|
|
solid_circle: "●",
|
|
hollow_circle: "○",
|
|
tick: "✔",
|
|
cross: "✘",
|
|
light_shadow: "░",
|
|
medium_shadow: "▒",
|
|
deep_shadow: "▓",
|
|
block: "█",
|
|
sharp: "#",
|
|
square: "√",
|
|
equal: "=",
|
|
space: " ",
|
|
point: ".",
|
|
line: "━"
|
|
};
|
|
var separator = {
|
|
angle_bracket: ["<",">"],
|
|
line: ["|","|"],
|
|
bracket: ["[","]"],
|
|
space: [" "," "],
|
|
curve: ["(",")"]
|
|
};
|
|
return func(front = "sharp", back = "space", sep = "line", length = 20) {
|
|
if (typeof(front)!="str" or !contains(bar,front))
|
|
front="sharp";
|
|
if (typeof(back)!="str" or !contains(bar,back))
|
|
back="space";
|
|
if (typeof(sep)!="str" or !contains(separator,sep))
|
|
sep="line";
|
|
front=bar[front];
|
|
back=bar[back];
|
|
sep=separator[sep];
|
|
return {
|
|
bar: func(number) {
|
|
if (number>1)
|
|
number=1;
|
|
if (number<0)
|
|
number=0;
|
|
var finish_length=int(number*length);
|
|
var other=length-finish_length;
|
|
var s="";
|
|
for (var i=0;i<finish_length;i+=1)
|
|
s~=front;
|
|
for (var i=0;i<other;i+=1)
|
|
s~=back;
|
|
return sep[0]~s~sep[1];
|
|
}
|
|
};
|
|
};
|
|
}();
|
|
|
|
# return a high resolution progress bar
|
|
# example:
|
|
# var bar=process_bar.high_resolution_bar(40);
|
|
# for (var i=0;i<=1;i+=0.001) {
|
|
# print(bar.bar(i,40),'\r');
|
|
# unix.sleep(0.001);
|
|
# }
|
|
# println();
|
|
var high_resolution_bar = func() {
|
|
var block=["▏","▎","▍","▌","▋","▊","▉","█"];
|
|
return func(length) {
|
|
return {
|
|
bar: func(number) {
|
|
if (number>1)
|
|
number=1;
|
|
if (number<0)
|
|
number=0;
|
|
var block_len=number*length;
|
|
var complete_block=int(block_len);
|
|
var decimal=block_len-complete_block;
|
|
var progress=complete_block+(decimal!=0);
|
|
var s="|";
|
|
for (var i=0;i<complete_block;i+=1) {
|
|
s~="█";
|
|
}
|
|
if (decimal!=0) {
|
|
s~=block[int(decimal*10)/10*size(block)];
|
|
}
|
|
for (var i=0;i<length-progress;i+=1) {
|
|
s~=" ";
|
|
}
|
|
s~="|";
|
|
return s;
|
|
}
|
|
};
|
|
};
|
|
}();
|
|
|
|
var spinner = func() {
|
|
var generate_scrolling_spinner = func(s) {
|
|
if (typeof(s)!="str")
|
|
s="****";
|
|
if (size(s)>16)
|
|
s="****";
|
|
var vec=split("",s);
|
|
var res=[];
|
|
var len=size(vec);
|
|
var tmp="";
|
|
for (var i=0;i<len;i+=1) {
|
|
tmp=pop(vec)~tmp;
|
|
append(res,tmp);
|
|
while (size(res[-1])!=16)
|
|
res[-1]~=" ";
|
|
}
|
|
tmp=res[-1];
|
|
while (tmp!=" ") {
|
|
tmp=" "~substr(tmp,0,15);
|
|
append(res,tmp);
|
|
}
|
|
return res;
|
|
}
|
|
var spinner = {
|
|
rise:["▁","▂","▃","▄","▅","▆","▇","█","█","▇","▆","▅","▄","▃","▂","▁"],
|
|
vertical:["▏","▎","▍","▌","▋","▊","▉","▇","▇","▉","▊","▋","▌","▍","▎","▏"],
|
|
dot:["⠁","⠈","⠐","⠠","⢀","⡀","⠄","⠂"],
|
|
dots:["⣾","⣷","⣯","⣟","⡿","⢿","⣻","⣽"],
|
|
arrow:["↑","↗","→","↘","↓","↙","←","↖"],
|
|
classic:["/","-","\\","-"],
|
|
balls:["●...",".●..","..●.","...●",],
|
|
dots_wave:[
|
|
"⠈⠁⠂⠄⡀⢀⠠⠐",
|
|
"⠐⠈⠁⠂⠄⡀⢀⠠",
|
|
"⠠⠐⠈⠁⠂⠄⡀⢀",
|
|
"⢀⠠⠐⠈⠁⠂⠄⡀",
|
|
"⡀⢀⠠⠐⠈⠁⠂⠄",
|
|
"⠄⡀⢀⠠⠐⠈⠁⠂",
|
|
"⠂⠄⡀⢀⠠⠐⠈⠁",
|
|
"⠁⠂⠄⡀⢀⠠⠐⠈"
|
|
],
|
|
pulse:[
|
|
"●---------------",
|
|
"-●--------------",
|
|
"--●-------------",
|
|
"---●------------",
|
|
"----●-----------",
|
|
"-----●----------",
|
|
"------●---------",
|
|
"-------√--------",
|
|
"-------√\\-------",
|
|
"-------√\\/------",
|
|
"-------√\\/●-----",
|
|
"--------\\/-●----",
|
|
"---------/--●---",
|
|
"-------------●--",
|
|
"--------------●-",
|
|
"---------------●"
|
|
],
|
|
wave:[
|
|
"▁▂▃▄▅▆▇█",
|
|
"▂▃▄▅▆▇█▇",
|
|
"▃▄▅▆▇█▇▆",
|
|
"▄▅▆▇█▇▆▅",
|
|
"▅▆▇█▇▆▅▄",
|
|
"▆▇█▇▆▅▄▃",
|
|
"▇█▇▆▅▄▃▂",
|
|
"█▇▆▅▄▃▂▁",
|
|
"▇▆▅▄▃▂▁▂",
|
|
"▆▅▄▃▂▁▂▃",
|
|
"▅▄▃▂▁▂▃▄",
|
|
"▄▃▂▁▂▃▄▅",
|
|
"▃▂▁▂▃▄▅▆",
|
|
"▂▁▂▃▄▅▆▇"
|
|
],
|
|
short_wave:[
|
|
"▅▄█▇",
|
|
"▄▃▇▆",
|
|
"▃▂▆▅",
|
|
"▂▁▅▄",
|
|
"▁▂▄▃",
|
|
"▂▃▃▂",
|
|
"▃▄▂▁",
|
|
"▄▅▁▂",
|
|
"▅▆▂▃",
|
|
"▆▇▃▄",
|
|
"▇█▄▅",
|
|
"█▇▅▆",
|
|
"▇▆▆▇",
|
|
"▆▅▇█"
|
|
],
|
|
happy:[
|
|
" ",
|
|
"ᕗ ",
|
|
" ᕗ ",
|
|
") ᕗ ",
|
|
"ᐛ ) ᕗ ",
|
|
" ᐛ ) ᕗ ",
|
|
"( ᐛ ) ᕗ ",
|
|
" ( ᐛ ) ᕗ ",
|
|
" ᕕ ( ᐛ ) ᕗ ",
|
|
" ᕕ ( ᐛ ) ᕗ ",
|
|
" ᕕ ( ᐛ ) ᕗ ",
|
|
" ᕕ ( ᐛ ) ᕗ ",
|
|
" ᕕ ( ᐛ ) ᕗ ",
|
|
" ᕕ ( ᐛ ) ᕗ ",
|
|
" ᕕ ( ᐛ ) ᕗ",
|
|
" ᕕ ( ᐛ ) ",
|
|
" ᕕ ( ᐛ )",
|
|
" ᕕ ( ᐛ ",
|
|
" ᕕ ( ᐛ",
|
|
" ᕕ ( ",
|
|
" ᕕ (",
|
|
" ᕕ ",
|
|
" ᕕ",
|
|
],
|
|
fish:generate_scrolling_spinner("><))))`>"),
|
|
wait:generate_scrolling_spinner("please wait"),
|
|
stars:generate_scrolling_spinner("********")
|
|
};
|
|
return func(type = "classic", repeat = 1) {
|
|
if (typeof(type)!="str" or !contains(spinner,type))
|
|
type="classic";
|
|
type=spinner[type];
|
|
var counter=0;
|
|
return {
|
|
next: func() {
|
|
var s="";
|
|
for (var i=0;i<repeat;i+=1)
|
|
s~=type[counter];
|
|
counter+=1;
|
|
if (counter>=size(type))
|
|
counter=0;
|
|
return s;
|
|
}
|
|
}
|
|
};
|
|
}();
|
|
|
|
var default_bar = func(name = "classic", length = 20) {
|
|
if (typeof(name)!="str")
|
|
name="classic";
|
|
if (name=="classic")
|
|
return bar("sharp","point","bracket",length);
|
|
elsif (name=="classic2")
|
|
return bar("equal","point","bracket",length);
|
|
elsif (name=="classic3")
|
|
return bar("sharp","point","line",length);
|
|
elsif (name=="classic4")
|
|
return bar("equal","point","line",length);
|
|
elsif (name=="triangle")
|
|
return bar("solid_triangle_right","hollow_triangle_right","angle_bracket",length);
|
|
elsif (name=="dots")
|
|
return bar("solid_circle","hollow_circle","curve",length);
|
|
elsif (name=="ticks")
|
|
return bar("tick","space","line",length);
|
|
elsif (name=="deep_shadow")
|
|
return bar("deep_shadow","light_shadow","line",length);
|
|
elsif (name=="block")
|
|
return bar("block","light_shadow","line",length);
|
|
elsif (name=="oneline")
|
|
return bar("line","space","space",length);
|
|
else
|
|
return bar("sharp","point","bracket",length);
|
|
}
|
|
|
|
var default_spinner = func(name = "classic", repeat = 1) {
|
|
if (typeof(name)!="str")
|
|
name="classic";
|
|
if (name=="rise")
|
|
return spinner("rise",repeat);
|
|
elsif (name=="vertical")
|
|
return spinner("vertical",repeat);
|
|
elsif (name=="dot")
|
|
return spinner("dot",repeat);
|
|
elsif (name=="dots")
|
|
return spinner("dots",repeat);
|
|
elsif (name=="arrow")
|
|
return spinner("arrow",repeat);
|
|
elsif (name=="classic")
|
|
return spinner("classic",repeat);
|
|
elsif (name=="balls")
|
|
return spinner("balls",repeat);
|
|
elsif (name=="dots_wave")
|
|
return spinner("dots_wave",repeat);
|
|
elsif (name=="pulse")
|
|
return spinner("pulse",repeat);
|
|
elsif (name=="wave")
|
|
return spinner("wave",repeat);
|
|
elsif (name=="short_wave")
|
|
return spinner("short_wave",repeat);
|
|
elsif (name=="fish")
|
|
return spinner("fish",repeat);
|
|
elsif (name=="happy")
|
|
return spinner("happy",repeat);
|
|
elsif (name=="wait")
|
|
return spinner("wait",repeat);
|
|
elsif (name=="stars")
|
|
return spinner("stars",repeat);
|
|
else
|
|
return spinner("classic",repeat);
|
|
}
|
|
|
|
var show = func() {
|
|
print("\ec");
|
|
var bars={
|
|
"classic ":default_bar("classic",40),
|
|
"classic2 ":default_bar("classic2",40),
|
|
"classic3 ":default_bar("classic3",40),
|
|
"classic4 ":default_bar("classic4",40),
|
|
"triangle ":default_bar("triangle",40),
|
|
"dots ":default_bar("dots",40),
|
|
"ticks ":default_bar("ticks",40),
|
|
"deep_shadow":default_bar("deep_shadow",40),
|
|
"block ":default_bar("block",40),
|
|
"oneline ":default_bar("oneline",40)
|
|
};
|
|
var spinners={
|
|
"rise ":default_spinner("rise",16),
|
|
"vertical ":default_spinner("vertical",16),
|
|
"dot ":default_spinner("dot",16),
|
|
"dots ":default_spinner("dots",16),
|
|
"arrow ":default_spinner("arrow",16),
|
|
"classic ":default_spinner("classic",16),
|
|
"balls ":default_spinner("balls",4),
|
|
"dots_wave ":default_spinner("dots_wave",2),
|
|
"pulse ":default_spinner("pulse",1),
|
|
"wave ":default_spinner("wave",2),
|
|
"short_wave ":default_spinner("short_wave",4),
|
|
"fish ":default_spinner("fish",1),
|
|
"happy ":default_spinner("happy",1),
|
|
"wait ":default_spinner("wait",1),
|
|
"stars ":default_spinner("stars",1)
|
|
};
|
|
var bar_key=keys(bars);
|
|
var spin_key=keys(spinners);
|
|
for (var i=0; i<40; i+=1) {
|
|
forindex(var j; bar_key) {
|
|
var k=bar_key[j];
|
|
print("\e["~(j+1)~";1H["~k~"] "~bars[k].bar((i+1)/40));
|
|
}
|
|
forindex(var j; spin_key) {
|
|
var k=spin_key[j];
|
|
print("\e["~(j+1+size(bars))~";1H["~k~"] |"~spinners[k].next()~"|");
|
|
}
|
|
unix.sleep(1/20);
|
|
}
|
|
print("\n");
|
|
} |