2012-05-26 14:49:10 +02:00
|
|
|
#include "fmt_opts.h"
|
|
|
|
|
2019-10-16 09:17:49 +02:00
|
|
|
strmap formatting_options::styles;
|
|
|
|
|
2012-05-26 14:49:10 +02:00
|
|
|
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;";
|
2014-01-17 14:52:31 +01:00
|
|
|
break;
|
|
|
|
case formatting_options::align_left:
|
|
|
|
case formatting_options::align_error:
|
2014-01-19 15:46:54 +01:00
|
|
|
break;
|
2012-05-26 14:49:10 +02:00
|
|
|
}
|
|
|
|
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
|
|
|
|
{
|
2019-10-16 09:17:49 +02:00
|
|
|
return std::string("<p class=\"") + formatting_options::get_style_id(style) + "\">";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string formatting_options::get_style_id(const std::string &style)
|
|
|
|
{
|
|
|
|
strmap::iterator i_style = styles.find(style);
|
|
|
|
if (i_style == styles.end())
|
|
|
|
{
|
|
|
|
i_style = styles.insert(strmap::value_type(style, std::string("cls") + from_int(styles.size()))).first;
|
|
|
|
}
|
|
|
|
return i_style->second;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string formatting_options::get_styles()
|
|
|
|
{
|
|
|
|
std::string result;
|
|
|
|
for (strmap::const_iterator i = styles.begin(); i != styles.end(); ++i)
|
|
|
|
{
|
|
|
|
result += std::string(".") + i->second + " {" + i->first + "}\n";
|
2012-05-26 14:49:10 +02:00
|
|
|
}
|
2019-10-16 09:17:49 +02:00
|
|
|
return result;
|
2012-05-26 14:49:10 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
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+=";";
|
|
|
|
}
|
2019-10-16 09:17:49 +02:00
|
|
|
if (opt.chpAllCaps!=last_opt.chpAllCaps)
|
|
|
|
{
|
|
|
|
style+="text-transform:";
|
|
|
|
style+=opt.chpAllCaps?"uppercase":"none";
|
|
|
|
style+=";";
|
|
|
|
}
|
2012-05-26 14:49:10 +02:00
|
|
|
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+=";";
|
|
|
|
}
|
2019-10-16 09:17:49 +02:00
|
|
|
if (opt.chpVShift!=last_opt.chpVShift)
|
|
|
|
{
|
|
|
|
style += "position:relative;top:" + from_int(opt.chpVShift / 2) + "pt;";
|
|
|
|
}
|
2012-05-26 14:49:10 +02:00
|
|
|
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;
|
2014-01-19 15:46:54 +01:00
|
|
|
case font::ff_none: break;
|
2012-05-26 14:49:10 +02:00
|
|
|
}
|
|
|
|
style+=";";
|
|
|
|
}
|
|
|
|
opt_stack.push_back(opt);
|
2019-10-16 09:17:49 +02:00
|
|
|
return result + "<span class=\"" + formatting_options::get_style_id(style) + "\">";
|
2012-05-26 14:49:10 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
std::string formatter::close()
|
|
|
|
{
|
|
|
|
std::string result;
|
|
|
|
for (fo_deque::iterator i=opt_stack.begin(); i!=opt_stack.end(); ++i)
|
|
|
|
result+="</span>";
|
|
|
|
return result;
|
|
|
|
}
|