Store ASCII data in std::string

Math inset names and LaTeX requirements are always ASCII. This avoids some
conversions and makes math requirements more similar to text requirements.
This commit is contained in:
Georg Baum 2014-12-29 21:46:30 +01:00
parent cc87f81002
commit 0a93c9b70f
8 changed files with 53 additions and 49 deletions

View File

@ -245,7 +245,7 @@ void InsetMathDecoration::htmlize(HtmlStream & os) const
os << MTag("span", "class='overbar'") << cell(0) << ETag("span");
return;
}
if (name == "underbar" || name == "underline") {
os << MTag("span", "class='underbar'") << cell(0) << ETag("span");
return;
@ -254,12 +254,12 @@ void InsetMathDecoration::htmlize(HtmlStream & os) const
TranslationMap const & t = translationMap();
TranslationMap::const_iterator cur = t.find(name);
LASSERT(cur != t.end(), return);
bool symontop = cur->second.over;
string const symclass = symontop ? "symontop" : "symonbot";
os << MTag("span", "class='symbolpair " + symclass + "'")
<< '\n';
if (symontop)
os << MTag("span", "class='symbol'") << from_ascii(cur->second.tag);
else
@ -287,12 +287,12 @@ void InsetMathDecoration::validate(LaTeXFeatures & features) const
"span.symbolpair{display: inline-block; text-align:center;}\n"
"span.symontop{vertical-align: top;}\n"
"span.symonbot{vertical-align: bottom;}\n"
"span.symbolpair span{display: block;}\n"
"span.symbolpair span{display: block;}\n"
"span.symbol{height: 0.5ex;}");
}
} else {
if (!key_->requires.empty())
features.require(to_utf8(key_->requires));
features.require(key_->requires);
}
InsetMathNest::validate(features);
}

View File

@ -71,16 +71,16 @@ void InsetMathDelim::validate(LaTeXFeatures & features) const
MathWordList::const_iterator it = words.find(left_);
if (it != words.end())
{
docstring const req = it->second.requires;
string const req = it->second.requires;
if (!req.empty())
features.require(to_ascii(req));
features.require(req);
}
it = words.find(right_);
if (it != words.end())
{
docstring const req = it->second.requires;
string const req = it->second.requires;
if (!req.empty())
features.require(to_ascii(req));
features.require(req);
}
}

View File

@ -81,7 +81,7 @@ docstring InsetMathDots::name() const
void InsetMathDots::validate(LaTeXFeatures & features) const
{
if (!key_->requires.empty())
features.require(to_utf8(key_->requires));
features.require(key_->requires);
}

View File

@ -66,9 +66,9 @@ void InsetMathSymbol::metrics(MetricsInfo & mi, Dimension & dim) const
bool const italic_upcase_greek = sym_->inset == "cmr" &&
sym_->extra == "mathalpha" &&
mi.base.fontname == "mathit";
docstring const font = italic_upcase_greek ? from_ascii("cmm") : sym_->inset;
std::string const font = italic_upcase_greek ? "cmm" : sym_->inset;
int const em = mathed_char_width(mi.base.font, 'M');
FontSetChanger dummy(mi.base, font);
FontSetChanger dummy(mi.base, from_ascii(font));
mathed_string_dim(mi.base.font, sym_->draw, dim);
docstring::const_reverse_iterator rit = sym_->draw.rbegin();
kerning_ = mathed_char_kerning(mi.base.font, *rit);
@ -102,14 +102,14 @@ void InsetMathSymbol::draw(PainterInfo & pi, int x, int y) const
bool const italic_upcase_greek = sym_->inset == "cmr" &&
sym_->extra == "mathalpha" &&
pi.base.fontname == "mathit";
docstring const font = italic_upcase_greek ? from_ascii("cmm") : sym_->inset;
std::string const font = italic_upcase_greek ? "cmm" : sym_->inset;
int const em = mathed_char_width(pi.base.font, 'M');
if (isRelOp())
x += static_cast<int>(0.25*em+0.5);
else
x += static_cast<int>(0.0833*em+0.5);
FontSetChanger dummy(pi.base, font);
FontSetChanger dummy(pi.base, from_ascii(font));
pi.draw(x, y - h_, sym_->draw);
}
@ -270,7 +270,7 @@ void InsetMathSymbol::validate(LaTeXFeatures & features) const
"sup.limit{font-size: 75%;}");
} else {
if (!sym_->requires.empty())
features.require(to_utf8(sym_->requires));
features.require(sym_->requires);
}
}

