#include "Font.h"
#include "BufferParams.h" // stateText
+#include "Color.h"
#include "debug.h"
#include "Encoding.h"
#include "gettext.h"
#include "Language.h"
-#include "Color.h"
+#include "LaTeXFeatures.h"
#include "Lexer.h"
#include "LyXRC.h"
#include "output_latex.h"
#include "OutputParams.h"
+#include "support/convert.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
}
+std::string Font::toString(bool const toggle) const
+{
+ string lang = "ignore";
+ if (language())
+ lang = language()->lang();
+
+ ostringstream os;
+ os << "family " << family() << '\n'
+ << "series " << series() << '\n'
+ << "shape " << shape() << '\n'
+ << "size " << size() << '\n'
+ << "emph " << emph() << '\n'
+ << "underbar " << underbar() << '\n'
+ << "noun " << noun() << '\n'
+ << "number " << number() << '\n'
+ << "color " << color() << '\n'
+ << "language " << lang << '\n'
+ << "toggleall " << convert<string>(toggle);
+ return os.str();
+}
+
+
+bool Font::fromString(string const & data, bool & toggle)
+{
+ istringstream is(data);
+ Lexer lex(0,0);
+ lex.setStream(is);
+
+ int nset = 0;
+ while (lex.isOK()) {
+ string token;
+ if (lex.next())
+ token = lex.getString();
+
+ if (token.empty() || !lex.next())
+ break;
+
+ if (token == "family") {
+ int const next = lex.getInteger();
+ setFamily(FONT_FAMILY(next));
+
+ } else if (token == "series") {
+ int const next = lex.getInteger();
+ setSeries(FONT_SERIES(next));
+
+ } else if (token == "shape") {
+ int const next = lex.getInteger();
+ setShape(FONT_SHAPE(next));
+
+ } else if (token == "size") {
+ int const next = lex.getInteger();
+ setSize(FONT_SIZE(next));
+
+ } else if (token == "emph" || token == "underbar" ||
+ token == "noun" || token == "number") {
+
+ int const next = lex.getInteger();
+ FONT_MISC_STATE const misc = FONT_MISC_STATE(next);
+
+ if (token == "emph")
+ setEmph(misc);
+ else if (token == "underbar")
+ setUnderbar(misc);
+ else if (token == "noun")
+ setNoun(misc);
+ else if (token == "number")
+ setNumber(misc);
+
+ } else if (token == "color") {
+ int const next = lex.getInteger();
+ setColor(Color::color(next));
+
+ } else if (token == "language") {
+ string const next = lex.getString();
+ if (next == "ignore")
+ setLanguage(ignore_language);
+ else
+ setLanguage(languages.getLanguage(next));
+
+ } else if (token == "toggleall") {
+ toggle = lex.getBool();
+
+ } else {
+ // Unrecognised token
+ break;
+ }
+
+ ++nset;
+ }
+ return (nset > 0);
+}
+
+
+void Font::validate(LaTeXFeatures & features) const
+{
+ BufferParams const & bparams = features.bufferParams();
+ Language const * doc_language = bparams.language;
+
+ if (noun() == Font::ON) {
+ LYXERR(Debug::LATEX) << "font.noun: "
+ << noun()
+ << endl;
+ features.require("noun");
+ LYXERR(Debug::LATEX) << "Noun enabled. Font: "
+ << to_utf8(stateText(0))
+ << endl;
+ }
+ switch (color()) {
+ case Color::none:
+ case Color::inherit:
+ case Color::ignore:
+ // 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:
+ break;
+ default:
+ features.require("color");
+ LYXERR(Debug::LATEX) << "Color enabled. Font: "
+ << to_utf8(stateText(0))
+ << endl;
+ }
+
+ if (lang->babel() != doc_language->babel() &&
+ lang != ignore_language &&
+ lang != latex_language)
+ {
+ features.useLanguage(lang);
+ LYXERR(Debug::LATEX) << "Found language "
+ << lang->lang() << endl;
+ }
+}
+
+
ostream & operator<<(ostream & os, Font::FONT_MISC_STATE fms)
{
return os << int(fms);