You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kile/src/kile/symbols/gesymb.cpp

176 lines
4.3 KiB

/***************************************************************************
begin : Mon April 17 2006
edit: : Sat March 29 2008
copyright : (C) 2006-2008 by Thomas Braun
email : braun@physik.fu-berlin.de
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "gesymb.h"
using std::cout;
int main( int argc, char ** argv )
{
int latexret=-1;
int dvipngret=-1;
TQString texcommand, texfile,type,dvipngcommand,line;
TQString pkgs,pkgsarg,savepkgs="",savepkgsarg="";
bool env=false;
if (argc < 2)
usage();
texfile=argv[2];
type=argv[1];
TQFile f( texfile );
if ( !f.open( IO_ReadOnly ) )
{
cout << "File " << texfile.latin1() << " is not readable\n";
return 1;
}
texcommand="latex " + texfile;
dvipngcommand="dvipng --picky -bg Transparent -x 518 -O -1.2in,-1.2in -T bbox -D 300 -o img%03d" + type + ".png " + texfile.left(texfile.length()-4);
cout << texcommand.latin1() << "\n";
cout << dvipngcommand.latin1() << "\n";
latexret = system(texcommand.latin1());
dvipngret= system(dvipngcommand.latin1());
if (latexret)
{
cout << "Error compiling the latex file\n";
return 1;
}
if(dvipngret)
{
cout << "Error producing the pngs\n";
return 1;
}
TQTextStream t(&f);
TQRegExp optarg("\\\\(?:math)?command\\[(.*)\\]\\{");
TQRegExp arg("\\\\(?:math)?command\\{(.*)\\}");
TQRegExp beginenvpkgs("^\\\\begin\\{neededpkgs\\}(?:\\[(.*)\\])?\\{(.*)\\}");
TQRegExp endenvpkgs("^\\\\end\\{neededpkgs\\}");
TQRegExp cmdpkgs("\\\\pkgs(?:\\[(.*)\\])?\\{(.*)\\}");
TQRegExp comment("^\\s*%");
int number=1;
beginenvpkgs.setMinimal(true);
cmdpkgs.setMinimal(true);
// optarg.setMinimal(true); in some cases necessary
while( (line = t.readLine()) != 0L)
{
if( line.find(comment) != -1 )
continue;
if(env)
{
pkgs=savepkgs;
pkgsarg=savepkgsarg;
}
else
{
pkgs="";
pkgsarg="";
}
if ( line.find(beginenvpkgs) != -1)
{
env=true;
pkgs=beginenvpkgs.cap(2);
pkgsarg=beginenvpkgs.cap(1);
savepkgs=pkgs;
savepkgsarg=pkgsarg;
}
else if( line.find(cmdpkgs) != -1)
{
pkgs=cmdpkgs.cap(2);
pkgsarg=cmdpkgs.cap(1);
}
else if( line.find(endenvpkgs) != -1)
{
env=false;
savepkgs="";
savepkgsarg="";
pkgs="";
pkgsarg="";
}
cout << "line is " << line.latin1();
cout << "; pkgs=" << pkgs.latin1() << " ,pkgsarg=" << pkgsarg.latin1() << " ,savepkgs=" << savepkgs.latin1() << " ,savepkgsarg=" << savepkgsarg.latin1() << "\n";
if ( line.find(optarg) != -1)
writeComment(optarg.cap(1),pkgs,pkgsarg,type,number++);
else if(line.find(arg) != -1)
writeComment(arg.cap(1),pkgs,pkgsarg,type,number++);
}
f.close();
return 0;
}
void usage()
{
cout << "Usage:\n";
cout << "gesymb <type> <latex-file>\n";
exit(1);
}
void writeComment(TQString cmd, TQString pkgs, TQString pkgsarg, TQString type, int number)
{
TQImage image;
TQString fname;
fname.sprintf("img%03d%s.png",number,type.latin1());
cout << "fname is " << fname.latin1() << "\n";
if(image.load(fname))
{
image.setText("Command",0,cmd);
image.setText("Packages",0, ( pkgsarg.isEmpty() ? "" : '[' + pkgsarg + ']' ) + ( pkgs.isEmpty() ? "" : '{' + pkgs + '}') );
if(!image.save(fname,"PNG"))
{
cout << "Image " << fname.latin1() << " could not be saved\n";
exit(1);
}
readComment(fname);
}
else
cout << "===writeComment=== ERROR " << fname.latin1() << " could not be loaded\n";
}
void readComment(TQString fname)
{
TQImage image;
if(image.load(fname))
{
cout << "image " << fname.latin1() << " has Command comment_" << TQString(image.text("Command")).latin1() << "_\n";
cout << "image " << fname.latin1() << " has Packages comment_" << TQString(image.text("Packages")).latin1() << "_\n";
}
else
cout << "===readComment=== ERROR " << fname.latin1() << " could not be loaded\n";
}