X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftex2lyx%2FParser.cpp;h=20f5058901e163d9ab7f54eece6a73b0b31e1cd3;hb=aa9fed932225bb9344a056df3610258f19fa94dd;hp=d2998bf9e2a74b24bfa9368d729e19a4fb5ebbfa;hpb=c0778a3d0eab0dab2693be70365f573d7bec1579;p=lyx.git diff --git a/src/tex2lyx/Parser.cpp b/src/tex2lyx/Parser.cpp index d2998bf9e2..20f5058901 100644 --- a/src/tex2lyx/Parser.cpp +++ b/src/tex2lyx/Parser.cpp @@ -220,6 +220,20 @@ Token const Parser::next_token() } +// We return a copy here because the tokens_ vector may get reallocated +Token const Parser::next_next_token() +{ + static const Token dummy; + // If good() has not been called after the last get_token() we need + // to tokenize two more tokens. + if (pos_ + 1 >= tokens_.size()) { + tokenize_one(); + tokenize_one(); + } + return pos_ + 1 < tokens_.size() ? tokens_[pos_ + 1] : dummy; +} + + // We return a copy here because the tokens_ vector may get reallocated Token const Parser::get_token() { @@ -238,8 +252,7 @@ bool Parser::isParagraph() if (curr_token().cat() == catNewline && (curr_token().cs().size() > 1 || (next_token().cat() == catSpace && - pos_ < tokens_.size() - 1 && - tokens_[pos_ + 1].cat() == catNewline))) + next_next_token().cat() == catNewline))) return true; if (curr_token().cat() == catEscape && curr_token().cs() == "par") return true; @@ -406,11 +419,13 @@ string Parser::getArg(char left, char right) } -string Parser::getFullOpt() +string Parser::getFullOpt(bool keepws) { Arg arg = getFullArg('[', ']'); if (arg.first) return '[' + arg.second + ']'; + if (keepws) + unskip_spaces(true); return string(); } @@ -427,14 +442,6 @@ string Parser::getOpt(bool keepws) } -string Parser::getOptContent() -// the same as getOpt but without the brackets -{ - string const res = getArg('[', ']'); - return res.empty() ? string() : res; -} - - string Parser::getFullParentheseArg() { Arg arg = getFullArg('(', ')'); @@ -474,6 +481,49 @@ string const Parser::verbatimEnvironment(string const & name) } +string const Parser::plainEnvironment(string const & name) +{ + if (!good()) + return string(); + + ostringstream os; + for (Token t = get_token(); good(); t = get_token()) { + if (t.asInput() == "\\end") { + string const end = getArg('{', '}'); + if (end == name) + return os.str(); + else + os << "\\end{" << end << '}'; + } else + os << t.asInput(); + } + cerr << "unexpected end of input" << endl; + return os.str(); +} + + +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();