fixed some spacing problems, properly handling cli arguments now
This commit is contained in:
		
							parent
							
								
									5da40c6416
								
							
						
					
					
						commit
						72b8052f70
					
				|  | @ -21,6 +21,8 @@ pub fn build(b: *std.Build) void { | |||
|     exe.linkLibC(); | ||||
|     exe.root_module.addImport("grapheme", zg.module("grapheme")); | ||||
|     exe.root_module.addImport("DisplayWidth", zg.module("DisplayWidth")); | ||||
|     const clap = b.dependency("clap", .{}); | ||||
|     exe.root_module.addImport("clap", clap.module("clap")); | ||||
| 
 | ||||
|     b.installArtifact(exe); | ||||
| 
 | ||||
|  |  | |||
|  | @ -19,6 +19,10 @@ | |||
|             .url = "https://codeberg.org/dude_the_builder/zg/archive/v0.13.2.tar.gz", | ||||
|             .hash = "122055beff332830a391e9895c044d33b15ea21063779557024b46169fb1984c6e40", | ||||
|         }, | ||||
|         .clap = .{ | ||||
|             .url = "git+https://github.com/Hejsil/zig-clap#c0193e9247335a6c1688b946325060289405de2a", | ||||
|             .hash = "12207ee987ce045596cb992cfb15b0d6d9456e50d4721c3061c69dabc2962053644d", | ||||
|         }, | ||||
|     }, | ||||
|     .paths = .{ | ||||
|         // This makes *all* files, recursively, included in this package. It is generally | ||||
|  |  | |||
							
								
								
									
										1644
									
								
								output.pdf
								
								
								
								
							
							
						
						
									
										1644
									
								
								output.pdf
								
								
								
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -1,8 +1,8 @@ | |||
| //TODO: program is adding way more spacing than necessary at the bottom of pages, suspect the c lib | ||||
| // is computing size strangely | ||||
| //c library usage based on https://medium.com/@eddo2626/lets-learn-zig-4-using-c-libraries-in-zig-5fcc3206f0dc | ||||
| const std = @import("std"); | ||||
| const clap = @import("clap"); | ||||
| 
 | ||||
| //using the zg lib: https://codeberg.org/dude_the_builder/zg | ||||
| const DisplayWidth = @import("DisplayWidth"); | ||||
| const c = @cImport({ | ||||
|     @cInclude("pdfgen.h"); | ||||
|  | @ -19,7 +19,7 @@ const assert = std.debug.assert; | |||
| const Card = struct { | ||||
|     name: []const u8 = "",          //string | ||||
|     mana_cost: []const u8 = "",     //string | ||||
|     cmc: f32 = 0, //technically a float? but I think we can always cast safely cast. EDIT: NOPE | ||||
|     cmc: f32 = 0,                   //float | ||||
|     type_line: []const u8 = "",     //string | ||||
|     oracle_text: []const u8 = "",   //string | ||||
|     power: []const u8 = "",         //coerced to string | ||||
|  | @ -44,7 +44,7 @@ const cardWidth = 30; | |||
| const cardHeight = 32; | ||||
| const minCardHeight = 5; | ||||
| const pageHeight = 66;       | ||||
| var heightMayVary = true; | ||||
| var heightMayVary = true;   //whether or not cards must have a constant height | ||||
| 
 | ||||
| const formatString = "{s: <" ++ std.fmt.digits2(cardWidth) ++ "}"; | ||||
| const lineFormatter = "|" ++ formatString; | ||||
|  | @ -60,19 +60,26 @@ test "Check constants" { | |||
| } | ||||
| 
 | ||||
| pub fn main() !void { | ||||
|     var args = try std.process.argsWithAllocator(std.heap.page_allocator); | ||||
| 
 | ||||
|     //TODO: properly handle program arguments | ||||
|     _ = args.next(); //handle program name (args[0]) | ||||
|     const listFileName: []const u8 = args.next() orelse { | ||||
|         return error.ExpectedArgument; | ||||
|     }; | ||||
|     heightMayVary = stringToBool(args.next()); | ||||
|     // var args = try std.process.argsWithAllocator(std.heap.page_allocator); | ||||
| 
 | ||||
|     var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); | ||||
|     defer arena.deinit(); | ||||
|     const allocator = arena.allocator(); | ||||
| 
 | ||||
|     const params = comptime clap.parseParamsComptime( | ||||
|         \\-h, --help            Display this help and exit. | ||||
|         \\-l, --listFile <str>  The list of cards to print        | ||||
|         \\ | ||||
|     ); | ||||
| 
 | ||||
|     const res = clap.parse(clap.Help, ¶ms, clap.parsers.default, .{ | ||||
|         .allocator = allocator, | ||||
|     }) catch |err| { | ||||
|         return err; | ||||
|     }; | ||||
|     if(res.args.listFile == null) return error.ExpectedArgument; | ||||
|     const listFileName = res.args.listFile.?; | ||||
| 
 | ||||
|     const oracleFile = try cwd.openFile(oracleFileName, .{}); | ||||
|     var jsonReader = json.reader(allocator, oracleFile.reader()); | ||||
|     const parsedJson = try json.parseFromTokenSource([]Card, allocator, &jsonReader, .{ .ignore_unknown_fields = true }); | ||||
|  | @ -99,9 +106,9 @@ pub fn main() !void { | |||
| 
 | ||||
|     cards.sort(CardSortContext{ .list = cards.values() }); | ||||
|     var allPrinted = std.ArrayList([]const u8).init(allocator); | ||||
| 
 | ||||
|     const pdf_doc: *c.pdf_doc = @ptrCast(c.pdf_create(c.PDF_A4_WIDTH, c.PDF_A4_HEIGHT, &c.pdf_info{ .creator = ("My Software" ++ " " ** 53).* }).?); | ||||
|     _ = c.pdf_set_font(pdf_doc, "Times-Roman"); | ||||
|     const pdfHeight = c.PDF_LETTER_HEIGHT; | ||||
|     const pdfWidth = c.PDF_LETTER_WIDTH; | ||||
|     const pdf_doc: *c.pdf_doc = @ptrCast(c.pdf_create(pdfWidth, pdfHeight, &c.pdf_info{ .creator = ("My Software" ++ " " ** 53).* }).?); | ||||
| 
 | ||||
|     var rowToPrint = std.ArrayList(TextCard).init(allocator); | ||||
|     for (cards.values()) |cardText| { | ||||
|  | @ -124,10 +131,10 @@ pub fn main() !void { | |||
|         const pageRelative = rowNum % pageHeight; | ||||
|         const pageOffset: f32 = 12 * @as(f32, @floatFromInt(pageRelative)); | ||||
|         if (pageRelative != 0) { | ||||
|             _ = c.pdf_add_text(pdf_doc, page, try std.mem.Allocator.dupeZ(allocator, u8, text), 8, 10, c.PDF_A4_HEIGHT - pageOffset, c.PDF_BLACK); | ||||
|             _ = c.pdf_add_text(pdf_doc, page, try std.mem.Allocator.dupeZ(allocator, u8, text), 8, 10, pdfHeight - pageOffset, c.PDF_BLACK); | ||||
|         } else { | ||||
|             page = c.pdf_append_page(pdf_doc); | ||||
|             _ = c.pdf_add_text(pdf_doc, page, try std.mem.Allocator.dupeZ(allocator, u8, text), 8, 10, c.PDF_A4_HEIGHT - pageOffset, c.PDF_BLACK); | ||||
|             _ = c.pdf_add_text(pdf_doc, page, try std.mem.Allocator.dupeZ(allocator, u8, text), 8, 10, pdfHeight - pageOffset, c.PDF_BLACK); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|  | @ -206,7 +213,6 @@ const cardRow = struct { | |||
|     third: []const u8 = spacer, | ||||
|     last: []const u8 = "\n", | ||||
|     fn print(allocator: std.mem.Allocator, cards: []TextCard, allPrinted: *std.ArrayList([]const u8)) !void { | ||||
|         // _ = allocator; | ||||
|         var gpa = std.heap.GeneralPurposeAllocator(.{}){}; | ||||
| 
 | ||||
|         var lines = linesList{}; | ||||
|  | @ -215,15 +221,11 @@ const cardRow = struct { | |||
|         const dw = DisplayWidth{ .data = &dwd }; | ||||
| 
 | ||||
|         for (cards, 0..) |cardObj, cardNo| { | ||||
|             //const cardText = try card(cardObj); | ||||
|             const cardText = cardObj.lines; | ||||
|             for (cardText, 0..) |line, idx| { | ||||
|                 //this step is probably unnecessary | ||||
|                 const strippedLine = std.mem.trimRight(u8, line, " "); | ||||
|                 const paddedLine = try std.fmt.allocPrint(gpa.allocator(), lineFormatter, .{strippedLine}); | ||||
|                 // const theoreticalLength = (paddedLine.len * 3) + 1; | ||||
|                 assert(dw.strWidth(paddedLine) == dw.strWidth(spacer)); | ||||
|                 // assert(theoreticalLength == pageWidth); | ||||
|                 const placeholder = if (idx < lines.items(.first).len) lines.get(idx) else cardRow{}; | ||||
|                 const new: cardRow = switch (cardNo) { | ||||
|                     0 => .{ .first = paddedLine }, | ||||
|  | @ -244,9 +246,8 @@ const cardRow = struct { | |||
|         } | ||||
|         for (lines.items(.first), 0..) |_, idx| { | ||||
|             const line = lines.get(idx); | ||||
|             // const printedWidth = line + line.second.len + line.third.len + line.last.len; | ||||
|             // assert(printedWidth == pageWidth); | ||||
|             const fullLine = try std.mem.concat(gpa.allocator(), u8, &[_][]const u8{ line.first, line.second, line.third, line.last }); | ||||
|             assert(dw.strWidth(fullLine) == dw.strWidth(fullWidthSpacer)); | ||||
|             try allPrinted.append(fullLine); | ||||
|         } | ||||
|     } | ||||
|  |  | |||
										
											Binary file not shown.
										
									
								
							
		Loading…
	
		Reference in New Issue