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.linkLibC();
|
||||||
exe.root_module.addImport("grapheme", zg.module("grapheme"));
|
exe.root_module.addImport("grapheme", zg.module("grapheme"));
|
||||||
exe.root_module.addImport("DisplayWidth", zg.module("DisplayWidth"));
|
exe.root_module.addImport("DisplayWidth", zg.module("DisplayWidth"));
|
||||||
|
const clap = b.dependency("clap", .{});
|
||||||
|
exe.root_module.addImport("clap", clap.module("clap"));
|
||||||
|
|
||||||
b.installArtifact(exe);
|
b.installArtifact(exe);
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,10 @@
|
||||||
.url = "https://codeberg.org/dude_the_builder/zg/archive/v0.13.2.tar.gz",
|
.url = "https://codeberg.org/dude_the_builder/zg/archive/v0.13.2.tar.gz",
|
||||||
.hash = "122055beff332830a391e9895c044d33b15ea21063779557024b46169fb1984c6e40",
|
.hash = "122055beff332830a391e9895c044d33b15ea21063779557024b46169fb1984c6e40",
|
||||||
},
|
},
|
||||||
|
.clap = .{
|
||||||
|
.url = "git+https://github.com/Hejsil/zig-clap#c0193e9247335a6c1688b946325060289405de2a",
|
||||||
|
.hash = "12207ee987ce045596cb992cfb15b0d6d9456e50d4721c3061c69dabc2962053644d",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
.paths = .{
|
.paths = .{
|
||||||
// This makes *all* files, recursively, included in this package. It is generally
|
// 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
|
//c library usage based on https://medium.com/@eddo2626/lets-learn-zig-4-using-c-libraries-in-zig-5fcc3206f0dc
|
||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
const clap = @import("clap");
|
const clap = @import("clap");
|
||||||
|
|
||||||
|
//using the zg lib: https://codeberg.org/dude_the_builder/zg
|
||||||
const DisplayWidth = @import("DisplayWidth");
|
const DisplayWidth = @import("DisplayWidth");
|
||||||
const c = @cImport({
|
const c = @cImport({
|
||||||
@cInclude("pdfgen.h");
|
@cInclude("pdfgen.h");
|
||||||
|
@ -19,7 +19,7 @@ const assert = std.debug.assert;
|
||||||
const Card = struct {
|
const Card = struct {
|
||||||
name: []const u8 = "", //string
|
name: []const u8 = "", //string
|
||||||
mana_cost: []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
|
type_line: []const u8 = "", //string
|
||||||
oracle_text: []const u8 = "", //string
|
oracle_text: []const u8 = "", //string
|
||||||
power: []const u8 = "", //coerced to string
|
power: []const u8 = "", //coerced to string
|
||||||
|
@ -44,7 +44,7 @@ const cardWidth = 30;
|
||||||
const cardHeight = 32;
|
const cardHeight = 32;
|
||||||
const minCardHeight = 5;
|
const minCardHeight = 5;
|
||||||
const pageHeight = 66;
|
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 formatString = "{s: <" ++ std.fmt.digits2(cardWidth) ++ "}";
|
||||||
const lineFormatter = "|" ++ formatString;
|
const lineFormatter = "|" ++ formatString;
|
||||||
|
@ -60,19 +60,26 @@ test "Check constants" {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn main() !void {
|
pub fn main() !void {
|
||||||
var args = try std.process.argsWithAllocator(std.heap.page_allocator);
|
// 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 arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
||||||
defer arena.deinit();
|
defer arena.deinit();
|
||||||
const allocator = arena.allocator();
|
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, .{});
|
const oracleFile = try cwd.openFile(oracleFileName, .{});
|
||||||
var jsonReader = json.reader(allocator, oracleFile.reader());
|
var jsonReader = json.reader(allocator, oracleFile.reader());
|
||||||
const parsedJson = try json.parseFromTokenSource([]Card, allocator, &jsonReader, .{ .ignore_unknown_fields = true });
|
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() });
|
cards.sort(CardSortContext{ .list = cards.values() });
|
||||||
var allPrinted = std.ArrayList([]const u8).init(allocator);
|
var allPrinted = std.ArrayList([]const u8).init(allocator);
|
||||||
|
const pdfHeight = c.PDF_LETTER_HEIGHT;
|
||||||
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).* }).?);
|
const pdfWidth = c.PDF_LETTER_WIDTH;
|
||||||
_ = c.pdf_set_font(pdf_doc, "Times-Roman");
|
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);
|
var rowToPrint = std.ArrayList(TextCard).init(allocator);
|
||||||
for (cards.values()) |cardText| {
|
for (cards.values()) |cardText| {
|
||||||
|
@ -124,10 +131,10 @@ pub fn main() !void {
|
||||||
const pageRelative = rowNum % pageHeight;
|
const pageRelative = rowNum % pageHeight;
|
||||||
const pageOffset: f32 = 12 * @as(f32, @floatFromInt(pageRelative));
|
const pageOffset: f32 = 12 * @as(f32, @floatFromInt(pageRelative));
|
||||||
if (pageRelative != 0) {
|
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 {
|
} else {
|
||||||
page = c.pdf_append_page(pdf_doc);
|
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,
|
third: []const u8 = spacer,
|
||||||
last: []const u8 = "\n",
|
last: []const u8 = "\n",
|
||||||
fn print(allocator: std.mem.Allocator, cards: []TextCard, allPrinted: *std.ArrayList([]const u8)) !void {
|
fn print(allocator: std.mem.Allocator, cards: []TextCard, allPrinted: *std.ArrayList([]const u8)) !void {
|
||||||
// _ = allocator;
|
|
||||||
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
||||||
|
|
||||||
var lines = linesList{};
|
var lines = linesList{};
|
||||||
|
@ -215,15 +221,11 @@ const cardRow = struct {
|
||||||
const dw = DisplayWidth{ .data = &dwd };
|
const dw = DisplayWidth{ .data = &dwd };
|
||||||
|
|
||||||
for (cards, 0..) |cardObj, cardNo| {
|
for (cards, 0..) |cardObj, cardNo| {
|
||||||
//const cardText = try card(cardObj);
|
|
||||||
const cardText = cardObj.lines;
|
const cardText = cardObj.lines;
|
||||||
for (cardText, 0..) |line, idx| {
|
for (cardText, 0..) |line, idx| {
|
||||||
//this step is probably unnecessary
|
|
||||||
const strippedLine = std.mem.trimRight(u8, line, " ");
|
const strippedLine = std.mem.trimRight(u8, line, " ");
|
||||||
const paddedLine = try std.fmt.allocPrint(gpa.allocator(), lineFormatter, .{strippedLine});
|
const paddedLine = try std.fmt.allocPrint(gpa.allocator(), lineFormatter, .{strippedLine});
|
||||||
// const theoreticalLength = (paddedLine.len * 3) + 1;
|
|
||||||
assert(dw.strWidth(paddedLine) == dw.strWidth(spacer));
|
assert(dw.strWidth(paddedLine) == dw.strWidth(spacer));
|
||||||
// assert(theoreticalLength == pageWidth);
|
|
||||||
const placeholder = if (idx < lines.items(.first).len) lines.get(idx) else cardRow{};
|
const placeholder = if (idx < lines.items(.first).len) lines.get(idx) else cardRow{};
|
||||||
const new: cardRow = switch (cardNo) {
|
const new: cardRow = switch (cardNo) {
|
||||||
0 => .{ .first = paddedLine },
|
0 => .{ .first = paddedLine },
|
||||||
|
@ -244,9 +246,8 @@ const cardRow = struct {
|
||||||
}
|
}
|
||||||
for (lines.items(.first), 0..) |_, idx| {
|
for (lines.items(.first), 0..) |_, idx| {
|
||||||
const line = lines.get(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 });
|
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);
|
try allPrinted.append(fullLine);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
Loading…
Reference in New Issue