summaryrefslogtreecommitdiffstats
path: root/src/rtf2html/fmt_opts.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/rtf2html/fmt_opts.cpp')
-rw-r--r--src/rtf2html/fmt_opts.cpp221
1 files changed, 221 insertions, 0 deletions
diff --git a/src/rtf2html/fmt_opts.cpp b/src/rtf2html/fmt_opts.cpp
new file mode 100644
index 0000000..25a2f24
--- /dev/null
+++ b/src/rtf2html/fmt_opts.cpp
@@ -0,0 +1,221 @@
+/* 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; *
+ * *
+ ***************************************************************************/
+
+#include "fmt_opts.h"
+
+using namespace rtf;
+
+std::string formatting_options::get_par_str() const
+{
+ std::string style;
+ switch (papAlign)
+ {
+ case formatting_options::align_right:
+ style+="text-align:right;";
+ break;
+ case formatting_options::align_center:
+ style+="text-align:center;";
+ break;
+ case formatting_options::align_justify:
+ style+="text-align:justify;";
+ default: break;
+ }
+ if (papFirst!=0)
+ {
+ style+="text-indent:";
+ style+=from_int(papFirst);
+ style+="pt;";
+ }
+ if (papLeft!=0)
+ {
+ style+="margin-left:";
+ style+=from_int(papLeft);
+ style+="pt;";
+ }
+ if (papRight!=0)
+ {
+ style+="margin-right:";
+ style+=from_int(papRight);
+ style+="pt;";
+ }
+ if (papBefore!=0)
+ {
+ style+="margin-top:";
+ style+=from_int(papBefore);
+ style+="pt;";
+ }
+ if (papAfter!=0)
+ {
+ style+="margin-bottom:";
+ style+=from_int(papAfter);
+ style+="pt;";
+ }
+ if (style.empty())
+ return std::string("<p>");
+ else
+ {
+ style.insert(0, "<p style=\"");
+ return style+"\">";
+ }
+}
+
+std::string formatter::format(const formatting_options &_opt)
+{
+ formatting_options last_opt, opt(_opt);
+ std::string result;
+ if (!opt_stack.empty())
+ {
+ int cnt=0;
+ fo_deque::reverse_iterator i;
+ for (i=opt_stack.rbegin(); i!=opt_stack.rend(); ++i)
+ {
+ if (*i==opt)
+ break;
+ ++cnt;
+ }
+ if (cnt==0)
+ return "";
+ if (i!=opt_stack.rend())
+ {
+ while (cnt--)
+ {
+ result+="</span>";
+ opt_stack.pop_back();
+ }
+ return result;
+ }
+ last_opt=opt_stack.back();
+ }
+ if (last_opt.chpVAlign!=formatting_options::va_normal
+ && last_opt.chpVAlign!=opt.chpVAlign)
+ {
+ int cnt=0;
+ fo_deque::reverse_iterator i;
+ for (i=opt_stack.rbegin(); i!=opt_stack.rend(); ++i)
+ {
+ if (i->chpVAlign==formatting_options::va_normal)
+ break;
+ ++cnt;
+ }
+ while (cnt--)
+ {
+ result+="</span>";
+ opt_stack.pop_back();
+ }
+ last_opt=opt_stack.empty()?formatting_options():opt_stack.back();
+ }
+ std::string style;
+ if (opt.chpBold!=last_opt.chpBold)
+ {
+ style+="font-weight:";
+ style+=opt.chpBold?"bold":"normal";
+ style+=";";
+ }
+ if (opt.chpItalic!=last_opt.chpItalic)
+ {
+ style+="font-style:";
+ style+=opt.chpItalic?"italic":"normal";
+ style+=";";
+ }
+ if (opt.chpUnderline!=last_opt.chpUnderline)
+ {
+ style+="text-decoration:";
+ style+=opt.chpUnderline?"underline":"none";
+ style+=";";
+ }
+ if (opt.chpVAlign!=formatting_options::va_normal)
+ opt.chpFontSize=(int)(0.7*(opt.chpFontSize?opt.chpFontSize:24));
+ if (opt.chpFontSize!=last_opt.chpFontSize)
+ {
+ style+="font-size:";
+ style+=from_int(opt.chpFontSize/2);
+ style+="pt;";
+ }
+ if (opt.chpVAlign!=last_opt.chpVAlign)
+ {
+ style+="vertical-align:";
+ style+=opt.chpVAlign==formatting_options::va_sub?"sub":"super";
+ style+=";";
+ }
+ if (opt.chpFColor!=last_opt.chpFColor)
+ {
+ style+="color:";
+ style+=opt.chpFColor.r>0?"#"+hex(opt.chpFColor.r&0xFF)
+ +hex(opt.chpFColor.g&0xFF)
+ +hex(opt.chpFColor.b&0xFF)
+ :"WindowText";
+ style+=";";
+ }
+ if (opt.chpBColor!=last_opt.chpBColor)
+ {
+ style+="background-color:";
+ style+=opt.chpBColor.r>0?"#"+hex(opt.chpBColor.r&0xFF)
+ +hex(opt.chpBColor.g&0xFF)
+ +hex(opt.chpBColor.b&0xFF)
+ :"Window";
+ style+=";";
+ }
+ if (opt.chpHighlight!=last_opt.chpHighlight)
+ {
+ style+="background-color:";
+ switch (opt.chpHighlight)
+ {
+ case 0: style+="Window"; break;
+ case 1: style+="black"; break;
+ case 2: style+="blue"; break;
+ case 3: style+="aqua"; break;
+ case 4: style+="lime"; break;
+ case 5: style+="fuchsia"; break;
+ case 6: style+="red"; break;
+ case 7: style+="yellow"; break;
+ case 9: style+="navy"; break;
+ case 10: style+="teal"; break;
+ case 11: style+="green"; break;
+ case 12: style+="purple"; break;
+ case 13: style+="maroon"; break;
+ case 14: style+="olive"; break;
+ case 15: style+="gray"; break;
+ case 16: style+="silver"; break;
+ }
+ style+=";";
+ }
+ if (opt.chpFont!=last_opt.chpFont)
+ {
+ style+="font-family:'";
+ style+=opt.chpFont.name.empty()?"serif":opt.chpFont.name;
+ style+="'";
+ switch (opt.chpFont.family)
+ {
+ case font::ff_serif: style+=", serif"; break;
+ case font::ff_sans_serif: style+=", sans-serif"; break;
+ case font::ff_cursive: style+=", cursive"; break;
+ case font::ff_fantasy: style+=", fantasy"; break;
+ case font::ff_monospace: style+=", monospace"; break;
+ default: break;
+ }
+ style+=";";
+ }
+ opt_stack.push_back(opt);
+ return result+"<span style=\""+style+"\">";
+}
+
+std::string formatter::close()
+{
+ std::string result;
+ for (fo_deque::iterator i=opt_stack.begin(); i!=opt_stack.end(); ++i)
+ result+="</span>";
+ return result;
+}