if (!ar[i]->asCharInset())
continue;
docstring s = charSequence(ar.begin() + i, ar.end());
- ar[i] = MathAtom(new InsetMathString(s));
+ ar[i] = MathAtom(new InsetMathString(ar.buffer(), s));
ar.erase(i + 1, i + s.size());
}
//lyxerr << "\nStrings to: " << ar << endl;
return testString(at, from_ascii(str));
}
+
+bool testSymbol(MathAtom const & at, docstring const & name)
+{
+ return at->asSymbolInset() && at->asSymbolInset()->name() == name;
+}
+
+
+bool testSymbol(MathAtom const & at, char const * const name)
+{
+ return testSymbol(at, from_ascii(name));
+}
+
+
// search end of nested sequence
MathData::iterator endNestSearch(
MathData::iterator it,
- MathData::iterator last,
+ const MathData::iterator& last,
TestItemFunc testOpen,
TestItemFunc testClose
)
docstring s = digitSequence(ar.begin() + i, ar.end());
- ar[i] = MathAtom(new InsetMathNumber(s));
+ ar[i] = MathAtom(new InsetMathNumber(ar.buffer(), s));
ar.erase(i + 1, i + s.size());
}
//lyxerr << "\nNumbers to: " << ar << endl;
MathAtom replaceParenDelims(const MathData & ar)
{
return MathAtom(new InsetMathDelim(const_cast<Buffer *>(ar.buffer()),
- from_ascii("("), from_ascii(")"), ar));
+ from_ascii("("), from_ascii(")"), ar, true));
}
MathAtom replaceBracketDelims(const MathData & ar)
{
return MathAtom(new InsetMathDelim(const_cast<Buffer *>(ar.buffer()),
- from_ascii("["), from_ascii("]"), ar));
+ from_ascii("["), from_ascii("]"), ar, true));
+}
+
+
+bool testOpenVert(MathAtom const & at)
+{
+ return testSymbol(at, "lvert");
+}
+
+
+bool testCloseVert(MathAtom const & at)
+{
+ return testSymbol(at, "rvert");
+}
+
+
+MathAtom replaceVertDelims(const MathData & ar)
+{
+ return MathAtom(new InsetMathDelim(const_cast<Buffer *>(ar.buffer()),
+ from_ascii("lvert"), from_ascii("rvert"), ar, true));
}
-// replace '('...')' and '['...']' sequences by a real InsetMathDelim
+bool testOpenAngled(MathAtom const & at)
+{
+ return testSymbol(at, "langle");
+}
+
+
+bool testCloseAngled(MathAtom const & at)
+{
+ return testSymbol(at, "rangle");
+}
+
+
+MathAtom replaceAngledDelims(const MathData & ar)
+{
+ return MathAtom(new InsetMathDelim(const_cast<Buffer *>(ar.buffer()),
+ from_ascii("langle"), from_ascii("rangle"), ar, true));
+}
+
+
+// replace '('...')', '['...']', '|'...'|', and '<'...'>' sequences by a real InsetMathDelim
void extractDelims(MathData & ar)
{
//lyxerr << "\nDelims from: " << ar << endl;
replaceNested(ar, testOpenParen, testCloseParen, replaceParenDelims);
replaceNested(ar, testOpenBracket, testCloseBracket, replaceBracketDelims);
+ replaceNested(ar, testOpenVert, testCloseVert, replaceVertDelims);
+ replaceNested(ar, testOpenAngled, testCloseAngled, replaceAngledDelims);
//lyxerr << "\nDelims to: " << ar << endl;
}
// do we have an exponent like in
// 'sin' '^2' 'x' -> 'sin(x)' '^2'
- MathData exp;
+ MathData exp(buf);
extractScript(exp, jt, ar.end(), true);
// create a proper inset as replacement
- auto p = make_unique<InsetMathExFunc>(buf, name);
+ auto p = lyx::make_unique<InsetMathExFunc>(buf, name);
// jt points to the "argument". Get hold of this.
MathData::iterator st =
// search integrals
//
-bool testSymbol(MathAtom const & at, docstring const & name)
-{
- return at->asSymbolInset() && at->asSymbolInset()->name() == name;
-}
-
-
-bool testSymbol(MathAtom const & at, char const * const name)
-{
- return at->asSymbolInset() && at->asSymbolInset()->name() == from_ascii(name);
-}
-
-
bool testIntSymbol(MathAtom const & at)
{
return testSymbol(at, from_ascii("int"));
continue;
// core is part from behind the scripts to the 'd'
- auto p = make_unique<InsetMathExInt>(buf, from_ascii("int"));
+ auto p = lyx::make_unique<InsetMathExInt>(buf, from_ascii("int"));
// handle scripts if available
if (!testIntSymbol(*it)) {
continue;
// create a proper inset as replacement
- auto p = make_unique<InsetMathExInt>(buf, from_ascii("sum"));
+ auto p = lyx::make_unique<InsetMathExInt>(buf, from_ascii("sum"));
// collect lower bound and summation index
InsetMathScript const * sub = ar[i]->asScriptInset();
}
// create a proper diff inset
- auto diff = make_unique<InsetMathDiff>(buf);
+ auto diff = lyx::make_unique<InsetMathDiff>(buf);
// collect function, let jt point behind last used item
MathData::iterator jt = it + 1;
MathData x0 = MathData(buf, st + 1, s.end());
// use something behind the script as core
- MathData f;
+ MathData f(buf);
MathData::iterator tt = extractTerm(f, it + 1, ar.end());
// cleanup
vector<string> tmp = getVectorFromString(out, "$$");
if (tmp.size() < 2)
- return MathData();
+ return MathData(nullptr);
out = subst(subst(tmp[1], "\\>", string()), "{\\it ", "\\mathit{");
lyxerr << "output: '" << out << "'" << endl;
//lyxerr << "output: " << out << endl;
i = out.find("\\over", i + 4);
}
- MathData res;
+ MathData res(nullptr);
mathed_parse_cell(res, from_utf8(out));
return res;
}
// change \_ into _
//
- MathData res;
+ MathData res(nullptr);
mathed_parse_cell(res, from_utf8(out));
return res;
}
// ansi control sequence before, such as '\033[?1034hans = '
size_t i = out.find("ans = ");
if (i == string::npos)
- return MathData();
+ return MathData(nullptr);
out = out.substr(i + 6);
// parse output as matrix or single number
size_t pos2 = out.find("In[2]:=");
if (pos1 == string::npos || pos2 == string::npos)
- return MathData();
+ return MathData(nullptr);
// get everything from pos1+17 to pos2
out = out.substr(pos1 + 17, pos2 - pos1 - 17);
prettifyMathematicaOutput(out, "Muserfunction", true, false);
prettifyMathematicaOutput(out, "Mvariable", false, false);
- MathData res;
+ MathData res(nullptr);
mathed_parse_cell(res, from_utf8(out));
return res;
}
} // namespace
-void write(MathData const & dat, WriteStream & wi)
+void write(MathData const & dat, TeXMathStream & wi)
{
wi.firstitem() = true;
docstring s;
}
-void writeString(docstring const & s, WriteStream & os)
+void writeString(docstring const & s, TeXMathStream & os)
{
if (!os.latex()) {
- os << (os.asciiOnly() ? escape(s) : s);
+ os << s;
+ return;
+ }
+
+ docstring str = s;
+ if (os.asciiOnly())
+ str = escape(s);
+
+ if (os.output() == TeXMathStream::wsSearchAdv) {
+ os << str;
return;
}
if (os.lockedMode()) {
bool space;
docstring cmd;
- for (char_type c : s) {
+ for (char_type c : str) {
try {
Encodings::latexMathChar(c, true, os.encoding(), cmd, space);
os << cmd;
os.pendingSpace(space);
} catch (EncodingException const & e) {
switch (os.output()) {
- case WriteStream::wsDryrun: {
+ case TeXMathStream::wsDryrun: {
os << "<" << _("LyX Warning: ")
<< _("uncodable character") << " '";
os << docstring(1, e.failed_char);
os << "'>";
break;
}
- case WriteStream::wsPreview: {
+ case TeXMathStream::wsPreview: {
// indicate the encoding error by a boxed '?'
os << "{\\fboxsep=1pt\\fbox{?}}";
LYXERR0("Uncodable character" << " '"
<< "'");
break;
}
- case WriteStream::wsDefault:
+ case TeXMathStream::wsDefault:
default:
// throw again
throw;
// We will take care of matching braces.
os.pendingBrace(false);
- for (char_type const c : s) {
+ for (char_type const c : str) {
bool mathmode = in_forced_mode ? os.textMode() : !os.textMode();
docstring command(1, c);
try {
os.pendingSpace(true);
} catch (EncodingException const & e) {
switch (os.output()) {
- case WriteStream::wsDryrun: {
+ case TeXMathStream::wsDryrun: {
os << "<" << _("LyX Warning: ")
<< _("uncodable character") << " '";
os << docstring(1, e.failed_char);
os << "'>";
break;
}
- case WriteStream::wsPreview: {
+ case TeXMathStream::wsPreview: {
// indicate the encoding error by a boxed '?'
os << "{\\fboxsep=1pt\\fbox{?}}";
LYXERR0("Uncodable character" << " '"
<< "'");
break;
}
- case WriteStream::wsDefault:
+ case TeXMathStream::wsDefault:
default:
// throw again
throw;
{
MathData ar = dat;
extractStructure(ar, MATHML);
- if (ar.empty())
- ms << "<" << from_ascii(ms.namespacedTag("mrow")) << "/>";
- else if (ar.size() == 1)
+ if (ar.empty()) {
+ if (!ms.inText())
+ ms << CTag("mrow");
+ } else if (ar.size() == 1) {
ms << ar.front();
- else {
- ms << MTag("mrow");
+ } else {
+ if (!ms.inText())
+ ms << MTag("mrow");
for (MathData::const_iterator it = ar.begin(); it != ar.end(); ++it)
(*it)->mathmlize(ms);
- ms << ETag("mrow");
+ if (!ms.inText())
+ ms << ETag("mrow");
}
}
FileName const file = libFileSearch("mathed", "extern_" + lang);
if (file.empty()) {
lyxerr << "converter to '" << lang << "' not found" << endl;
- return MathData();
+ return MathData(nullptr);
}
// run external sript
string out = captureOutput(file.absFileName(), data);
- MathData res;
+ MathData res(nullptr);
mathed_parse_cell(res, from_utf8(out));
return res;
}