]> git.lyx.org Git - lyx.git/blobdiff - src/Font.cpp
At least for now, this has to be done differently.
[lyx.git] / src / Font.cpp
index 57cf5e6192224e88605f75186235018950a11bfb..4bf3040cd7fb8af60765f3a66266d4b71c4ff801 100644 (file)
@@ -3,10 +3,10 @@
  * This file is part of LyX, the document processor.
  * Licence details can be found in the file COPYING.
  *
- * \author Lars Gullik Bjønnes
+ * \author Lars Gullik Bjønnes
  * \author Jean-Marc Lasgouttes
  * \author Angus Leeming
- * \author André Pönitz
+ * \author André Pönitz
  * \author Dekel Tsur
  *
  * Full author contact details are available in file CREDITS.
 #include "Font.h"
 
 #include "BufferParams.h" // stateText
-#include "Color.h"
-#include "debug.h"
+#include "ColorSet.h"
 #include "Encoding.h"
-#include "gettext.h"
 #include "Language.h"
 #include "LaTeXFeatures.h"
 #include "Lexer.h"
 #include "output_latex.h"
 #include "OutputParams.h"
 
+#include "support/lassert.h"
 #include "support/convert.h"
+#include "support/debug.h"
+#include "support/gettext.h"
 #include "support/lstrings.h"
 
-using std::endl;
-using std::string;
-using std::ostream;
-using std::ostringstream;
-using std::istringstream;
-using std::pair;
-
-#ifndef CXX_GLOBAL_CSTD
-using std::strlen;
-#endif
+#include <cstring>
 
