#include "output_latex.h"
#include "OutputParams.h"
+#include "support/convert.h"
#include "support/lstrings.h"
-
-namespace lyx {
-
-using support::ascii_lowercase;
-using support::bformat;
-using support::rtrim;
-using support::subst;
-
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
+
+namespace lyx {
+
+using support::ascii_lowercase;
+using support::bformat;
+using support::rtrim;
+using support::subst;
+
//
// Names for the GUI
//
os << lcolor.getGUIName(color()) << ", ";
if (emph() != INHERIT)
os << bformat(_("Emphasis %1$s, "),
- _(GUIMiscNames[emph()]));
+ _(GUIMiscNames[emph()]));
if (underbar() != INHERIT)
os << bformat(_("Underline %1$s, "),
- _(GUIMiscNames[underbar()]));
+ _(GUIMiscNames[underbar()]));
if (noun() != INHERIT)
os << bformat(_("Noun %1$s, "),
- _(GUIMiscNames[noun()]));
+ _(GUIMiscNames[noun()]));
if (bits == inherit)
os << _("Default") << ", ";
if (!params || (language() != params->language))
os << bformat(_("Language: %1$s, "),
- _(language()->display()));
+ _(language()->display()));
if (number() != OFF)
os << bformat(_(" Number %1$s"),
- _(GUIMiscNames[number()]));
+ _(GUIMiscNames[number()]));
return rtrim(os.str(), ", ");
}
} else if (ttok == "noun") {
setNoun(ON);
} else {
- lex.printError("Illegal misc type `$$Tokenยด");
+ lex.printError("Illegal misc type `$$Token'");
}
} else if (tok == "color") {
lex.next();
/// Writes the head of the LaTeX needed to impose this font
// Returns number of chars written.
int Font::latexWriteStartChanges(odocstream & os, BufferParams const & bparams,
- OutputParams const & runparams,
- Font const & base,
- Font const & prev) const
+ OutputParams const & runparams,
+ Font const & base,
+ Font const & prev) const
{
bool env = false;
int count = 0;
if (language()->babel() != base.language()->babel() &&
language() != prev.language()) {
- if (isRightToLeft() != prev.isRightToLeft()) {
+ if (language()->lang() == "farsi") {
+ os << "\\textFR{";
+ count += 8;
+ } else if (!isRightToLeft() &&
+ base.language()->lang() == "farsi") {
+ os << "\\textLR{";
+ count += 8;
+ } else if (language()->lang() == "arabic_arabi") {
+ os << "\\textAR{";
+ count += 8;
+ } else if (!isRightToLeft() &&
+ base.language()->lang() == "arabic_arabi") {
+ os << "\\textLR{";
+ count += 8;
+ // currently the remaining RTL languages are arabic_arabtex and hebrew
+ } else if (isRightToLeft() != prev.isRightToLeft()) {
if (isRightToLeft()) {
os << "\\R{";
count += 3;
}
if (language()->encoding()->package() == Encoding::CJK) {
- int const c = switchEncoding(os, bparams,
+ pair<bool, int> const c = switchEncoding(os, bparams,
runparams.moving_arg, *(runparams.encoding),
*(language()->encoding()));
- if (c > 0) {
+ if (c.first) {
open_encoding_ = true;
- count += c;
+ count += c.second;
runparams.encoding = language()->encoding();
}
}
// When the current language is Hebrew, Arabic, or Farsi
- // the numbers are written Left-to-Right.
- if (number() == ON && prev.number() != ON && isRightToLeft()) {
+ // the numbers are written Left-to-Right. ArabTeX package
+ // reorders the number automatically but the packages used
+ // for Hebrew and Farsi (Arabi) do not.
+ if (number() == ON && prev.number() != ON
+ && (language()->lang() == "hebrew"
+ || language()->lang() == "farsi"
+ || language()->lang() == "arabic_arabi")) {
os << "{\\beginL ";
count += 9;
}
// Returns number of chars written
// This one corresponds to latexWriteStartChanges(). (Asger)
int Font::latexWriteEndChanges(odocstream & os, BufferParams const & bparams,
- OutputParams const & runparams,
- Font const & base,
- Font const & next) const
+ OutputParams const & runparams,
+ Font const & base,
+ Font const & next,
+ bool const & closeLanguage) const
{
int count = 0;
bool env = false;
}
// When the current language is Hebrew, Arabic, or Farsi
- // the numbers are written Left-to-Right.
- if (number() == ON && next.number() != ON && isRightToLeft()) {
+ // the numbers are written Left-to-Right. ArabTeX package
+ // reorders the number automatically but the packages used
+ // for Hebrew and Farsi (Arabi) do not.
+ if (number() == ON && next.number() != ON
+ && (language()->lang() == "hebrew"
+ || language()->lang() == "farsi"
+ || language()->lang() == "arabic_arabi")) {
os << "\\endL}";
count += 6;
}
// We need to close the encoding even if it does not change
// to do correct environment nesting
Encoding const * const ascii = encodings.getFromLyXName("ascii");
- int const c = switchEncoding(os, bparams,
+ pair<bool, int> const c = switchEncoding(os, bparams,
runparams.moving_arg, *(runparams.encoding),
*ascii);
- BOOST_ASSERT(c > 0);
- count += c;
+ BOOST_ASSERT(c.first);
+ count += c.second;
runparams.encoding = ascii;
open_encoding_ = false;
}
- if (language() != base.language() && language() != next.language()) {
+ if (closeLanguage &&
+ language() != base.language() && language() != next.language()) {
os << '}';
++count;
}
}
+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);
+}
+
+
ostream & operator<<(ostream & os, Font::FONT_MISC_STATE fms)
{
return os << int(fms);