]> git.lyx.org Git - lyx.git/blob - src/Language.cpp
Introduce PolyglossiaName and PolyglossiaOpts.
[lyx.git] / src / Language.cpp
1 /**
2  * \file Language.cpp
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author Lars Gullik Bjønnes
7  * \author Jean-Marc Lasgouttes
8  * \author Jürgen Spitzmüller
9  * \author Dekel Tsur
10  *
11  * Full author contact details are available in file CREDITS.
12  */
13
14 #include <config.h>
15
16 #include "Language.h"
17
18 #include "Encoding.h"
19 #include "Lexer.h"
20 #include "LyXRC.h"
21
22 #include "support/debug.h"
23 #include "support/FileName.h"
24 #include "support/lstrings.h"
25
26 using namespace std;
27 using namespace lyx::support;
28
29
30 namespace lyx {
31
32 Languages languages;
33 Language ignore_lang;
34 Language latex_lang;
35 Language const * default_language;
36 Language const * ignore_language = &ignore_lang;
37 Language const * latex_language = &latex_lang;
38 Language const * reset_language = 0;
39
40
41 bool Language::readLanguage(Lexer & lex)
42 {
43         enum LanguageTags {
44                 LA_AS_BABELOPTS = 1,
45                 LA_BABELNAME,
46                 LA_ENCODING,
47                 LA_END,
48                 LA_GUINAME,
49                 LA_INTERNAL_ENC,
50                 LA_LANG_CODE,
51                 LA_LANG_VARIETY,
52                 LA_POLYGLOSSIANAME,
53                 LA_POLYGLOSSIAOPTS,
54                 LA_POSTBABELPREAMBLE,
55                 LA_PREBABELPREAMBLE,
56                 LA_RTL
57         };
58
59         // Keep these sorted alphabetically!
60         LexerKeyword languageTags[] = {
61                 { "asbabeloptions",       LA_AS_BABELOPTS },
62                 { "babelname",            LA_BABELNAME },
63                 { "encoding",             LA_ENCODING },
64                 { "end",                  LA_END },
65                 { "guiname",              LA_GUINAME },
66                 { "internalencoding",     LA_INTERNAL_ENC },
67                 { "langcode",             LA_LANG_CODE },
68                 { "langvariety",          LA_LANG_VARIETY },
69                 { "polyglossianame",      LA_POLYGLOSSIANAME },
70                 { "polyglossiaopts",      LA_POLYGLOSSIAOPTS },
71                 { "postbabelpreamble",    LA_POSTBABELPREAMBLE },
72                 { "prebabelpreamble",     LA_PREBABELPREAMBLE },
73                 { "rtl",                  LA_RTL }
74         };
75
76         bool error = false;
77         bool finished = false;
78         lex.pushTable(languageTags);
79         // parse style section
80         while (!finished && lex.isOK() && !error) {
81                 int le = lex.lex();
82                 // See comment in LyXRC.cpp.
83                 switch (le) {
84                 case Lexer::LEX_FEOF:
85                         continue;
86
87                 case Lexer::LEX_UNDEF: // parse error
88                         lex.printError("Unknown language tag `$$Token'");
89                         error = true;
90                         continue;
91
92                 default: 
93                         break;
94                 }
95                 switch (static_cast<LanguageTags>(le)) {
96                 case LA_END: // end of structure
97                         finished = true;
98                         break;
99                 case LA_AS_BABELOPTS:
100                         lex >> as_babel_options_;
101                         break;
102                 case LA_BABELNAME:
103                         lex >> babel_;
104                         break;
105                 case LA_POLYGLOSSIANAME:
106                         lex >> polyglossia_name_;
107                         break;
108                 case LA_POLYGLOSSIAOPTS:
109                         lex >> polyglossia_opts_;
110                         break;
111                 case LA_ENCODING:
112                         lex >> encodingStr_;
113                         break;
114                 case LA_GUINAME:
115                         lex >> display_;
116                         break;
117                 case LA_INTERNAL_ENC:
118                         lex >> internal_enc_;
119                         break;
120                 case LA_LANG_CODE:
121                         lex >> code_;
122                         break;
123                 case LA_LANG_VARIETY:
124                         lex >> variety_;
125                         break;
126                 case LA_POSTBABELPREAMBLE:
127                         babel_postsettings_ =
128                                 lex.getLongString("EndPostBabelPreamble");
129                         break;
130                 case LA_PREBABELPREAMBLE:
131                         babel_presettings_ =
132                                 lex.getLongString("EndPreBabelPreamble");
133                         break;
134                 case LA_RTL:
135                         lex >> rightToLeft_;
136                         break;
137                 }
138         }
139         lex.popTable();
140         return finished && !error;
141 }
142
143
144 bool Language::read(Lexer & lex)
145 {
146         as_babel_options_ = 0;
147         encoding_ = 0;
148         internal_enc_ = 0;
149         rightToLeft_ = 0;
150
151         if (!lex.next()) {
152                 lex.printError("No name given for language: `$$Token'.");
153                 return false;
154         }
155
156         lang_ = lex.getString();
157         LYXERR(Debug::INFO, "Reading language " << lang_);
158         if (!readLanguage(lex)) {
159                 LYXERR0("Error parsing language `" << lang_ << '\'');
160                 return false;
161         }
162
163         encoding_ = encodings.fromLyXName(encodingStr_);
164         if (!encoding_ && !encodingStr_.empty()) {
165                 encoding_ = encodings.fromLyXName("iso8859-1");
166                 LYXERR0("Unknown encoding " << encodingStr_);
167         }
168         return true;
169 }
170
171 void Languages::read(FileName const & filename)
172 {
173         Lexer lex;
174         lex.setFile(filename);
175         lex.setContext("Languages::read");
176         while (lex.isOK()) {
177                 int le = lex.lex();
178                 switch (le) {
179                 case Lexer::LEX_FEOF:
180                         continue;
181
182                 default:
183                         break;
184                 }
185                 if (lex.getString() != "Language") {
186                         lex.printError("Unknown Language tag `$$Token'");
187                         continue;
188                 }
189                 Language l;
190                 l.read(lex);
191                 if (!lex)
192                         break;
193                 if (l.lang() == "latex")
194                         latex_lang = l;
195                 else if (l.lang() == "ignore")
196                         ignore_lang = l;
197                 else
198                         languagelist[l.lang()] = l;
199         }
200
201         default_language = getLanguage(lyxrc.default_language);
202         if (!default_language) {
203                 LYXERR0("Default language \"" << lyxrc.default_language
204                        << "\" not found!");
205                 default_language = getLanguage("english");
206                 if (!default_language)
207                         default_language = &(*languagelist.begin()).second;
208                 LYXERR0("Using \"" << default_language->lang() << "\" instead!");
209         }
210 }
211
212
213 Language const * Languages::getLanguage(string const & language) const
214 {
215         if (language == "reset")
216                 return reset_language;
217         if (language == "ignore")
218                 return ignore_language;
219         const_iterator it = languagelist.find(language);
220         return it == languagelist.end() ? reset_language : &it->second;
221 }
222
223
224 } // namespace lyx