The branch, master, has been updated.

- Log -----------------------------------------------------------------

commit 2f7f0c76312c4500147ee5795e2df030a2d5ae3a
Author: Georg Baum <[email protected]>
Date:   Fri Oct 5 00:12:18 2012 +0200

    Really fix bug #4468.
    
    The old fix was incomplete (\verb~\~ was translated to \verb~~ in 
roundtrip).
    The real cause for this bug (and also the mistranslation of \href{...}{\}})
    was the misbehaviour of Token::character() (see comment in Parser.h): This
    method even returns a character if the category is catEscape, and this is 
not
    wanted in most (all?) cases.

diff --git a/src/tex2lyx/Parser.cpp b/src/tex2lyx/Parser.cpp
index 75b8ba4..530e73a 100644
--- a/src/tex2lyx/Parser.cpp
+++ b/src/tex2lyx/Parser.cpp
@@ -383,7 +383,7 @@ bool Parser::hasOpt()
 }
 
 
-Parser::Arg Parser::getFullArg(char left, char right)
+Parser::Arg Parser::getFullArg(char left, char right, bool allow_escaping)
 {
        skip_spaces(true);
 
@@ -393,36 +393,40 @@ Parser::Arg Parser::getFullArg(char left, char right)
                return make_pair(false, string());
 
        string result;
-       char c = getChar();
+       Token t = get_token();
 
-       if (c != left) {
+       if (t.cat() == catComment || t.cat() == catEscape ||
+           t.character() != left) {
                putback();
                return make_pair(false, string());
        } 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()) {
+               for (t = get_token(); good(); t = get_token()) {
                        // Ignore comments
-                       if (curr_token().cat() == catComment) {
-                               if (!curr_token().cs().empty())
-                                       cerr << "Ignoring comment: " << 
curr_token().asInput();
+                       if (t.cat() == catComment) {
+                               if (!t.cs().empty())
+                                       cerr << "Ignoring comment: " << 
t.asInput();
+                               continue;
                        }
-                       else
-                               result += curr_token().asInput();
+                       if (allow_escaping) {
+                               if (t.cat() != catEscape && t.character() == 
right)
+                                       break;
+                       } else {
+                               if (t.character() == right) {
+                                       if (t.cat() == catEscape)
+                                               result += '\\';
+                                       break;
+                               }
+                       }
+                       result += t.asInput();
                }
        }
        return make_pair(true, result);
 }
 
 
-string Parser::getArg(char left, char right)
+string Parser::getArg(char left, char right, bool allow_escaping)
 {
-       return getFullArg(left, right).second;
+       return getFullArg(left, right, allow_escaping).second;
 }
 
 
diff --git a/src/tex2lyx/Parser.h b/src/tex2lyx/Parser.h
index c0c5685..59a89d5 100644
--- a/src/tex2lyx/Parser.h
+++ b/src/tex2lyx/Parser.h
@@ -87,8 +87,8 @@ public:
         *        ../mathed/MathParser.cpp (which is the anchestor of this
         *        class) uses a separate char member for this method. I
         *        believe that the intended usage is to not cover tokens with
-        *        catEscape, e.g. \code
-        *        return (cs_.empty() || cat_ == catEscape) ? 0 : cs_[0];
+        *        catEscape or catComment, e.g. \code
+        *        return (cs_.empty() || cat_ == catEscape || cat_ == 
catComment) ? 0 : cs_[0];
         *        \endcode
         *        All usages of this method should be checked. gb 2011-01-05
         */
@@ -157,18 +157,24 @@ public:
        typedef std::pair<bool, std::string> Arg;
        /*!
         * Get an argument enclosed by \p left and \p right.
+        * If \p allow_escaping is true, a right delimiter escaped by a
+        * backslash does not count as delimiter, but is included in the
+        * argument.
         * \returns wether an argument was found in \p Arg.first and the
         * argument in \p Arg.second. \see getArg().
         */
-       Arg getFullArg(char left, char right);
+       Arg getFullArg(char left, char right, bool allow_escaping = true);
        /*!
         * Get an argument enclosed by \p left and \p right.
+        * If \p allow_escaping is true, a right delimiter escaped by a
+        * backslash does not count as delimiter, but is included in the
+        * argument.
         * \returns the argument (without \p left and \p right) or the empty
         * string if the next non-space token is not \p left. Use
         * getFullArg() if you need to know wether there was an empty
         * argument or no argument at all.
         */
-       std::string getArg(char left, char right);
+       std::string getArg(char left, char right, bool allow_escaping = true);
        /*!
         * Like getOpt(), but distinguishes between a missing argument ""
         * and an empty argument "[]".
diff --git a/src/tex2lyx/test/test-insets.lyx.lyx 
b/src/tex2lyx/test/test-insets.lyx.lyx
index a854dac..f5484ad 100644
--- a/src/tex2lyx/test/test-insets.lyx.lyx
+++ b/src/tex2lyx/test/test-insets.lyx.lyx
@@ -970,6 +970,19 @@ target "http://www.test.test";
 
 \end_layout
 
+\begin_layout Standard
+
+parser test (escaped):
+\begin_inset CommandInset href
+LatexCommand href
+name "a brace } and another one { and something"
+target "http://www.test.test";
+
+\end_inset
+
+
+\end_layout
+
 \begin_layout Section
 
 Lists
diff --git a/src/tex2lyx/test/test-insets.tex b/src/tex2lyx/test/test-insets.tex
index 16354ba..a74a542 100644
--- a/src/tex2lyx/test/test-insets.tex
+++ b/src/tex2lyx/test/test-insets.tex
@@ -160,6 +160,8 @@ ftp2:\href{ftp://www.test.test}{www.test.test}
 
 parser test (stupid, but valid):\href{http://www.test.test}{\}}
 
+parser test (escaped):\href{http://www.test.test}{a brace \} and another one 
\{ and something}
+
 
 \section{Lists\index{Lists}}
 
diff --git a/src/tex2lyx/test/test-structure.lyx.lyx 
b/src/tex2lyx/test/test-structure.lyx.lyx
index 27761e8..8fc60c9 100644
--- a/src/tex2lyx/test/test-structure.lyx.lyx
+++ b/src/tex2lyx/test/test-structure.lyx.lyx
@@ -1119,7 +1119,9 @@ status collapsed
 
 
 \backslash
-verb~~
+verb~
+\backslash
+~
 \end_layout
 
 \end_inset
@@ -1139,7 +1141,22 @@ item[ABC] first item+
 
 \end_inset
 
+ 
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+verb+something
+\backslash
++
+\end_layout
+
+\end_inset
 
+ bug 4468
 \end_layout
 
 \begin_layout Standard
diff --git a/src/tex2lyx/test/test-structure.tex 
b/src/tex2lyx/test/test-structure.tex
index 89fa589..79989fc 100644
--- a/src/tex2lyx/test/test-structure.tex
+++ b/src/tex2lyx/test/test-structure.tex
@@ -321,6 +321,7 @@ zzz \section{
 \end{verbatim}
 \verb~\~
 \verb+\item[ABC] first item+
+\verb+something\+ bug 4468
 
 and bibliography:
 \begin{thebibliography}{9}
diff --git a/src/tex2lyx/text.cpp b/src/tex2lyx/text.cpp
index db9f9b5..2ee3afc 100644
--- a/src/tex2lyx/text.cpp
+++ b/src/tex2lyx/text.cpp
@@ -3210,8 +3210,8 @@ void parse_text(Parser & p, ostream & os, unsigned flags, 
bool outer,
 
                else if (t.cs() == "href") {
                        context.check_layout(os);
-                       string target = p.getArg('{', '}');
-                       string name = p.getArg('{', '}');
+                       string target = 
convert_command_inset_arg(p.verbatim_item());
+                       string name = 
convert_command_inset_arg(p.verbatim_item());
                        string type;
                        size_t i = target.find(':');
                        if (i != string::npos) {
@@ -3729,7 +3729,11 @@ void parse_text(Parser & p, ostream & os, unsigned 
flags, bool outer,
                else if (t.cs() == "verb") {
                        context.check_layout(os);
                        char const delimiter = p.next_token().character();
-                       string const arg = p.getArg(delimiter, delimiter);
+                       // \verb is special: The usual escaping rules do not
+                       // apply, e.g. "\verb+\+" is valid and denotes a single
+                       // backslash (bug #4468). Therefore we do not allow
+                       // escaping in getArg().
+                       string const arg = p.getArg(delimiter, delimiter, 
false);
                        ostringstream oss;
                        oss << "\\verb" << delimiter << arg << delimiter;
                        handle_ert(os, oss.str(), context);

commit 5afe35cc59d3748df234750294fc4366785b2787
Author: Georg Baum <[email protected]>
Date:   Thu Oct 4 22:29:43 2012 +0200

    Compile tex2lyx before running tests

diff --git a/src/tex2lyx/Makefile.am b/src/tex2lyx/Makefile.am
index 5e65565..1bfb81a 100644
--- a/src/tex2lyx/Makefile.am
+++ b/src/tex2lyx/Makefile.am
@@ -32,7 +32,7 @@ TEST_FILES = \
        test/XeTeX-polyglossia.tex
 
 TESTS = test/runtests.py
-updatetests:
+updatetests: tex2lyx
        $(PYTHON) "$(srcdir)/test/runtests.py" ./tex2lyx ../../../lib/scripts 
"$(srcdir)/test"
 
 LINKED_FILES = \

-----------------------------------------------------------------------

Summary of changes:
 src/tex2lyx/Makefile.am                 |    2 +-
 src/tex2lyx/Parser.cpp                  |   40 +++++++++++++++++--------------
 src/tex2lyx/Parser.h                    |   14 +++++++---
 src/tex2lyx/test/test-insets.lyx.lyx    |   13 ++++++++++
 src/tex2lyx/test/test-insets.tex        |    2 +
 src/tex2lyx/test/test-structure.lyx.lyx |   19 ++++++++++++++-
 src/tex2lyx/test/test-structure.tex     |    1 +
 src/tex2lyx/text.cpp                    |   10 +++++--
 8 files changed, 74 insertions(+), 27 deletions(-)


hooks/post-receive
-- 
The LyX Source Repository

Reply via email to