Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 import os
00023 import os.path
00024 import sys
00025 from string import Template
00026 import re
00027 import subprocess
00028
00029 INPUT_DIRECTORY = '../../compiler'
00030 INPUT_FILE = 'errors.cpp'
00031
00032 OUTPUT_CODE_FILE = 'errors_code.h'
00033 OUTPUT_CODE_DIRECTORY = INPUT_DIRECTORY
00034
00035 OUTPUT_QT_FILE = 'CompilerTranslator.cpp'
00036 OUTPUT_QT_DIRECTORY = '../../studio/translations'
00037
00038 OUTPUT_TRANSLATION_DIRECTORY = '../../studio'
00039 translation_files = list()
00040 translation_files.append(['french', 'fr', 'compiler_fr.ts'])
00041 translation_files.append(['german', 'de', 'compiler_de.ts'])
00042 translation_files.append(['spanish', 'es', 'compiler_es.ts'])
00043 translation_files.append(['italian', 'it', 'compiler_it.ts'])
00044
00045 comment_regexp = re.compile(r'\A\s*// (.*)')
00046 error_regexp = re.compile(r'error_map\[(.*?)\]\s*=\s*L"(.*?)";')
00047
00048 output_code_file = \
00049 """
00050 #ifndef __ERRORS_H
00051 #define __ERRORS_H
00052
00053 /*
00054 This file was automatically generated. Do not modify it,
00055 or your changes will be lost!
00056 You can manually run the script 'sync_translation.py'
00057 to generate a new version, based on errors.cpp
00058 */
00059
00060 // define error codes
00061 namespace Aseba
00062 {
00063 enum ErrorCode
00064 {
00065 // ${start_comment}
00066 ${id_0} = 0,
00067 ${id_others}
00068 ERROR_END
00069 };
00070 };
00071
00072 #endif // __ERRORS_H
00073 """
00074 output_code_file_template = Template(output_code_file)
00075
00076 output_qt_file = \
00077 """
00078 #include "CompilerTranslator.h"
00079 #include "../../compiler/errors_code.h"
00080
00081 #include <CompilerTranslator.moc>
00082
00083 namespace Aseba
00084 {
00085 CompilerTranslator::CompilerTranslator()
00086 {
00087
00088 }
00089
00090 const std::wstring CompilerTranslator::translate(ErrorCode error)
00091 {
00092 QString msg;
00093
00094 switch (error)
00095 {
00096 ${elements}
00097 default:
00098 msg = tr("Unknown error");
00099 }
00100
00101 return msg.toStdWString();
00102 }
00103 };
00104 """
00105 output_qt_file_template = Template(output_qt_file)
00106
00107 output_qt_element = \
00108 """
00109 case ${error_id}:
00110 msg = tr("${error_msg}");
00111 break;
00112 """
00113 output_qt_element_template = Template(output_qt_element)
00114
00115
00116 filename = os.path.join(INPUT_DIRECTORY, INPUT_FILE)
00117 print "Reading " + filename
00118 try:
00119 fh = file(filename)
00120 except:
00121 print >> sys.stderr, "Invalid file " + filename
00122 exit(1)
00123
00124 case_vector = ""
00125 count = 0
00126 id_0 = None
00127 start_comment = ""
00128 id_others = ""
00129
00130 print "Processing..."
00131 for line in fh:
00132
00133 match = comment_regexp.search(line)
00134 if match:
00135
00136 if not id_0:
00137 start_comment = match.group(1)
00138 else:
00139 id_others += " // " + match.group(1) + "\n"
00140 continue
00141
00142 match = error_regexp.search(line)
00143 if match:
00144 count = count + 1
00145 code = match.group(1)
00146 msg = match.group(2)
00147
00148 if not id_0:
00149 id_0 = code
00150 else:
00151 id_others += " " + code + ",\n"
00152
00153 case_vector += output_qt_element_template.substitute(error_id=code, error_msg=msg)
00154
00155 fh.close()
00156 print "Found " + str(count) + " string(s)"
00157
00158
00159 result = output_code_file_template.substitute(start_comment=start_comment, id_0=id_0, id_others=id_others)
00160 filename = os.path.join(OUTPUT_CODE_DIRECTORY, OUTPUT_CODE_FILE)
00161 print "Writing to " + filename
00162 try:
00163 fh = file(filename, 'w')
00164 except:
00165 print >> sys.stderr, "Invalid file " + filename
00166 exit(1)
00167
00168 fh.write(result)
00169 fh.close()
00170
00171
00172 result = output_qt_file_template.substitute(elements=case_vector)
00173 filename = os.path.join(OUTPUT_QT_DIRECTORY, OUTPUT_QT_FILE)
00174 print "Writing to " + filename
00175 try:
00176 fh = file(filename, 'w')
00177 except:
00178 print >> sys.stderr, "Invalid file " + filename
00179 exit(1)
00180
00181 fh.write(result)
00182 fh.close()
00183 print "Done!"
00184
00185
00186 for translation in translation_files:
00187 translation_name = translation[0]
00188 translation_code = translation[1]
00189 translation_file = translation[2]
00190 answer = raw_input("Do you want to update " + translation_name + " [" + translation_code + "] translation file (" + translation_file + ")? [y/n] ")
00191 if answer == 'y' or answer == 'Y':
00192 print "Updating " + translation_file + "..."
00193 file1 = os.path.join(OUTPUT_QT_DIRECTORY, OUTPUT_QT_FILE)
00194 file2 = os.path.join(OUTPUT_TRANSLATION_DIRECTORY, translation_file)
00195 cmd = "lupdate-qt4 " + file1 + " -ts " + file2
00196 print "> " + cmd
00197 subprocess.call(cmd, shell=True)
00198 else:
00199 print "Skipping..."