]> git.lyx.org Git - features.git/commitdiff
tex2lyx: honor grouping in optional arguments.
authorJuergen Spitzmueller <spitz@lyx.org>
Fri, 9 Mar 2018 12:14:13 +0000 (13:14 +0100)
committerJuergen Spitzmueller <spitz@lyx.org>
Sun, 11 Mar 2018 17:27:23 +0000 (18:27 +0100)
E.g., \cite[{a literal ] character}]{key}

(cherry picked from commit cba38881d6b9fa3ff5dd0ebe50239fc384309082)

src/tex2lyx/Parser.cpp

index 35748b97694d4dbeaef1ef7e9e1cdea2299ef4cb..6e29623b960fffdf1387bf49832ecb7de647ff8d 100644 (file)
@@ -494,6 +494,7 @@ Parser::Arg Parser::getFullArg(char left, char right, bool allow_escaping)
        if (! good())
                return make_pair(false, string());
 
+       int group_level = 0;
        string result;
        Token t = get_token();
 
@@ -504,6 +505,15 @@ Parser::Arg Parser::getFullArg(char left, char right, bool allow_escaping)
        } else {
                while (good()) {
                        t = get_token();
+                       // honor grouping
+                       if (left != '{' && t.cat() == catBegin) {
+                               ++group_level;
+                               continue;
+                       }
+                       if (left != '{' && t.cat() == catEnd) {
+                               --group_level;
+                               continue;
+                       }
                        // Ignore comments
                        if (t.cat() == catComment) {
                                if (!t.cs().empty())
@@ -511,13 +521,15 @@ Parser::Arg Parser::getFullArg(char left, char right, bool allow_escaping)
                                continue;
                        }
                        if (allow_escaping) {
-                               if (t.cat() != catEscape && t.character() == right)
+                               if (t.cat() != catEscape && t.character() == right
+                                   && group_level == 0)
                                        break;
                        } else {
                                if (t.character() == right) {
                                        if (t.cat() == catEscape)
                                                result += '\\';
-                                       break;
+                                       if (group_level == 0)
+                                               break;
                                }
                        }
                        result += t.asInput();