X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsetbib.C;h=d314ad7013c235f5c9cf0a11f710e4496a4bbb11;hb=4a5b7a5952ad2381fcdf4830511293e184c7c5a1;hp=6db97e73a2cda17cde1f460900139c9451f1a895;hpb=4c6091b63f6ac4dae69ddcee26bf22e4f35a3cdf;p=lyx.git diff --git a/src/insets/insetbib.C b/src/insets/insetbib.C index 6db97e73a2..d314ad7013 100644 --- a/src/insets/insetbib.C +++ b/src/insets/insetbib.C @@ -1,25 +1,30 @@ #include -#include -#include - #ifdef __GNUG__ #pragma implementation #endif -#include FORMS_H_LOCATION -#include "frontends/Dialogs.h" #include "insetbib.h" #include "buffer.h" #include "debug.h" #include "BufferView.h" #include "gettext.h" #include "lyxtext.h" -#include "support/filetools.h" -#include "support/path.h" #include "lyxrc.h" #include "font.h" #include "LyXView.h" +#include "lyxtextclasslist.h" + +#include "frontends/Dialogs.h" + +#include "support/filetools.h" +#include "support/path.h" +#include "support/os.h" +#include "support/lstrings.h" +#include "support/LAssert.h" + +#include +#include using std::ostream; using std::ifstream; @@ -33,9 +38,8 @@ int InsetBibKey::key_counter = 0; const string key_prefix = "key-"; InsetBibKey::InsetBibKey(InsetCommandParams const & p) - : InsetCommand(p) + : InsetCommand(p), counter(1) { - counter = 1; if (getContents().empty()) setContents(key_prefix + tostr(++key_counter)); } @@ -46,7 +50,7 @@ InsetBibKey::~InsetBibKey() } -Inset * InsetBibKey::Clone(Buffer const &) const +Inset * InsetBibKey::clone(Buffer const &, bool) const { InsetBibKey * b = new InsetBibKey(params()); b->setCounter(counter); @@ -64,7 +68,7 @@ void InsetBibKey::setCounter(int c) // as a LyX 2.x command, and lyxlex is not enough smart to understand // real LaTeX commands. Yes, that could be fixed, but would be a waste // of time cause LyX3 won't use lyxlex anyway. (ale) -void InsetBibKey::Write(Buffer const *, ostream & os) const +void InsetBibKey::write(Buffer const *, ostream & os) const { os << "\\bibitem "; if (! getOptions().empty()) { @@ -78,15 +82,14 @@ void InsetBibKey::Write(Buffer const *, ostream & os) const // This is necessary here because this is written without begin_inset // This should be changed!!! (Jug) -void InsetBibKey::Read(Buffer const *, LyXLex & lex) -{ - string token; - - if (lex.EatLine()) { - token = lex.GetString(); +void InsetBibKey::read(Buffer const *, LyXLex & lex) +{ + if (lex.eatLine()) { + string const token = lex.getString(); scanCommand(token); - } else + } else { lex.printError("InsetCommand: Parse error: `$$Token'"); + } if (prefixIs(getContents(), key_prefix)) { int key = strToInt(getContents().substr(key_prefix.length())); @@ -101,19 +104,25 @@ string const InsetBibKey::getBibLabel() const return tostr(counter); } -string const InsetBibKey::getScreenLabel() const +string const InsetBibKey::getScreenLabel(Buffer const *) const { return getContents() + " [" + getBibLabel() + "]"; } -void InsetBibKey::Edit(BufferView * bv, int, int, unsigned int) +void InsetBibKey::edit(BufferView * bv, int, int, unsigned int) { bv->owner()->getDialogs()->showBibitem(this); } -InsetBibtex::InsetBibtex(InsetCommandParams const & p) +void InsetBibKey::edit(BufferView * bv, bool) +{ + edit(bv, 0, 0, 0); +} + + +InsetBibtex::InsetBibtex(InsetCommandParams const & p, bool) : InsetCommand(p) {} @@ -123,100 +132,161 @@ InsetBibtex::~InsetBibtex() } -string const InsetBibtex::getScreenLabel() const +string const InsetBibtex::getScreenLabel(Buffer const *) const { return _("BibTeX Generated References"); } -int InsetBibtex::Latex(Buffer const * buffer, ostream & os, +int InsetBibtex::latex(Buffer const * buffer, ostream & os, bool /*fragile*/, bool/*fs*/) const { - // If we generate in a temp dir, we might need to give an - // absolute path there. This is a bit complicated since we can - // have a comma-separated list of bibliographies + // changing the sequence of the commands + // 1. \bibliographystyle{style} + // 2. \addcontentsline{...} - if option bibtotoc set + // 3. \bibliography{database} string adb, db_out; string db_in = getContents(); db_in = split(db_in, adb, ','); - while(!adb.empty()) { - if (!buffer->niceFile && - IsFileReadable(MakeAbsPath(adb, buffer->filepath)+".bib")) - adb = MakeAbsPath(adb, buffer->filepath); + // Style-Options + string style = getOptions(); // maybe empty! and with bibtotoc + string bibtotoc; + if (prefixIs(style,"bibtotoc")) { + bibtotoc = "bibtotoc"; + if (contains(style,',')) { + style = split(style,bibtotoc,','); + } + } + + if (!buffer->niceFile + && IsFileReadable(MakeAbsPath(style, buffer->filePath()) + ".bst")) { + style = MakeAbsPath(style, buffer->filePath()); + } + + if (!style.empty()) { // we want no \biblio...{} + os << "\\bibliographystyle{" << style << "}\n"; + } + + // bibtotoc-Option + if (!bibtotoc.empty()) { + // maybe a problem when a textclass has no "art" as + // part of its name, because it's than book. + // For the "official" lyx-layouts it's no problem to support + // all well + if (!contains(textclasslist.NameOfClass(buffer->params.textclass),"art")) { + if (buffer->params.sides == LyXTextClass::OneSide) { + // oneside + os << "\\clearpage"; + } else { + // twoside + os << "\\cleardoublepage"; + } + + // bookclass + os << "\\addcontentsline{toc}{chapter}{\\bibname}"; + + } else { + // article class + os << "\\addcontentsline{toc}{section}{\\refname}"; + } + } + + // database + // If we generate in a temp dir, we might need to give an + // absolute path there. This is a bit complicated since we can + // have a comma-separated list of bibliographies + while (!adb.empty()) { + if (!buffer->niceFile && + IsFileReadable(MakeAbsPath(adb, buffer->filePath())+".bib")) + adb = os::external_path(MakeAbsPath(adb, buffer->filePath())); db_out += adb; db_out += ','; db_in= split(db_in, adb,','); } db_out = strip(db_out, ','); - // Idem, but simpler - string style; - if (!buffer->niceFile - && IsFileReadable(MakeAbsPath(getOptions(), buffer->filepath) - + ".bst")) - style = MakeAbsPath(getOptions(), buffer->filepath); - else - style = getOptions(); - - os << "\\bibliographystyle{" << style << "}\n" - << "\\bibliography{" << db_out << "}\n"; + os << "\\bibliography{" << db_out << "}\n"; return 2; } -// This method returns a comma separated list of Bibtex entries -vector > const InsetBibtex::getKeys(Buffer const * buffer) const +vector const InsetBibtex::getFiles(Buffer const & buffer) const { - Path p(buffer->filepath); + // Doesn't appear to be used (Angus, 31 July 2001) + Path p(buffer.filePath()); + + vector vec; - vector > keys; string tmp; string bibfiles = getContents(); bibfiles = split(bibfiles, tmp, ','); - while(!tmp.empty()) { - string fil = findtexfile(ChangeExtension(tmp, "bib"), - "bib"); - lyxerr[Debug::LATEX] << "Bibfile: " << fil << endl; + while (!tmp.empty()) { + string file = findtexfile(ChangeExtension(tmp, "bib"), "bib"); + lyxerr[Debug::LATEX] << "Bibfile: " << file << endl; + // If we didn't find a matching file name just fail silently - if (!fil.empty()) { - // This is a _very_ simple parser for Bibtex database - // files. All it does is to look for lines starting - // in @ and not being @preamble and @string entries. - // It does NOT do any syntax checking! - ifstream ifs(fil.c_str()); - string linebuf0; - while (getline(ifs, linebuf0)) { - string linebuf = frontStrip(strip(linebuf0)); - if (linebuf.empty() ) continue; - if (prefixIs(linebuf, "@")) { - linebuf = subst(linebuf, '{', '('); - linebuf = split(linebuf, tmp, '('); - tmp = lowercase(tmp); - if (!prefixIs(tmp, "@string") - && !prefixIs(tmp, "@preamble")) { - linebuf = split(linebuf, tmp, ','); - tmp = frontStrip(tmp); - if (!tmp.empty()) { - keys.push_back(pair(tmp,string())); - } + if (!file.empty()) + vec.push_back(file); + + // Get next file name + bibfiles = split(bibfiles, tmp, ','); + } + + return vec; +} + +// This method returns a comma separated list of Bibtex entries +vector > const InsetBibtex::getKeys(Buffer const * buffer) const +{ + vector > keys; + + lyx::Assert(buffer); + vector const files = getFiles(*buffer); + for (vector::const_iterator it = files.begin(); + it != files.end(); ++ it) { + // This is a _very_ simple parser for Bibtex database + // files. All it does is to look for lines starting + // in @ and not being @preamble and @string entries. + // It does NOT do any syntax checking! + ifstream ifs(it->c_str()); + string linebuf0; + while (getline(ifs, linebuf0)) { + string linebuf = frontStrip(strip(linebuf0)); + if (linebuf.empty()) continue; + if (prefixIs(linebuf, "@")) { + linebuf = subst(linebuf, '{', '('); + string tmp; + linebuf = split(linebuf, tmp, '('); + tmp = lowercase(tmp); + if (!prefixIs(tmp, "@string") + && !prefixIs(tmp, "@preamble")) { + linebuf = split(linebuf, tmp, ','); + tmp = frontStrip(tmp); + if (!tmp.empty()) { + keys.push_back(pair(tmp,string())); } - } else if (!keys.empty()) { - keys.back().second += linebuf + "\n"; } + } else if (!keys.empty()) { + keys.back().second += linebuf + "\n"; } } - // Get next file name - bibfiles = split(bibfiles, tmp, ','); } return keys; } -void InsetBibtex::Edit(BufferView * bv, int, int, unsigned int) +void InsetBibtex::edit(BufferView * bv, int, int, unsigned int) { bv->owner()->getDialogs()->showBibtex(this); } +void InsetBibtex::edit(BufferView * bv, bool) +{ + edit(bv, 0, 0, 0); +} + + bool InsetBibtex::addDatabase(string const & db) { string contents(getContents()); @@ -253,8 +323,9 @@ bool InsetBibtex::delDatabase(string const & db) int bibitemMaxWidth(BufferView * bv, LyXFont const & font) { int w = 0; + // Ha, now we are mainly at 1.2.0 and it is still here (Jug) // Does look like a hack? It is! (but will change at 0.13) - LyXParagraph * par = bv->buffer()->paragraph; + Paragraph * par = bv->buffer()->paragraph; while (par) { if (par->bibkey) { @@ -272,7 +343,7 @@ string const bibitemWidest(Buffer const * buffer) { int w = 0; // Does look like a hack? It is! (but will change at 0.13) - LyXParagraph * par = buffer->paragraph; + Paragraph * par = buffer->paragraph; InsetBibKey * bkey = 0; LyXFont font;