+bool Font::fromString(string const & data, bool & toggle)
+{
+ istringstream is(data);
+ Lexer lex;
+ 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();
+ bits_.setFamily(FontFamily(next));
+
+ } else if (token == "series") {
+ int const next = lex.getInteger();
+ bits_.setSeries(FontSeries(next));
+
+ } else if (token == "shape") {
+ int const next = lex.getInteger();
+ bits_.setShape(FontShape(next));
+
+ } else if (token == "size") {
+ int const next = lex.getInteger();
+ bits_.setSize(FontSize(next));
+
+ } else if (token == "emph" || token == "underbar" ||
+ token == "noun" || token == "number") {
+
+ int const next = lex.getInteger();
+ FontState const misc = FontState(next);
+
+ if (token == "emph")
+ bits_.setEmph(misc);
+ else if (token == "underbar")
+ bits_.setUnderbar(misc);
+ else if (token == "noun")
+ bits_.setNoun(misc);
+ else if (token == "number")
+ bits_.setNumber(misc);
+
+ } else if (token == "color") {
+ int const next = lex.getInteger();
+ bits_.setColor(ColorCode(next));
+
+ /**
+ } else if (token == "background") {
+ int const next = lex.getInteger();
+ bits_.setBackground(ColorCode(next));
+ */
+
+ } else if (token == "language") {
+ string const next = lex.getString();
+ 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 (bits_.noun() == FONT_ON) {
+ LYXERR(Debug::LATEX, "font.noun: " << bits_.noun());
+ features.require("noun");
+ LYXERR(Debug::LATEX, "Noun enabled. Font: " << to_utf8(stateText(0)));
+ }
+ switch (bits_.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_notelabel:
+ break;
+ default:
+ features.require("color");
+ LYXERR(Debug::LATEX, "Color enabled. Font: " << to_utf8(stateText(0)));
+ }
+
+ // FIXME: Do something for background and soul package?
+
+ if (lang_->babel() != doc_language->babel() &&
+ lang_ != ignore_language &&
+ lang_ != latex_language)
+ {
+ features.useLanguage(lang_);
+ LYXERR(Debug::LATEX, "Found language " << lang_->lang());
+ }
+}
+
+
+ostream & operator<<(ostream & os, FontState fms)