Skip to content
Snippets Groups Projects
Commit 98692288 authored by Rob Swindell's avatar Rob Swindell :speech_balloon:
Browse files

Add configurable size formatting, filename formatting, ext-description offset

parent 6f2cbca9
No related branches found
No related tags found
1 merge request!463MRC mods by Codefenix (2024-10-20)
...@@ -19,27 +19,28 @@ var json_space; ...@@ -19,27 +19,28 @@ var json_space;
var detail = -1; var detail = -1;
var dir_list = []; var dir_list = [];
var filespec = ""; var filespec = "";
var extdesc_offset = 25; var extdesc_prefix;
var since = 0; var since = 0;
var props = []; var props = [];
var fmt; var fmt;
var name_len = 12;
var date_fmt; var date_fmt;
var byte_fmt = 2; var size_fmt = 2;
var byte_fmts = [ var size_fmts = [
// bytes, precision // bytes, precision, minlen
[undefined, undefined ], [undefined, undefined, 10 ],
[false, 0 ], [false, 0, 5 ],
[false, 1 ], [false, 1, 6 ],
[false, 2 ], [false, 2, 7 ],
[1024, 0 ], [1024, 0, 5 ],
[1024, 1 ], [1024, 1, 6 ],
[1024, 2 ], [1024, 2, 7 ],
[1024*1024, 0 ], [1024*1024, 0, 5 ],
[1024*1024, 1 ], [1024*1024, 1, 6 ],
[1024*1024, 2 ], [1024*1024, 2, 7 ],
[1024*1024, 3 ], [1024*1024, 3, 8 ],
[true, undefined ], [true, undefined, 7 ],
[false, undefined ], [false, undefined, 7 ],
]; ];
for(var i = 0; i < argc; i++) { for(var i = 0; i < argc; i++) {
var arg = argv[i]; var arg = argv[i];
...@@ -56,12 +57,17 @@ for(var i = 0; i < argc; i++) { ...@@ -56,12 +57,17 @@ for(var i = 0; i < argc; i++) {
writeln(" -hdr include header for each directory"); writeln(" -hdr include header for each directory");
writeln(" -sort[=prop] enable case-sensitive output sorting"); writeln(" -sort[=prop] enable case-sensitive output sorting");
writeln(" -isort[=prop] enable case-insensitive output sorting"); writeln(" -isort[=prop] enable case-insensitive output sorting");
writeln(" -reverse reverse the sort order");
writeln(" -json[=spaces] use JSON formatted output"); writeln(" -json[=spaces] use JSON formatted output");
writeln(" -new=<days> include new files uploaded in past <days>"); writeln(" -new=<days> include new files uploaded in past <days>");
writeln(" -date=<fmt> specify date/time display format (strftime syntax)");
writeln(" -p=[list] specify comma-separated list of property names to print"); writeln(" -p=[list] specify comma-separated list of property names to print");
writeln(" -fmt=<fmt> specify output format string (printf syntax)");
writeln(" -ext include extended file descriptions"); writeln(" -ext include extended file descriptions");
writeln(" -ext=<prefix> specify extended file description prefix");
writeln(" -fmt=<fmt> specify output format string (printf syntax)");
writeln(" -date=<fmt> specify date/time display format (strftime syntax)");
writeln(" -size=<fmt> specify size/byte display format (0-" + (size_fmts.length - 1) + ")");
writeln(" -name=<len> specify filename length");
writeln(" -pad pad filename with spaces");
writeln(" -v increase verbosity (detail) of output"); writeln(" -v increase verbosity (detail) of output");
exit(0); exit(0);
} }
...@@ -93,8 +99,8 @@ for(var i = 0; i < argc; i++) { ...@@ -93,8 +99,8 @@ for(var i = 0; i < argc; i++) {
date_fmt = opt.slice(5); date_fmt = opt.slice(5);
continue; continue;
} }
if(opt.indexOf("unit=") == 0) { if(opt.indexOf("name=") == 0) {
unit = parseInt(opt.slice(5), 10); name_len = parseInt(opt.slice(5), 10);
continue; continue;
} }
if(opt.indexOf("sort=") == 0) { if(opt.indexOf("sort=") == 0) {
...@@ -114,7 +120,7 @@ for(var i = 0; i < argc; i++) { ...@@ -114,7 +120,7 @@ for(var i = 0; i < argc; i++) {
continue; continue;
} }
if(opt.indexOf("ext=") == 0) { if(opt.indexOf("ext=") == 0) {
extdesc_offset = parseInt(opt.slice(4), 10); extdesc_prefix = opt.slice(4);
detail = FileBase.DETAIL.EXTENDED; detail = FileBase.DETAIL.EXTENDED;
continue; continue;
} }
...@@ -144,10 +150,13 @@ for(var i = 0; i < argc; i++) { ...@@ -144,10 +150,13 @@ for(var i = 0; i < argc; i++) {
fmt = opt.slice(4); fmt = opt.slice(4);
continue; continue;
} }
if(opt.indexOf("b=") == 0) { if(opt.indexOf("size=") == 0) {
byte_fmt = parseInt(opt.slice(2), 10); opt = opt.slice(5);
if(byte_fmt >= byte_fmts.length) size_fmt = parseInt(opt, 10);
byte_fmt = 0; if(isNaN(size_fmt))
size_fmt = opt;
else if(size_fmt >= size_fmts.length)
size_fmt = 0;
continue; continue;
} }
if(opt == "all") { if(opt == "all") {
...@@ -169,11 +178,17 @@ if(fmt != "json") { ...@@ -169,11 +178,17 @@ if(fmt != "json") {
detail = FileBase.DETAIL.EXTENDED; //Math.max(0, detail); detail = FileBase.DETAIL.EXTENDED; //Math.max(0, detail);
if(!props.length) { if(!props.length) {
var f = "%-13s"; var f = "%-" + name_len + "s";
var offset = name_len;
props.push("name"); props.push("name");
if(detail >= FileBase.DETAIL.MIN) { if(detail >= FileBase.DETAIL.MIN) {
props.push("size"); props.push("size");
f += " %10s"; if(typeof size_fmt == 'string')
f += size_fmt;
else {
f += " %" + size_fmts[size_fmt][2] + "s";
offset += size_fmts[size_fmt][2] + 1;
}
} }
if(detail >= FileBase.DETAIL.NORM) { if(detail >= FileBase.DETAIL.NORM) {
props.push("desc"); props.push("desc");
...@@ -181,6 +196,8 @@ if(fmt != "json") { ...@@ -181,6 +196,8 @@ if(fmt != "json") {
} }
if(detail >= FileBase.DETAIL.EXTENDED) { if(detail >= FileBase.DETAIL.EXTENDED) {
props.push("extdesc"); props.push("extdesc");
if(extdesc_prefix === undefined)
extdesc_prefix = format("%*s| ", offset - 1, "");
f += "%s"; f += "%s";
} }
if(!fmt) if(!fmt)
...@@ -261,6 +278,8 @@ else if(options.sort) { ...@@ -261,6 +278,8 @@ else if(options.sort) {
); );
} }
} }
if(options.reverse)
file_list.reverse();
log("Formatting " + file_list.length + " files for output..."); log("Formatting " + file_list.length + " files for output...");
if(fmt == "json") { if(fmt == "json") {
...@@ -328,19 +347,22 @@ function list_file(file, fmt, props) ...@@ -328,19 +347,22 @@ function list_file(file, fmt, props)
fmt = "%s"; fmt = "%s";
var a = [fmt]; var a = [fmt];
for(var i in props) { for(var i in props) {
var p = file[props[i]]; var name = props[i];
var p = file[name];
switch(typeof p) { switch(typeof p) {
case "undefined": case "undefined":
a.push(''); a.push('');
break; break;
case "string": case "string":
if(props[i] == 'extdesc') if(name == 'name')
a.push(p.replace(/([^\n]+)/g, format("%*s| $&", extdesc_offset, "")).trimRight()); a.push(FileBase().format_name(p, name_len, options.pad));
else if(name == 'extdesc')
a.push(p.replace(/([^\n]+)/g, (extdesc_prefix + "$&")).trimRight());
else else
a.push(p); a.push(p);
break; break;
case "number": case "number":
switch(props[i]) { switch(name) {
case 'time': case 'time':
case 'added': case 'added':
case 'last_downloaded': case 'last_downloaded':
...@@ -354,11 +376,15 @@ function list_file(file, fmt, props) ...@@ -354,11 +376,15 @@ function list_file(file, fmt, props)
break; break;
case 'size': case 'size':
case 'cost': case 'cost':
if(byte_fmts[byte_fmt][0] !== undefined if(typeof size_fmt == 'string') {
|| byte_fmts[byte_fmt][1] !== undefined) { a.push(format(size_fmt, p));
break;
}
if(size_fmts[size_fmt][0] !== undefined
|| size_fmts[size_fmt][1] !== undefined) {
a.push(file_size_str(p a.push(file_size_str(p
,/* unit: */ byte_fmts[byte_fmt][0] ,/* unit: */ size_fmts[size_fmt][0]
,/* precision: */ byte_fmts[byte_fmt][1])); ,/* precision: */ size_fmts[size_fmt][1]));
break; break;
} }
default: default:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment