#include "BufferView.h"
#include "ParagraphParameters.h"
-using std::stringstream;
using std::ostream;
using std::ofstream;
using std::ifstream;
namespace {
-const int LYX_FORMAT = 218;
+const int LYX_FORMAT = 220;
} // namespace anon
}
+// 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 {
+ return the_end_read;
+}
-string last_inset_read;
-} // anon
+void Buffer::insertErtContents(Paragraph * par, int & pos,
+ LyXFont const & font, bool set_inactive)
+{
+ if (!ert_comp.contents.empty()) {
+ lyxerr[Debug::INSETS] << "ERT contents:\n"
+ << ert_comp.contents << endl;
+ Inset * inset = new InsetERT(ert_comp.contents);
+ par->insertInset(pos++, inset, font);
+ ert_comp.contents.erase();
+ }
+ if (set_inactive) {
+ 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
#endif
if (token[0] != '\\') {
+#ifdef NO_LATEX
+ if (ert_comp.active) {
+ ert_comp.contents += token;
+ } else {
+#endif
for (string::const_iterator cit = token.begin();
cit != token.end(); ++cit) {
par->insertChar(pos, (*cit), font);
++pos;
}
checkminipage = true;
+#ifdef NO_LATEX
+ }
+#endif
} else if (token == "\\i") {
Inset * inset = new InsetLatexAccent;
- inset->Read(this, lex);
+ inset->read(this, lex);
par->insertInset(pos, inset, font);
++pos;
} else if (token == "\\layout") {
+#ifdef NO_LATEX
+ ert_comp.in_tabular = false;
+ // Do the insetert.
+ insertErtContents(par, pos, font);
+#endif
lex.EatLine();
string const layoutname = lex.GetString();
pair<bool, LyXTextClass::LayoutList::size_type> pp
= textclasslist.NumberOfLayout(params.textclass,
layoutname);
+#ifdef NO_LATEX
+ if (compare_no_case(layoutname, "latex") == 0) {
+ ert_comp.active = true;
+ }
+#endif
#ifdef USE_CAPTION
// The is the compability reading of layout caption.
// It can be removed in LyX version 1.3.0. (Lgb)
++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 =
istringstream istr(old_float.str());
LyXLex nylex(0, 0);
nylex.setStream(istr);
- inset->Read(this, nylex);
+ inset->read(this, nylex);
par->insertInset(pos, inset, font);
++pos;
} else if (token == "\\begin_deeper") {
}
// 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);
} else if (token == "\\size") {
lex.next();
font.setLyXSize(lex.GetString());
+#ifndef NO_LATEX
+#ifdef WITH_WARNINGS
+#warning compatability hack needed
+#endif
} else if (token == "\\latex") {
lex.next();
string const tok = lex.GetString();
else
lex.printError("Unknown LaTeX font flag "
"`$$Token'");
+#else
+ } else if (token == "\\latex") {
+ lex.next();
+ string const tok = lex.GetString();
+ if (tok == "no_latex") {
+ // Do the insetert.
+ insertErtContents(par, pos, font);
+ } else if (tok == "latex") {
+ ert_comp.active = true;
+ } else if (tok == "default") {
+ // Do the insetert.
+ insertErtContents(par, pos, font);
+ } else {
+ lex.printError("Unknown LaTeX font flag "
+ "`$$Token'");
+ }
+#endif
} else if (token == "\\lang") {
lex.next();
string const tok = lex.GetString();
// 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,
}
} else {
Inset * inset = new InsetSpecialChar;
- inset->Read(this, lex);
+ inset->read(this, lex);
par->insertInset(pos, inset, font);
}
++pos;
} else if (token == "\\newline") {
+#ifdef NO_LATEX
+
+ 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);
+ inset->read(this, lex);
par->insertInset(pos, inset, font);
++pos;
// because of OLD_TABULAR_READ where tabulars have been
InsetCommandParams p("bibitem", "dummy");
par->bibkey = new InsetBibKey(p);
}
- par->bibkey->Read(this, lex);
+ par->bibkey->read(this, lex);
} else if (token == "\\backslash") {
+#ifdef NO_LATEX
+ if (ert_comp.active) {
+ ert_comp.contents += "\\";
+ } else {
+#endif
par->insertChar(pos, '\\', font);
++pos;
+#ifdef NO_LATEX
+ }
+#endif
} else if (token == "\\the_end") {
+#ifdef NO_LATEX
+ // If we still have some ert active here we have to insert
+ // it so we don't loose it. (Lgb)
+ insertErtContents(par, pos, font);
+#endif
the_end_read = true;
minipar = parBeforeMinipage = 0;
} else {
+#ifdef NO_LATEX
+ if (ert_comp.active) {
+ ert_comp.contents += token;
+ } else {
+#endif
// This should be insurance for the future: (Asger)
lex.printError("Unknown token `$$Token'. "
"Inserting as text.");
par->insertChar(pos, (*cit), font);
++pos;
}
+#ifdef NO_LATEX
+ }
+#endif
}
#ifndef NO_PEXTRA_REALLY
// now check if we have a minipage paragraph as at this
lyxerr << "WP:" << mini->width() << endl;
mini->width(tostr(par->params().pextraWidthp())+"%");
}
- mini->inset.par = par;
+ mini->inset.paragraph(par);
// Insert the minipage last in the
// previous paragraph.
if (par->params().pextraHfill()) {
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()));
lyxerr << "WP:" << mini->width() << endl;
mini->width(tostr(par->params().pextraWidthp())+"%");
}
- mini->inset.par = minipar;
+ mini->inset.paragraph(minipar);
// Insert the minipage last in the
// previous paragraph.
// test the different insets
if (tmptok == "LatexCommand") {
InsetCommandParams inscmd;
- inscmd.Read(lex);
+ inscmd.read(lex);
string const cmdName = inscmd.getCmdName();
inset = new InsetFloatList;
}
- if (inset) inset->Read(this, lex);
+ if (inset) inset->read(this, lex);
}
if (inset) {
} else {
lyxerr << "Should this ever happen?" << endl;
}
-
+
+#ifndef NO_LATEX
LyXFont const font1 = LyXFont(LyXFont::ALL_INHERIT, params.language);
+#endif
for (Paragraph::size_type i = 0; i < par->size(); ++i) {
if (!i && !noparbreak) {
if (linelen > 0)
currlinelen += (ltype_depth-depth)*2;
}
}
+#ifndef NO_LATEX
LyXFont const font2 = par->getFontSettings(params, i);
if (font1.latex() != font2.latex()) {
if (font2.latex() == LyXFont::OFF)
} else {
islatex = 0;
}
+#endif
char c = par->getUChar(params, i);
if (islatex)
{
Inset const * inset = par->getInset(i);
if (inset) {
- if (!inset->Ascii(this, buffer)) {
+ if (!inset->ascii(this, buffer)) {
string dummy;
string const s =
rsplit(buffer.str().c_str(),
} else if (c != '\0')
buffer << c;
else if (c == '\0')
- lyxerr.debug() << "writeAsciiFile: NULL char in structure." << endl;
+ lyxerr[Debug::INFO] << "writeAsciiFile: NULL char in structure." << endl;
++currlinelen;
break;
}
texrow.newline();
texrow.newline();
}
- lyxerr.debug() << "lyx header finished" << endl;
+ lyxerr[Debug::INFO] << "lyx header finished" << endl;
// There are a few differences between nice LaTeX and usual files:
// usual is \batchmode and has a
// special input@path to allow the including of figures
ofs << "\\begin{document}\n";
texrow.newline();
} // only_body
- lyxerr.debug() << "preamble finished, now the body." << endl;
+ lyxerr[Debug::INFO] << "preamble finished, now the body." << endl;
if (!lyxrc.language_auto_begin) {
ofs << subst(lyxrc.language_command_begin, "$$lang",
lyxerr << "File was not closed properly." << endl;
}
- lyxerr.debug() << "Finished making latex file." << endl;
+ lyxerr[Debug::INFO] << "Finished making latex file." << endl;
}
string const & latexname) const
{
if (!latexname.empty() && latexname != "!-- --")
- os << string(depth, ' ') << "<" << latexname << ">\n";
+ os << "<!-- " << depth << " -->" << "<" << latexname << ">";
+ //os << string(depth, ' ') << "<" << latexname << ">\n";
}
string const & latexname) const
{
if (!latexname.empty() && latexname != "!-- --")
- os << string(depth, ' ') << "</" << latexname << ">\n";
+ os << "<!-- " << depth << " -->" << "</" << latexname << ">\n";
+ //os << string(depth, ' ') << "</" << latexname << ">\n";
}
// treat <toc> as a special case for compatibility with old code
if (par->getChar(0) == Paragraph::META_INSET) {
Inset * inset = par->getInset(0);
- Inset::Code lyx_code = inset->LyxCode();
+ Inset::Code lyx_code = inset->lyxCode();
if (lyx_code == Inset::TOC_CODE){
string const temp = "toc";
sgmlOpenTag(ofs, depth, temp);
case LATEX_COMMAND:
if (depth!= 0)
- LinuxDocError(par, 0,
+ linuxDocError(par, 0,
_("Error : Wrong depth for"
" LatexType Command.\n"));
break;
}
- SimpleLinuxDocOnePar(ofs, par, depth);
+ simpleLinuxDocOnePar(ofs, par, depth);
par = par->next();
}
-void Buffer::DocBookHandleCaption(ostream & os, string & inner_tag,
+void Buffer::docBookHandleCaption(ostream & os, string & inner_tag,
Paragraph::depth_type depth, int desc_on,
Paragraph * & par)
{
"Caption").second) {
sgmlOpenTag(os, depth + 1, inner_tag);
string extra_par;
- SimpleDocBookOnePar(os, extra_par, tpar,
+ simpleDocBookOnePar(os, extra_par, tpar,
desc_on, depth + 2);
sgmlCloseTag(os, depth+1, inner_tag);
if (!extra_par.empty())
// Handle internal paragraph parsing -- layout already processed.
-void Buffer::SimpleLinuxDocOnePar(ostream & os,
+void Buffer::simpleLinuxDocOnePar(ostream & os,
Paragraph * par,
Paragraph::depth_type /*depth*/)
{
if (c == Paragraph::META_INSET) {
Inset * inset = par->getInset(i);
- inset->Linuxdoc(this, os);
+ inset->linuxdoc(this, os);
font_old = font;
continue;
}
- if (font.latex() == LyXFont::ON || style.latexparam() == "CDATA") {
+ if (
+#ifndef NO_LATEX
+ font.latex() == LyXFont::ON ||
+#endif
+ style.latexparam() == "CDATA") {
// "TeX"-Mode on == > SGML-Mode on.
if (c != '\0')
os << c;
// Print an error message.
-void Buffer::LinuxDocError(Paragraph * par, int pos,
+void Buffer::linuxDocError(Paragraph * par, int pos,
string const & message)
{
// insert an error marker in text
case LATEX_COMMAND:
if (depth != 0)
- LinuxDocError(par, 0,
+ linuxDocError(par, 0,
_("Error : Wrong depth for "
"LatexType Command.\n"));
// more WYSIWYM handling.
if (par->getChar(0) == Paragraph::META_INSET) {
Inset * inset = par->getInset(0);
- Inset::Code lyx_code = inset->LyxCode();
+ Inset::Code lyx_code = inset->lyxCode();
if (lyx_code == Inset::LABEL_CODE){
command_name += " id=\"";
command_name += (static_cast<InsetCommand *>(inset))->getContents();
}
string extra_par;
- SimpleDocBookOnePar(ofs, extra_par, par, desc_on,
+ simpleDocBookOnePar(ofs, extra_par, par, desc_on,
depth + 1 + command_depth);
par = par->next();
}
-void Buffer::SimpleDocBookOnePar(ostream & os, string & extra,
+void Buffer::simpleDocBookOnePar(ostream & os, string & extra,
Paragraph * par, int & desc_on,
Paragraph::depth_type depth) const
{
LyXFont font_old = style.labeltype == LABEL_MANUAL ? style.labelfont : style.font;
int char_line_count = depth;
- if (!style.free_spacing)
- os << string(depth,' ');
+ //if (!style.free_spacing)
+ // os << string(depth,' ');
// parsing main loop
for (Paragraph::size_type i = 0;
if (c == Paragraph::META_INSET) {
Inset * inset = par->getInset(i);
- std::ostringstream ost;
- inset->DocBook(this, ost);
+ ostringstream ost;
+ inset->docBook(this, ost);
string tmp_out = ost.str().c_str();
//
else
os << tmp_out;
}
+#ifndef NO_LATEX
} else if (font.latex() == LyXFont::ON) {
// "TeX"-Mode on ==> SGML-Mode on.
if (c != '\0')
os << c;
++char_line_count;
+#endif
} else {
string sgml_string;
if (par->linuxDocConvertChar(c, sgml_string)
// <term> not closed...
os << "</term>";
}
- os << '\n';
+ if(style.free_spacing) os << '\n';
}
{
if (!users->text) return 0;
- ProhibitInput(users);
+ users->owner()->prohibitInput();
// get LaTeX-Filename
string const name = getLatexName();
users->redraw();
users->fitCursor(users->text);
}
- AllowInput(users);
+ users->owner()->allowInput();
return res;
}
string lst;
for (inset_iterator it = inset_iterator_begin();
it != inset_iterator_end(); ++it) {
- if ((*it)->LyxCode() == Inset::INCLUDE_CODE) {
+ if ((*it)->lyxCode() == Inset::INCLUDE_CODE) {
InsetInclude * insetinc =
static_cast<InsetInclude *>(*it);
if (insetinc->isIncludeOnly()) {
}
}
}
- lyxerr.debug() << "Includeonly(" << lst << ')' << endl;
+ lyxerr[Debug::INFO] << "Includeonly(" << lst << ')' << endl;
return lst;
}
par->inset_iterator_end();
for (; it != end; ++it) {
- if ((*it)->LyxCode() == Inset::FLOAT_CODE) {
+ if ((*it)->lyxCode() == Inset::FLOAT_CODE) {
InsetFloat * il =
static_cast<InsetFloat*>(*it);
// Now find the caption in the float...
// We now tranverse the paragraphs of
// the inset...
- Paragraph * tmp = il->inset.par;
+ Paragraph * tmp = il->inset.paragraph();
while (tmp) {
if (tmp->layout == cap) {
SingleList & item = l[type];
for (inset_iterator it = inset_iterator_begin();
it != inset_iterator_end(); ++it) {
// Search for Bibtex or Include inset
- if ((*it)->LyxCode() == Inset::BIBTEX_CODE) {
+ if ((*it)->lyxCode() == Inset::BIBTEX_CODE) {
vector<pair<string,string> > tmp =
static_cast<InsetBibtex*>(*it)->getKeys(this);
keys.insert(keys.end(), tmp.begin(), tmp.end());
- } else if ((*it)->LyxCode() == Inset::INCLUDE_CODE) {
+ } else if ((*it)->lyxCode() == Inset::INCLUDE_CODE) {
vector<pair<string,string> > const tmp =
static_cast<InsetInclude*>(*it)->getKeys();
keys.insert(keys.end(), tmp.begin(), tmp.end());
}
-bool Buffer::Dispatch(string const & command)
+bool Buffer::dispatch(string const & command)
{
// Split command string into command and argument
string cmd;
string line = frontStrip(command);
string const arg = strip(frontStrip(split(line, cmd, ' ')));
- return Dispatch(lyxaction.LookupFunc(cmd), arg);
+ return dispatch(lyxaction.LookupFunc(cmd), arg);
}
-bool Buffer::Dispatch(int action, string const & argument)
+bool Buffer::dispatch(int action, string const & argument)
{
bool dispatched = true;
switch (action) {
}
-void Buffer::ChangeLanguage(Language const * from, Language const * to)
+void Buffer::changeLanguage(Language const * from, Language const * to)
{
Paragraph * par = paragraph;
it = par->InsetIterator(pos);
if (it == par->inset_iterator_end()) {
par = par->next();
- SetParagraph();
+ setParagraph();
}
}
-void Buffer::inset_iterator::SetParagraph()
+void Buffer::inset_iterator::setParagraph()
{
while (par) {
it = par->inset_iterator_begin();
//it = 0;
// We maintain an invariant that whenever par = 0 then it = 0
}
+
+
+Inset * Buffer::getInsetFromID(int id_arg) const
+{
+ for (inset_iterator it = inset_const_iterator_begin();
+ it != inset_const_iterator_end(); ++it)
+ {
+ if ((*it)->id() == id_arg)
+ return *it;
+ Inset * in = (*it)->getInsetFromID(id_arg);
+ if (in)
+ return in;
+ }
+ 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;
+}