]> git.lyx.org Git - lyx.git/blob - src/Language.cpp
Introduce a new Language option "AsBabelOptions" that specifies whether a language...
[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_POSTBABELPREAMBLE,
53                 LA_PREBABELPREAMBLE,
54                 LA_RTL
55         };
56
57         // Keep these sorted alphabetically!
58         LexerKeyword languageTags[] = {
59                 { "asbabeloptions",       LA_AS_BABELOPTS },
60                 { "babelname",            LA_BABELNAME },
61                 { "encoding",             LA_ENCODING },
62                 { "end",                  LA_END },
63                 { "guiname",              LA_GUINAME },
64                 { "internalencoding",     LA_INTERNAL_ENC },
65                 { "langcode",             LA_LANG_CODE },
66                 { "langvariety",          LA_LANG_VARIETY },
67                 { "postbabelpreamble",    LA_POSTBABELPREAMBLE },
68                 { "prebabelpreamble",     LA_PREBABELPREAMBLE },
69                 { "rtl",                  LA_RTL }
70         };
71
72         bool error = false;
73         bool finished = false;
74         lex.pushTable(languageTags);
75         // parse style section
76         while (!finished && lex.isOK() && !error) {
77                 int le = lex.lex();
78                 // See comment in LyXRC.cpp.
79                 switch (le) {
80                 case Lexer::LEX_FEOF:
81                         continue;
82
83                 case Lexer::LEX_UNDEF: // parse error
84                         lex.printError("Unknown language tag `$$Token'");
85                         error = true;
86                         continue;
87
88                 default: 
89                         break;
90                 }
91                 switch (static_cast<LanguageTags>(le)) {
92                 case LA_END: // end of structure
93                         finished = true;
94                         break;
95                 case LA_AS_BABELOPTS:
96                         lex >> as_babel_options_;
97                         break;
98                 case LA_BABELNAME:
99                         lex >> babel_;
100                         break;
101                 case LA_ENCODING:
102                         lex >> encodingStr_;
103                         break;
104                 case LA_GUINAME:
105                         lex >> display_;
106                         break;
107                 case LA_INTERNAL_ENC:
108                         lex >> internal_enc_;
109                         break;
110                 case LA_LANG_CODE:
111                         lex >> code_;
112                         break;
113                 case LA_LANG_VARIETY:
114                         lex >> variety_;
115                         break;
116                 case LA_POSTBABELPREAMBLE:
117                         babel_postsettings_ =
118                                 lex.getLongString("EndPostBabelPreamble");
119                         break;
120                 case LA_PREBABELPREAMBLE:
121                         babel_presettings_ =
122                                 lex.getLongString("EndPreBabelPreamble");
123                         break;
124                 case LA_RTL:
125                         lex >> rightToLeft_;
126                         break;
127                 }
128         }
129         lex.popTable();
130         return finished && !error;
131 }
132
133
134 bool Language::read(Lexer & lex)
135 {
136         as_babel_options_ = 0;
137         encoding_ = 0;
138         internal_enc_ = 0;
139         rightToLeft_ = 0;
140
141         if (!lex.next()) {
142                 lex.printError("No name given for language: `$$Token'.");
143                 return false;
144         }
145
146         lang_ = lex.getString();
147         LYXERR(Debug::INFO, "Reading language " << lang_);
148         if (!readLanguage(lex)) {
149                 LYXERR0("Error parsing language `" << lang_ << '\'');
150                 return false;
151         }
152
153         encoding_ = encodings.fromLyXName(encodingStr_);
154         if (!encoding_ && !encodingStr_.empty()) {
155                 encoding_ = encodings.fromLyXName("iso8859-1");
156                 LYXERR0("Unknown encoding " << encodingStr_);
157         }
158         return true;
159 }
160
161 void Languages::read(FileName const & filename)
162 {
163         Lexer lex;
164         lex.setFile(filename);
165         lex.setContext("Languages::read");
166         while (lex.isOK()) {
167                 int le = lex.lex();
168                 switch (le) {
169                 case Lexer::LEX_FEOF:
170                         continue;
171
172                 default:
173                         break;
174                 }
175                 if (lex.getString() != "Language") {
176                         lex.printError("Unknown Language tag `$$Token'");
177                         continue;
178                 }
179                 Language l;
180                 l.read(lex);
181                 if (!lex)
182                         break;
183                 if (l.lang() == "latex")
184                         latex_lang = l;
185                 else if (l.lang() == "ignore")
186                         ignore_lang = l;
187                 else
188                         languagelist[l.lang()] = l;
189         }
190
191         default_language = getLanguage(lyxrc.default_language);
192         if (!default_language) {
193                 LYXERR0("Default language \"" << lyxrc.default_language
194                        << "\" not found!");
195                 default_language = getLanguage("english");
196                 if (!default_language)
197                         default_language = &(*languagelist.begin()).second;
198                 LYXERR0("Using \"" << default_language->lang() << "\" instead!");
199         }
200 }
201
202
203 Language const * Languages::getLanguage(string const & language) const
204 {
205         if (language == "reset")
206                 return reset_language;
207         if (language == "ignore")
208                 return ignore_language;
209         const_iterator it = languagelist.find(language);
210         return it == languagelist.end() ? reset_language : &it->second;
211 }
212
213
214 } // namespace lyx