View File

@ -114,7 +114,7 @@ vector<docstring> const & MacroData::defaults() const
string const MacroData::requires() const
{
if (sym_)
return to_utf8(sym_->requires);
return sym_->requires;
return string();
}

View File

@ -86,13 +86,13 @@ namespace {
MathWordList theMathWordList;
bool isMathFontAvailable(docstring & name)
bool isMathFontAvailable(string & name)
{
if (!use_gui)
return false;
FontInfo f;
augmentFont(f, name);
augmentFont(f, from_ascii(name));
// Do we have the font proper?
if (theFontLoader().available(f))
@ -100,12 +100,12 @@ bool isMathFontAvailable(docstring & name)
// can we fake it?
if (name == "eufrak") {
name = from_ascii("lyxfakefrak");
name = "lyxfakefrak";
return true;
}
LYXERR(Debug::MATHED,
"font " << to_utf8(name) << " not available and I can't fake it");
"font " << name << " not available and I can't fake it");
return false;
}
@ -160,8 +160,7 @@ void initSymbols()
string tmp;
is >> tmp;
is >> tmp;
docstring t = from_utf8(tmp);
skip = !isMathFontAvailable(t);
skip = !isMathFontAvailable(tmp);
continue;
} else if (line.size() >= 4 && line.substr(0, 4) == "else") {
skip = !skip;
@ -202,11 +201,11 @@ void initSymbols()
<< to_utf8(it->first) << " already exists.");
else {
latexkeys tmp;
tmp.inset = from_ascii("macro");
tmp.inset = "macro";
tmp.name = it->first;
tmp.extra = from_utf8(extra);
tmp.xmlname = from_utf8(xmlname);
tmp.requires = from_utf8(requires);
tmp.requires = requires;
theMathWordList[it->first] = tmp;
wit = theMathWordList.find(it->first);
it->second.setSymbol(&(wit->second));
@ -225,40 +224,45 @@ void initSymbols()
idocstringstream is(from_utf8(line));
latexkeys tmp;
is >> tmp.name >> tmp.inset;
if (isFontName(tmp.inset))
docstring help;
is >> tmp.name >> help;
tmp.inset = to_ascii(help);
if (isFontName(help))
is >> charid >> fallbackid >> tmp.extra >> tmp.xmlname;
else
is >> tmp.extra;
// requires is optional
if (is) {
is >> tmp.requires;
// backward compatibility
if (tmp.requires == "esintoramsmath")
tmp.requires = from_ascii("esint|amsmath");
if ((is >> help)) {
// backward compatibility
if (help == "esintoramsmath")
tmp.requires = "esint|amsmath";
else
tmp.requires = to_ascii(help);
}
} else {
LYXERR(Debug::MATHED, "skipping line '" << line << "'\n"
<< to_utf8(tmp.name) << ' ' << to_utf8(tmp.inset) << ' '
<< to_utf8(tmp.name) << ' ' << tmp.inset << ' '
<< to_utf8(tmp.extra));
continue;
}
if (isFontName(tmp.inset)) {
if (isFontName(from_ascii(tmp.inset))) {
// tmp.inset _is_ the fontname here.
// create fallbacks if necessary
// store requirements as long as we can
if (tmp.requires.empty()) {
if (tmp.inset == "msa" || tmp.inset == "msb")
tmp.requires = from_ascii("amssymb");
tmp.requires = "amssymb";
else if (tmp.inset == "wasy")
tmp.requires = from_ascii("wasysym");
tmp.requires = "wasysym";
else if (tmp.inset == "mathscr")
tmp.requires = from_ascii("mathrsfs");
tmp.requires = "mathrsfs";
}
// symbol font is not available sometimes
docstring symbol_font = from_ascii("lyxsymbol");
string symbol_font = "lyxsymbol";
char_type unicodesymbol = 0;
if (tmp.extra == "func" || tmp.extra == "funclim" || tmp.extra == "special") {
@ -270,23 +274,23 @@ void initSymbols()
} else if (fallbackid && isMathFontAvailable(symbol_font) &&
canBeDisplayed(fallbackid)) {
if (tmp.inset == "cmex")
tmp.inset = from_ascii("lyxsymbol");
tmp.inset = "lyxsymbol";
else
tmp.inset = from_ascii("lyxboldsymbol");
tmp.inset = "lyxboldsymbol";
LYXERR(Debug::MATHED, "symbol fallback for " << to_utf8(tmp.name));
tmp.draw.push_back(char_type(fallbackid));
} else if (isUnicodeSymbolAvailable(tmp.name, unicodesymbol)) {
LYXERR(Debug::MATHED, "unicode fallback for " << to_utf8(tmp.name));
tmp.inset = from_ascii("mathnormal");
tmp.inset = "mathnormal";
tmp.draw.push_back(unicodesymbol);
} else {
LYXERR(Debug::MATHED, "faking " << to_utf8(tmp.name));
tmp.draw = tmp.name;
tmp.inset = from_ascii("lyxtex");
tmp.inset = "lyxtex";
}
} else {
// it's a proper inset
LYXERR(Debug::MATHED, "inset " << to_utf8(tmp.inset)
LYXERR(Debug::MATHED, "inset " << tmp.inset
<< " used for " << to_utf8(tmp.name));
}
@ -299,14 +303,14 @@ void initSymbols()
// If you change the following output, please adjust
// development/tools/generate_symbols_images.py.
LYXERR(Debug::MATHED, "read symbol '" << to_utf8(tmp.name)
<< " inset: " << to_utf8(tmp.inset)
<< " inset: " << tmp.inset
<< " draw: " << int(tmp.draw.empty() ? 0 : tmp.draw[0])
<< " extra: " << to_utf8(tmp.extra)
<< " xml: " << to_utf8(tmp.xmlname)
<< " requires: " << to_utf8(tmp.requires) << '\'');
<< " requires: " << tmp.requires << '\'');
}
docstring tmp = from_ascii("cmm");
docstring tmp2 = from_ascii("cmsy");
string tmp = "cmm";
string tmp2 = "cmsy";
has_math_fonts = isMathFontAvailable(tmp) && isMathFontAvailable(tmp2);
}
@ -410,7 +414,7 @@ MathAtom createInsetMath(docstring const & s, Buffer * buf)
latexkeys const * l = in_word_set(s);
if (l) {
docstring const & inset = l->inset;
string const & inset = l->inset;
//lyxerr << " found inset: '" << inset << '\'' << endl;
if (inset == "ref")
return MathAtom(new InsetMathRef(buf, l->name));

View File

@ -1748,7 +1748,7 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags,
lyxerr << "found math environment `"
<< to_utf8(name)
<< "' in symbols file with unsupported inset `"
<< to_utf8(l->inset)
<< l->inset
<< "'." << endl;
}
// create generic environment inset

View File

@ -35,7 +35,7 @@ public:
/// name of the macro or primitive
docstring name;
/// name of a inset that handles that macro
docstring inset;
std::string inset;
/**
* The string or symbol to draw.
* This is a string of length 1 if \p name is a known symbol, and
@ -55,7 +55,7 @@ public:
/// how is this called as XML entity in MathML?
docstring xmlname;
/// required LaTeXFeatures
docstring requires;
std::string requires;
};