]> git.lyx.org Git - lyx.git/blobdiff - src/Font.cpp
grammar
[lyx.git] / src / Font.cpp
index d3dd3bbc2ab0ed462a6c03b74262d9b3640fad2e..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.
@@ -17,7 +17,7 @@
 #include "Font.h"
 
 #include "BufferParams.h" // stateText
-#include "Color.h"
+#include "ColorSet.h"
 #include "Encoding.h"
 #include "Language.h"
 #include "LaTeXFeatures.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"
 
+#include <cstring>
+
 using namespace std;
 using namespace lyx::support;
 
@@ -105,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;
@@ -143,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());
 }
@@ -170,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()]));
@@ -324,6 +338,12 @@ FontInfo lyxRead(Lexer & lex, FontInfo const & fi)
 
                        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") {
@@ -332,17 +352,23 @@ FontInfo lyxRead(Lexer & lex, FontInfo const & fi)
                                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;
                }
        }
@@ -383,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";
        }
@@ -450,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, *(runparams.encoding),
-                               *(language()->encoding()));
+                               runparams, *(language()->encoding()));
                if (c.first) {
                        open_encoding_ = true;
                        count += c.second;
@@ -518,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
@@ -589,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) {
@@ -619,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, *(runparams.encoding),
-                               *ascii);
-               BOOST_ASSERT(c.first);
+                               runparams, *ascii);
+               LASSERT(c.first, /**/);
                count += c.second;
                runparams.encoding = ascii;
                open_encoding_ = false;
@@ -641,9 +712,8 @@ int Font::latexWriteEndChanges(odocstream & os, BufferParams const & bparams,
 
 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'
@@ -652,6 +722,9 @@ 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'
@@ -664,7 +737,7 @@ 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;
@@ -693,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);
@@ -702,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")
@@ -719,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();
@@ -748,6 +826,26 @@ void Font::validate(LaTeXFeatures & features) const
                features.require("noun");
                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:
                case Color_inherit:
@@ -755,7 +853,7 @@ 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");
@@ -792,6 +890,9 @@ ostream & operator<<(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();
 }