]> git.lyx.org Git - lyx.git/blobdiff - src/tex2lyx/context.C
* funcrequest.C: initialize button_ member
[lyx.git] / src / tex2lyx / context.C
index 7bb967d1113f5d8aeda62eab3a3564b48374178f..1558da7e282076cdac5f367c536047fc78afce5a 100644 (file)
@@ -9,11 +9,39 @@
 using std::ostream;
 using std::endl;
 
+namespace {
+
+void begin_layout(ostream & os, LyXLayout_ptr layout)
+{
+       os << "\n\\begin_layout " << layout->name() << "\n\n";
+}
+
+
+void end_layout(ostream & os)
+{
+       os << "\n\\end_layout\n";
+}
+
+
+void begin_deeper(ostream & os)
+{
+       os << "\n\\begin_deeper \n";
+}
+
+
+void end_deeper(ostream & os)
+{
+       os << "\n\\end_deeper \n";
+}
+       
+}
+
 Context::Context(bool need_layout_,
                 LyXTextClass const & textclass_,
                 LyXLayout_ptr layout_, LyXLayout_ptr parent_layout_)
        : need_layout(need_layout_),
          need_end_layout(false), need_end_deeper(false),
+         has_item(false), deeper_paragraph(false),
          textclass(textclass_),
          layout(layout_), parent_layout(parent_layout_)
 {
@@ -28,13 +56,38 @@ void Context::check_layout(ostream & os)
 {
        if (need_layout) {
                check_end_layout(os);
-               
-               os << "\n\\begin_layout " << layout->name() << "\n\n";
-               need_layout=false;
-               need_end_layout = true;
-               if (!extra_stuff.empty()) {
-                       os << extra_stuff;
-                       extra_stuff.erase();
+
+               // are we in a list-like environment?
+               if (layout->isEnvironment()
+                   && layout->latextype != LATEX_ENVIRONMENT) {
+                       if (has_item) {
+                               if (deeper_paragraph) {
+                                       end_deeper(os);
+                                       deeper_paragraph = false;
+                               }
+                               begin_layout(os, layout);
+                               has_item = false;
+                               need_layout=false;
+                               need_end_layout = true;
+                       } else {
+                               // a standard paragraph in an
+                               // enumeration. We have to recognize
+                               // that this may require a begin_deeper.
+                               if (!deeper_paragraph)
+                                       begin_deeper(os);
+                               begin_layout(os, textclass.defaultLayout());
+                               need_layout=false;
+                               need_end_layout = true;
+                               deeper_paragraph = true;
+                       }
+               } else {
+                       begin_layout(os, layout);
+                       need_layout=false;
+                       need_end_layout = true;
+                       if (!extra_stuff.empty()) {
+                               os << extra_stuff;
+                               extra_stuff.erase();
+                       }
                }
        }
 }
@@ -42,8 +95,8 @@ void Context::check_layout(ostream & os)
 
 void Context::check_end_layout(ostream & os) 
 {
-       if (need_end_layout) {
-               os << "\n\\end_layout\n";
+       if (need_end_layout) {          
+               end_layout(os);
                need_end_layout = false;
        }
 }
@@ -53,11 +106,10 @@ void Context::check_deeper(ostream & os)
 {
        if (parent_layout->isEnvironment()) {
                if (need_end_deeper) {
-                               // no need to have \end_deeper \begin_deeper
-// FIXME: This does not work because \par already calls check_end_layout
+                       // no need to have \end_deeper \begin_deeper
                        need_end_deeper = false;
                } else {
-                       os << "\n\\begin_deeper \n";
+                       begin_deeper(os);
                        need_end_deeper = true;
                }
        } else
@@ -68,9 +120,13 @@ void Context::check_deeper(ostream & os)
 void Context::check_end_deeper(ostream & os) 
 {
        if (need_end_deeper) {
-               os << "\n\\end_deeper \n";
+               end_deeper(os);
                need_end_deeper = false;
        }
+       if (deeper_paragraph) {
+               end_deeper(os);
+               deeper_paragraph = false;
+       }
 }