]> git.lyx.org Git - lyx.git/blobdiff - src/tex2lyx/text.cpp
Fix #10778 (issue with CJK and language nesting)
[lyx.git] / src / tex2lyx / text.cpp
index ffeac41df38aa090b987458f3036a3d1285f5fc7..ce330a2b9ffe97a21a1c0da1ac0093632469fdd6 100644 (file)
@@ -127,7 +127,6 @@ string parse_text_snippet(Parser & p, unsigned flags, const bool outer,
 string fboxrule = "";
 string fboxsep = "";
 string shadow_size = "";
-bool wasBoxAlign = false;
 
 char const * const known_ref_commands[] = { "ref", "pageref", "vref",
  "vpageref", "prettyref", "nameref", "eqref", 0 };
@@ -314,7 +313,7 @@ char const * const known_tipa_marks[] = {"textsubwedge", "textsubumlaut",
 "textovercross", "textsubarch", "textsuperimposetilde", "textraising",
 "textlowering", "textadvancing", "textretracting", "textdoublegrave",
 "texthighrise", "textlowrise", "textrisefall", "textsyllabic",
-"textsubring", 0};
+"textsubring", "textsubbar", 0};
 
 /// TIPA tones that need special handling
 char const * const known_tones[] = {"15", "51", "45", "12", "454", 0};
@@ -522,8 +521,8 @@ docstring convert_unicodesymbols(docstring s)
                bool termination;
                docstring rem;
                set<string> req;
-               docstring parsed = encodings.fromLaTeXCommand(s,
-                               Encodings::TEXT_CMD, termination, rem, &req);
+               docstring parsed = normalize_c(encodings.fromLaTeXCommand(s,
+                               Encodings::TEXT_CMD, termination, rem, &req));
                set<string>::const_iterator it = req.begin();
                set<string>::const_iterator en = req.end();
                for (; it != en; ++it)
@@ -581,6 +580,16 @@ void output_ert_inset(ostream & os, string const & s, Context & context)
 }
 
 
