mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 05:52:46 +00:00 
			
		
		
		
	 c1efa4f336
			
		
	
	
		c1efa4f336
		
	
	
	
	
		
			
			This should really be handled by LibHTML, but just include a <head> element for now, so generated man pages always have a <head>.
		
			
				
	
	
		
			69 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include <AK/StringBuilder.h>
 | |
| #include <LibMarkdown/MDCodeBlock.h>
 | |
| #include <LibMarkdown/MDDocument.h>
 | |
| #include <LibMarkdown/MDHeading.h>
 | |
| #include <LibMarkdown/MDList.h>
 | |
| #include <LibMarkdown/MDParagraph.h>
 | |
| 
 | |
| String MDDocument::render_to_html() const
 | |
| {
 | |
|     StringBuilder builder;
 | |
| 
 | |
|     builder.append("<!DOCTYPE html>\n");
 | |
|     builder.append("<html>\n");
 | |
|     builder.append("<head></head>\n");
 | |
|     builder.append("<body>\n");
 | |
| 
 | |
|     for (auto& block : m_blocks) {
 | |
|         auto s = block.render_to_html();
 | |
|         builder.append(s);
 | |
|     }
 | |
| 
 | |
|     builder.append("</body>\n");
 | |
|     builder.append("</html>\n");
 | |
|     return builder.build();
 | |
| }
 | |
| 
 | |
| String MDDocument::render_for_terminal() const
 | |
| {
 | |
|     StringBuilder builder;
 | |
| 
 | |
|     for (auto& block : m_blocks) {
 | |
|         auto s = block.render_for_terminal();
 | |
|         builder.append(s);
 | |
|     }
 | |
| 
 | |
|     return builder.build();
 | |
| }
 | |
| 
 | |
| template<typename Block>
 | |
| static bool helper(Vector<StringView>::ConstIterator& lines, NonnullOwnPtrVector<MDBlock>& blocks)
 | |
| {
 | |
|     NonnullOwnPtr<Block> block = make<Block>();
 | |
|     bool success = block->parse(lines);
 | |
|     if (!success)
 | |
|         return false;
 | |
|     blocks.append(move(block));
 | |
|     return true;
 | |
| }
 | |
| 
 | |
| bool MDDocument::parse(const StringView& str)
 | |
| {
 | |
|     const Vector<StringView> lines_vec = str.split_view('\n', true);
 | |
|     auto lines = lines_vec.begin();
 | |
| 
 | |
|     while (true) {
 | |
|         if (lines.is_end())
 | |
|             return true;
 | |
| 
 | |
|         if ((*lines).is_empty()) {
 | |
|             ++lines;
 | |
|             continue;
 | |
|         }
 | |
| 
 | |
|         bool any = helper<MDList>(lines, m_blocks) || helper<MDParagraph>(lines, m_blocks) || helper<MDCodeBlock>(lines, m_blocks) || helper<MDHeading>(lines, m_blocks);
 | |
| 
 | |
|         if (!any)
 | |
|             return false;
 | |
|     }
 | |
| }
 |