JSON_to_GROFF.d (1453B)
1 import std.stdio; 2 import std.json; 3 import std.array; 4 import std.algorithm; 5 import std.regex; 6 import std.format; 7 import std.conv; 8 import std.range; 9 import std.datetime : Clock; 10 11 void main(string[] argv){ 12 auto str=stdin.byChunk(4096).map!(a=>cast(char[])a).joiner(); 13 auto j=parseJSON(str); 14 15 string positions(){ 16 Appender!string app; 17 app~=".na\n"; 18 app~=".TS\n"; 19 "llxni\n".repeat(j["articles"].array.length).copy(app); 20 app~="===\n"; 21 app~="llxbni\n"; 22 app~=".\n"; 23 double total=0; 24 foreach(ulong ix,art; j["articles"]){ 25 double price=art["price"].str.to!double; 26 string name=art["name"].str; 27 ulong amount=art["amount"].integer; 28 app.formattedWrite!"%d\tT{\n%s\nT}\t%.2f\n"(amount,name,price); 29 total+=price * amount; 30 } 31 app~="\n"; 32 app.formattedWrite("\tTOTAL\t%.2f\n", total); 33 app~=".TE\n"; 34 app~=".al\n"; 35 return app.data; 36 } 37 string delegate()[string] tbl=[ 38 "sale_id": (){return j["sale_id"].integer.to!string;}, 39 "positions": &positions, 40 "today": (){return Clock.currTime.toISOExtString();}, 41 ]; 42 auto lookup(Captures!(char[]) cap){ 43 auto b=cap[1]; 44 auto fct=b in tbl; 45 if(!fct){ 46 return "{{"~b~"}}"; 47 } 48 else{ 49 return cast(const(char)[])(*fct)(); 50 } 51 } 52 File tmplate=File(argv[1], "r"); 53 scope(exit)tmplate.close(); 54 auto reg=ctRegex!("\\{\\{([^}]+)\\}\\}"); 55 auto sink=stdout.lockingTextWriter; 56 57 foreach(line; tmplate.byLine(KeepTerminator.yes)){ 58 replaceAllInto!(lookup)(sink, line, reg); 59 } 60 61 }