X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FMathStream.cpp;h=cf3fb51f1f0ba484be79ef9dc7567570b20c3afd;hb=28be7d552f62cc02fa86d7f79201d089bfb2d7b5;hp=c9f7ef54a50df772ff4164f936c548ed8a04d765;hpb=eb17e9c3623e941afd470f969b11820c73b021b5;p=lyx.git diff --git a/src/mathed/MathStream.cpp b/src/mathed/MathStream.cpp index c9f7ef54a5..cf3fb51f1f 100644 --- a/src/mathed/MathStream.cpp +++ b/src/mathed/MathStream.cpp @@ -12,11 +12,15 @@ #include "MathStream.h" +#include "MathFactory.h" #include "MathData.h" #include "MathExtern.h" -#include "support/textutils.h" +#include "TexRow.h" + #include "support/docstring.h" +#include "support/RefChanger.h" +#include "support/textutils.h" #include #include @@ -85,42 +89,49 @@ NormalStream & operator<<(NormalStream & ns, int i) WriteStream & operator<<(WriteStream & ws, docstring const & s) { + // Skip leading '\n' if we had already output a newline char + size_t const first = + (s.length() > 0 && (s[0] != '\n' || ws.canBreakLine())) ? 0 : 1; + + // Check whether there's something to output + if (s.length() <= first) + return ws; + if (ws.pendingBrace()) { ws.os() << '}'; ws.pendingBrace(false); ws.pendingSpace(false); ws.textMode(true); - } else if (ws.pendingSpace() && s.length() > 0) { - if (isAlphaASCII(s[0])) + } else if (ws.pendingSpace()) { + if (isAlphaASCII(s[first])) ws.os() << ' '; - else if (s[0] == ' ' && ws.textMode()) + else if (s[first] == ' ' && ws.textMode()) ws.os() << '\\'; ws.pendingSpace(false); } - ws.os() << s; + ws.os() << s.substr(first); int lf = 0; - docstring::const_iterator dit = s.begin(); + char_type lastchar = 0; + docstring::const_iterator dit = s.begin() + first; docstring::const_iterator end = s.end(); - for (; dit != end; ++dit) - if ((*dit) == '\n') + for (; dit != end; ++dit) { + lastchar = *dit; + if (lastchar == '\n') ++lf; + } ws.addlines(lf); + ws.canBreakLine(lastchar != '\n'); return ws; } -WriteStream::WriteStream(odocstream & os, bool fragile, bool latex, OutputType output, - Encoding const * encoding) +WriteStream::WriteStream(otexrowstream & os, bool fragile, bool latex, + OutputType output, Encoding const * encoding) : os_(os), fragile_(fragile), firstitem_(false), latex_(latex), - output_(output), pendingspace_(false), pendingbrace_(false), - textmode_(false), locked_(0), line_(0), encoding_(encoding) -{} - - -WriteStream::WriteStream(odocstream & os) - : os_(os), fragile_(false), firstitem_(false), latex_(false), - output_(wsDefault), pendingspace_(false), pendingbrace_(false), - textmode_(false), locked_(0), line_(0), encoding_(0) + output_(output), insidemacro_(false), pendingspace_(false), + pendingbrace_(false), textmode_(false), locked_(0), ascii_(0), + canbreakline_(true), mathsout_(false), ulemcmd_(NONE), line_(0), + encoding_(encoding), row_entry_(TexRow::row_none) {} @@ -163,6 +174,26 @@ void WriteStream::lockedMode(bool locked) } +void WriteStream::asciiOnly(bool ascii) +{ + ascii_ = ascii; +} + + +Changer WriteStream::changeRowEntry(TexRow::RowEntry entry) +{ + return make_change(row_entry_, entry); +} + + +bool WriteStream::startOuterRow() +{ + if (TexRow::isNone(row_entry_)) + return false; + return texrow().start(row_entry_); +} + + WriteStream & operator<<(WriteStream & ws, MathAtom const & at) { at->write(ws); @@ -179,26 +210,16 @@ WriteStream & operator<<(WriteStream & ws, MathData const & ar) WriteStream & operator<<(WriteStream & ws, char const * s) { - if (ws.pendingBrace()) { - ws.os() << '}'; - ws.pendingBrace(false); - ws.pendingSpace(false); - ws.textMode(true); - } else if (ws.pendingSpace() && strlen(s) > 0) { - if (isAlphaASCII(s[0])) - ws.os() << ' '; - else if (s[0] == ' ' && ws.textMode()) - ws.os() << '\\'; - ws.pendingSpace(false); - } - ws.os() << s; - ws.addlines(int(count(s, s + strlen(s), '\n'))); + ws << from_utf8(s); return ws; } WriteStream & operator<<(WriteStream & ws, char c) { + if (c == '\n' && !ws.canBreakLine()) + return ws; + if (ws.pendingBrace()) { ws.os() << '}'; ws.pendingBrace(false); @@ -214,6 +235,7 @@ WriteStream & operator<<(WriteStream & ws, char c) ws.os() << c; if (c == '\n') ws.addlines(1); + ws.canBreakLine(c != '\n'); return ws; } @@ -226,6 +248,7 @@ WriteStream & operator<<(WriteStream & ws, int i) ws.textMode(true); } ws.os() << i; + ws.canBreakLine(true); return ws; } @@ -238,6 +261,7 @@ WriteStream & operator<<(WriteStream & ws, unsigned int i) ws.textMode(true); } ws.os() << i; + ws.canBreakLine(true); return ws; } @@ -246,7 +270,7 @@ WriteStream & operator<<(WriteStream & ws, unsigned int i) MathStream::MathStream(odocstream & os) - : os_(os), tab_(0), line_(0), lastchar_(0), in_text_(false) + : os_(os), tab_(0), line_(0), in_text_(false) {} @@ -306,7 +330,7 @@ MathStream & operator<<(MathStream & ms, char c) MathStream & operator<<(MathStream & ms, char_type c) { - ms.os() << c; + ms.os().put(c); return ms; } @@ -315,7 +339,10 @@ MathStream & operator<<(MathStream & ms, MTag const & t) { ++ms.tab(); ms.cr(); - ms.os() << '<' << from_ascii(t.tag_) << '>'; + ms.os() << '<' << from_ascii(t.tag_); + if (!t.attr_.empty()) + ms.os() << " " << from_ascii(t.attr_); + ms << '>'; return ms; } @@ -337,56 +364,122 @@ MathStream & operator<<(MathStream & ms, docstring const & s) } -SetMode::SetMode(MathStream & os, bool text) - : os_(os), opened_(false) +////////////////////////////////////////////////////////////////////// + + +HtmlStream::HtmlStream(odocstream & os) + : os_(os), tab_(0), line_(0), in_text_(false) +{} + + +void HtmlStream::defer(docstring const & s) +{ + deferred_ << s; +} + + +void HtmlStream::defer(string const & s) { - init(text, from_ascii("")); + deferred_ << from_utf8(s); +} + + +docstring HtmlStream::deferred() const +{ + return deferred_.str(); } -SetMode::SetMode(MathStream & os, bool text, docstring attrs) - : os_(os), opened_(false) +HtmlStream & operator<<(HtmlStream & ms, MathAtom const & at) { - init(text, attrs); + at->htmlize(ms); + return ms; } -void SetMode::init(bool text, docstring attrs) +HtmlStream & operator<<(HtmlStream & ms, MathData const & ar) +{ + htmlize(ar, ms); + return ms; +} + + +HtmlStream & operator<<(HtmlStream & ms, char const * s) +{ + ms.os() << s; + return ms; +} + + +HtmlStream & operator<<(HtmlStream & ms, char c) +{ + ms.os() << c; + return ms; +} + + +HtmlStream & operator<<(HtmlStream & ms, char_type c) +{ + ms.os().put(c); + return ms; +} + + +HtmlStream & operator<<(HtmlStream & ms, MTag const & t) +{ + ms.os() << '<' << from_ascii(t.tag_); + if (!t.attr_.empty()) + ms.os() << " " << from_ascii(t.attr_); + ms << '>'; + return ms; +} + + +HtmlStream & operator<<(HtmlStream & ms, ETag const & t) +{ + ms.os() << "'; + return ms; +} + + +HtmlStream & operator<<(HtmlStream & ms, docstring const & s) +{ + ms.os() << s; + return ms; +} + + +////////////////////////////////////////////////////////////////////// + + +SetMode::SetMode(MathStream & os, bool text) + : os_(os) { was_text_ = os_.inText(); - if (was_text_) - os_ << ""; - if (text) { - os_.setTextMode(); - os_ << ""; - opened_ = true; - } else { - if (!attrs.empty()) { - os_ << ""; - opened_ = true; - } - os_.setMathMode(); - } + os_.setTextMode(text); } SetMode::~SetMode() { - if (opened_) { - if (os_.inText()) - os_ << ""; - else - os_ << ""; - } - if (was_text_) { - os_.setTextMode(); - os_ << ""; - } else { - os_.setMathMode(); - } + os_.setTextMode(was_text_); +} + + +////////////////////////////////////////////////////////////////////// + + +SetHTMLMode::SetHTMLMode(HtmlStream & os, bool text) + : os_(os) +{ + was_text_ = os_.inText(); + os_.setTextMode(text); +} + + +SetHTMLMode::~SetHTMLMode() +{ + os_.setTextMode(was_text_); } @@ -605,4 +698,25 @@ OctaveStream & operator<<(OctaveStream & os, string const & s) } +docstring convertDelimToXMLEscape(docstring const & name) +{ + if (name.size() == 1) { + char_type const c = name[0]; + if (c == '<') + return from_ascii("<"); + else if (c == '>') + return from_ascii(">"); + else + return name; + } + MathWordList const & words = mathedWordList(); + MathWordList::const_iterator it = words.find(name); + if (it != words.end()) { + docstring const escape = it->second.xmlname; + return escape; + } + LYXERR0("Unable to find `" << name <<"' in the mathWordList."); + return name; +} + } // namespace lyx