File indexing completed on 2024-05-12 16:41:05
0001 /*************************************************************************** 0002 begin : Sat Mai 9 2009 0003 copyright : (C) 2009 by Thomas Braun 0004 email : thomas.braun@virtuell-zuhause.de 0005 ***************************************************************************/ 0006 0007 /*************************************************************************** 0008 * * 0009 * This program is free software; you can redistribute it and/or modify * 0010 * it under the terms of the GNU General Public License as published by * 0011 * the Free Software Foundation; either version 2 of the License, or * 0012 * (at your option) any later version. * 0013 * * 0014 ***************************************************************************/ 0015 0016 #include "convertOldSymbolFormat.h" 0017 0018 using std::cout; 0019 using std::cerr; 0020 using std::endl; 0021 0022 int main( int argc, char ** argv ) 0023 { 0024 0025 bool mathMode; 0026 QList<Package> PackagesList; 0027 QString texfile, type, greedyOptArgString; 0028 QString pkgs, pkgsarg, savepkgs, savepkgsarg; 0029 bool env=false, greedyOptArg=true; 0030 0031 if (argc < 1) { 0032 usage(); 0033 } 0034 0035 texfile=argv[1]; 0036 greedyOptArgString=argv[2]; 0037 0038 if( greedyOptArgString.isEmpty() || greedyOptArgString == QString("true") ) { 0039 greedyOptArg = true; 0040 } 0041 else if( greedyOptArgString == QString("false") ) { 0042 greedyOptArg = false; 0043 } 0044 else { 0045 usage(); 0046 } 0047 0048 QFile file(texfile); 0049 if ( !file.open( QIODevice::ReadOnly ) ) { 0050 cerr << "File " << qPrintable(texfile) << " is not readable" << Qt::endl; 0051 return 1; 0052 } 0053 0054 type = texfile.left(texfile.length() - 4); 0055 cout << qPrintable("<symbolGroupName>" + type + "</symbolGroupName>") << Qt::endl; 0056 0057 QTextStream t(&file); 0058 0059 QRegExp optarg("\\\\(math)?command\\[(.*)\\]\\{(.*)\\}"); 0060 QRegExp arg("\\\\(math)?command\\{(.*)\\}"); 0061 QRegExp beginenvpkgs("^\\\\begin\\{neededpkgs\\}(?:\\[(.*)\\])?\\{(.*)\\}"); 0062 QRegExp endenvpkgs("^\\\\end\\{neededpkgs\\}"); 0063 QRegExp cmdpkgs("\\\\pkgs(?:\\[(.*)\\])?\\{(.*)\\}"); 0064 QRegExp comment("^\\s*%"); 0065 0066 beginenvpkgs.setMinimal(true); 0067 cmdpkgs.setMinimal(true); 0068 if(!greedyOptArg) { 0069 optarg.setMinimal(true); 0070 } 0071 0072 while( !t.atEnd() ) { 0073 0074 QString line = t.readLine(); 0075 // cout << "<!-- line is " << qPrintable(line) << " -->"; 0076 0077 if( line.contains(comment) ) { 0078 continue; 0079 } 0080 0081 if(env) { 0082 pkgs=savepkgs; 0083 pkgsarg=savepkgsarg; 0084 } 0085 else { 0086 pkgs.clear(); 0087 pkgsarg.clear(); 0088 } 0089 0090 if ( line.indexOf(beginenvpkgs) != -1) { 0091 env=true; 0092 pkgs=beginenvpkgs.cap(2); 0093 pkgsarg=beginenvpkgs.cap(1); 0094 savepkgs=pkgs; 0095 savepkgsarg=pkgsarg; 0096 } 0097 else if( line.indexOf(cmdpkgs) != -1) { 0098 pkgs=cmdpkgs.cap(2); 0099 pkgsarg=cmdpkgs.cap(1); 0100 } 0101 else if( line.indexOf(endenvpkgs) != -1) { 0102 env=false; 0103 savepkgs.clear(); 0104 savepkgsarg.clear(); 0105 pkgs.clear(); 0106 pkgsarg.clear(); 0107 } 0108 0109 cout << "<!-- pkgs=" << qPrintable(pkgs) << " ,pkgsarg=" << qPrintable(pkgsarg) << " ,savepkgs=" << qPrintable(savepkgs) << " ,savepkgsarg=" << qPrintable(savepkgsarg) << "-->" << Qt::endl; 0110 0111 0112 QString packageString = QString("{%1}").arg(pkgs); 0113 mathMode = false; 0114 0115 if(!pkgsarg.isEmpty()) { 0116 packageString.prepend(QString("[%1]").arg(pkgsarg)); 0117 } 0118 0119 if(line.indexOf(optarg) != -1) { 0120 cout << "<!-- optarg " << qPrintable(optarg.cap(1) + ' ' + optarg.cap(2) + ' ' + optarg.cap(3) + " -->") << Qt::endl; 0121 if(optarg.cap(1) == QString("math") ) { 0122 mathMode = true; 0123 } 0124 extractPackageString(packageString,PackagesList); 0125 outputXML(optarg.cap(2),optarg.cap(3),PackagesList,mathMode); 0126 } 0127 else if(line.indexOf(arg) != -1) { 0128 cout << "<!-- arg " << qPrintable(arg.cap(1) + ' ' + arg.cap(2) + ' ' + arg.cap(3)+ " -->") << Qt::endl; 0129 0130 if(arg.cap(1) == QString("math") ) { 0131 mathMode = true; 0132 } 0133 extractPackageString(packageString,PackagesList); 0134 outputXML(arg.cap(2),arg.cap(2),PackagesList,mathMode); 0135 } 0136 } 0137 cout << "</symbols>" << Qt::endl; 0138 return 0; 0139 } 0140 0141 void usage() 0142 { 0143 cerr << "Usage:\n"; 0144 cerr << "convertOldSymbolFormat <latex-file> <greadyOptArg>\n"; 0145 cerr << "latex-file, a file which can be compiled with LaTeX, has to end with .tex\n"; 0146 cerr << "greedyOptArg, can be true or false, defaults to true\n"; 0147 cerr << "Setting it to true will match as much of the square brackets from \\command[.*], setting it to false to as few as possible.\n"; 0148 exit(1); 0149 } 0150 0151 void outputXML(const QString &latexCommand, const QString &imageCommand, const QList< Package >& packages, bool mathMode) 0152 { 0153 Package pkg; 0154 QString output; 0155 output = "<commandDefinition>\n"; 0156 if(imageCommand == latexCommand) { 0157 output += " <latexCommand>" + Qt::escape(latexCommand) + "</latexCommand>\n"; 0158 } 0159 else { 0160 output += " <latexCommand>" + Qt::escape(latexCommand) + "</latexCommand>\n"; 0161 output += " <imageCommand>" + Qt::escape(imageCommand) + "</imageCommand>\n"; 0162 } 0163 0164 if(mathMode) { 0165 output += " <mathMode>true</mathMode>\n"; 0166 } 0167 0168 foreach(pkg, packages) { 0169 if(pkg.name.isEmpty()) { 0170 continue; 0171 } 0172 output += " <package>\n\ 0173 <name>" + Qt::escape(pkg.name) + "</name>\n"; 0174 if(!pkg.arguments.isEmpty()) { 0175 output += " <arguments>" + Qt::escape(pkg.arguments) + "</arguments>\n"; 0176 } 0177 output += " </package>\n"; 0178 } 0179 0180 output += "</commandDefinition>\n"; 0181 0182 cout << qPrintable(output) << Qt::endl; 0183 } 0184 0185 void extractPackageString(const QString&string, QList<Package> &packages) { 0186 0187 QRegExp rePkgs("(?:\\[(.*)\\])?\\{(.*)\\}"); 0188 QStringList args,pkgs; 0189 Package pkg; 0190 0191 if(string.isEmpty()) { 0192 return; 0193 } 0194 0195 packages.clear(); 0196 0197 if ( rePkgs.exactMatch(string) ) { 0198 args = rePkgs.cap(1).split(','); 0199 pkgs = rePkgs.cap(2).split(','); 0200 } 0201 else { 0202 return; 0203 } 0204 0205 for(int i = 0 ; i < pkgs.count() && i < args.count() ; i++) { 0206 pkg.name = pkgs.at(i); 0207 pkg.arguments = args.at(i); 0208 packages.append(pkg); 0209 } 0210 0211 }