]> git.lyx.org Git - lyx.git/blobdiff - src/tex2lyx/Parser.cpp
Collapsable -> Collapsible (part 5)
[lyx.git] / src / tex2lyx / Parser.cpp
index d0954cf5c1adb611cbfd9230d76b8cdf7f59736f..ec63b77da83e7c063724746427fa64be8c0c127e 100644 (file)
@@ -12,7 +12,6 @@
 
 #include "Encoding.h"
 #include "Parser.h"
-#include "support/foreach.h"
 #include "support/lstrings.h"
 #include "support/textutils.h"
 
@@ -49,7 +48,7 @@ char_type getNewline(iparserdocstream & is, char_type c)
        return c;
 }
 
-}
+} // namespace
 
 //
 // Token
@@ -118,14 +117,9 @@ void debugToken(std::ostream & os, Token const & t, unsigned int flags)
 // Wrapper
 //
 
-bool iparserdocstream::setEncoding(std::string const & e)
+void iparserdocstream::setEncoding(std::string const & e)
 {
        is_ << lyx::setEncoding(e);
-       if (s_.empty())
-               return true;
-       cerr << "Setting encoding " << e << " too late. The encoding of `"
-            << to_utf8(s_) << "ยด is wrong." << std::endl;
-       return false;
 }
 
 
@@ -159,10 +153,15 @@ iparserdocstream & iparserdocstream::get(char_type &c)
 //
 
 
-Parser::Parser(idocstream & is)
-       : lineno_(0), pos_(0), iss_(0), is_(is), encoding_iconv_("UTF-8"),
-         theCatcodesType_(NORMAL_CATCODES), curr_cat_(UNDECIDED_CATCODES)
+Parser::Parser(idocstream & is, std::string const & fixedenc)
+       : lineno_(0), pos_(0), iss_(0), is_(is),
+         encoding_iconv_(fixedenc.empty() ? "UTF-8" : fixedenc),
+         theCatcodesType_(NORMAL_CATCODES), curr_cat_(UNDECIDED_CATCODES),
+         fixed_enc_(!fixedenc.empty())
 {
+       if (fixed_enc_)
+               is_.setEncoding(fixedenc);
+       catInit();
 }
 
 
@@ -170,8 +169,11 @@ Parser::Parser(string const & s)
        : lineno_(0), pos_(0),
          iss_(new idocstringstream(from_utf8(s))), is_(*iss_),
          encoding_iconv_("UTF-8"),
-         theCatcodesType_(NORMAL_CATCODES), curr_cat_(UNDECIDED_CATCODES)
+         theCatcodesType_(NORMAL_CATCODES), curr_cat_(UNDECIDED_CATCODES),
+         // An idocstringstream can not change the encoding
+         fixed_enc_(true)
 {
+       catInit();
 }
 
 
@@ -266,7 +268,13 @@ bool Parser::setEncoding(std::string const & e)
 {
        //cerr << "setting encoding to " << e << std::endl;
        encoding_iconv_ = e;
-       return is_.setEncoding(e);
+       // If the encoding is fixed, we must not change the stream encoding
+       // (because the whole input uses that encoding, e.g. if it comes from
+       // the clipboard). We still need to track the original encoding in
+       // encoding_iconv_, so that the generated output is correct.
+       if (!fixed_enc_)
+               is_.setEncoding(e);
+       return true;
 }
 
 
@@ -312,11 +320,10 @@ Token const Parser::next_next_token()
                return dummy;
        // If tokenize_one() has not been called after the last get_token() we
        // need to tokenize two more tokens.
-       if (pos_ >= tokens_.size()) {
+       if (pos_ >= tokens_.size())
+               tokenize_one();
+       if (pos_ + 1 >= tokens_.size())
                tokenize_one();
-               if (pos_ + 1 >= tokens_.size())
-                       tokenize_one();
-       }
        return pos_ + 1 < tokens_.size() ? tokens_[pos_ + 1] : dummy;
 }
 
@@ -332,7 +339,7 @@ Token const Parser::get_token()
                if (pos_ >= tokens_.size())
                        return dummy;
        }
-       // cerr << "looking at token " << tokens_[pos_] 
+       // cerr << "looking at token " << tokens_[pos_]
        //      << " pos: " << pos_ << '\n';
        return tokens_[pos_++];
 }
@@ -655,7 +662,7 @@ Parser::Arg Parser::verbatimStuff(string const & end_string, bool const allow_li
                                return Arg(false, string());
                        }
                        if (match_index) {
-                               oss << end_string.substr(0, match_index) 
+                               oss << end_string.substr(0, match_index)
                                    << t.asInput();
                                match_index = 0;
                        } else
@@ -698,7 +705,7 @@ string Parser::verbatimOption()
                                putback();
                                res += '{' + verbatim_item() + '}';
                        } else
-                               res += t.cs();
+                               res += t.asInput();
                }
        }
        return res;