summaryrefslogtreecommitdiffstats
path: root/src/rtf2html/fmt_opts.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/rtf2html/fmt_opts.h')
-rw-r--r--src/rtf2html/fmt_opts.h154
1 files changed, 154 insertions, 0 deletions
diff --git a/src/rtf2html/fmt_opts.h b/src/rtf2html/fmt_opts.h
new file mode 100644
index 0000000..6845d60
--- /dev/null
+++ b/src/rtf2html/fmt_opts.h
@@ -0,0 +1,154 @@
+/* This is RTF to HTML converter, implemented as a text filter, generally.
+ Copyright (C) 2003 Valentin Lavrinenko, [email protected]
+
+ available at http://rtf2html.sf.net
+
+ Original available under the terms of the GNU LGPL2, and according
+ to those terms, relicensed under the GNU GPL2 for inclusion in Tellico */
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of version 2 of the GNU General Public License as *
+ * published by the Free Software Foundation; *
+ * *
+ ***************************************************************************/
+
+#ifndef __FMT_OPTS_H__
+#define __FMT_OPTS_H__
+
+#include "common.h"
+#include <stack>
+#include <vector>
+#include <deque>
+#include <map>
+
+namespace rtf {
+
+struct color {
+ int r, g, b;
+ color() : r(-1), g(-1), b(-1) {}
+ bool operator==(const color &clr)
+ {
+ return r==clr.r && g==clr.g && b==clr.b;
+ }
+ bool operator!=(const color &clr)
+ {
+ return !(*this==clr);
+ }
+ color &operator=(const color &clr)
+ {
+ r=clr.r; g=clr.g; b=clr.b;
+ return *this;
+ }
+};
+
+typedef std::vector<color> colorvect;
+
+struct font {
+ enum font_family {ff_none, ff_serif, ff_sans_serif, ff_cursive,
+ ff_fantasy, ff_monospace};
+ font_family family;
+ std::string name;
+ int pitch;
+ int charset;
+ font() : family(ff_none), name(), pitch(0), charset(0) {}
+ bool operator==(const font &f)
+ {
+ return family==f.family && name==f.name;
+ }
+ bool operator!=(const font &f)
+ {
+ return !(*this==f);
+ }
+ font &operator=(const font &f)
+ {
+ family=f.family; name=f.name; pitch=f.pitch; charset=f.charset;
+ return *this;
+ }
+};
+
+typedef std::map<int, font> fontmap;
+
+struct formatting_options
+{
+ enum halign {align_left, align_right, align_center, align_justify, align_error};
+ enum valign {va_normal, va_sub, va_sup};
+ bool chpBold, chpItalic, chpUnderline;
+ valign chpVAlign;
+ int chpFontSize, chpHighlight;
+ color chpFColor, chpBColor;
+ font chpFont;
+ int papLeft, papRight, papFirst;
+ int papBefore, papAfter;
+ halign papAlign;
+ bool papInTbl;
+ formatting_options()
+ {
+ chpBold=chpItalic=chpUnderline=false;
+ chpVAlign=va_normal;
+ chpFontSize=chpHighlight=0;
+ papLeft=papRight=papFirst=papBefore=papAfter=0;
+ papAlign=align_left;
+ papInTbl=false;
+ }
+ bool operator==(const formatting_options &opt) // tests only for character options
+ {
+ return chpBold==opt.chpBold && chpItalic==opt.chpItalic
+ && chpUnderline==opt.chpUnderline && chpVAlign==opt.chpVAlign
+ && chpFontSize==opt.chpFontSize
+ && chpFColor==opt.chpFColor && chpBColor==opt.chpBColor
+ && chpHighlight==opt.chpHighlight && chpFont==opt.chpFont;
+ }
+ bool operator!=(const formatting_options &opt) // tests only for character options
+ {
+ return !(*this==opt);
+ }
+ formatting_options &operator=(const formatting_options &opt)
+ {
+ chpBold=opt.chpBold; chpItalic=opt.chpItalic;
+ chpUnderline=opt.chpUnderline; chpVAlign=opt.chpVAlign;
+ chpFontSize=opt.chpFontSize;
+ chpFColor=opt.chpFColor; chpBColor=opt.chpBColor;
+ chpHighlight=opt.chpHighlight; chpFont=opt.chpFont;
+ papLeft=opt.papLeft; papRight=opt.papRight;
+ papFirst=opt.papFirst; papBefore=opt.papBefore; papAfter=opt.papAfter;
+ papAlign=opt.papAlign; papInTbl=opt.papInTbl;
+ return *this;
+ }
+ std::string get_par_str() const;
+};
+
+typedef std::stack<formatting_options> fo_stack;
+
+typedef std::deque<formatting_options> fo_deque;
+
+class formatter {
+ private:
+ fo_deque opt_stack;
+ public:
+ std::string format(const formatting_options &opt);
+ std::string close();
+ void clear() { opt_stack.clear(); }
+};
+
+class html_text {
+ private:
+ const formatting_options &opt;
+ formatter fmt;
+ std::string text;
+ public:
+ html_text(const formatting_options &_opt) : opt(_opt) {}
+ const std::string &str() { return text; }
+ template <class T> void write(T s)
+ {
+ text+=fmt.format(opt)+s;
+ }
+ std::string close() { return fmt.close(); }
+// void write(char c) { write(std::string()+c); }
+ void clear() { text.clear(); fmt.clear(); }
+};
+
+}
+#endif
+