X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetSpecialChar.cpp;h=91c13645b535af7e541e949f2c71748b8fce16b2;hb=12c7e7dde3851ad894380fd42ba741dd3d0cbcc7;hp=beb80116d43aec1ab4c0ac4b7d486f7bb88f53de;hpb=00e305c9d9bd8b0ff54b6c58adb6192d5934ed60;p=lyx.git diff --git a/src/insets/InsetSpecialChar.cpp b/src/insets/InsetSpecialChar.cpp index beb80116d4..91c13645b5 100644 --- a/src/insets/InsetSpecialChar.cpp +++ b/src/insets/InsetSpecialChar.cpp @@ -5,7 +5,7 @@ * * \author Asger Alstrup Nielsen * \author Jean-Marc Lasgouttes - * \author Lars Gullik Bjønnes + * \author Lars Gullik Bjønnes * * Full author contact details are available in file CREDITS. */ @@ -14,25 +14,26 @@ #include "InsetSpecialChar.h" -#include "debug.h" +#include "Dimension.h" +#include "Font.h" #include "LaTeXFeatures.h" -#include "LColor.h" -#include "LyXLex.h" +#include "Lexer.h" #include "MetricsInfo.h" +#include "output_xhtml.h" #include "frontends/FontMetrics.h" #include "frontends/Painter.h" +#include "support/debug.h" +#include "support/docstream.h" -namespace lyx { +using namespace std; -using std::string; -using std::auto_ptr; -using std::ostream; +namespace lyx { InsetSpecialChar::InsetSpecialChar(Kind k) - : kind_(k) + : Inset(0), kind_(k) {} @@ -42,7 +43,7 @@ InsetSpecialChar::Kind InsetSpecialChar::kind() const } -bool InsetSpecialChar::metrics(MetricsInfo & mi, Dimension & dim) const +void InsetSpecialChar::metrics(MetricsInfo & mi, Dimension & dim) const { frontend::FontMetrics const & fm = theFontMetrics(mi.base.font); @@ -51,50 +52,65 @@ bool InsetSpecialChar::metrics(MetricsInfo & mi, Dimension & dim) const string s; switch (kind_) { - case LIGATURE_BREAK: s = "|"; break; - case END_OF_SENTENCE: s = "."; break; - case LDOTS: s = ". . ."; break; - case MENU_SEPARATOR: s = " x "; break; - case HYPHENATION: s = "-"; break; + case LIGATURE_BREAK: + s = "|"; + break; + case END_OF_SENTENCE: + s = "."; + break; + case LDOTS: + s = ". . ."; + break; + case MENU_SEPARATOR: + s = " x "; + break; + case HYPHENATION: + s = "-"; + break; + case SLASH: + s = "/"; + break; + case NOBREAKDASH: + s = "-"; + break; } - docstring ds(s.begin(), s.end()); + docstring ds(s.begin(), s.end()); dim.wid = fm.width(ds); if (kind_ == HYPHENATION && dim.wid > 5) dim.wid -= 2; // to make it look shorter - bool const changed = dim_ != dim; - dim_ = dim; - return changed; + + setDimCache(mi, dim); } void InsetSpecialChar::draw(PainterInfo & pi, int x, int y) const { - LyXFont font = pi.base.font; + FontInfo font = pi.base.font; switch (kind_) { case HYPHENATION: { - font.setColor(LColor::special); + font.setColor(Color_special); pi.pain.text(x, y, char_type('-'), font); break; } case LIGATURE_BREAK: { - font.setColor(LColor::special); + font.setColor(Color_special); pi.pain.text(x, y, char_type('|'), font); break; } case END_OF_SENTENCE: { - font.setColor(LColor::special); + font.setColor(Color_special); pi.pain.text(x, y, char_type('.'), font); break; } case LDOTS: { - font.setColor(LColor::special); - string ell = ". . . "; - docstring dell(ell.begin(), ell.end()); + font.setColor(Color_special); + string ell = ". . . "; + docstring dell(ell.begin(), ell.end()); pi.pain.text(x, y, dell, font); break; } @@ -104,7 +120,7 @@ void InsetSpecialChar::draw(PainterInfo & pi, int x, int y) const theFontMetrics(font); // A triangle the width and height of an 'x' - int w = fm.width(char_type('x')); + int w = fm.width(char_type('x')); int ox = fm.width(char_type(' ')) + x; int h = fm.ascent(char_type('x')); int xp[4], yp[4]; @@ -114,7 +130,19 @@ void InsetSpecialChar::draw(PainterInfo & pi, int x, int y) const xp[2] = ox + w; yp[2] = y - h/2; xp[3] = ox; yp[3] = y; - pi.pain.lines(xp, yp, 4, LColor::special); + pi.pain.lines(xp, yp, 4, Color_special); + break; + } + case SLASH: + { + font.setColor(Color_special); + pi.pain.text(x, y, char_type('/'), font); + break; + } + case NOBREAKDASH: + { + font.setColor(Color_latex); + pi.pain.text(x, y, char_type('-'), font); break; } } @@ -122,7 +150,7 @@ void InsetSpecialChar::draw(PainterInfo & pi, int x, int y) const // In lyxf3 this will be just LaTeX -void InsetSpecialChar::write(Buffer const &, ostream & os) const +void InsetSpecialChar::write(ostream & os) const { string command; switch (kind_) { @@ -141,13 +169,19 @@ void InsetSpecialChar::write(Buffer const &, ostream & os) const case MENU_SEPARATOR: command = "\\menuseparator"; break; + case SLASH: + command = "\\slash{}"; + break; + case NOBREAKDASH: + command = "\\nobreakdash-"; + break; } os << "\\SpecialChar " << command << "\n"; } // This function will not be necessary when lyx3 -void InsetSpecialChar::read(Buffer const &, LyXLex & lex) +void InsetSpecialChar::read(Lexer & lex) { lex.next(); string const command = lex.getString(); @@ -162,13 +196,17 @@ void InsetSpecialChar::read(Buffer const &, LyXLex & lex) kind_ = LDOTS; else if (command == "\\menuseparator") kind_ = MENU_SEPARATOR; + else if (command == "\\slash{}") + kind_ = SLASH; + else if (command == "\\nobreakdash-") + kind_ = NOBREAKDASH; else lex.printError("InsetSpecialChar: Unknown kind: `$$Token'"); } -int InsetSpecialChar::latex(Buffer const &, odocstream & os, - OutputParams const &) const +int InsetSpecialChar::latex(odocstream & os, + OutputParams const & rp) const { switch (kind_) { case HYPHENATION: @@ -184,15 +222,25 @@ int InsetSpecialChar::latex(Buffer const &, odocstream & os, os << "\\ldots{}"; break; case MENU_SEPARATOR: - os << "\\lyxarrow{}"; + if (rp.local_font->isRightToLeft()) + os << "\\lyxarrow*{}"; + else + os << "\\lyxarrow{}"; + break; + case SLASH: + os << "\\slash{}"; + break; + case NOBREAKDASH: + if (rp.moving_arg) + os << "\\protect"; + os << "\\nobreakdash-"; break; } return 0; } -int InsetSpecialChar::plaintext(Buffer const &, odocstream & os, - OutputParams const &) const +int InsetSpecialChar::plaintext(odocstream & os, OutputParams const &) const { switch (kind_) { case HYPHENATION: @@ -207,13 +255,18 @@ int InsetSpecialChar::plaintext(Buffer const &, odocstream & os, case MENU_SEPARATOR: os << "->"; return 2; + case SLASH: + os << '/'; + return 1; + case NOBREAKDASH: + os << '-'; + return 1; } return 0; } -int InsetSpecialChar::docbook(Buffer const &, odocstream & os, - OutputParams const &) const +int InsetSpecialChar::docbook(odocstream & os, OutputParams const &) const { switch (kind_) { case HYPHENATION: @@ -228,35 +281,55 @@ int InsetSpecialChar::docbook(Buffer const &, odocstream & os, case MENU_SEPARATOR: os << "&lyxarrow;"; break; + case SLASH: + os << '/'; + break; + case NOBREAKDASH: + os << '-'; + break; } return 0; } -int InsetSpecialChar::textString(Buffer const & buf, odocstream & os, - OutputParams const & op) const +docstring InsetSpecialChar::xhtml(XHTMLStream & xs, OutputParams const &) const { - return plaintext(buf, os, op); + switch (kind_) { + case HYPHENATION: + case LIGATURE_BREAK: + break; + case END_OF_SENTENCE: + xs << '.'; + break; + case LDOTS: + xs << XHTMLStream::NextRaw() << "…"; + break; + case MENU_SEPARATOR: + xs << XHTMLStream::NextRaw() << "⇒"; + break; + case SLASH: + xs << XHTMLStream::NextRaw() << "⁄"; + break; + case NOBREAKDASH: + xs << '-'; + break; + } + return docstring(); } -auto_ptr InsetSpecialChar::doClone() const +void InsetSpecialChar::tocString(odocstream & os) const { - return auto_ptr(new InsetSpecialChar(kind_)); + plaintext(os, OutputParams(0)); } void InsetSpecialChar::validate(LaTeXFeatures & features) const { - if (kind_ == MENU_SEPARATOR) { + if (kind_ == MENU_SEPARATOR) features.require("lyxarrow"); - } -} - - -bool InsetSpecialChar::isChar() const -{ - return true; + if (kind_ == NOBREAKDASH) + features.require("amsmath"); }