00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <iostream>
00024 #include <fstream>
00025 #include <set>
00026 #include <string>
00027 #include <time.h>
00028 #include <cstdlib>
00029 #include <errno.h>
00030
00031 #include "doc_lang.hh"
00032 #include "doc_notice.hh"
00033 #include "doc_autodoc.hh"
00034 #include "doc_metadatas.hh"
00035 #include "lateq.hh"
00036 #include "enrobage.hh"
00037 #include "compatibility.hh"
00038
00039
00040
00041 extern map<string, string> gDocNoticeStringMap;
00042 extern set<string> gDocNoticeKeySet;
00043
00044 extern map<string, string> gDocAutodocStringMap;
00045 extern set<string> gDocAutodocKeySet;
00046
00047 extern map<string, string> gDocMathStringMap;
00048 extern set<string> gDocMathKeySet;
00049
00050 extern map<string, string> gDocMetadatasStringMap;
00051 extern set<string> gDocMetadatasKeySet;
00052
00053 static const string gDocTextsDefaultFile = "mathdoctexts-default.txt";
00054
00055 static void importDocStrings(const string& filename);
00056 static void getKey(string& s, string& key, size_t& pt1);
00057 static void getText(string& s, size_t& pt1, string& text);
00058 static void storePair(const string& key, const string& text);
00059
00060 static void printStringMapContent(map<string,string>& map, const string& name);
00061
00062 static istream* openArchFile (const string& filename);
00063 static void getCurrentDir();
00064 static int cholddir();
00065
00066 static string gCurrentDir;
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076 void loadTranslationFile(const string& lang)
00077 {
00078 initDocMath();
00079 initDocNotice();
00080 initDocAutodoc();
00081 initDocMetadatas();
00082
00084 importDocStrings(gDocTextsDefaultFile);
00085
00087 if ( ! lang.empty() ) {
00088 importDocStrings( "mathdoctexts-" + lang + ".txt" );
00089 }
00090 }
00091
00092
00093
00094
00095
00096
00097
00098
00099
00113 static void importDocStrings(const string& filename)
00114 {
00115 string s;
00116 string key, text;
00117 istream* file = openArchFile(filename);
00118
00119 while ( getline(*file, s) ) {
00120 size_t pt1;
00121
00122
00123 switch (s[0]) {
00124 case ':':
00125 text = "";
00126 getKey(s, key, pt1);
00127 if (pt1==string::npos) continue;
00128 break;
00129 case '\"':
00130 pt1 = 0;
00131 break;
00132 default:
00133 continue;
00134 }
00135 getText(s, pt1, text);
00136 storePair(key, text);
00137 }
00138 printStringMapContent(gDocNoticeStringMap, "gDocNoticeStringMap");
00139 printStringMapContent(gDocAutodocStringMap, "gDocAutodocStringMap");
00140 printStringMapContent(gDocMathStringMap, "gDocMathStringMap");
00141 printStringMapContent(gDocMetadatasStringMap, "gDocMetadatasStringMap");
00142 }
00143
00144
00145 static void getKey(string& s, string& key, size_t& pt1)
00146 {
00147
00148 key = "";
00149 string separators = " \t";
00150 size_t pk1 = 1;
00151 size_t pk2 = s.find_first_of(separators);
00152
00153
00154 if (pk2==string::npos) pk2 = s.size();
00155
00156
00157 key = s.substr(pk1, pk2-1);
00158
00159
00160 pt1 = s.find_first_of("\"", pk2);
00161 }
00162
00163
00164 static void getText(string& s, size_t& pt1, string& text)
00165 {
00166
00167 size_t pt2;
00168 pt2 = s.find_last_not_of("\"");
00169 if (pt2!=string::npos) {
00170 if (text.size() > 0) text += "\n";
00171 text += s.substr(pt1+1, pt2-pt1);
00172 }
00173 }
00174
00175
00176 static void storePair(const string& key, const string& text)
00177 {
00178
00179 if(!key.empty() && !text.empty()) {
00180
00181 if (gDocNoticeKeySet.find(key) != gDocNoticeKeySet.end()) {
00182 gDocNoticeStringMap[key] = text;
00183 }
00184 else if (gDocAutodocKeySet.find(key) != gDocAutodocKeySet.end()) {
00185 gDocAutodocStringMap[key] = text;
00186 }
00187 else if (gDocMathKeySet.find(key) != gDocMathKeySet.end()) {
00188 gDocMathStringMap[key] = text;
00189 }
00190 else if (gDocMetadatasKeySet.find(key) != gDocMetadatasKeySet.end()) {
00191 gDocMetadatasStringMap[key] = text;
00192 }
00193 else {
00194 cerr << "Documentator : importDocStings : " << "warning : unknown key \"" << key << "\"" << endl;
00195 }
00196
00197 }
00198 }
00199
00200
00204 static void printStringMapContent(map<string,string>& m, const string& name) {
00205 bool trace = false;
00206 if(trace) {
00207 cout << name << ".size() = " << m.size() << endl;
00208 map<string,string>::iterator it;
00209 int i = 1;
00210 for(it = m.begin(); it!=m.end(); ++it)
00211 cout << i++ << ".\t" << name << "[" << it->first << "] \t= '" << it->second << "'" << endl;
00212 }
00213 }
00214
00215
00216
00217
00218
00219
00220
00224 static istream* openArchFile (const string& filename)
00225 {
00226 istream* file;
00227 getCurrentDir();
00228 if ( (file = open_arch_stream(filename.c_str())) ) {
00229
00230 } else {
00231 cerr << "ERROR : can't open architecture file " << filename << endl;
00232 exit(1);
00233 }
00234 cholddir();
00235 return file;
00236 }
00237
00238
00242 static int cholddir ()
00243 {
00244 if (chdir(gCurrentDir.c_str()) == 0) {
00245 return 0;
00246 } else {
00247 perror("cholddir");
00248 exit(errno);
00249 }
00250 }
00251
00252
00256 static void getCurrentDir ()
00257 {
00258 char buffer[FAUST_PATH_MAX];
00259 gCurrentDir = getcwd (buffer, FAUST_PATH_MAX);
00260 }
00261
00262