a new biblio::asValidLatexString helper function.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8754 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Angus Leeming 2004-05-14 15:27:13 +00:00
parent ea6a5fe92d
commit 24bd12178d
5 changed files with 136 additions and 42 deletions

View File

@ -1,3 +1,9 @@
2004-05-14 Angus Leeming <leeming@lyx.org>
* biblio.[Ch] (asValidLatexCommand): new function which examines
the input string to return a latex citation command that is
valid for the current citation engine.
2004-05-14 Angus Leeming <leeming@lyx.org> 2004-05-14 Angus Leeming <leeming@lyx.org>
* ControlCitation.[Ch]: small changes to use the CiteEngine_enum * ControlCitation.[Ch]: small changes to use the CiteEngine_enum

View File

@ -30,6 +30,7 @@ using lyx::support::compare_ascii_no_case;
using lyx::support::contains; using lyx::support::contains;
using lyx::support::getVectorFromString; using lyx::support::getVectorFromString;
using lyx::support::ltrim; using lyx::support::ltrim;
using lyx::support::prefixIs;
using lyx::support::rtrim; using lyx::support::rtrim;
using lyx::support::split; using lyx::support::split;
using lyx::support::subst; using lyx::support::subst;
@ -43,6 +44,113 @@ using std::vector;
namespace biblio { namespace biblio {
namespace {
vector<string> const init_possible_cite_commands()
{
char const * const pos[] = {
"cite",
"citet", "citep", "citealt", "citealp",
"citeauthor", "citeyear", "citeyearpar",
"citet*", "citep*", "citealt*", "citealp*", "citeauthor*",
"Citet", "Citep", "Citealt", "Citealp", "Citeauthor",
"Citet*", "Citep*", "Citealt*", "Citealp*", "Citeauthor*",
"fullcite",
"footcite", "footcitet", "footcitep", "footcitealt",
"footcitealp", "footciteauthor", "footciteyear",
"footciteyearpar",
"citefield",
"citetitle",
"cite*"
};
size_t const size_pos = sizeof(pos) / sizeof(pos[0]);
return vector<string>(pos, pos + size_pos);
}
vector<string> const & possible_cite_commands()
{
static vector<string> const pos = init_possible_cite_commands();
return pos;
}
bool is_possible_cite_command(string const & input)
{
vector<string> const & possibles = possible_cite_commands();
vector<string>::const_iterator const end = possibles.end();
return std::find(possibles.begin(), end, input) != end;
}
string const default_cite_command(CiteEngine engine)
{
string str;
switch (engine) {
case ENGINE_BASIC:
str = "cite";
break;
case ENGINE_NATBIB_AUTHORYEAR:
str = "citet";
break;
case ENGINE_NATBIB_NUMERICAL:
str = "citep";
break;
case ENGINE_JURABIB:
str = "cite";
break;
}
return str;
}
} // namespace anon
string const asValidLatexCommand(string const & input,
CiteEngine_enum const & engine)
{
string const default_str = default_cite_command(engine);
if (!is_possible_cite_command(input))
return default_str;
string output;
switch (engine) {
case ENGINE_BASIC:
output = default_str;
break;
case ENGINE_NATBIB_AUTHORYEAR:
case ENGINE_NATBIB_NUMERICAL:
if (input == "cite" || input == "citefield" ||
input == "citetitle" || input == "cite*")
output = default_str;
else if (prefixIs(input, "foot"))
output = input.substr(4);
else
output = input;
break;
case ENGINE_JURABIB: {
// Jurabib does not support the 'uppercase' natbib style.
if (input[0] == 'C')
output = string(1, 'c') + input.substr(1);
else
output = input;
// Jurabib does not support the 'full' natbib style.
string::size_type const n = output.size() - 1;
if (output != "cite*" && output[n] == '*')
output = output.substr(0, n);
break;
}
}
return output;
}
string const familyName(string const & name) string const familyName(string const & name)
{ {
// Very simple parser // Very simple parser

View File

@ -49,6 +49,14 @@ enum Direction {
BACKWARD BACKWARD
}; };
/** Each citation engine recognizes only a subset of all possible
* citation commands. Given a latex command \c input, this function
* returns an appropriate command, valid for \c engine.
*/
std::string const asValidLatexCommand(std::string const & input,
CiteEngine_enum const & engine);
/// First entry is the bibliography key, second the data /// First entry is the bibliography key, second the data
typedef std::map<std::string, std::string> InfoMap; typedef std::map<std::string, std::string> InfoMap;

View File

@ -1,3 +1,8 @@
2004-05-14 Angus Leeming <leeming@lyx.org>
* insetcite.C (getNatbibLabel, generateLabel, latex): use the
new biblio::asValidLatexString function.
2004-05-12 Angus Leeming <leeming@lyx.org> 2004-05-12 Angus Leeming <leeming@lyx.org>
* insetcite.C: use BufferParams::cite_engine rather than the three * insetcite.C: use BufferParams::cite_engine rather than the three

View File

@ -80,12 +80,11 @@ string const getNatbibLabel(Buffer const & buffer,
// CITE: author/<before field> // CITE: author/<before field>
// We don't currently use the full or forceUCase fields. // We don't currently use the full or forceUCase fields.
// bool const forceUCase = citeType[0] == 'C'; string cite_type = biblio::asValidLatexCommand(citeType, engine);
bool const full = citeType[citeType.size() - 1] == '*'; if (cite_type[0] == 'C')
cite_type = string(1, 'c') + cite_type.substr(1);
string const cite_type = full ? if (cite_type[cite_type.size() - 1] == '*')
ascii_lowercase(citeType.substr(0, citeType.size() - 1)) : cite_type = cite_type.substr(0, cite_type.size() - 1);
ascii_lowercase(citeType);
string before_str; string before_str;
if (!before.empty()) { if (!before.empty()) {
@ -270,19 +269,7 @@ string const InsetCitation::generateLabel(Buffer const & buffer) const
string label; string label;
biblio::CiteEngine const engine = buffer.params().cite_engine; biblio::CiteEngine const engine = buffer.params().cite_engine;
if (engine != biblio::ENGINE_BASIC) { if (engine != biblio::ENGINE_BASIC) {
string cmd = getCmdName(); label = getNatbibLabel(buffer, getCmdName(), getContents(),
if (cmd == "cite") {
// We may be "upgrading" from an older LyX version.
// If, however, we use "cite" because the necessary
// author/year info is not present in the biblio
// database, then getNatbibLabel will exit gracefully
// and we'll call getBasicLabel.
if (engine == biblio::ENGINE_NATBIB_NUMERICAL)
cmd = "citep";
else if (engine == biblio::ENGINE_NATBIB_AUTHORYEAR)
cmd = "citet";
}
label = getNatbibLabel(buffer, cmd, getContents(),
before, after, engine); before, after, engine);
} }
@ -343,30 +330,10 @@ int InsetCitation::latex(Buffer const & buffer, ostream & os,
OutputParams const &) const OutputParams const &) const
{ {
biblio::CiteEngine const cite_engine = buffer.params().cite_engine; biblio::CiteEngine const cite_engine = buffer.params().cite_engine;
string const cite_str =
biblio::asValidLatexCommand(getCmdName(), cite_engine);
os << "\\"; os << "\\" << cite_str;
switch (cite_engine) {
case biblio::ENGINE_BASIC:
os << "cite";
break;
case biblio::ENGINE_NATBIB_AUTHORYEAR:
case biblio::ENGINE_NATBIB_NUMERICAL:
os << getCmdName();
break;
case biblio::ENGINE_JURABIB:
{
// jurabib does not (yet) support "force upper case"
// and "full author name". Fallback.
string cmd = getCmdName();
if (cmd[0] == 'C')
cmd[0] = 'c';
size_t n = cmd.size() - 1;
if (cmd[n] == '*')
cmd = cmd.substr(0,n);
os << cmd;
break;
}
}
string const before = getSecOptions(); string const before = getSecOptions();
string const after = getOptions(); string const after = getOptions();