]> git.lyx.org Git - lyx.git/blobdiff - src/tex2lyx/Parser.cpp
hyperref support for tex2lyx
[lyx.git] / src / tex2lyx / Parser.cpp
index 0b6bbe2db2c28f9838a4839ca16af5c26fd6cfc7..4cdb9a0d8d06ffcc75ab2e6e05295817960a8331 100644 (file)
@@ -12,6 +12,7 @@
 
 #include "Encoding.h"
 #include "Parser.h"
+#include "support/textutils.h"
 
 #include <iostream>
 
@@ -120,6 +121,37 @@ string Token::asInput() const
 }
 
 
+bool Token::isAlnumASCII() const
+{
+       return cat_ == catLetter ||
+              (cat_ == catOther && cs_.length() == 1 && isDigitASCII(cs_[0]));
+}
+
+
+#ifdef FILEDEBUG
+void debugToken(std::ostream & os, Token const & t, unsigned int flags)
+{
+       char sep = ' ';
+       os << "t: " << t << " flags: " << flags;
+       if (flags & FLAG_BRACE_LAST) { os << sep << "BRACE_LAST"; sep = '|'; }
+       if (flags & FLAG_RIGHT     ) { os << sep << "RIGHT"     ; sep = '|'; }
+       if (flags & FLAG_END       ) { os << sep << "END"       ; sep = '|'; }
+       if (flags & FLAG_BRACK_LAST) { os << sep << "BRACK_LAST"; sep = '|'; }
+       if (flags & FLAG_TEXTMODE  ) { os << sep << "TEXTMODE"  ; sep = '|'; }
+       if (flags & FLAG_ITEM      ) { os << sep << "ITEM"      ; sep = '|'; }
+       if (flags & FLAG_LEAVE     ) { os << sep << "LEAVE"     ; sep = '|'; }
+       if (flags & FLAG_SIMPLE    ) { os << sep << "SIMPLE"    ; sep = '|'; }
+       if (flags & FLAG_EQUATION  ) { os << sep << "EQUATION"  ; sep = '|'; }
+       if (flags & FLAG_SIMPLE2   ) { os << sep << "SIMPLE2"   ; sep = '|'; }
+       if (flags & FLAG_OPTION    ) { os << sep << "OPTION"    ; sep = '|'; }
+       if (flags & FLAG_BRACED    ) { os << sep << "BRACED"    ; sep = '|'; }
+       if (flags & FLAG_CELL      ) { os << sep << "CELL"      ; sep = '|'; }
+       if (flags & FLAG_TABBING   ) { os << sep << "TABBING"   ; sep = '|'; }
+       os << "\n";
+}
+#endif
+
+
 //
 // Parser
 //
@@ -215,20 +247,24 @@ bool Parser::isParagraph()
 }
 
 
-void Parser::skip_spaces(bool skip_comments)
+bool Parser::skip_spaces(bool skip_comments)
 {
        // We just silently return if we have no more tokens.
        // skip_spaces() should be callable at any time,
        // the caller must check p::good() anyway.
+       bool skipped = false;
        while (good()) {
                get_token();
                if (isParagraph()) {
                        putback();
                        break;
                }
-               if ( curr_token().cat() == catSpace ||
-                    curr_token().cat() == catNewline ||
-                   (curr_token().cat() == catComment && curr_token().cs().empty()))
+               if (curr_token().cat() == catSpace ||
+                   curr_token().cat() == catNewline) {
+                       skipped = true;
+                       continue;
+               }
+               if ((curr_token().cat() == catComment && curr_token().cs().empty()))
                        continue;
                if (skip_comments && curr_token().cat() == catComment)
                        cerr << "  Ignoring comment: " << curr_token().asInput();
@@ -237,6 +273,7 @@ void Parser::skip_spaces(bool skip_comments)
                        break;
                }
        }
+       return skipped;
 }
 
 
@@ -263,6 +300,19 @@ void Parser::putback()
 }
 
 
+void Parser::pushPosition()
+{
+       positions_.push_back(pos_);
+}
+
+
+void Parser::popPosition()
+{
+       pos_ = positions_.back();
+       positions_.pop_back();
+}
+
+
 bool Parser::good()
 {
        if (pos_ < tokens_.size())
@@ -280,6 +330,38 @@ char Parser::getChar()
 }
 
 
+bool Parser::hasOpt()
+{
+       // An optional argument can occur in any of the following forms:
+       // - \foo[bar]
+       // - \foo [bar]
+       // - \foo
+       //   [bar]
+       // - \foo %comment
+       //   [bar]
+
+       // remember current position
+       unsigned int oldpos = pos_;
+       // skip spaces and comments
+       while (good()) {
+               get_token();
+               if (isParagraph()) {
+                       putback();
+                       break;
+               }
+               if (curr_token().cat() == catSpace ||
+                   curr_token().cat() == catNewline ||
+                   curr_token().cat() == catComment)
+                       continue;
+               putback();
+               break;
+       }
+       bool const retval = (next_token().asInput() == "[");
+       pos_ = oldpos;
+       return retval;
+}
+
+
 Parser::Arg Parser::getFullArg(char left, char right)
 {
        skip_spaces(true);
@@ -325,10 +407,15 @@ string Parser::getFullOpt()
 }
 
 
-string Parser::getOpt()
+string Parser::getOpt(bool keepws)
 {
        string const res = getArg('[', ']');
-       return res.empty() ? string() : '[' + res + ']';
+       if (res.empty()) {
+               if (keepws)
+                       unskip_spaces(true);
+               return string();
+       }
+       return '[' + res + ']';
 }