]> git.lyx.org Git - lyx.git/blobdiff - src/insets/insetbibtex.C
* src/LyXAction.C: mark goto-clear-bookmark as working without buffer
[lyx.git] / src / insets / insetbibtex.C
index 9d8d81732cd355ef357d4d148d4ab3a645c186c8..fa604fddd381159f9b1e90203dcfaab0bbae44ed 100644 (file)
@@ -113,7 +113,7 @@ namespace {
 string normalize_name(Buffer const & buffer, OutputParams const & runparams,
                      string const & name, string const & ext)
 {
-       string const fname = makeAbsPath(name, buffer.filePath());
+       string const fname = makeAbsPath(name, buffer.filePath()).absFilename();
        if (absolutePath(name) || !isFileReadable(FileName(fname + ext)))
                return name;
        else if (!runparams.nice)
@@ -166,8 +166,8 @@ int InsetBibtex::latex(Buffer const & buffer, odocstream & os,
                string utf8input(to_utf8(input));
                string database =
                        normalize_name(buffer, runparams, utf8input, ".bib");
-               string const try_in_file = makeAbsPath(database + ".bib", buffer.filePath());
-               bool const not_from_texmf = isFileReadable(FileName(try_in_file));
+               FileName const try_in_file(makeAbsPath(database + ".bib", buffer.filePath()));
+               bool const not_from_texmf = isFileReadable(try_in_file);
 
                if (!runparams.inComment && !runparams.dryrun && !runparams.nice &&
                    not_from_texmf) {
@@ -175,7 +175,7 @@ int InsetBibtex::latex(Buffer const & buffer, odocstream & os,
                        // mangledFilename() needs the extension
                        DocFileName const in_file = DocFileName(try_in_file);
                        database = removeExtension(in_file.mangledFilename());
-                       FileName const out_file = FileName(makeAbsPath(database + ".bib",
+                       FileName const out_file(makeAbsPath(database + ".bib",
                                        buffer.getMasterBuffer()->temppath()));
 
                        bool const success = copy(in_file, out_file);
@@ -221,8 +221,8 @@ int InsetBibtex::latex(Buffer const & buffer, odocstream & os,
        if (!style.empty()) {
                string base =
                        normalize_name(buffer, runparams, style, ".bst");
-               string const try_in_file = makeAbsPath(base + ".bst", buffer.filePath());
-               bool const not_from_texmf = isFileReadable(FileName(try_in_file));
+               FileName const try_in_file(makeAbsPath(base + ".bst", buffer.filePath()));
+               bool const not_from_texmf = isFileReadable(try_in_file);
                // If this style does not come from texmf and we are not
                // exporting to .tex copy it to the tmp directory.
                // This prevents problems with spaces and 8bit charcaters
@@ -232,7 +232,7 @@ int InsetBibtex::latex(Buffer const & buffer, odocstream & os,
                        // use new style name
                        DocFileName const in_file = DocFileName(try_in_file);
                        base = removeExtension(in_file.mangledFilename());
-                       FileName const out_file = FileName(makeAbsPath(base + ".bst",
+                       FileName const out_file(makeAbsPath(base + ".bst",
                                        buffer.getMasterBuffer()->temppath()));
                        bool const success = copy(in_file, out_file);
                        if (!success) {
@@ -330,7 +330,7 @@ vector<FileName> const InsetBibtex::getFiles(Buffer const & buffer) const
 
 // This method returns a comma separated list of Bibtex entries
 void InsetBibtex::fillWithBibKeys(Buffer const & buffer,
-                                 std::vector<std::pair<string, string> > & keys) const
+               std::vector<std::pair<string, docstring> > & keys) const
 {
        vector<FileName> const files = getFiles(buffer);
        for (vector<FileName>::const_iterator it = files.begin();
@@ -344,14 +344,18 @@ void InsetBibtex::fillWithBibKeys(Buffer const & buffer,
                // you can use the encoding of the main document as long as
                // some elements like keys and names are pure ASCII. Therefore
                // we convert the file from the buffer encoding.
+               // We don't restrict keys to ASCII in LyX, since our own
+               // InsetBibitem can generate non-ASCII keys, and nonstandard
+               // 8bit clean bibtex forks exist.
                idocfstream ifs(it->toFilesystemEncoding().c_str(),
                                std::ios_base::in,
                                buffer.params().encoding().iconvName());
                docstring linebuf0;
                while (getline(ifs, linebuf0)) {
                        docstring linebuf = trim(linebuf0);
-                       if (linebuf.empty()) continue;
-                       if (prefixIs(linebuf, from_ascii("@"))) {
+                       if (linebuf.empty())
+                               continue;
+                       if (prefixIs(linebuf, '@')) {
                                linebuf = subst(linebuf, '{', '(');
                                docstring tmp;
                                linebuf = split(linebuf, tmp, '(');
@@ -361,15 +365,13 @@ void InsetBibtex::fillWithBibKeys(Buffer const & buffer,
                                        linebuf = split(linebuf, tmp, ',');
                                        tmp = ltrim(tmp, " \t");
                                        if (!tmp.empty()) {
-                                               // to_ascii because bibtex keys may
-                                               // only consist of ASCII characters
-                                               keys.push_back(pair<string, string>(to_ascii(tmp), string()));
+                                               // FIXME UNICODE
+                                               keys.push_back(pair<string, docstring>(
+                                                       to_utf8(tmp), docstring()));
                                        }
                                }
-                       } else if (!keys.empty()) {
-                               // FIXME UNICODE
-                               keys.back().second += to_utf8(linebuf + '\n');
-                       }
+                       } else if (!keys.empty())
+                               keys.back().second += linebuf + '\n';
                }
        }
 }