X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftex2lyx%2FParser.cpp;h=a538c760efe2ac8f83002cd2a581544bf5c8cfe4;hb=a2b21e3cd4bbfd42e59161143eba6e7681aaa93f;hp=25a3f41e815ce76bc22493c96712cd5a4ad1c239;hpb=0915e814814ab26732b6dd13fc1740cfbf64b5b4;p=lyx.git diff --git a/src/tex2lyx/Parser.cpp b/src/tex2lyx/Parser.cpp index 25a3f41e81..a538c760ef 100644 --- a/src/tex2lyx/Parser.cpp +++ b/src/tex2lyx/Parser.cpp @@ -453,7 +453,7 @@ bool Parser::good() } -bool Parser::hasOpt() +bool Parser::hasOpt(string const l) { // An optional argument can occur in any of the following forms: // - \foo[bar] @@ -479,7 +479,7 @@ bool Parser::hasOpt() putback(); break; } - bool const retval = (next_token().asInput() == "["); + bool const retval = (next_token().asInput() == l); pos_ = oldpos; return retval; } @@ -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(); @@ -565,6 +577,26 @@ string Parser::getFullParentheseArg() } +bool Parser::hasListPreamble(string const itemcmd) +{ + // remember current position + unsigned int oldpos = pos_; + // jump over arguments + if (hasOpt()) + getOpt(); + if (hasOpt("{")) + getArg('{', '}'); + // and swallow spaces and comments + skip_spaces(true); + // we have a list preamble if the next thing + // that follows is not the \item command + bool res = next_token().cs() != itemcmd; + // back to orig position + pos_ = oldpos; + return res; +} + + string const Parser::ertEnvironment(string const & name) { if (!good()) @@ -638,6 +670,27 @@ string const Parser::plainCommand(char left, char right, string const & name) } +string const Parser::getCommandLatexParam() +{ + if (!good()) + return string(); + string res; + size_t offset = 0; + while (true) { + if (pos_ + offset >= tokens_.size()) + tokenize_one(); + if (pos_ + offset >= tokens_.size()) + break; + Token t = tokens_[pos_ + offset]; + if (t.cat() == catBegin) + break; + res += t.asInput(); + ++offset; + } + return res; +} + + Parser::Arg Parser::verbatimStuff(string const & end_string, bool const allow_linebreak) { if (!good())