#define MATH_MATHMLSTREAM_H
#include "InsetMath.h"
+#include "FontInfo.h"
#include "TexRow.h"
#include "texstream.h"
#include "support/Changer.h"
#include "support/strfwd.h"
-#include "support/unique_ptr.h"
namespace lyx {
class Encoding;
-class InsetMath;
class MathAtom;
class MathData;
// LaTeX/LyX
//
-class WriteStream {
+class TeXMathStream {
public:
///
enum OutputType {
STRIKEOUT
};
///
- explicit WriteStream(otexrowstream & os, bool fragile = false,
- bool latex = false, OutputType output = wsDefault,
- Encoding const * encoding = 0);
+ explicit TeXMathStream(otexrowstream & os, bool fragile = false,
+ bool latex = false, OutputType output = wsDefault,
+ Encoding const * encoding = nullptr);
///
- ~WriteStream();
+ ~TeXMathStream();
///
int line() const { return line_; }
///
/// tell which ulem command type we are inside
UlemCmdType ulemCmd() const { return ulemcmd_; }
/// writes space if next thing is isalpha()
- void pendingSpace(bool how);
+ void pendingSpace(bool space);
/// writes space if next thing is isalpha()
bool pendingSpace() const { return pendingspace_; }
+ /// write braces if a space is pending and next char is [
+ /// or when a prime immediately follows a superscript
+ void useBraces(bool braces);
+ /// write braces if a space is pending and next char is [
+ /// or when a prime immediately follows a superscript
+ bool useBraces() const { return usebraces_; }
/// tell whether to write the closing brace of \ensuremath
void pendingBrace(bool brace);
/// tell whether to write the closing brace of \ensuremath
void asciiOnly(bool ascii);
/// tell whether to use only ascii chars when producing latex code
bool asciiOnly() const { return ascii_; }
+ /// tell whether we are in a MathClass inset
+ void inMathClass(bool mathclass) { mathclass_ = mathclass; }
+ /// tell whether we are in a MathClass inset
+ bool inMathClass() const { return mathclass_; }
/// LaTeX encoding
Encoding const * encoding() const { return encoding_; }
///
otexrowstream & os_;
/// do we have to write \\protect sometimes
- bool fragile_;
+ bool fragile_ = false;
/// are we at the beginning of an MathData?
- bool firstitem_;
+ bool firstitem_ = false;
/// are we writing to .tex?
- int latex_;
+ int latex_ = false;
/// output type (default, source preview, instant preview)?
- OutputType output_;
+ OutputType output_ = wsDefault;
/// do we have a space pending?
- bool pendingspace_;
+ bool pendingspace_ = false;
+ /// do we have to write braces when a space is pending and [ follows,
+ /// or when a prime immediately follows a superscript?
+ bool usebraces_ = false;
/// do we have a brace pending?
- bool pendingbrace_;
+ bool pendingbrace_ = false;
/// are we in text mode when producing latex code?
- bool textmode_;
+ bool textmode_ = false;
/// are we allowed to switch mode when producing latex code?
- bool locked_;
+ bool locked_ = false;
/// should we use only ascii chars when producing latex code?
- bool ascii_;
+ bool ascii_ = false;
/// are we allowed to output an immediately following newline?
- bool canbreakline_;
+ bool canbreakline_ = true;
/// should we take care for striking out display math?
- bool mathsout_;
+ bool mathsout_ = false;
/// what ulem command are we inside (none, underline, strikeout)?
- UlemCmdType ulemcmd_;
+ UlemCmdType ulemcmd_ = NONE;
///
- int line_;
+ int line_ = 0;
///
- Encoding const * encoding_;
+ Encoding const * encoding_ = nullptr;
/// Row entry we are in
- TexRow::RowEntry row_entry_;
+ TexRow::RowEntry row_entry_ = TexRow::row_none;
+ /// whether we are in a MathClass inset
+ bool mathclass_ = false;
};
///
-WriteStream & operator<<(WriteStream &, MathAtom const &);
+TeXMathStream & operator<<(TeXMathStream &, MathAtom const &);
///
-WriteStream & operator<<(WriteStream &, MathData const &);
+TeXMathStream & operator<<(TeXMathStream &, MathData const &);
///
-WriteStream & operator<<(WriteStream &, docstring const &);
+TeXMathStream & operator<<(TeXMathStream &, docstring const &);
///
-WriteStream & operator<<(WriteStream &, char const * const);
+TeXMathStream & operator<<(TeXMathStream &, char const * const);
///
-WriteStream & operator<<(WriteStream &, char);
+TeXMathStream & operator<<(TeXMathStream &, char);
///
-WriteStream & operator<<(WriteStream &, int);
+TeXMathStream & operator<<(TeXMathStream &, int);
///
-WriteStream & operator<<(WriteStream &, unsigned int);
+TeXMathStream & operator<<(TeXMathStream &, unsigned int);
/// ensure correct mode, possibly by opening \ensuremath or \lyxmathsym
-bool ensureMath(WriteStream & os, bool needs_mathmode = true,
+bool ensureMath(TeXMathStream & os, bool needs_mathmode = true,
bool macro = false, bool textmode_macro = false);
/// ensure the requested mode, possibly by closing \ensuremath or \lyxmathsym
-int ensureMode(WriteStream & os, InsetMath::mode_type mode, bool locked, bool ascii);
+int ensureMode(TeXMathStream & os, InsetMath::mode_type mode, bool locked, bool ascii);
/**
{
public:
///
- explicit MathEnsurer(WriteStream & os, bool needs_mathmode = true,
+ explicit MathEnsurer(TeXMathStream & os, bool needs_mathmode = true,
bool macro = false, bool textmode_macro = false)
: os_(os), brace_(ensureMath(os, needs_mathmode, macro, textmode_macro)) {}
///
~MathEnsurer() { os_.pendingBrace(brace_); }
private:
///
- WriteStream & os_;
+ TeXMathStream & os_;
///
bool brace_;
};
{
public:
///
- explicit ModeSpecifier(WriteStream & os, InsetMath::mode_type mode,
- bool locked = false, bool ascii = false)
+ explicit ModeSpecifier(TeXMathStream & os, InsetMath::mode_type mode,
+ bool locked = false, bool ascii = false)
: os_(os), oldmodes_(ensureMode(os, mode, locked, ascii)) {}
///
~ModeSpecifier()
}
private:
///
- WriteStream & os_;
+ TeXMathStream & os_;
///
int oldmodes_;
};
std::string attr_;
};
+/// Start inline tag.
+class MTagInline {
+public:
+ ///
+ MTagInline(char const * const tag, std::string const & attr = std::string())
+ : tag_(tag), attr_(attr) {}
+ ///
+ char const * const tag_;
+ ///
+ std::string attr_;
+};
+
/// End tag.
class ETag {
};
+/// End inlinetag.
+class ETagInline {
+public:
+ ///
+ explicit ETagInline(char const * const tag) : tag_(tag) {}
+ ///
+ char const * const tag_;
+};
+
+
/// Compound tag (no content, directly closed).
class CTag {
public:
///
- CTag(char const * const tag, std::string attr = "")
+ CTag(char const * const tag, std::string const & attr = "")
: tag_(tag), attr_(attr) {}
///
char const * const tag_;
class MathExportException : public std::exception {};
-class MathStream {
+class MathMLStream {
public:
/// Builds a stream proxy for os; the MathML namespace is given by xmlns (supposed to be already defined elsewhere in the document).
- explicit MathStream(odocstream & os, std::string xmlns="");
+ explicit MathMLStream(odocstream & os, std::string const & xmlns = "", bool xmlMode = false);
///
void cr();
///
///
int & tab() { return tab_; }
///
- friend MathStream & operator<<(MathStream &, char const *);
+ friend MathMLStream & operator<<(MathMLStream &, char const *);
///
void defer(docstring const &);
///
bool inText() const { return in_text_; }
///
std::string xmlns() const { return xmlns_; }
+ ///
+ bool xmlMode() const { return xml_mode_; }
/// Returns the tag name prefixed by the name space if needed.
- std::string namespacedTag(std::string tag) const { return ((xmlns().empty()) ? "" : xmlns() + ":") + tag; }
+ std::string namespacedTag(std::string const & tag) const {
+ return (xmlns().empty() ? "" : xmlns() + ":") + tag;
+ }
+ /// Returns the current math style in the stream.
+ const MathStyle & getFontMathStyle() const { return font_math_style_; }
+ /// Returns the current math style in the stream.
+ void setFontMathStyle(const MathStyle style) { font_math_style_ = style; }
private:
///
void setTextMode(bool t) { in_text_ = t; }
///
std::string xmlns_;
///
+ bool xml_mode_;
+ /// The only important part of a FontInfo object.
+ MathStyle font_math_style_;
+ ///
friend class SetMode;
};
///
-MathStream & operator<<(MathStream &, MathAtom const &);
+MathMLStream & operator<<(MathMLStream &, MathAtom const &);
+///
+MathMLStream & operator<<(MathMLStream &, MathData const &);
+///
+MathMLStream & operator<<(MathMLStream &, docstring const &);
///
-MathStream & operator<<(MathStream &, MathData const &);
+MathMLStream & operator<<(MathMLStream &, char const *);
///
-MathStream & operator<<(MathStream &, docstring const &);
+MathMLStream & operator<<(MathMLStream &, char);
///
-MathStream & operator<<(MathStream &, char const *);
+MathMLStream & operator<<(MathMLStream &, char_type);
///
-MathStream & operator<<(MathStream &, char);
+MathMLStream & operator<<(MathMLStream &, MTag const &);
///
-MathStream & operator<<(MathStream &, char_type);
+MathMLStream & operator<<(MathMLStream &, MTagInline const &);
///
-MathStream & operator<<(MathStream &, MTag const &);
+MathMLStream & operator<<(MathMLStream &, ETag const &);
///
-MathStream & operator<<(MathStream &, ETag const &);
+MathMLStream & operator<<(MathMLStream &, ETagInline const &);
///
-MathStream & operator<<(MathStream &, CTag const &);
+MathMLStream & operator<<(MathMLStream &, CTag const &);
/// A simpler version of ModeSpecifier, for MathML
class SetMode {
public:
///
- explicit SetMode(MathStream & ms, bool text);
+ explicit SetMode(MathMLStream & ms, bool text);
///
~SetMode();
private:
///
- MathStream & ms_;
+ MathMLStream & ms_;
///
bool was_text_;
};
OctaveStream & operator<<(OctaveStream &, int);
-docstring convertDelimToXMLEscape(docstring const & name);
+docstring convertDelimToXMLEscape(docstring const & name, bool xmlmode);
} // namespace lyx