mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 18:22:45 +00:00 
			
		
		
		
	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.
This commit is contained in:
		
							parent
							
								
									5fbec2b003
								
							
						
					
					
						commit
						aa65f664a9
					
				
					 12 changed files with 30 additions and 14 deletions
				
			
		|  | @ -36,7 +36,7 @@ public: | ||||||
|     virtual ~Block() { } |     virtual ~Block() { } | ||||||
| 
 | 
 | ||||||
|     virtual String render_to_html() const = 0; |     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; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -74,7 +74,7 @@ String CodeBlock::render_to_html() const | ||||||
|     return builder.build(); |     return builder.build(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| String CodeBlock::render_for_terminal() const | String CodeBlock::render_for_terminal(size_t) const | ||||||
| { | { | ||||||
|     StringBuilder builder; |     StringBuilder builder; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -42,7 +42,7 @@ public: | ||||||
|     virtual ~CodeBlock() override { } |     virtual ~CodeBlock() override { } | ||||||
| 
 | 
 | ||||||
|     virtual String render_to_html() const 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<CodeBlock> parse(Vector<StringView>::ConstIterator& lines); |     static OwnPtr<CodeBlock> parse(Vector<StringView>::ConstIterator& lines); | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|  |  | ||||||
|  | @ -52,12 +52,12 @@ String Document::render_to_html() const | ||||||
|     return builder.build(); |     return builder.build(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| String Document::render_for_terminal() const | String Document::render_for_terminal(size_t view_width) const | ||||||
| { | { | ||||||
|     StringBuilder builder; |     StringBuilder builder; | ||||||
| 
 | 
 | ||||||
|     for (auto& block : m_blocks) { |     for (auto& block : m_blocks) { | ||||||
|         auto s = block.render_for_terminal(); |         auto s = block.render_for_terminal(view_width); | ||||||
|         builder.append(s); |         builder.append(s); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -35,7 +35,7 @@ namespace Markdown { | ||||||
| class Document final { | class Document final { | ||||||
| public: | public: | ||||||
|     String render_to_html() const; |     String render_to_html() const; | ||||||
|     String render_for_terminal() const; |     String render_for_terminal(size_t view_width = 0) const; | ||||||
| 
 | 
 | ||||||
|     static OwnPtr<Document> parse(const StringView&); |     static OwnPtr<Document> parse(const StringView&); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -38,7 +38,7 @@ String Heading::render_to_html() const | ||||||
|     return builder.build(); |     return builder.build(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| String Heading::render_for_terminal() const | String Heading::render_for_terminal(size_t) const | ||||||
| { | { | ||||||
|     StringBuilder builder; |     StringBuilder builder; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -44,7 +44,7 @@ public: | ||||||
|     virtual ~Heading() override { } |     virtual ~Heading() override { } | ||||||
| 
 | 
 | ||||||
|     virtual String render_to_html() const 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<Heading> parse(Vector<StringView>::ConstIterator& lines); |     static OwnPtr<Heading> parse(Vector<StringView>::ConstIterator& lines); | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|  |  | ||||||
|  | @ -47,7 +47,7 @@ String List::render_to_html() const | ||||||
|     return builder.build(); |     return builder.build(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| String List::render_for_terminal() const | String List::render_for_terminal(size_t) const | ||||||
| { | { | ||||||
|     StringBuilder builder; |     StringBuilder builder; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -43,7 +43,7 @@ public: | ||||||
|     virtual ~List() override { } |     virtual ~List() override { } | ||||||
| 
 | 
 | ||||||
|     virtual String render_to_html() const 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<List> parse(Vector<StringView>::ConstIterator& lines); |     static OwnPtr<List> parse(Vector<StringView>::ConstIterator& lines); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -38,7 +38,7 @@ String Paragraph::render_to_html() const | ||||||
|     return builder.build(); |     return builder.build(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| String Paragraph::render_for_terminal() const | String Paragraph::render_for_terminal(size_t) const | ||||||
| { | { | ||||||
|     StringBuilder builder; |     StringBuilder builder; | ||||||
|     builder.append(m_text.render_for_terminal()); |     builder.append(m_text.render_for_terminal()); | ||||||
|  |  | ||||||
|  | @ -41,7 +41,7 @@ public: | ||||||
|     virtual ~Paragraph() override { } |     virtual ~Paragraph() override { } | ||||||
| 
 | 
 | ||||||
|     virtual String render_to_html() const 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<Paragraph> parse(Vector<StringView>::ConstIterator& lines); |     static OwnPtr<Paragraph> parse(Vector<StringView>::ConstIterator& lines); | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|  |  | ||||||
|  | @ -32,22 +32,38 @@ | ||||||
| #include <LibMarkdown/Document.h> | #include <LibMarkdown/Document.h> | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
|  | #include <sys/ioctl.h> | ||||||
|  | #include <unistd.h> | ||||||
| 
 | 
 | ||||||
| int main(int argc, char* argv[]) | int main(int argc, char* argv[]) | ||||||
| { | { | ||||||
|     if (pledge("stdio rpath", nullptr) < 0) { |     if (pledge("stdio rpath tty", nullptr) < 0) { | ||||||
|         perror("pledge"); |         perror("pledge"); | ||||||
|         return 1; |         return 1; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const char* file_name = nullptr; |     const char* file_name = nullptr; | ||||||
|     bool html = false; |     bool html = false; | ||||||
|  |     int view_width = 0; | ||||||
| 
 | 
 | ||||||
|     Core::ArgsParser args_parser; |     Core::ArgsParser args_parser; | ||||||
|     args_parser.add_option(html, "Render to HTML rather than for the terminal", "html", 'H'); |     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.add_positional_argument(file_name, "Path to Markdown file", "path", Core::ArgsParser::Required::No); | ||||||
|     args_parser.parse(argc, argv); |     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(); |     auto file = Core::File::construct(); | ||||||
|     bool success; |     bool success; | ||||||
|     if (file_name == nullptr) { |     if (file_name == nullptr) { | ||||||
|  | @ -77,6 +93,6 @@ int main(int argc, char* argv[]) | ||||||
|         return 1; |         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()); |     printf("%s", res.characters()); | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 AnotherTest
						AnotherTest