BastliPOSPrinter

A collection of programs that allow receipt printing
git clone git://xatko.vsos.ethz.ch/BastliPOSPrinter.git
Log | Files | Refs

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 }