Compare commits
No commits in common. "12e96454ff6e883710cbc43c713673349300649f" and "013f4687039e713d24a79677754db9f894cd9a0d" have entirely different histories.
12e96454ff
...
013f468703
47
src/main.zig
47
src/main.zig
|
@ -2,6 +2,9 @@ const std = @import("std");
|
|||
const clap = @import("clap");
|
||||
const md4c = @import("md4c_h.zig");
|
||||
const ansi = @import("ansi-term");
|
||||
const cstdio = @cImport({
|
||||
@cInclude("stdio.h");
|
||||
});
|
||||
|
||||
pub fn main() !void {
|
||||
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
||||
|
@ -9,8 +12,7 @@ pub fn main() !void {
|
|||
|
||||
const params = comptime clap.parseParamsComptime(
|
||||
\\-h, --help display this help and exit
|
||||
\\-v, --version display the version and exit
|
||||
\\<FILE> file to read from, empty or "-" use stdin
|
||||
\\<FILE> file to read from, if empty or "-" use stdin.
|
||||
\\
|
||||
);
|
||||
|
||||
|
@ -28,14 +30,8 @@ pub fn main() !void {
|
|||
};
|
||||
defer res.deinit();
|
||||
|
||||
if (res.args.help != 0) return clap.help(std.io.getStdErr().writer(), clap.Help, ¶ms, .{});
|
||||
|
||||
const version_string = "0.1.1\n";
|
||||
|
||||
if (res.args.version != 0) return std.debug.print(version_string, .{});
|
||||
|
||||
var reader: std.io.AnyReader = undefined;
|
||||
if (res.positionals.len < 1 or std.mem.eql(u8, res.positionals[0], "-")) {
|
||||
if (res.positionals.len < 1) {
|
||||
reader = std.io.getStdIn().reader().any();
|
||||
} else {
|
||||
const filename = res.positionals[0];
|
||||
|
@ -101,36 +97,30 @@ const State = struct {
|
|||
};
|
||||
|
||||
fn enter_block(blocktype: md4c.MD_BLOCKTYPE, detail: ?*anyopaque, userdata: ?*anyopaque) callconv(.C) c_int {
|
||||
//std.debug.print("enter {d}\n", .{blocktype});
|
||||
const state: *State = @ptrCast(@alignCast(userdata));
|
||||
|
||||
if (blocktype == md4c.MD_BLOCK_H) {
|
||||
just_write(state.writer, "\n");
|
||||
|
||||
const h_detail: *md4c.MD_BLOCK_H_DETAIL = @ptrCast(@alignCast(detail));
|
||||
|
||||
var temp_style = state.last_style;
|
||||
temp_style.font_style.dim = true;
|
||||
temp_style.font_style.bold = true;
|
||||
state.update_style(temp_style);
|
||||
|
||||
for (0..h_detail.level) |_| {
|
||||
just_write(state.writer, "#");
|
||||
}
|
||||
|
||||
temp_style.font_style.dim = false;
|
||||
temp_style.font_style.bold = state.nested_bold_count > 0;
|
||||
state.update_style(temp_style);
|
||||
|
||||
just_write(state.writer, " ");
|
||||
}
|
||||
if (blocktype == md4c.MD_BLOCK_LI) {
|
||||
const li_detail: *md4c.MD_BLOCK_LI_DETAIL = @ptrCast(@alignCast(detail));
|
||||
|
||||
var temp_style = state.last_style;
|
||||
if (li_detail.is_task == 0) temp_style.font_style.dim = true;
|
||||
temp_style.font_style.bold = true;
|
||||
state.update_style(temp_style);
|
||||
|
||||
if (li_detail.is_task == 0) {
|
||||
just_write(state.writer, "• ");
|
||||
} else {
|
||||
|
@ -140,7 +130,6 @@ fn enter_block(blocktype: md4c.MD_BLOCKTYPE, detail: ?*anyopaque, userdata: ?*an
|
|||
just_write(state.writer, "☐ ");
|
||||
}
|
||||
}
|
||||
|
||||
temp_style.font_style.dim = false;
|
||||
temp_style.font_style.bold = state.nested_bold_count > 0;
|
||||
state.update_style(temp_style);
|
||||
|
@ -152,6 +141,7 @@ fn enter_block(blocktype: md4c.MD_BLOCKTYPE, detail: ?*anyopaque, userdata: ?*an
|
|||
}
|
||||
|
||||
fn leave_block(blocktype: md4c.MD_BLOCKTYPE, detail: ?*anyopaque, userdata: ?*anyopaque) callconv(.C) c_int {
|
||||
//std.debug.print("leave {d}\n", .{blocktype});
|
||||
const state: *State = @ptrCast(@alignCast(userdata));
|
||||
|
||||
if (blocktype == md4c.MD_BLOCK_H) {
|
||||
|
@ -161,15 +151,14 @@ fn leave_block(blocktype: md4c.MD_BLOCKTYPE, detail: ?*anyopaque, userdata: ?*an
|
|||
just_write(state.writer, "\n");
|
||||
}
|
||||
if (blocktype == md4c.MD_BLOCK_HR) {
|
||||
var winsize: std.c.winsize = undefined;
|
||||
var temp_style = state.last_style;
|
||||
temp_style.font_style.dim = true;
|
||||
temp_style.font_style.bold = true;
|
||||
state.update_style(temp_style);
|
||||
|
||||
const term_name = "/dev/tty";
|
||||
const term_name_c = cstdio.ctermid(null);
|
||||
const term_name = std.mem.sliceTo(term_name_c, 0);
|
||||
const term_fd = std.posix.open(term_name, .{}, 0) catch errorexit(5, "failed to open terminal D:\n");
|
||||
|
||||
var winsize: std.c.winsize = undefined;
|
||||
if (std.c.ioctl(term_fd, std.c.T.IOCGWINSZ, &winsize) != -1) {
|
||||
for (0..winsize.ws_col) |_| {
|
||||
just_write(state.writer, "-");
|
||||
|
@ -178,7 +167,6 @@ fn leave_block(blocktype: md4c.MD_BLOCKTYPE, detail: ?*anyopaque, userdata: ?*an
|
|||
} else {
|
||||
just_write(state.writer, "---\n");
|
||||
}
|
||||
|
||||
temp_style.font_style.dim = false;
|
||||
temp_style.font_style.bold = state.nested_bold_count > 0;
|
||||
state.update_style(temp_style);
|
||||
|
@ -213,16 +201,14 @@ fn enter_span(spantype: md4c.MD_SPANTYPE, detail: ?*anyopaque, userdata: ?*anyop
|
|||
temp_style.foreground = .Blue;
|
||||
temp_style.font_style.underline = true;
|
||||
state.update_style(temp_style);
|
||||
|
||||
just_write(state.writer, "\x1b]8;;"); // OSC 8 link begin
|
||||
|
||||
just_write(state.writer, "\x1b]8;;");
|
||||
const detail_a: *md4c.MD_SPAN_A_DETAIL = @ptrCast(@alignCast(detail));
|
||||
const link_c = detail_a.href.text;
|
||||
const link = link_c[0..detail_a.href.size];
|
||||
|
||||
just_write(state.writer, link);
|
||||
just_write(state.writer, "\x07"); // OSC 8 link seperate url and text
|
||||
just_write(state.writer, "\x07");
|
||||
}
|
||||
// TODO emit ansi to the writer
|
||||
return 0; // TODO what does the return value represent ????
|
||||
}
|
||||
|
||||
|
@ -246,13 +232,13 @@ fn leave_span(spantype: md4c.MD_SPANTYPE, detail: ?*anyopaque, userdata: ?*anyop
|
|||
state.update_underline();
|
||||
}
|
||||
if (spantype == md4c.MD_SPAN_A) {
|
||||
just_write(state.writer, "\x1b]8;;\x07"); // OSC 8 link end
|
||||
|
||||
just_write(state.writer, "\x1b]8;;\x07");
|
||||
var temp_style = state.last_style;
|
||||
temp_style.foreground = .Default;
|
||||
state.update_style(temp_style);
|
||||
state.update_underline();
|
||||
}
|
||||
// TODO emit ansi to the writer
|
||||
return 0; // TODO what does the return value represent ????
|
||||
}
|
||||
|
||||
|
@ -274,9 +260,7 @@ fn on_text(texttype: md4c.MD_TEXTTYPE, text: [*c]const md4c.MD_CHAR, size: md4c.
|
|||
var temp_style = state.last_style;
|
||||
temp_style.font_style.dim = true;
|
||||
state.update_style(temp_style);
|
||||
|
||||
just_write(state.writer, text_data);
|
||||
|
||||
temp_style.font_style.dim = false;
|
||||
state.update_style(temp_style);
|
||||
}
|
||||
|
@ -298,7 +282,6 @@ const parser: md4c.MD_PARSER = .{
|
|||
};
|
||||
|
||||
fn errorexit(code: u8, comptime msg: []const u8) noreturn {
|
||||
std.debug.print("mdcat exiting with error: ", .{});
|
||||
std.debug.print(msg, .{});
|
||||
std.process.exit(code);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue