]> git.lyx.org Git - lyx.git/blobdiff - src/tex2lyx/Parser.cpp
tex2lyx: update a command
[lyx.git] / src / tex2lyx / Parser.cpp
index 75eb5182033af6a2021df6972ddc18c4b035bf75..75b8ba4bdd3be80e6e7187cc13875f5fadf7eb91 100644 (file)
@@ -398,7 +398,14 @@ Parser::Arg Parser::getFullArg(char left, char right)
        if (c != left) {
                putback();
                return make_pair(false, string());
-       } else
+       } else {
+               // a single '\' is only allowed within \verb, no matter what the delimiter is,
+               // for example "\verb+\+" (reported as bug #4468)
+               // To support this, we allow single '\' if it is the only character
+               // within equal delimiters
+               if (next_token().cat() == catEscape)
+                       if (next_token().character() == right && right == left)
+                               result += '\\';
                while ((c = getChar()) != right && good()) {
                        // Ignore comments
                        if (curr_token().cat() == catComment) {
@@ -408,7 +415,7 @@ Parser::Arg Parser::getFullArg(char left, char right)
                        else
                                result += curr_token().asInput();
                }
-
+       }
        return make_pair(true, result);
 }
 
@@ -488,10 +495,7 @@ string const Parser::plainEnvironment(string const & name)
 
        ostringstream os;
        for (Token t = get_token(); good(); t = get_token()) {
-               if (t.cat() == catBegin) {
-                       putback();
-                       os << '{' << verbatim_item() << '}';
-               } else if (t.asInput() == "\\end") {
+               if (t.asInput() == "\\end") {
                        string const end = getArg('{', '}');
                        if (end == name)
                                return os.str();
@@ -505,6 +509,28 @@ string const Parser::plainEnvironment(string const & name)
 }
 
 
+string const Parser::plainCommand(char left, char right, string const & name)
+{
+       if (!good())
+               return string();
+       // check if first token is really the start character
+       Token tok = get_token();
+       if (tok.character() != left) {
+               cerr << "first character does not match start character of command \\" << name << endl;
+               return string();
+       }
+       ostringstream os;
+       for (Token t = get_token(); good(); t = get_token()) {
+               if (t.character() == right) {
+                       return os.str();
+               } else
+                       os << t.asInput();
+       }
+       cerr << "unexpected end of input" << endl;
+       return os.str();
+}
+
+
 void Parser::tokenize_one()
 {
        catInit();