X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftex2lyx%2FParser.cpp;h=75b8ba4bdd3be80e6e7187cc13875f5fadf7eb91;hb=487c8b5bd34b1de999d213d83e27916a334d4891;hp=75eb5182033af6a2021df6972ddc18c4b035bf75;hpb=df95041141c01c04fe8d4af43acc1cc1bc1b4795;p=lyx.git diff --git a/src/tex2lyx/Parser.cpp b/src/tex2lyx/Parser.cpp index 75eb518203..75b8ba4bdd 100644 --- a/src/tex2lyx/Parser.cpp +++ b/src/tex2lyx/Parser.cpp @@ -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();