]> git.lyx.org Git - lyx.git/blobdiff - src/BiblioInfo.cpp
* ca/Intro.lyx from Daniel
[lyx.git] / src / BiblioInfo.cpp
index 486bd5c1e51d652c2f3265fda33626786754da5c..36509c6c7c9557d0525acb56acd7b5fbc1ed4aca 100644 (file)
@@ -5,7 +5,7 @@
  *
  * \author Angus Leeming
  * \author Herbert Voß
- * \author Richard Heck
+ * \author Richard Kimberly Heck
  * \author Julien Rioux
  * \author Jürgen Spitzmüller
  *
 #include <config.h>
 
 #include "BiblioInfo.h"
+
 #include "Buffer.h"
 #include "BufferParams.h"
-#include "buffer_funcs.h"
 #include "Citation.h"
 #include "Encoding.h"
-#include "InsetIterator.h"
 #include "Language.h"
-#include "xml.h"
-#include "Paragraph.h"
 #include "TextClass.h"
 #include "TocBackend.h"
+#include "xml.h"
 
 #include "support/convert.h"
 #include "support/debug.h"
 #include "support/gettext.h"
 #include "support/lassert.h"
 #include "support/lstrings.h"
-#include "support/regex.h"
 #include "support/textutils.h"
 
 #include <map>
+#include <regex>
 #include <set>
 
 using namespace std;
@@ -279,8 +277,14 @@ vector<docstring> const getAuthors(docstring const & author)
        // in author names, but can happen (consider cases such as "C \& A Corp.").
        docstring iname = subst(author, from_ascii("&"), from_ascii("$$amp!"));
        // Then, we temporarily make all " and " strings to ampersands in order
-       // to handle them later on a per-char level.
-       iname = subst(iname, from_ascii(" and "), from_ascii(" & "));
+       // to handle them later on a per-char level. Note that arbitrary casing
+       // ("And", "AND", "aNd", ...) is allowed in bibtex (#10465).
+       static regex const and_reg("(.* )([aA][nN][dD])( .*)");
+       smatch sub;
+       string res = to_utf8(iname);
+       while (regex_match(res, sub, and_reg))
+               res = sub.str(1) + "&" + sub.str(3);
+       iname = from_utf8(res);
        // Now we traverse through the string and replace the "&" by the proper
        // output in- and outside groups
        docstring name;
@@ -329,6 +333,7 @@ docstring convertLaTeXCommands(docstring const & str)
 
        bool scanning_cmd = false;
        bool scanning_math = false;
+       bool is_section = false;
        bool escaped = false; // used to catch \$, etc.
        while (!val.empty()) {
                char_type const ch = val[0];
@@ -351,13 +356,24 @@ docstring convertLaTeXCommands(docstring const & str)
                // discard characters until we hit something that
                // isn't alpha.
                if (scanning_cmd) {
+                       if (!is_section && ch == 'S') {
+                               is_section = true;
+                               val = val.substr(1);
+                               continue;
+                       }
                        if (isAlphaASCII(ch)) {
+                               is_section = false;
                                val = val.substr(1);
                                escaped = false;
                                continue;
+                       } else if (is_section) {
+                               ret.push_back(0x00a7);
+                               is_section = false;
+                               continue;
                        }
                        // so we're done with this command.
                        // now we fall through and check this character.
+                       is_section = false;
                        scanning_cmd = false;
                }
 
@@ -374,6 +390,12 @@ docstring convertLaTeXCommands(docstring const & str)
                        continue;
                }
 
+               if (ch == '~') {
+                       ret += char_type(0x00a0);
+                       val = val.substr(1);
+                       continue;
+               }
+
                if (ch == '$') {
                        ret += ch;
                        val = val.substr(1);
@@ -385,8 +407,8 @@ docstring convertLaTeXCommands(docstring const & str)
                // {\v a} to \v{a} (see #9340).
                // FIXME: This is a sort of mini-tex2lyx.
                //        Use the real tex2lyx instead!
-               static lyx::regex const tma_reg("^\\{\\\\[bcCdfGhHkrtuUv]\\s\\w\\}");
-               if (lyx::regex_search(to_utf8(val), tma_reg)) {
+               static regex const tma_reg("^\\{\\\\[bcCdfGhHkrtuUv]\\s\\w\\}");
+               if (regex_search(to_utf8(val), tma_reg)) {
                        val = val.substr(1);
                        val.replace(2, 1, from_ascii("{"));
                        continue;
@@ -413,8 +435,8 @@ docstring convertLaTeXCommands(docstring const & str)
                // look for that and change it, if necessary.
                // FIXME: This is a sort of mini-tex2lyx.
                //        Use the real tex2lyx instead!
-               static lyx::regex const reg("^\\\\\\W\\w");
-               if (lyx::regex_search(to_utf8(val), reg)) {
+               static regex const reg("^\\\\\\W\\w");
+               if (regex_search(to_utf8(val), reg)) {
                        val.insert(3, from_ascii("}"));
                        val.insert(2, from_ascii("{"));
                }
@@ -1404,7 +1426,7 @@ docstring const BiblioInfo::getInfo(docstring const & key,
 {
        BiblioInfo::const_iterator it = find(key);
        if (it == end())
-               return docstring(_("Bibliography entry not found!"));
+               return _("Bibliography entry not found!");
        BibTeXInfo const & data = it->second;
        BibTeXInfoList xrefptrs;
        for (docstring const & xref : getXRefs(data)) {