]> git.lyx.org Git - lyx.git/blobdiff - src/tex2lyx/Context.cpp
tex2lyx: support all MoreOpts
[lyx.git] / src / tex2lyx / Context.cpp
index 94bb4668fc5ff6f2677967efec58eedcd55a61d0..f214f770ee466a39c5803c2ad278f61caa6d8724 100644 (file)
 
 #include <config.h>
 
-#include <iostream>
-
-#include "support/lstrings.h"
 #include "Context.h"
+#include "Layout.h"
 
+#include "support/lstrings.h"
 
-namespace lyx {
+#include <iostream>
 
-using std::ostream;
-using std::endl;
-using std::string;
+using namespace std;
+using namespace lyx::support;
 
+namespace lyx {
 
 namespace {
 
-void begin_layout(ostream & os, Layout_ptr layout, TeXFont const & font,
-                 TeXFont const & normalfont)
-{
-       os << "\n\\begin_layout " << to_utf8(layout->name()) << "\n";
-       // FIXME: This is not enough for things like
-       // \\Huge par1 \\par par2
-       output_font_change(os, normalfont, font);
-}
-
-
 void end_layout(ostream & os)
 {
        os << "\n\\end_layout\n";
@@ -52,7 +41,7 @@ void end_deeper(ostream & os)
        os << "\n\\end_deeper";
 }
 
-}
+} // namespace
 
 
 bool operator==(TeXFont const & f1, TeXFont const & f2)
@@ -61,7 +50,8 @@ bool operator==(TeXFont const & f1, TeXFont const & f2)
                f1.size == f2.size &&
                f1.family == f2.family &&
                f1.series == f2.series &&
-               f1.shape == f2.shape;
+               f1.shape == f2.shape &&
+               f1.language == f2.language;
 }
 
 
@@ -76,6 +66,8 @@ void output_font_change(ostream & os, TeXFont const & oldfont,
                os << "\n\\shape " << newfont.shape << '\n';
        if (oldfont.size != newfont.size)
                os << "\n\\size " << newfont.size << '\n';
+       if (oldfont.language != newfont.language)
+               os << "\n\\lang " << newfont.language << '\n';
 }
 
 
@@ -84,28 +76,48 @@ bool Context::empty = true;
 
 
 Context::Context(bool need_layout_,
-                TextClass const & textclass_,
-                Layout_ptr layout_, Layout_ptr parent_layout_,
-                TeXFont font_)
+                TeX2LyXDocClass const & textclass_,
+                Layout const * layout_, Layout const * parent_layout_,
+                TeXFont const & font_)
        : need_layout(need_layout_),
          need_end_layout(false), need_end_deeper(false),
-         has_item(false), deeper_paragraph(false),
-         new_layout_allowed(true), textclass(textclass_),
+         has_item(false), in_list_preamble(false), deeper_paragraph(false),
+         new_layout_allowed(true), merging_hyphens_allowed(true),
+         textclass(textclass_),
          layout(layout_), parent_layout(parent_layout_),
-         font(font_)
+         font(font_), tablerotation(0)
 {
-       if (!layout.get())
-               layout = textclass.defaultLayout();
-       if (!parent_layout.get())
-               parent_layout = textclass.defaultLayout();
+       if (!layout)
+               layout = &textclass.defaultLayout();
+       if (!parent_layout)
+               parent_layout = &textclass.defaultLayout();
 }
 
 
 Context::~Context()
 {
-       if (!extra_stuff.empty())
-               std::cerr << "Bug: Ignoring extra stuff '" << extra_stuff
-                         << '\'' << std::endl;
+       if (!par_extra_stuff.empty())
+               cerr << "Bug: Ignoring par-level extra stuff '"
+                    << par_extra_stuff << '\'' << endl;
+}
+
+
+void Context::begin_layout(ostream & os, Layout const * const & l)
+{
+       os << "\n\\begin_layout " << to_utf8(l->name()) << "\n";
+       if (!extra_stuff.empty()) {
+               os << extra_stuff;
+       }
+       if (!par_extra_stuff.empty()) {
+               os << par_extra_stuff;
+               par_extra_stuff.erase();
+       }
+       // FIXME: This is not enough for things like
+       // \\Huge par1 \\par par2
+       // FIXME: If the document language is not english this outputs a
+       // superflous language change. Fortunately this is only file format
+       // bloat and does not change the TeX export of LyX.
+       output_font_change(os, normalfont, font);
 }
 
 
@@ -125,29 +137,23 @@ void Context::check_layout(ostream & os)
                                        end_deeper(os);
                                        deeper_paragraph = false;
                                }
-                               begin_layout(os, layout, font, normalfont);
+                               begin_layout(os, layout);
                                has_item = false;
                        } else {
-                               // a standard paragraph in an
-                               // enumeration. We have to recognize
-                               // that this may require a begin_deeper.
+                               // A standard paragraph in a list.
+                               // We have to recognize that this
+                               // may require a begin_deeper.
                                if (!deeper_paragraph)
                                        begin_deeper(os);
-                               begin_layout(os, textclass.defaultLayout(),
-                                            font, normalfont);
+                               begin_layout(os, &textclass.defaultLayout());
                                deeper_paragraph = true;
                        }
                } else {
                        // No list-like environment
-                       begin_layout(os, layout, font, normalfont);
+                       begin_layout(os, layout);
                }
                need_layout = false;
                need_end_layout = true;
-               if (!extra_stuff.empty()) {
-                       os << extra_stuff;
-                       extra_stuff.erase();
-               }
-               os << "\n";
                empty = false;
        }
 }
@@ -206,13 +212,20 @@ void Context::new_paragraph(ostream & os)
 }
 
 
-void Context::add_extra_stuff(std::string const & stuff)
+void Context::add_extra_stuff(string const & stuff)
 {
-       if (!lyx::support::contains(extra_stuff, stuff))
+       if (!contains(extra_stuff, stuff))
                extra_stuff += stuff;
 }
 
 
+void Context::add_par_extra_stuff(string const & stuff)
+{
+       if (!contains(par_extra_stuff, stuff))
+               par_extra_stuff += stuff;
+}
+
+
 void Context::dump(ostream & os, string const & desc) const
 {
        os << "\n" << desc <<" [";
@@ -228,8 +241,14 @@ void Context::dump(ostream & os, string const & desc) const
                os << "deeper_paragraph ";
        if (new_layout_allowed)
                os << "new_layout_allowed ";
+       if (merging_hyphens_allowed)
+               os << "merging_hyphens_allowed ";
        if (!extra_stuff.empty())
                os << "extrastuff=[" << extra_stuff << "] ";
+       if (!par_extra_stuff.empty())
+               os << "parextrastuff=[" << par_extra_stuff << "] ";
+       if (!list_extra_stuff.empty())
+               os << "listextrastuff=[" << list_extra_stuff << "] ";
        os << "textclass=" << textclass.name()
           << " layout=" << to_utf8(layout->name())
           << " parent_layout=" << to_utf8(parent_layout->name()) << "] font=["