1999-09-27 18:44:28 +00:00
|
|
|
/* This file is part of
|
|
|
|
* ======================================================
|
|
|
|
*
|
|
|
|
* LyX, The Document Processor
|
|
|
|
*
|
1999-10-02 16:21:10 +00:00
|
|
|
* Copyright 1995 Matthias Ettrich
|
2001-05-30 13:53:44 +00:00
|
|
|
* Copyright 1995-2001 The LyX Team.
|
1999-09-27 18:44:28 +00:00
|
|
|
*
|
1999-11-15 10:58:38 +00:00
|
|
|
* ====================================================== */
|
1999-09-27 18:44:28 +00:00
|
|
|
|
|
|
|
#include <config.h>
|
|
|
|
|
|
|
|
#ifdef __GNUG__
|
|
|
|
#pragma implementation
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include "insetcommand.h"
|
1999-10-07 18:44:17 +00:00
|
|
|
#include "debug.h"
|
2000-02-10 17:53:36 +00:00
|
|
|
#include "Painter.h"
|
2001-06-25 00:06:33 +00:00
|
|
|
#include "lyxlex.h"
|
1999-09-27 18:44:28 +00:00
|
|
|
|
2000-04-04 00:19:15 +00:00
|
|
|
using std::ostream;
|
2000-03-28 02:18:55 +00:00
|
|
|
using std::endl;
|
|
|
|
|
|
|
|
|
2000-07-27 08:55:59 +00:00
|
|
|
InsetCommandParams::InsetCommandParams()
|
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
|
|
InsetCommandParams::InsetCommandParams( string const & n,
|
|
|
|
string const & c,
|
|
|
|
string const & o )
|
|
|
|
: cmdname(n), contents(c), options(o)
|
|
|
|
{}
|
|
|
|
|
|
|
|
|
2000-09-14 17:53:12 +00:00
|
|
|
string const InsetCommandParams::getAsString() const
|
2000-07-27 08:55:59 +00:00
|
|
|
{
|
2001-01-22 20:47:08 +00:00
|
|
|
return cmdname + "|++|" + contents + "|++|" + options;
|
2000-07-27 08:55:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void InsetCommandParams::setFromString( string const & b )
|
|
|
|
{
|
|
|
|
string::size_type idx = b.find("|++|");
|
2000-11-04 10:00:12 +00:00
|
|
|
if (idx == string::npos) {
|
2001-01-22 20:47:08 +00:00
|
|
|
cmdname = b;
|
2000-08-08 13:55:26 +00:00
|
|
|
contents = "";
|
2001-01-22 20:47:08 +00:00
|
|
|
options = "";
|
2000-08-08 13:55:26 +00:00
|
|
|
return;
|
|
|
|
}
|
2000-07-27 08:55:59 +00:00
|
|
|
|
|
|
|
cmdname = b.substr(0, idx);
|
|
|
|
string tmp = b.substr(idx+4);
|
|
|
|
|
|
|
|
idx = tmp.find("|++|");
|
2000-11-04 10:00:12 +00:00
|
|
|
if (idx == string::npos) {
|
2001-01-22 20:47:08 +00:00
|
|
|
contents = tmp;
|
|
|
|
options = "";
|
2000-07-27 08:55:59 +00:00
|
|
|
} else {
|
2001-01-22 20:47:08 +00:00
|
|
|
contents = tmp.substr(0, idx);
|
|
|
|
options = tmp.substr(idx+4);
|
2000-07-27 08:55:59 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2000-08-04 13:12:30 +00:00
|
|
|
bool InsetCommandParams::operator==(InsetCommandParams const & o) const
|
2000-07-27 08:55:59 +00:00
|
|
|
{
|
2000-09-14 17:53:12 +00:00
|
|
|
if (cmdname == o.cmdname && contents == o.contents && options == o.options) return true;
|
|
|
|
return false;
|
2000-07-27 08:55:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2000-08-04 13:12:30 +00:00
|
|
|
bool InsetCommandParams::operator!=(InsetCommandParams const & o) const
|
1999-09-27 18:44:28 +00:00
|
|
|
{
|
2000-09-14 17:53:12 +00:00
|
|
|
return !(*this == o);
|
1999-09-27 18:44:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2000-08-04 13:12:30 +00:00
|
|
|
void InsetCommandParams::scanCommand(string const & cmd)
|
1999-09-27 18:44:28 +00:00
|
|
|
{
|
2000-06-07 08:53:40 +00:00
|
|
|
string tcmdname, toptions, tcontents;
|
1999-09-27 18:44:28 +00:00
|
|
|
|
|
|
|
if (cmd.empty()) return;
|
|
|
|
|
2000-06-07 08:53:40 +00:00
|
|
|
enum { WS, CMDNAME, OPTION, CONTENT } state = WS;
|
1999-09-27 18:44:28 +00:00
|
|
|
|
|
|
|
// Used to handle things like \command[foo[bar]]{foo{bar}}
|
|
|
|
int nestdepth = 0;
|
|
|
|
|
1999-10-02 16:21:10 +00:00
|
|
|
for (string::size_type i = 0; i < cmd.length(); ++i) {
|
1999-09-27 18:44:28 +00:00
|
|
|
char c = cmd[i];
|
2000-06-07 08:53:40 +00:00
|
|
|
if ((state == CMDNAME && c == ' ') ||
|
|
|
|
(state == CMDNAME && c == '[') ||
|
|
|
|
(state == CMDNAME && c == '{')) {
|
1999-09-27 18:44:28 +00:00
|
|
|
state = WS;
|
|
|
|
}
|
2000-06-07 08:53:40 +00:00
|
|
|
if ((state == OPTION && c == ']') ||
|
|
|
|
(state == CONTENT && c == '}')) {
|
1999-11-15 10:58:38 +00:00
|
|
|
if (nestdepth == 0) {
|
1999-09-27 18:44:28 +00:00
|
|
|
state = WS;
|
|
|
|
} else {
|
2000-01-24 18:34:46 +00:00
|
|
|
--nestdepth;
|
1999-09-27 18:44:28 +00:00
|
|
|
}
|
|
|
|
}
|
2000-06-07 08:53:40 +00:00
|
|
|
if ((state == OPTION && c == '[') ||
|
|
|
|
(state == CONTENT && c == '{')) {
|
2000-01-24 18:34:46 +00:00
|
|
|
++nestdepth;
|
1999-09-27 18:44:28 +00:00
|
|
|
}
|
|
|
|
switch (state) {
|
2000-06-07 08:53:40 +00:00
|
|
|
case CMDNAME: tcmdname += c; break;
|
|
|
|
case OPTION: toptions += c; break;
|
|
|
|
case CONTENT: tcontents += c; break;
|
1999-09-27 18:44:28 +00:00
|
|
|
case WS:
|
|
|
|
if (c == '\\') {
|
2000-06-07 08:53:40 +00:00
|
|
|
state = CMDNAME;
|
1999-09-27 18:44:28 +00:00
|
|
|
} else if (c == '[') {
|
2000-06-07 08:53:40 +00:00
|
|
|
state = OPTION;
|
1999-09-27 18:44:28 +00:00
|
|
|
nestdepth = 0; // Just to be sure
|
|
|
|
} else if (c == '{') {
|
2000-06-07 08:53:40 +00:00
|
|
|
state = CONTENT;
|
1999-09-27 18:44:28 +00:00
|
|
|
nestdepth = 0; // Just to be sure
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Don't mess with this.
|
2000-07-27 08:55:59 +00:00
|
|
|
if (!tcmdname.empty()) setCmdName( tcmdname );
|
|
|
|
if (!toptions.empty()) setOptions( toptions );
|
|
|
|
if (!tcontents.empty()) setContents( tcontents );
|
1999-09-27 18:44:28 +00:00
|
|
|
|
1999-10-07 18:44:17 +00:00
|
|
|
if (lyxerr.debugging(Debug::PARSER))
|
|
|
|
lyxerr << "Command <" << cmd
|
|
|
|
<< "> == <" << getCommand()
|
|
|
|
<< "> == <" << getCmdName()
|
|
|
|
<< '|' << getContents()
|
|
|
|
<< '|' << getOptions() << '>' << endl;
|
1999-09-27 18:44:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// This function will not be necessary when lyx3
|
2001-06-28 10:25:20 +00:00
|
|
|
void InsetCommandParams::read(LyXLex & lex)
|
1999-09-27 18:44:28 +00:00
|
|
|
{
|
2000-07-05 14:57:48 +00:00
|
|
|
string token;
|
|
|
|
|
1999-09-27 18:44:28 +00:00
|
|
|
if (lex.EatLine()) {
|
2000-07-05 14:57:48 +00:00
|
|
|
token = lex.GetString();
|
|
|
|
scanCommand(token);
|
1999-09-27 18:44:28 +00:00
|
|
|
} else
|
|
|
|
lex.printError("InsetCommand: Parse error: `$$Token'");
|
2000-07-05 14:57:48 +00:00
|
|
|
while (lex.IsOK()) {
|
|
|
|
lex.nextToken();
|
|
|
|
token = lex.GetString();
|
|
|
|
if (token == "\\end_inset")
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (token != "\\end_inset") {
|
|
|
|
lex.printError("Missing \\end_inset at this point. "
|
|
|
|
"Read: `$$Token'");
|
|
|
|
}
|
1999-09-27 18:44:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-06-28 10:25:20 +00:00
|
|
|
void InsetCommandParams::write(ostream & os) const
|
2000-08-04 13:12:30 +00:00
|
|
|
{
|
|
|
|
os << "LatexCommand " << getCommand() << "\n";
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2000-09-14 17:53:12 +00:00
|
|
|
string const InsetCommandParams::getCommand() const
|
2000-08-04 13:12:30 +00:00
|
|
|
{
|
|
|
|
string s;
|
|
|
|
if (!getCmdName().empty()) s += "\\"+getCmdName();
|
|
|
|
if (!getOptions().empty()) s += "["+getOptions()+']';
|
|
|
|
s += "{"+getContents()+'}';
|
|
|
|
return s;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-07-06 15:57:54 +00:00
|
|
|
InsetCommand::InsetCommand(InsetCommandParams const & p, bool)
|
2000-08-04 13:12:30 +00:00
|
|
|
: p_( p.getCmdName(), p.getContents(), p.getOptions() )
|
2001-07-06 15:57:54 +00:00
|
|
|
{
|
|
|
|
}
|
2000-08-04 13:12:30 +00:00
|
|
|
|
|
|
|
|
|
|
|
void InsetCommand::setParams(InsetCommandParams const & p )
|
|
|
|
{
|
|
|
|
p_.setCmdName( p.getCmdName() );
|
|
|
|
p_.setContents( p.getContents() );
|
|
|
|
p_.setOptions( p.getOptions() );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-06-28 10:25:20 +00:00
|
|
|
int InsetCommand::latex(Buffer const *, ostream & os,
|
2000-07-15 23:51:46 +00:00
|
|
|
bool /*fragile*/, bool/*fs*/) const
|
1999-09-27 18:44:28 +00:00
|
|
|
{
|
1999-12-07 00:44:53 +00:00
|
|
|
os << getCommand();
|
1999-09-27 18:44:28 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-06-28 10:25:20 +00:00
|
|
|
int InsetCommand::ascii(Buffer const *, ostream &, int) const
|
2000-04-24 20:58:23 +00:00
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-06-28 10:25:20 +00:00
|
|
|
int InsetCommand::linuxdoc(Buffer const *, ostream &) const
|
2000-03-06 02:42:40 +00:00
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-06-28 10:25:20 +00:00
|
|
|
int InsetCommand::docBook(Buffer const *, ostream &) const
|
2000-03-06 02:42:40 +00:00
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|