esv: detect passage line length based on terminal width

Implements: https://todo.sr.ht/~jeremy/esv/2
This commit is contained in:
Jeremy Baxter 2024-06-18 18:41:30 +12:00
parent d68b83b722
commit 982273b9d7

32
esv.d
View file

@ -44,6 +44,7 @@ string CFlag; /* config */
bool fFlag, FFlag; /* footnotes */ bool fFlag, FFlag; /* footnotes */
bool hFlag, HFlag; /* headings */ bool hFlag, HFlag; /* headings */
int lFlag; /* line length */ int lFlag; /* line length */
bool lFlagSpecified;
bool nFlag, NFlag; /* verse numbers */ bool nFlag, NFlag; /* verse numbers */
bool rFlag, RFlag; /* passage references */ bool rFlag, RFlag; /* passage references */
string sFlag; /* search passages */ string sFlag; /* search passages */
@ -70,7 +71,7 @@ main(string[] args)
import core.sys.openbsd.unistd : pledge; import core.sys.openbsd.unistd : pledge;
import std.string : toStringz; import std.string : toStringz;
promises = toStringz("stdio rpath wpath cpath inet dns proc exec prot_exec"); promises = toStringz("stdio rpath wpath cpath inet dns tty proc exec prot_exec");
pledge(promises, null); pledge(promises, null);
}(); }();
@ -87,7 +88,7 @@ main(string[] args)
"C", &CFlag, "C", &CFlag,
"F", &FFlag, "f", &fFlag, "F", &FFlag, "f", &fFlag,
"H", &HFlag, "h", &hFlag, "H", &HFlag, "h", &hFlag,
"l", &lFlag, "l", &onLineLength,
"N", &NFlag, "n", &nFlag, "N", &NFlag, "n", &nFlag,
"R", &RFlag, "r", &rFlag, "R", &RFlag, "r", &rFlag,
"s", &sFlag, "s", &sFlag,
@ -100,8 +101,6 @@ main(string[] args)
"missing argument for option " ~ e.extractOpt()); "missing argument for option " ~ e.extractOpt());
die(e.msg); /* catch-all */ die(e.msg); /* catch-all */
} catch (ConvException e) {
die("illegal argument to -l option -- must be integer");
} }
if (VFlag) { if (VFlag) {
@ -225,7 +224,8 @@ key = %s
/* Get line-length ([passage]) */ /* Get line-length ([passage]) */
try try
esv.opts.i["line-length"] = esv.opts.i["line-length"] =
ini["passage"].keyAs!int("line-length", 0); lFlagSpecified ? lFlag :
ini["passage"].keyAs!int("line-length", terminalColumns());
catch (INITypeException e) catch (INITypeException e)
die(configPath ~ ": " ~ e.msg); die(configPath ~ ": " ~ e.msg);
@ -237,7 +237,6 @@ key = %s
if (HFlag) esv.opts.b["include-headings"] = false; if (HFlag) esv.opts.b["include-headings"] = false;
if (NFlag) esv.opts.b["include-verse-numbers"] = false; if (NFlag) esv.opts.b["include-verse-numbers"] = false;
if (RFlag) esv.opts.b["include-passage-references"] = false; if (RFlag) esv.opts.b["include-passage-references"] = false;
if (lFlag != 0) esv.opts.i["line-length"] = lFlag;
try try
writeln(esv.getPassage(args[1].parseBook(), args[2])); writeln(esv.getPassage(args[1].parseBook(), args[2]));
@ -263,6 +262,17 @@ die(string mesg) @trusted
exit(1); exit(1);
} }
private ushort
terminalColumns() @trusted
{
import core.sys.posix.sys.ioctl;
winsize w;
ioctl(1, TIOCGWINSZ, &w);
return w.ws_col > 72 ? 72 : w.ws_col;
}
private void private void
enforceDie(A...)(bool cond, string fmt, A a) enforceDie(A...)(bool cond, string fmt, A a)
{ {
@ -280,6 +290,16 @@ extractOpt(in GetOptException e)
return e.msg.matchFirst("-.")[0]; return e.msg.matchFirst("-.")[0];
} }
private void
onLineLength(string flag, string value)
{
lFlagSpecified = true;
try
lFlag = value.to!int();
catch (ConvException e)
die("illegal argument to -l option -- must be a positive integer");
}
private string private string
parseBook(in string book) parseBook(in string book)
{ {