File: htmlrenderer.h

package info (click to toggle)
newsbeuter 2.9-8
  • links: PTS
  • area: main
  • in suites: buster
  • size: 4,716 kB
  • sloc: cpp: 18,663; ruby: 1,797; xml: 350; sh: 200; makefile: 171; perl: 101
file content (80 lines) | stat: -rw-r--r-- 2,575 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#ifndef NEWSBEUTER_HTMLRENDERER__H
#define NEWSBEUTER_HTMLRENDERER__H

#include <vector>
#include <string>
#include <istream>
#include <map>

namespace newsbeuter {

enum link_type { LINK_HREF, LINK_IMG, LINK_EMBED };
enum htmltag {
	TAG_A = 1, TAG_EMBED, TAG_BR, TAG_PRE, TAG_ITUNESHACK,
	TAG_IMG, TAG_BLOCKQUOTE, TAG_H1, TAG_H2, TAG_H3, TAG_H4,TAG_H5, TAG_H6,
	TAG_P, TAG_OL, TAG_UL, TAG_LI, TAG_DT, TAG_DD, TAG_DL,
	TAG_SUP, TAG_SUB, TAG_HR, TAG_STRONG, TAG_UNDERLINE, TAG_QUOTATION,
	TAG_SCRIPT, TAG_STYLE, TAG_TABLE, TAG_TH, TAG_TR, TAG_TD
};

typedef std::pair<std::string,link_type> linkpair;

class htmlrenderer {
	public:
		htmlrenderer(unsigned int width = 80, bool raw = false);
		void render(const std::string&, std::vector<std::string>& lines,  std::vector<linkpair>& links, const std::string& url);
		void render(std::istream &, std::vector<std::string>& lines, std::vector<linkpair>& links, const std::string& url);
		// only public for unit testing purposes:
		std::string format_ol_count(unsigned int count, char type);

		struct TableCell {
			TableCell(size_t s) : span(s) { }
			size_t span;
			std::vector<std::string> text; // multiline cell text
		};

		struct TableRow {
			TableRow() : inside(false) { }

			void add_text(const std::string& str);
			void start_cell(size_t span);
			void complete_cell();

			bool inside;    // inside a cell
			std::vector<TableCell> cells;
		};

		struct Table {
			Table(bool b) : inside(false), border(b) { }

			void add_text(const std::string& str);
			void start_row();
			void complete_row();
			void start_cell(size_t span);
			void complete_cell();

			bool inside;    // inside a row
			bool border;
			std::vector<TableRow> rows;
		};

	private:
		unsigned int w;
		void prepare_newline(std::string& line, int indent_level);
		bool line_is_nonempty(const std::string& line);
		unsigned int add_link(std::vector<linkpair>& links, const std::string& link, link_type type);
		std::string quote_for_stfl(std::string str);
		std::string absolute_url(const std::string& url, const std::string& link);
		std::string type2str(link_type type);
		std::map<std::string, htmltag> tags;
		void render_table(const Table& table, std::vector<std::string>& lines);
		void add_nonempty_line(const std::string& curline, std::vector<Table>& tables, std::vector<std::string>& lines);
		void add_line(const std::string& curline, std::vector<Table>& tables, std::vector<std::string>& lines);
		std::string get_char_numbering(unsigned int count);
		std::string get_roman_numbering(unsigned int count);
		bool raw_;
};

}

#endif