+using namespace std;
+using namespace lyx::support;
 
 namespace lyx {
 
-using support::ascii_lowercase;
-using support::bformat;
-using support::rtrim;
-using support::subst;
-
 //
 // Names for the GUI
 //
@@ -119,7 +108,7 @@ char const * LaTeXSizeNames[14] =
 
 
 Font::Font(FontInfo bits, Language const * l)
-       : bits_(bits), lang_(l), open_encoding_(false)
+       : bits_(bits), lang_(l), misspelled_(false), open_encoding_(false)
 {
        if (!lang_)
                lang_ = default_language;
@@ -157,6 +146,8 @@ void Font::update(Font const & newfont,
                        setLanguage(default_language);
                else
                        setLanguage(document_language);
+       else if (newfont.language() == reset_language)
+               setLanguage(document_language);
        else if (newfont.language() != ignore_language)
                setLanguage(newfont.language());
 }
@@ -184,6 +175,15 @@ docstring const stateText(FontInfo const & f)
        if (f.underbar() != FONT_INHERIT)
                os << bformat(_("Underline %1$s, "),
                              _(GUIMiscNames[f.underbar()]));
+       if (f.strikeout() != FONT_INHERIT)
+               os << bformat(_("Strikeout %1$s, "),
+                             _(GUIMiscNames[f.strikeout()]));
+       if (f.uuline() != FONT_INHERIT)
+               os << bformat(_("Double underline %1$s, "),
+                             _(GUIMiscNames[f.uuline()]));
+       if (f.uwave() != FONT_INHERIT)
+               os << bformat(_("Wavy underline %1$s, "),
+                             _(GUIMiscNames[f.uwave()]));
        if (f.noun() != FONT_INHERIT)
                os << bformat(_("Noun %1$s, "),
                              _(GUIMiscNames[f.noun()]));
@@ -303,9 +303,9 @@ string const Font::latexSize() const
 
 // Read a font definition from given file in lyx format
 // Used for layouts
-FontInfo lyxRead(Lexer & lex)
+FontInfo lyxRead(Lexer & lex, FontInfo const & fi)
 {
-       FontInfo f;
+       FontInfo f = fi;
        bool error = false;
        bool finished = false;
        while (!finished && lex.isOK() && !error) {
@@ -338,6 +338,12 @@ FontInfo lyxRead(Lexer & lex)
 
                        if (ttok == "no_bar") {
                                f.setUnderbar(FONT_OFF);
+                       } else if (ttok == "no_strikeout") {
+                               f.setStrikeout(FONT_OFF);
+                       } else if (ttok == "no_uuline") {
+                               f.setUuline(FONT_OFF);
+                       } else if (ttok == "no_uwave") {
+                               f.setUwave(FONT_OFF);
                        } else if (ttok == "no_emph") {
                                f.setEmph(FONT_OFF);
                        } else if (ttok == "no_noun") {
@@ -346,17 +352,23 @@ FontInfo lyxRead(Lexer & lex)
                                f.setEmph(FONT_ON);
                        } else if (ttok == "underbar") {
                                f.setUnderbar(FONT_ON);
+                       } else if (ttok == "strikeout") {
+                               f.setStrikeout(FONT_ON);
+                       } else if (ttok == "uuline") {
+                               f.setUuline(FONT_ON);
+                       } else if (ttok == "uwave") {
+                               f.setUwave(FONT_ON);
                        } else if (ttok == "noun") {
                                f.setNoun(FONT_ON);
                        } else {
-                               lex.printError("Illegal misc type `$$Token'");
+                               lex.printError("Illegal misc type");
                        }
                } else if (tok == "color") {
                        lex.next();
                        string const ttok = lex.getString();
                        setLyXColor(ttok, f);
                } else {
-                       lex.printError("Unknown tag `$$Token'");
+                       lex.printError("Unknown tag");
                        error = true;
                }
        }
@@ -397,6 +409,15 @@ void Font::lyxWriteChanges(Font const & orgfont,
                break;
                }
        }
+       if (orgfont.fontInfo().strikeout() != bits_.strikeout()) {
+               os << "\\strikeout " << LyXMiscNames[bits_.strikeout()] << "\n";
+       }
+       if (orgfont.fontInfo().uuline() != bits_.uuline()) {
+               os << "\\uuline " << LyXMiscNames[bits_.uuline()] << "\n";
+       }
+       if (orgfont.fontInfo().uwave() != bits_.uwave()) {
+               os << "\\uwave " << LyXMiscNames[bits_.uwave()] << "\n";
+       }
        if (orgfont.fontInfo().noun() != bits_.noun()) {
                os << "\\noun " << LyXMiscNames[bits_.noun()] << "\n";
        }
@@ -464,8 +485,7 @@ int Font::latexWriteStartChanges(odocstream & os, BufferParams const & bparams,
 
        if (language()->encoding()->package() == Encoding::CJK) {
                pair<bool, int> const c = switchEncoding(os, bparams,
-                               runparams.moving_arg, *(runparams.encoding),
-                               *(language()->encoding()));
+                               runparams, *(language()->encoding()));
                if (c.first) {
                        open_encoding_ = true;
                        count += c.second;
@@ -532,8 +552,27 @@ int Font::latexWriteStartChanges(odocstream & os, BufferParams const & bparams,
                env = true; //We have opened a new environment
        }
        if (f.underbar() == FONT_ON) {
-               os << "\\underbar{";
+               os << "\\uline{";
                count += 10;
+               runparams.inulemcmd = true;
+               env = true; //We have opened a new environment
+       }
+       if (f.strikeout() == FONT_ON) {
+               os << "\\sout{";
+               count += 9;
+               runparams.inulemcmd = true;
+               env = true; //We have opened a new environment
+       }
+       if (f.uuline() == FONT_ON) {
+               os << "\\uuline{";
+               count += 11;
+               runparams.inulemcmd = true;
+               env = true; //We have opened a new environment
+       }
+       if (f.uwave() == FONT_ON) {
+               os << "\\uwave{";
+               count += 10;
+               runparams.inulemcmd = true;
                env = true; //We have opened a new environment
        }
        // \noun{} is a LyX special macro
@@ -603,6 +642,25 @@ int Font::latexWriteEndChanges(odocstream & os, BufferParams const & bparams,
        if (f.underbar() == FONT_ON) {
                os << '}';
                ++count;
+               runparams.inulemcmd = false;
+               env = true; // Size change need not bother about closing env.
+       }
+       if (f.strikeout() == FONT_ON) {
+               os << '}';
+               ++count;
+               runparams.inulemcmd = false;
+               env = true; // Size change need not bother about closing env.
+       }
+       if (f.uuline() == FONT_ON) {
+               os << '}';
+               ++count;
+               runparams.inulemcmd = false;
+               env = true; // Size change need not bother about closing env.
+       }
+       if (f.uwave() == FONT_ON) {
+               os << '}';
+               ++count;
+               runparams.inulemcmd = false;
                env = true; // Size change need not bother about closing env.
        }
        if (f.noun() == FONT_ON) {
@@ -633,11 +691,10 @@ int Font::latexWriteEndChanges(odocstream & os, BufferParams const & bparams,
        if (open_encoding_) {
                // We need to close the encoding even if it does not change
                // to do correct environment nesting
-               Encoding const * const ascii = encodings.getFromLyXName("ascii");
+               Encoding const * const ascii = encodings.fromLyXName("ascii");
                pair<bool, int> const c = switchEncoding(os, bparams,
-                               runparams.moving_arg, *(runparams.encoding),
-                               *ascii);
-               BOOST_ASSERT(c.first);
+                               runparams, *ascii);
+               LASSERT(c.first, /**/);
                count += c.second;
                runparams.encoding = ascii;
                open_encoding_ = false;
@@ -653,11 +710,10 @@ int Font::latexWriteEndChanges(odocstream & os, BufferParams const & bparams,
 }
 
 
-std::string Font::toString(bool const toggle) const
+string Font::toString(bool const toggle) const
 {
-       string lang = "ignore";
-       if (language())
-               lang = language()->lang();
+       string const lang = (language() == reset_language)
+               ? "reset" : language()->lang();
 
        ostringstream os;
        os << "family " << bits_.family() << '\n'
@@ -666,6 +722,9 @@ std::string Font::toString(bool const toggle) const
           << "size " << bits_.size() << '\n'
           << "emph " << bits_.emph() << '\n'
           << "underbar " << bits_.underbar() << '\n'
+          << "strikeout " << bits_.strikeout() << '\n'
+          << "uuline " << bits_.uuline() << '\n'
+          << "uwave " << bits_.uwave() << '\n'
           << "noun " << bits_.noun() << '\n'
           << "number " << bits_.number() << '\n'
           << "color " << bits_.color() << '\n'
@@ -678,7 +737,7 @@ std::string Font::toString(bool const toggle) const
 bool Font::fromString(string const & data, bool & toggle)
 {
        istringstream is(data);
-       Lexer lex(0,0);
+       Lexer lex;
        lex.setStream(is);
 
        int nset = 0;
@@ -707,7 +766,9 @@ bool Font::fromString(string const & data, bool & toggle)
                        bits_.setSize(FontSize(next));
 
                } else if (token == "emph" || token == "underbar" ||
-                          token == "noun" || token == "number") {
+                          token == "noun" || token == "number" ||
+                          token == "uuline" || token == "uwave" ||
+                          token == "strikeout") {
 
                        int const next = lex.getInteger();
                        FontState const misc = FontState(next);
@@ -716,6 +777,12 @@ bool Font::fromString(string const & data, bool & toggle)
                                bits_.setEmph(misc);
                        else if (token == "underbar")
                                bits_.setUnderbar(misc);
+                       else if (token == "strikeout")
+                               bits_.setStrikeout(misc);
+                       else if (token == "uuline")
+                               bits_.setUuline(misc);
+                       else if (token == "uwave")
+                               bits_.setUwave(misc);
                        else if (token == "noun")
                                bits_.setNoun(misc);
                        else if (token == "number")
@@ -733,10 +800,7 @@ bool Font::fromString(string const & data, bool & toggle)
 
                } else if (token == "language") {
                        string const next = lex.getString();
-                       if (next == "ignore")
-                               setLanguage(ignore_language);
-                       else
-                               setLanguage(languages.getLanguage(next));
+                       setLanguage(languages.getLanguage(next));
 
                } else if (token == "toggleall") {
                        toggle = lex.getBool();
@@ -758,13 +822,29 @@ void Font::validate(LaTeXFeatures & features) const
        Language const * doc_language = bparams.language;
 
        if (bits_.noun() == FONT_ON) {
-               LYXERR(Debug::LATEX) << "font.noun: "
-                       << bits_.noun()
-                       << endl;
+               LYXERR(Debug::LATEX, "font.noun: " << bits_.noun());
                features.require("noun");
-               LYXERR(Debug::LATEX) << "Noun enabled. Font: "
-                       << to_utf8(stateText(0))
-                       << endl;
+               LYXERR(Debug::LATEX, "Noun enabled. Font: " << to_utf8(stateText(0)));
+       }
+       if (bits_.underbar() == FONT_ON) {
+               LYXERR(Debug::LATEX, "font.underline: " << bits_.underbar());
+               features.require("ulem");
+               LYXERR(Debug::LATEX, "Underline enabled. Font: " << to_utf8(stateText(0)));
+       }
+       if (bits_.strikeout() == FONT_ON) {
+               LYXERR(Debug::LATEX, "font.strikeout: " << bits_.strikeout());
+               features.require("ulem");
+               LYXERR(Debug::LATEX, "Strikeout enabled. Font: " << to_utf8(stateText(0)));
+       }
+       if (bits_.uuline() == FONT_ON) {
+               LYXERR(Debug::LATEX, "font.uuline: " << bits_.uuline());
+               features.require("ulem");
+               LYXERR(Debug::LATEX, "Double underline enabled. Font: " << to_utf8(stateText(0)));
+       }
+       if (bits_.uwave() == FONT_ON) {
+               LYXERR(Debug::LATEX, "font.uwave: " << bits_.uwave());
+               features.require("ulem");
+               LYXERR(Debug::LATEX, "Wavy underline enabled. Font: " << to_utf8(stateText(0)));
        }
        switch (bits_.color()) {
                case Color_none:
@@ -773,13 +853,11 @@ void Font::validate(LaTeXFeatures & features) const
                        // probably we should put here all interface colors used for
                        // font displaying! For now I just add this ones I know of (Jug)
                case Color_latex:
-               case Color_note:
+               case Color_notelabel:
                        break;
                default:
                        features.require("color");
-                       LYXERR(Debug::LATEX) << "Color enabled. Font: "
-                               << to_utf8(stateText(0))
-                               << endl;
+                       LYXERR(Debug::LATEX, "Color enabled. Font: " << to_utf8(stateText(0)));
        }
 
        // FIXME: Do something for background and soul package?
@@ -789,8 +867,7 @@ void Font::validate(LaTeXFeatures & features) const
                lang_ != latex_language)
        {
                features.useLanguage(lang_);
-               LYXERR(Debug::LATEX) << "Found language "
-                       << lang_->lang() << endl;
+               LYXERR(Debug::LATEX, "Found language " << lang_->lang());
        }
 }
 
@@ -801,7 +878,7 @@ ostream & operator<<(ostream & os, FontState fms)
 }
 
 
-ostream & operator<<(std::ostream & os, FontInfo const & f)
+ostream & operator<<(ostream & os, FontInfo const & f)
 {
        return os << "font:"
                << " family " << f.family()
@@ -813,12 +890,15 @@ ostream & operator<<(std::ostream & os, FontInfo const & f)
                //<< " background " << f.background()
                << " emph " << f.emph()
                << " underbar " << f.underbar()
+               << " strikeout " << f.strikeout()
+               << " uuline " << f.uuline()
+               << " uwave " << f.uwave()
                << " noun " << f.noun()
                << " number " << f.number();
 }
 
 
-std::ostream & operator<<(std::ostream & os, Font const & font)
+ostream & operator<<(ostream & os, Font const & font)
 {
        return os << font.bits_
                << " lang: " << (font.lang_ ? font.lang_->lang() : 0);