#include "BufferView.h"
#include "ParagraphParameters.h"
-using std::stringstream;
using std::ostream;
using std::ofstream;
using std::ifstream;
}
+// We'll remove this later. (Lgb)
+namespace {
+
+string last_inset_read;
+
+struct ErtComp
+{
+ ErtComp() : active(false), in_tabular(false) {
+ }
+ string contents;
+ bool active;
+ bool in_tabular;
+};
+
+std::stack<ErtComp> ert_stack;
+ErtComp ert_comp;
+
+
+} // anon
+
+
+int unknown_layouts;
+
// candidate for move to BufferView
// (at least some parts in the beginning of the func)
//
// Returns false if "\the_end" is not read for formats >= 2.13. (Asger)
bool Buffer::readLyXformat2(LyXLex & lex, Paragraph * par)
{
+ unknown_layouts = 0;
+#ifdef NO_LATEX
+ ert_comp.contents.erase();
+ ert_comp.active = false;
+ ert_comp.in_tabular = false;
+#endif
+
int pos = 0;
Paragraph::depth_type depth = 0;
bool the_end_read = false;
- Paragraph * return_par = 0;
+ Paragraph * first_par = 0;
LyXFont font(LyXFont::ALL_INHERIT, params.language);
if (file_format < 216 && params.language->lang() == "hebrew")
font.setLanguage(default_language);
- // If we are inserting, we cheat and get a token in advance
- bool has_token = false;
- string pretoken;
if (!par) {
par = new Paragraph;
} else {
// We are inserting into an existing document
users->text->breakParagraph(users);
- return_par = users->text->firstParagraph();
+ first_par = users->text->firstParagraph();
pos = 0;
markDirty();
// We don't want to adopt the parameters from the
// document we insert, so we skip until the text begins:
while (lex.IsOK()) {
lex.nextToken();
- pretoken = lex.GetString();
+ string const pretoken = lex.GetString();
if (pretoken == "\\layout") {
- has_token = true;
+ lex.pushToken(pretoken);
break;
}
}
}
while (lex.IsOK()) {
- if (has_token) {
- has_token = false;
- } else {
- lex.nextToken();
- pretoken = lex.GetString();
- }
+ lex.nextToken();
+ string const token = lex.GetString();
- if (pretoken.empty()) continue;
+ if (token.empty()) continue;
+
+ lyxerr[Debug::PARSER] << "Handling token: `"
+ << token << "'" << endl;
the_end_read =
- parseSingleLyXformat2Token(lex, par, return_par,
- pretoken, pos, depth,
- font
- );
+ parseSingleLyXformat2Token(lex, par, first_par,
+ token, pos, depth,
+ font);
}
- if (!return_par)
- return_par = par;
+ if (!first_par)
+ first_par = par;
- paragraph = return_par;
-
- return the_end_read;
-}
+ paragraph = first_par;
+ if (unknown_layouts > 0) {
+ string s = _("Couldn't set the layout for ");
+ if (unknown_layouts == 1) {
+ s += _("one paragraph");
+ } else {
+ s += tostr(unknown_layouts);
+ s += _(" paragraphs");
+ }
+ WriteAlert(_("Textclass Loading Error!"), s,
+ _("When reading " + fileName()));
+ }
-// We'll remove this later. (Lgb)
-namespace {
-
-string last_inset_read;
-string inset_ert_contents;
-bool ert_active = false;
-
-} // anon
+ return the_end_read;
+}
void Buffer::insertErtContents(Paragraph * par, int & pos,
LyXFont const & font, bool set_inactive)
{
- if (!inset_ert_contents.empty()) {
+ if (!ert_comp.contents.empty()) {
lyxerr[Debug::INSETS] << "ERT contents:\n"
- << inset_ert_contents << endl;
- Inset * inset = new InsetERT(inset_ert_contents);
+ << ert_comp.contents << endl;
+ Inset * inset = new InsetERT(ert_comp.contents);
par->insertInset(pos++, inset, font);
- inset_ert_contents.erase();
+ ert_comp.contents.erase();
}
if (set_inactive) {
- ert_active = false;
+ ert_comp.active = false;
}
}
bool
Buffer::parseSingleLyXformat2Token(LyXLex & lex, Paragraph *& par,
- Paragraph *& return_par,
+ Paragraph *& first_par,
string const & token, int & pos,
Paragraph::depth_type & depth,
LyXFont & font
if (token[0] != '\\') {
#ifdef NO_LATEX
- if (ert_active) {
- inset_ert_contents += token;
+ if (ert_comp.active) {
+ ert_comp.contents += token;
} else {
#endif
for (string::const_iterator cit = token.begin();
++pos;
} else if (token == "\\layout") {
#ifdef NO_LATEX
+ ert_comp.in_tabular = false;
// Do the insetert.
insertErtContents(par, pos, font);
#endif
#ifdef NO_LATEX
if (compare_no_case(layoutname, "latex") == 0) {
- ert_active = true;
+ ert_comp.active = true;
}
#endif
#ifdef USE_CAPTION
++pos;
} else {
#endif
- if (!return_par)
- return_par = par;
+ if (!first_par)
+ first_par = par;
else {
par = new Paragraph(par);
}
// layout not found
// use default layout "Standard" (0)
par->layout = 0;
+ ++unknown_layouts;
+ string const s = _("Layout had to be changed from\n")
+ + layoutname + _(" to ")
+ + textclasslist.NameOfLayout(params.textclass, par->layout);
+ InsetError * new_inset = new InsetError(s);
+ par->insertInset(0, new_inset);
}
// Test whether the layout is obsolete.
LyXLayout const & layout =
}
// Small hack so that files written with klyx will be
// parsed correctly.
- if (return_par) {
+ if (first_par) {
par->params().spacing(Spacing(tmp_space, tmp_val));
} else {
params.spacing.set(tmp_space, tmp_val);
// Do the insetert.
insertErtContents(par, pos, font);
} else if (tok == "latex") {
- ert_active = true;
+ ert_comp.active = true;
} else if (tok == "default") {
// Do the insetert.
insertErtContents(par, pos, font);
// But insets should read it, it is a part of
// the inset isn't it? Lgb.
} else if (token == "\\begin_inset") {
+#ifdef NO_LATEX
+ insertErtContents(par, pos, font, false);
+ ert_stack.push(ert_comp);
+ ert_comp = ErtComp();
+#endif
readInset(lex, par, pos, font);
+#ifdef NO_LATEX
+ ert_comp = ert_stack.top();
+ ert_stack.pop();
+#endif
} else if (token == "\\SpecialChar") {
LyXLayout const & layout =
textclasslist.Style(params.textclass,
++pos;
} else if (token == "\\newline") {
#ifdef NO_LATEX
- // Since we cannot know it this is only a regular newline or a
- // tabular cell delimter we have to handle the ERT here.
- insertErtContents(par, pos, font, false);
-#endif
+
+ if (!ert_comp.in_tabular && ert_comp.active) {
+ ert_comp.contents += char(Paragraph::META_NEWLINE);
+ } else {
+ // Since we cannot know it this is only a regular
+ // newline or a tabular cell delimter we have to
+ // handle the ERT here.
+ insertErtContents(par, pos, font, false);
+
+ par->insertChar(pos, Paragraph::META_NEWLINE, font);
+ ++pos;
+ }
+#else
par->insertChar(pos, Paragraph::META_NEWLINE, font);
++pos;
+#endif
} else if (token == "\\LyXTable") {
+#ifdef NO_LATEX
+ ert_comp.in_tabular = true;
+#endif
Inset * inset = new InsetTabular(*this);
inset->read(this, lex);
par->insertInset(pos, inset, font);
par->bibkey->read(this, lex);
} else if (token == "\\backslash") {
#ifdef NO_LATEX
- if (ert_active) {
- inset_ert_contents += "\\";
+ if (ert_comp.active) {
+ ert_comp.contents += "\\";
} else {
#endif
par->insertChar(pos, '\\', font);
minipar = parBeforeMinipage = 0;
} else {
#ifdef NO_LATEX
- if (ert_active) {
- inset_ert_contents += token;
+ if (ert_comp.active) {
+ ert_comp.contents += token;
} else {
#endif
// This should be insurance for the future: (Asger)
par->previous(0);
parBeforeMinipage = p;
minipar = par;
- if (!return_par || (return_par == par))
- return_par = p;
+ if (!first_par || (first_par == par))
+ first_par = p;
InsetMinipage * mini = new InsetMinipage;
mini->pos(static_cast<InsetMinipage::Position>(minipar->params().pextraAlignment()));
if (c == Paragraph::META_INSET) {
Inset * inset = par->getInset(i);
- std::ostringstream ost;
+ ostringstream ost;
inset->docBook(this, ost);
string tmp_out = ost.str().c_str();
}
return 0;
}
+
+
+Paragraph * Buffer::getParFromID(int id) const
+{
+ if (id < 0) return 0;
+ Paragraph * par = paragraph;
+ while (par) {
+ if (par->id() == id) {
+ return par;
+ }
+ Paragraph * tmp = par->getParFromID(id);
+ if (tmp) {
+ return tmp;
+ }
+ par = par->next();
+ }
+ return 0;
+}