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_)
{
{
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();
+ }
}
}
}
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;
}
}
{
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
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;
+ }
}