+void output_comment(Parser & p, ostream & os, string const & s,
+                    Context & context)
+{
+       if (p.next_token().cat() == catNewline)
+               output_ert_inset(os, '%' + s, context);
+       else
+               output_ert_inset(os, '%' + s + '\n', context);
+}
+
+
 Layout const * findLayout(TextClass const & textclass, string const & name, bool command)
 {
        Layout const * layout = findLayoutWithoutModule(textclass, name, command);
@@ -1023,37 +1032,6 @@ void parse_box(Parser & p, ostream & os, unsigned outer_flags,
                p.popPosition();
        }
 
-       // try to determine the box content alignment
-       // first handle the simple case of "{\centering..."
-       if (p.next_token().asInput() == "\\raggedright") {
-               wasBoxAlign = true;
-               hor_pos = "l";
-       } else if (p.next_token().asInput() == "\\centering") {
-               wasBoxAlign = true;
-               hor_pos = "c";
-       } else if (p.next_token().asInput() == "\\raggedleft") {
-               wasBoxAlign = true;
-               hor_pos = "r";
-       } else {
-               // now handle the cases "{%catNewline\centering..."
-               // and "{catNewline\centering..."
-               p.pushPosition();
-               p.get_token().asInput();
-               if (p.next_token().cat() == catComment || p.next_token().cat() == catNewline)
-                       p.get_token().asInput();
-               if (p.next_token().asInput() == "\\raggedright") {
-                       wasBoxAlign = true;
-                       hor_pos = "l";
-               } else if (p.next_token().asInput() == "\\centering") {
-                       wasBoxAlign = true;
-                       hor_pos = "c";
-               } else if (p.next_token().asInput() == "\\raggedleft") {
-                       wasBoxAlign = true;
-                       hor_pos = "r";
-               }
-               p.popPosition();
-       }
-
        if (use_ert) {
                ostringstream ss;
                if (!outer_type.empty()) {
@@ -1221,13 +1199,13 @@ void parse_box(Parser & p, ostream & os, unsigned outer_flags,
                // LyX puts a % after the end of the minipage
                if (p.next_token().cat() == catNewline && p.next_token().cs().size() > 1) {
                        // new paragraph
-                       //output_ert_inset(os, "%dummy", parent_context);
+                       //output_comment(p, os, "dummy", parent_context);
                        p.get_token();
                        p.skip_spaces();
                        parent_context.new_paragraph(os);
                }
                else if (p.next_token().cat() == catSpace || p.next_token().cat() == catNewline) {
-                       //output_ert_inset(os, "%dummy", parent_context);
+                       //output_comment(p, os, "dummy", parent_context);
                        p.get_token();
                        p.skip_spaces();
                        // We add a protected space if something real follows
@@ -1577,15 +1555,17 @@ void parse_environment(Parser & p, ostream & os, bool outer,
                preamble.registerAutomaticallyLoadedPackage("verbatim");
        }
 
-       else if (name == "verbatim") {
+       else if (unstarred_name == "verbatim") {
                // FIXME: this should go in the generic code that
                // handles environments defined in layout file that
                // have "PassThru 1". However, the code over there is
                // already too complicated for my taste.
+               string const ascii_name =
+                       (name == "verbatim*") ? "Verbatim*" : "Verbatim";
                parent_context.new_paragraph(os);
                Context context(true, parent_context.textclass,
-                               &parent_context.textclass[from_ascii("Verbatim")]);
-               string s = p.verbatimEnvironment("verbatim");
+                               &parent_context.textclass[from_ascii(ascii_name)]);
+               string s = p.verbatimEnvironment(name);
                output_ert(os, s, context);
                p.skip_spaces();
        }
@@ -1912,7 +1892,7 @@ void parse_comment(Parser & p, ostream & os, Token const & t, Context & context)
        LASSERT(t.cat() == catComment, return);
        if (!t.cs().empty()) {
                context.check_layout(os);
-               output_ert_inset(os, '%' + t.cs(), context);
+               output_comment(p, os, t.cs(), context);
                if (p.next_token().cat() == catNewline) {
                        // A newline after a comment line starts a new
                        // paragraph
@@ -2095,7 +2075,6 @@ void copy_file(FileName const & src, string dstname)
                dst = FileName(dstname);
        else
                dst = makeAbsPath(dstname, absParent);
-       string const absMaster = getMasterFilePath(false);
        FileName const srcpath = src.onlyPath();
        FileName const dstpath = dst.onlyPath();
        if (equivalent(srcpath, dstpath))
@@ -2859,8 +2838,8 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                        context.check_layout(os);
                        // FIXME: This is a hack to prevent paragraph
                        // deletion if it is empty. Handle this better!
-                       output_ert_inset(os,
-                               "%dummy comment inserted by tex2lyx to "
+                       output_comment(p, os,
+                               "dummy comment inserted by tex2lyx to "
                                "ensure that this paragraph is not empty",
                                context);
                        // Both measures above may generate an additional
@@ -2934,7 +2913,6 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                        // the syntax is \subfloat[list entry][sub caption]{content}
                        // if it is a table of figure depends on the surrounding float
                        // FIXME: second optional argument is not parsed
-                       bool has_caption = false;
                        p.skip_spaces();
                        // do nothing if there is no outer float
                        if (!float_type.empty()) {
@@ -2946,6 +2924,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                                   << "\nstatus collapsed\n\n";
                                // test for caption
                                string caption;
+                               bool has_caption = false;
                                if (p.next_token().cat() != catEscape &&
                                                p.next_token().character() == '[') {
                                                        p.get_token(); // eat '['
@@ -4309,17 +4288,8 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                                                shadow_size = shadow_size + p.get_token().asInput();
                                }
                        } else {
-                               // we only handle them if they are in a box
-                               if (wasBoxAlign) {
-                                       // LyX will add a space after outputting the
-                                       // alignment command, so eat any space which
-                                       // might follow. Otherwise the paragraph
-                                       // might start with an unneeded space.
-                                       p.skip_spaces(true);
-                               } else
-                                       output_ert_inset(os, t.asInput(), context);
+                               output_ert_inset(os, t.asInput(), context);
                        }
-                       wasBoxAlign = false;
                }
 
                //\framebox() is part of the picture environment and different from \framebox{}
@@ -4787,7 +4757,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                                        // fromLaTeXCommand() does not yet
                                        // recognize tipa short cuts
                                        p.get_token();
-                                       name = "\\b";
+                                       name = "\\textsubbar";
                                } else if (name == "\\textdoublevertline") {
                                        // FIXME: This is not correct,
                                        // \textvertline is higher than \textbardbl
@@ -4854,8 +4824,8 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                        bool termination;
                        docstring rem;
                        set<string> req;
-                       docstring s = encodings.fromLaTeXCommand(from_utf8(name),
-                                       Encodings::TEXT_CMD, termination, rem, &req);
+                       docstring s = normalize_c(encodings.fromLaTeXCommand(from_utf8(name),
+                                       Encodings::TEXT_CMD, termination, rem, &req));
                        if (!s.empty()) {
                                context.check_layout(os);
                                os << to_utf8(s);