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 }