From aa65f664a97abca040663768936b59fa29c2a9e6 Mon Sep 17 00:00:00 2001 From: AnotherTest Date: Sun, 20 Sep 2020 16:41:04 +0430 Subject: [PATCH] LibMarkdown: Take a 'view_width' argument for render_for_terminal() Some constructs will require the width of the terminal (or a general 'width') to be rendered correctly, such as tables. --- Libraries/LibMarkdown/Block.h | 2 +- Libraries/LibMarkdown/CodeBlock.cpp | 2 +- Libraries/LibMarkdown/CodeBlock.h | 2 +- Libraries/LibMarkdown/Document.cpp | 4 ++-- Libraries/LibMarkdown/Document.h | 2 +- Libraries/LibMarkdown/Heading.cpp | 2 +- Libraries/LibMarkdown/Heading.h | 2 +- Libraries/LibMarkdown/List.cpp | 2 +- Libraries/LibMarkdown/List.h | 2 +- Libraries/LibMarkdown/Paragraph.cpp | 2 +- Libraries/LibMarkdown/Paragraph.h | 2 +- Userland/md.cpp | 20 ++++++++++++++++++-- 12 files changed, 30 insertions(+), 14 deletions(-) diff --git a/Libraries/LibMarkdown/Block.h b/Libraries/LibMarkdown/Block.h index b1d96146c4a..239c4731653 100644 --- a/Libraries/LibMarkdown/Block.h +++ b/Libraries/LibMarkdown/Block.h @@ -36,7 +36,7 @@ public: virtual ~Block() { } virtual String render_to_html() const = 0; - virtual String render_for_terminal() const = 0; + virtual String render_for_terminal(size_t view_width = 0) const = 0; }; } diff --git a/Libraries/LibMarkdown/CodeBlock.cpp b/Libraries/LibMarkdown/CodeBlock.cpp index 16703853fa8..b6501ad03ce 100644 --- a/Libraries/LibMarkdown/CodeBlock.cpp +++ b/Libraries/LibMarkdown/CodeBlock.cpp @@ -74,7 +74,7 @@ String CodeBlock::render_to_html() const return builder.build(); } -String CodeBlock::render_for_terminal() const +String CodeBlock::render_for_terminal(size_t) const { StringBuilder builder; diff --git a/Libraries/LibMarkdown/CodeBlock.h b/Libraries/LibMarkdown/CodeBlock.h index 5b5159de6d2..fb12fb4b655 100644 --- a/Libraries/LibMarkdown/CodeBlock.h +++ b/Libraries/LibMarkdown/CodeBlock.h @@ -42,7 +42,7 @@ public: virtual ~CodeBlock() override { } virtual String render_to_html() const override; - virtual String render_for_terminal() const override; + virtual String render_for_terminal(size_t view_width = 0) const override; static OwnPtr parse(Vector::ConstIterator& lines); private: diff --git a/Libraries/LibMarkdown/Document.cpp b/Libraries/LibMarkdown/Document.cpp index 6958ce82296..922dda5b37f 100644 --- a/Libraries/LibMarkdown/Document.cpp +++ b/Libraries/LibMarkdown/Document.cpp @@ -52,12 +52,12 @@ String Document::render_to_html() const return builder.build(); } -String Document::render_for_terminal() const +String Document::render_for_terminal(size_t view_width) const { StringBuilder builder; for (auto& block : m_blocks) { - auto s = block.render_for_terminal(); + auto s = block.render_for_terminal(view_width); builder.append(s); } diff --git a/Libraries/LibMarkdown/Document.h b/Libraries/LibMarkdown/Document.h index 259aa090464..752cd12f4c9 100644 --- a/Libraries/LibMarkdown/Document.h +++ b/Libraries/LibMarkdown/Document.h @@ -35,7 +35,7 @@ namespace Markdown { class Document final { public: String render_to_html() const; - String render_for_terminal() const; + String render_for_terminal(size_t view_width = 0) const; static OwnPtr parse(const StringView&); diff --git a/Libraries/LibMarkdown/Heading.cpp b/Libraries/LibMarkdown/Heading.cpp index c489f1e6031..e0374c97c9a 100644 --- a/Libraries/LibMarkdown/Heading.cpp +++ b/Libraries/LibMarkdown/Heading.cpp @@ -38,7 +38,7 @@ String Heading::render_to_html() const return builder.build(); } -String Heading::render_for_terminal() const +String Heading::render_for_terminal(size_t) const { StringBuilder builder; diff --git a/Libraries/LibMarkdown/Heading.h b/Libraries/LibMarkdown/Heading.h index 8988bc0f886..f68ebd2cd35 100644 --- a/Libraries/LibMarkdown/Heading.h +++ b/Libraries/LibMarkdown/Heading.h @@ -44,7 +44,7 @@ public: virtual ~Heading() override { } virtual String render_to_html() const override; - virtual String render_for_terminal() const override; + virtual String render_for_terminal(size_t view_width = 0) const override; static OwnPtr parse(Vector::ConstIterator& lines); private: diff --git a/Libraries/LibMarkdown/List.cpp b/Libraries/LibMarkdown/List.cpp index 52bc2816fe9..2f043ea59c9 100644 --- a/Libraries/LibMarkdown/List.cpp +++ b/Libraries/LibMarkdown/List.cpp @@ -47,7 +47,7 @@ String List::render_to_html() const return builder.build(); } -String List::render_for_terminal() const +String List::render_for_terminal(size_t) const { StringBuilder builder; diff --git a/Libraries/LibMarkdown/List.h b/Libraries/LibMarkdown/List.h index 50ac609ef6c..b853ccb801c 100644 --- a/Libraries/LibMarkdown/List.h +++ b/Libraries/LibMarkdown/List.h @@ -43,7 +43,7 @@ public: virtual ~List() override { } virtual String render_to_html() const override; - virtual String render_for_terminal() const override; + virtual String render_for_terminal(size_t view_width = 0) const override; static OwnPtr parse(Vector::ConstIterator& lines); diff --git a/Libraries/LibMarkdown/Paragraph.cpp b/Libraries/LibMarkdown/Paragraph.cpp index 764e555fbc6..f44da06fbbf 100644 --- a/Libraries/LibMarkdown/Paragraph.cpp +++ b/Libraries/LibMarkdown/Paragraph.cpp @@ -38,7 +38,7 @@ String Paragraph::render_to_html() const return builder.build(); } -String Paragraph::render_for_terminal() const +String Paragraph::render_for_terminal(size_t) const { StringBuilder builder; builder.append(m_text.render_for_terminal()); diff --git a/Libraries/LibMarkdown/Paragraph.h b/Libraries/LibMarkdown/Paragraph.h index 39c86624cbd..d5e63a03c2d 100644 --- a/Libraries/LibMarkdown/Paragraph.h +++ b/Libraries/LibMarkdown/Paragraph.h @@ -41,7 +41,7 @@ public: virtual ~Paragraph() override { } virtual String render_to_html() const override; - virtual String render_for_terminal() const override; + virtual String render_for_terminal(size_t view_width = 0) const override; static OwnPtr parse(Vector::ConstIterator& lines); private: diff --git a/Userland/md.cpp b/Userland/md.cpp index f7dc74349b2..2a608e05dc2 100644 --- a/Userland/md.cpp +++ b/Userland/md.cpp @@ -32,22 +32,38 @@ #include #include #include +#include +#include int main(int argc, char* argv[]) { - if (pledge("stdio rpath", nullptr) < 0) { + if (pledge("stdio rpath tty", nullptr) < 0) { perror("pledge"); return 1; } const char* file_name = nullptr; bool html = false; + int view_width = 0; Core::ArgsParser args_parser; args_parser.add_option(html, "Render to HTML rather than for the terminal", "html", 'H'); + args_parser.add_option(view_width, "Viewport width for the terminal (defaults to current terminal width)", "view-width", 0, "width"); args_parser.add_positional_argument(file_name, "Path to Markdown file", "path", Core::ArgsParser::Required::No); args_parser.parse(argc, argv); + if (!html && view_width == 0) { + if (isatty(STDOUT_FILENO)) { + struct winsize ws; + if (ioctl(STDERR_FILENO, TIOCGWINSZ, &ws) < 0) + view_width = 80; + else + view_width = ws.ws_col; + + } else { + view_width = 80; + } + } auto file = Core::File::construct(); bool success; if (file_name == nullptr) { @@ -77,6 +93,6 @@ int main(int argc, char* argv[]) return 1; } - String res = html ? document->render_to_html() : document->render_for_terminal(); + String res = html ? document->render_to_html() : document->render_for_terminal(view_width); printf("%s", res.characters()); }