X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fbuffer.C;h=f36aa069e7945b6e222e6a48f86cda9988a7a4a4;hb=3df345c9383480f68fad51feae8b9c64425c8729;hp=e4b86df493f3e6a437ff1b312ac76fc7618e1edc;hpb=c779cef938fc3720f4a912ba7356f9ffd9ff3233;p=lyx.git diff --git a/src/buffer.C b/src/buffer.C index e4b86df493..f36aa069e7 100644 --- a/src/buffer.C +++ b/src/buffer.C @@ -4,7 +4,7 @@ * LyX, The Document Processor * * Copyright 1995 Matthias Ettrich - * Copyright 1995-1999 The LyX Team. + * Copyright 1995-2000 The LyX Team. * * This file is Copyright 1996-1999 * Lars Gullik Bjønnes @@ -25,15 +25,11 @@ #include #include -using std::ofstream; -using std::ifstream; -using std::fstream; -using std::ios; -using std::setw; - #include #include +#include +#include #ifdef __GNUG__ #pragma implementation "buffer.h" @@ -60,9 +56,6 @@ using std::setw; #include "insets/inseturl.h" #include "insets/insetinfo.h" #include "insets/insetquotes.h" -#if 0 -#include "insets/insetlatex.h" -#endif #include "insets/insetlatexaccent.h" #include "insets/insetbib.h" #include "insets/insetindex.h" @@ -74,6 +67,11 @@ using std::setw; #include "insets/insetparent.h" #include "insets/insetspecialchar.h" #include "insets/figinset.h" +#include "insets/insettext.h" +//#include "insets/insetnumber.h" +#include "insets/insetert.h" +#include "insets/insetgraphics.h" +#include "insets/insetfoot.h" #include "support/filetools.h" #include "support/path.h" #include "LaTeX.h" @@ -87,6 +85,16 @@ using std::setw; #include "support/FileInfo.h" #include "lyxtext.h" #include "gettext.h" +#include "language.h" + +using std::ostream; +using std::ofstream; +using std::ifstream; +using std::fstream; +using std::ios; +using std::setw; +using std::endl; +using std::pair; // Uncomment this line to enable a workaround for the weird behaviour // of the cursor between a displayed inset and last character @@ -106,14 +114,14 @@ extern void MenuExport(Buffer *, string const &); extern LyXAction lyxaction; -static const float LYX_FORMAT = 2.15; +static const float LYX_FORMAT = 2.16; extern int tex_code_break_column; extern void FreeUpdateTimer(); -Buffer::Buffer(string const & file, LyXRC * lyxrc, bool ronly) +Buffer::Buffer(string const & file, bool ronly) { lyxerr[Debug::INFO] << "Buffer::Buffer()" << endl; filename = file; @@ -127,7 +135,7 @@ Buffer::Buffer(string const & file, LyXRC * lyxrc, bool ronly) read_only = ronly; users = 0; lyxvc.buffer(this); - if (read_only || (lyxrc && lyxrc->use_tempdir)) { + if (read_only || (lyxrc.use_tempdir)) { tmppath = CreateBufferTmpDir(); } else tmppath.clear(); } @@ -159,6 +167,26 @@ Buffer::~Buffer() } +string Buffer::getLatexName(bool no_path /* = true */) const +{ + return ChangeExtension(MakeLatexName(filename), + ".tex", no_path); +} + + +void Buffer::setReadonly(bool flag /* = true */) +{ + if (read_only != flag) { + read_only = flag; + updateTitles(); + updateAllVisibleBufferRelatedPopups(); + } + if (read_only) { + WarnReadonly(filename); + } +} + + bool Buffer::saveParamsAsDefaults() { string fname = AddName(AddPath(user_lyxdir, "templates/"), @@ -177,7 +205,7 @@ bool Buffer::saveParamsAsDefaults() /// Update window titles of all users // Should work on a list -void Buffer::updateTitles() +void Buffer::updateTitles() const { if (users) users->owner()->updateWindowTitle(); } @@ -185,7 +213,7 @@ void Buffer::updateTitles() /// Reset autosave timer of all users // Should work on a list -void Buffer::resetAutosaveTimers() +void Buffer::resetAutosaveTimers() const { if (users) users->owner()->resetAutosaveTimer(); } @@ -200,59 +228,6 @@ void Buffer::fileName(string const & newfile) } -// Inserts a file into current document -bool BufferView::insertLyXFile(string const & filen) - // - // (c) CHT Software Service GmbH - // Uwe C. Schroeder - // - // Insert a Lyxformat - file into current buffer - // - // Moved from lyx_cb.C (Lgb) -{ - if (filen.empty()) return false; - - string fname = MakeAbsPath(filen); - - // check if file exist - FileInfo fi(fname); - - if (!fi.readable()) { - WriteAlert(_("Error!"), - _("Specified file is unreadable: "), - MakeDisplayPath(fname, 50)); - return false; - } - - beforeChange(); - - ifstream ifs(fname.c_str()); - if (!ifs) { - WriteAlert(_("Error!"), - _("Cannot open specified file: "), - MakeDisplayPath(fname, 50)); - return false; - } - LyXLex lex(0, 0); - lex.setStream(ifs); - char c; ifs.get(c); - ifs.putback(c); - - bool res = true; - - if (c == '#') { - lyxerr.debug() << "Will insert file with header" << endl; - res = buffer()->readFile(lex, text->cursor.par); - } else { - lyxerr.debug() << "Will insert file without header" << endl; - res = buffer()->readLyXformat2(lex, text->cursor.par); - } - - resize(); - return res; -} - - // candidate for move to BufferView // (at least some parts in the beginning of the func) // @@ -261,19 +236,20 @@ bool BufferView::insertLyXFile(string const & filen) // if par = 0 normal behavior // else insert behavior // Returns false if "\the_end" is not read for formats >= 2.13. (Asger) +#define USE_PARSE_FUNCTION 1 bool Buffer::readLyXformat2(LyXLex & lex, LyXParagraph * par) { string tmptok; - Inset * inset = 0; int pos = 0; - int tmpret, tmpret2; char depth = 0; // signed or unsigned? LyXParagraph::footnote_flag footnoteflag = LyXParagraph::NO_FOOTNOTE; LyXParagraph::footnote_kind footnotekind = LyXParagraph::FOOTNOTE; bool the_end_read = false; LyXParagraph * return_par = 0; - LyXFont font = LyXFont(LyXFont::ALL_INHERIT); + LyXFont font(LyXFont::ALL_INHERIT,params.language_info); + if (format < 2.16 && params.language == "hebrew") + font.setLanguage(default_language); // If we are inserting, we cheat and get a token in advance bool has_token = false; @@ -311,502 +287,607 @@ bool Buffer::readLyXformat2(LyXLex & lex, LyXParagraph * par) if (token.empty()) continue; - else if (token[0] != '\\') { - int n = token.length(); - for (int i = 0; i < n; ++i) { - par->InsertChar(pos, token[i]); - par->SetFont(pos, font); - ++pos; - } - } else if (token == "\\i") { - inset = new InsetLatexAccent; - inset->Read(lex); - par->InsertChar(pos, LyXParagraph::META_INSET); - - par->InsertInset(pos, inset); + the_end_read = parseSingleLyXformat2Token(lex, par, return_par, + token, pos, depth, + font, footnoteflag, + footnotekind); + } + + if (!return_par) + return_par = par; + + paragraph = return_par; + + return the_end_read; +} + + +bool Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par, + LyXParagraph *& return_par, + const string & token, int & pos, + char & depth, LyXFont & font, + LyXParagraph::footnote_flag & footnoteflag, + LyXParagraph::footnote_kind & footnotekind) +{ + Inset * inset = 0; + int tmpret, tmpret2; + string tmptok; + bool the_end_read = false; + + if (token[0] != '\\') { + int n = token.length(); + for (int i = 0; i < n; ++i) { + par->InsertChar(pos, token[i]); par->SetFont(pos, font); ++pos; - } else if (token == "\\layout") { - if (!return_par) - return_par = par; - else { - par->text.resize(par->text.size()); - par = new LyXParagraph(par); - } - pos = 0; - lex.EatLine(); - string layoutname = lex.GetString(); - pair pp - = textclasslist.NumberOfLayout(params.textclass, - layoutname); - if (pp.first) { - par->layout = pp.second; - } else { // layout not found + } + } else if (token == "\\i") { + inset = new InsetLatexAccent; + inset->Read(lex); + par->InsertChar(pos, LyXParagraph::META_INSET); + par->InsertInset(pos, inset); + par->SetFont(pos, font); + ++pos; + } else if (token == "\\layout") { + if (!return_par) + return_par = par; + else { + par->fitToSize(); + par = new LyXParagraph(par); + } + pos = 0; + lex.EatLine(); + string layoutname = lex.GetString(); + pair pp + = textclasslist.NumberOfLayout(params.textclass, + layoutname); + if (pp.first) { + par->layout = pp.second; + } else { // layout not found // use default layout "Standard" (0) - par->layout = 0; - } - // Test whether the layout is obsolete. - LyXLayout const & layout = textclasslist.Style(params.textclass, - par->layout); - if (!layout.obsoleted_by().empty()) - par->layout = - textclasslist.NumberOfLayout(params.textclass, - layout.obsoleted_by()).second; - par->footnoteflag = footnoteflag; - par->footnotekind = footnotekind; - par->depth = depth; - font = LyXFont(LyXFont::ALL_INHERIT); - } else if (token == "\\end_float") { - if (!return_par) - return_par = par; - else { - par->text.resize(par->text.size()); - par = new LyXParagraph(par); - } - footnotekind = LyXParagraph::FOOTNOTE; - footnoteflag = LyXParagraph::NO_FOOTNOTE; - pos = 0; - lex.EatLine(); - par->layout = LYX_DUMMY_LAYOUT; - font = LyXFont(LyXFont::ALL_INHERIT); - } else if (token == "\\begin_float") { - tmpret = lex.FindToken(string_footnotekinds); - if (tmpret == -1) ++tmpret; - if (tmpret != LYX_LAYOUT_DEFAULT) - footnotekind = static_cast(tmpret); // bad - if (footnotekind == LyXParagraph::FOOTNOTE - || footnotekind == LyXParagraph::MARGIN) - footnoteflag = LyXParagraph::CLOSED_FOOTNOTE; - else - footnoteflag = LyXParagraph::OPEN_FOOTNOTE; - } else if (token == "\\begin_deeper") { - ++depth; - } else if (token == "\\end_deeper") { - if (!depth) { - lex.printError("\\end_deeper: " - "depth is already null"); - } - else - --depth; - } else if (token == "\\begin_preamble") { - params.readPreamble(lex); - } else if (token == "\\textclass") { - lex.EatLine(); - pair pp = - textclasslist.NumberOfClass(lex.GetString()); - if (pp.first) { - params.textclass = pp.second; - } else { - lex.printError("Unknown textclass `$$Token'"); - params.textclass = 0; - } - if (!textclasslist.Load(params.textclass)) { + par->layout = 0; + } + // Test whether the layout is obsolete. + LyXLayout const & layout = + textclasslist.Style(params.textclass, + par->layout); + if (!layout.obsoleted_by().empty()) + par->layout = + textclasslist.NumberOfLayout(params.textclass, + layout.obsoleted_by()).second; + par->footnoteflag = footnoteflag; + par->footnotekind = footnotekind; + par->depth = depth; + font = LyXFont(LyXFont::ALL_INHERIT,params.language_info); + if (format < 2.16 && params.language == "hebrew") + font.setLanguage(default_language); + } else if (token == "\\end_float") { + if (!return_par) + return_par = par; + else { + par->fitToSize(); + par = new LyXParagraph(par); + } + footnotekind = LyXParagraph::FOOTNOTE; + footnoteflag = LyXParagraph::NO_FOOTNOTE; + pos = 0; + lex.EatLine(); + par->layout = LYX_DUMMY_LAYOUT; + font = LyXFont(LyXFont::ALL_INHERIT,params.language_info); + if (format < 2.16 && params.language == "hebrew") + font.setLanguage(default_language); + } else if (token == "\\begin_float") { + tmpret = lex.FindToken(string_footnotekinds); + if (tmpret == -1) ++tmpret; + if (tmpret != LYX_LAYOUT_DEFAULT) + footnotekind = static_cast(tmpret); // bad + if (footnotekind == LyXParagraph::FOOTNOTE + || footnotekind == LyXParagraph::MARGIN) + footnoteflag = LyXParagraph::CLOSED_FOOTNOTE; + else + footnoteflag = LyXParagraph::OPEN_FOOTNOTE; + } else if (token == "\\begin_deeper") { + ++depth; + } else if (token == "\\end_deeper") { + if (!depth) { + lex.printError("\\end_deeper: " + "depth is already null"); + } + else + --depth; + } else if (token == "\\begin_preamble") { + params.readPreamble(lex); + } else if (token == "\\textclass") { + lex.EatLine(); + pair pp = + textclasslist.NumberOfClass(lex.GetString()); + if (pp.first) { + params.textclass = pp.second; + } else { + lex.printError("Unknown textclass `$$Token'"); + params.textclass = 0; + } + if (!textclasslist.Load(params.textclass)) { // if the textclass wasn't loaded properly // we need to either substitute another // or stop loading the file. // I can substitute but I don't see how I can // stop loading... ideas?? ARRae980418 - WriteAlert(_("Textclass Loading Error!"), - string(_("Can't load textclass ")) + - textclasslist.NameOfClass(params.textclass), - _("-- substituting default")); - params.textclass = 0; - } - } else if (token == "\\options") { - lex.EatLine(); - params.options = lex.GetString(); - } else if (token == "\\language") { - params.readLanguage(lex); - } else if (token == "\\fontencoding") { - lex.EatLine(); - } else if (token == "\\inputencoding") { - lex.EatLine(); - params.inputenc = lex.GetString(); - } else if (token == "\\graphics") { - params.readGraphicsDriver(lex); - } else if (token == "\\fontscheme") { - lex.EatLine(); - params.fonts = lex.GetString(); - } else if (token == "\\noindent") { - par->noindent = true; - } else if (token == "\\fill_top") { - par->added_space_top = VSpace(VSpace::VFILL); - } else if (token == "\\fill_bottom") { - par->added_space_bottom = VSpace(VSpace::VFILL); - } else if (token == "\\line_top") { - par->line_top = true; - } else if (token == "\\line_bottom") { - par->line_bottom = true; - } else if (token == "\\pagebreak_top") { - par->pagebreak_top = true; - } else if (token == "\\pagebreak_bottom") { - par->pagebreak_bottom = true; - } else if (token == "\\start_of_appendix") { - par->start_of_appendix = true; - } else if (token == "\\paragraph_separation") { - tmpret = lex.FindToken(string_paragraph_separation); - if (tmpret == -1) ++tmpret; - if (tmpret != LYX_LAYOUT_DEFAULT) - params.paragraph_separation = - static_cast(tmpret); - } else if (token == "\\defskip") { - lex.nextToken(); - params.defskip = VSpace(lex.GetString()); - } else if (token == "\\no_isolatin1") { // obsolete - lex.nextToken(); - } else if (token == "\\no_babel") { // obsolete - lex.nextToken(); - } else if (token == "\\no_epsfig") { // obsolete - lex.nextToken(); - } else if (token == "\\epsfig") { // obsolete - // Indeed it is obsolete, but we HAVE to be backwards - // compatible until 0.14, because otherwise all figures - // in existing documents are irretrivably lost. (Asger) - params.readGraphicsDriver(lex); - } else if (token == "\\quotes_language") { - tmpret = lex.FindToken(string_quotes_language); - if (tmpret == -1) ++tmpret; - if (tmpret != LYX_LAYOUT_DEFAULT) { - InsetQuotes::quote_language tmpl = - InsetQuotes::EnglishQ; - switch(tmpret) { - case 0: - tmpl = InsetQuotes::EnglishQ; - break; - case 1: - tmpl = InsetQuotes::SwedishQ; - break; - case 2: - tmpl = InsetQuotes::GermanQ; - break; - case 3: - tmpl = InsetQuotes::PolishQ; - break; - case 4: - tmpl = InsetQuotes::FrenchQ; - break; - case 5: - tmpl = InsetQuotes::DanishQ; - break; - } - params.quotes_language = tmpl; - } - } else if (token == "\\quotes_times") { - lex.nextToken(); - switch(lex.GetInteger()) { - case 1: - params.quotes_times = InsetQuotes::SingleQ; - break; - case 2: - params.quotes_times = InsetQuotes::DoubleQ; - break; - } - } else if (token == "\\papersize") { -#if 0 - if (format > 2.13) -#endif - tmpret = lex.FindToken(string_papersize); + WriteAlert(_("Textclass Loading Error!"), + string(_("Can't load textclass ")) + + textclasslist.NameOfClass(params.textclass), + _("-- substituting default")); + params.textclass = 0; + } + } else if (token == "\\options") { + lex.EatLine(); + params.options = lex.GetString(); + } else if (token == "\\language") { + params.readLanguage(lex); + } else if (token == "\\fontencoding") { + lex.EatLine(); + } else if (token == "\\inputencoding") { + lex.EatLine(); + params.inputenc = lex.GetString(); + } else if (token == "\\graphics") { + params.readGraphicsDriver(lex); + } else if (token == "\\fontscheme") { + lex.EatLine(); + params.fonts = lex.GetString(); + } else if (token == "\\noindent") { + par->noindent = true; + } else if (token == "\\fill_top") { + par->added_space_top = VSpace(VSpace::VFILL); + } else if (token == "\\fill_bottom") { + par->added_space_bottom = VSpace(VSpace::VFILL); + } else if (token == "\\line_top") { + par->line_top = true; + } else if (token == "\\line_bottom") { + par->line_bottom = true; + } else if (token == "\\pagebreak_top") { + par->pagebreak_top = true; + } else if (token == "\\pagebreak_bottom") { + par->pagebreak_bottom = true; + } else if (token == "\\start_of_appendix") { + par->start_of_appendix = true; + } else if (token == "\\paragraph_separation") { + tmpret = lex.FindToken(string_paragraph_separation); + if (tmpret == -1) ++tmpret; + if (tmpret != LYX_LAYOUT_DEFAULT) + params.paragraph_separation = + static_cast(tmpret); + } else if (token == "\\defskip") { + lex.nextToken(); + params.defskip = VSpace(lex.GetString()); #if 0 - else - tmpret = lex.FindToken(string_oldpapersize); + } else if (token == "\\no_isolatin1") { // obsolete + lex.nextToken(); + } else if (token == "\\no_babel") { // obsolete + lex.nextToken(); + } else if (token == "\\no_epsfig") { // obsolete + lex.nextToken(); #endif - if (tmpret == -1) - ++tmpret; - else - params.papersize2 = tmpret; - } else if (token == "\\paperpackage") { - tmpret = lex.FindToken(string_paperpackages); - if (tmpret == -1) { - ++tmpret; - params.paperpackage = BufferParams::PACKAGE_NONE; - } else - params.paperpackage = tmpret; - } else if (token == "\\use_geometry") { - lex.nextToken(); - params.use_geometry = lex.GetInteger(); - } else if (token == "\\use_amsmath") { - lex.nextToken(); - params.use_amsmath = lex.GetInteger(); - } else if (token == "\\paperorientation") { - tmpret = lex.FindToken(string_orientation); - if (tmpret == -1) ++tmpret; - if (tmpret != LYX_LAYOUT_DEFAULT) - params.orientation = static_cast(tmpret); - } else if (token == "\\paperwidth") { - lex.next(); - params.paperwidth = lex.GetString(); - } else if (token == "\\paperheight") { - lex.next(); - params.paperheight = lex.GetString(); - } else if (token == "\\leftmargin") { - lex.next(); - params.leftmargin = lex.GetString(); - } else if (token == "\\topmargin") { - lex.next(); - params.topmargin = lex.GetString(); - } else if (token == "\\rightmargin") { - lex.next(); - params.rightmargin = lex.GetString(); - } else if (token == "\\bottommargin") { - lex.next(); - params.bottommargin = lex.GetString(); - } else if (token == "\\headheight") { - lex.next(); - params.headheight = lex.GetString(); - } else if (token == "\\headsep") { - lex.next(); - params.headsep = lex.GetString(); - } else if (token == "\\footskip") { - lex.next(); - params.footskip = lex.GetString(); - } else if (token == "\\paperfontsize") { - lex.nextToken(); - params.fontsize = strip(lex.GetString()); - } else if (token == "\\papercolumns") { - lex.nextToken(); - params.columns = lex.GetInteger(); - } else if (token == "\\papersides") { - lex.nextToken(); - switch(lex.GetInteger()) { - default: - case 1: params.sides = LyXTextClass::OneSide; break; - case 2: params.sides = LyXTextClass::TwoSides; break; + } else if (token == "\\epsfig") { // obsolete + // Indeed it is obsolete, but we HAVE to be backwards + // compatible until 0.14, because otherwise all figures + // in existing documents are irretrivably lost. (Asger) + params.readGraphicsDriver(lex); + } else if (token == "\\quotes_language") { + tmpret = lex.FindToken(string_quotes_language); + if (tmpret == -1) ++tmpret; + if (tmpret != LYX_LAYOUT_DEFAULT) { + InsetQuotes::quote_language tmpl = + InsetQuotes::EnglishQ; + switch(tmpret) { + case 0: + tmpl = InsetQuotes::EnglishQ; + break; + case 1: + tmpl = InsetQuotes::SwedishQ; + break; + case 2: + tmpl = InsetQuotes::GermanQ; + break; + case 3: + tmpl = InsetQuotes::PolishQ; + break; + case 4: + tmpl = InsetQuotes::FrenchQ; + break; + case 5: + tmpl = InsetQuotes::DanishQ; + break; } - } else if (token == "\\paperpagestyle") { - lex.nextToken(); - params.pagestyle = strip(lex.GetString()); - } else if (token == "\\bullet") { - lex.nextToken(); - int index = lex.GetInteger(); - lex.nextToken(); - int temp_int = lex.GetInteger(); - params.user_defined_bullets[index].setFont(temp_int); - params.temp_bullets[index].setFont(temp_int); - lex.nextToken(); - temp_int = lex.GetInteger(); - params.user_defined_bullets[index].setCharacter(temp_int); - params.temp_bullets[index].setCharacter(temp_int); - lex.nextToken(); - temp_int = lex.GetInteger(); - params.user_defined_bullets[index].setSize(temp_int); - params.temp_bullets[index].setSize(temp_int); - lex.nextToken(); - string temp_str = lex.GetString(); - if (temp_str != "\\end_bullet") { + params.quotes_language = tmpl; + } + } else if (token == "\\quotes_times") { + lex.nextToken(); + switch(lex.GetInteger()) { + case 1: + params.quotes_times = InsetQuotes::SingleQ; + break; + case 2: + params.quotes_times = InsetQuotes::DoubleQ; + break; + } + } else if (token == "\\papersize") { + tmpret = lex.FindToken(string_papersize); + if (tmpret == -1) + ++tmpret; + else + params.papersize2 = tmpret; + } else if (token == "\\paperpackage") { + tmpret = lex.FindToken(string_paperpackages); + if (tmpret == -1) { + ++tmpret; + params.paperpackage = BufferParams::PACKAGE_NONE; + } else + params.paperpackage = tmpret; + } else if (token == "\\use_geometry") { + lex.nextToken(); + params.use_geometry = lex.GetInteger(); + } else if (token == "\\use_amsmath") { + lex.nextToken(); + params.use_amsmath = lex.GetInteger(); + } else if (token == "\\paperorientation") { + tmpret = lex.FindToken(string_orientation); + if (tmpret == -1) ++tmpret; + if (tmpret != LYX_LAYOUT_DEFAULT) + params.orientation = static_cast(tmpret); + } else if (token == "\\paperwidth") { + lex.next(); + params.paperwidth = lex.GetString(); + } else if (token == "\\paperheight") { + lex.next(); + params.paperheight = lex.GetString(); + } else if (token == "\\leftmargin") { + lex.next(); + params.leftmargin = lex.GetString(); + } else if (token == "\\topmargin") { + lex.next(); + params.topmargin = lex.GetString(); + } else if (token == "\\rightmargin") { + lex.next(); + params.rightmargin = lex.GetString(); + } else if (token == "\\bottommargin") { + lex.next(); + params.bottommargin = lex.GetString(); + } else if (token == "\\headheight") { + lex.next(); + params.headheight = lex.GetString(); + } else if (token == "\\headsep") { + lex.next(); + params.headsep = lex.GetString(); + } else if (token == "\\footskip") { + lex.next(); + params.footskip = lex.GetString(); + } else if (token == "\\paperfontsize") { + lex.nextToken(); + params.fontsize = strip(lex.GetString()); + } else if (token == "\\papercolumns") { + lex.nextToken(); + params.columns = lex.GetInteger(); + } else if (token == "\\papersides") { + lex.nextToken(); + switch(lex.GetInteger()) { + default: + case 1: params.sides = LyXTextClass::OneSide; break; + case 2: params.sides = LyXTextClass::TwoSides; break; + } + } else if (token == "\\paperpagestyle") { + lex.nextToken(); + params.pagestyle = strip(lex.GetString()); + } else if (token == "\\bullet") { + lex.nextToken(); + int index = lex.GetInteger(); + lex.nextToken(); + int temp_int = lex.GetInteger(); + params.user_defined_bullets[index].setFont(temp_int); + params.temp_bullets[index].setFont(temp_int); + lex.nextToken(); + temp_int = lex.GetInteger(); + params.user_defined_bullets[index].setCharacter(temp_int); + params.temp_bullets[index].setCharacter(temp_int); + lex.nextToken(); + temp_int = lex.GetInteger(); + params.user_defined_bullets[index].setSize(temp_int); + params.temp_bullets[index].setSize(temp_int); + lex.nextToken(); + string temp_str = lex.GetString(); + if (temp_str != "\\end_bullet") { // this element isn't really necessary for // parsing but is easier for humans // to understand bullets. Put it back and // set a debug message? - lex.printError("\\end_bullet expected, got" + temp_str); + lex.printError("\\end_bullet expected, got" + temp_str); //how can I put it back? - } - } else if (token == "\\bulletLaTeX") { - lex.nextToken(); - int index = lex.GetInteger(); - lex.next(); - string temp_str = lex.GetString(), sum_str; - while (temp_str != "\\end_bullet") { + } + } else if (token == "\\bulletLaTeX") { + lex.nextToken(); + int index = lex.GetInteger(); + lex.next(); + string temp_str = lex.GetString(), sum_str; + while (temp_str != "\\end_bullet") { // this loop structure is needed when user // enters an empty string since the first // thing returned will be the \\end_bullet // OR // if the LaTeX entry has spaces. Each element // therefore needs to be read in turn - sum_str += temp_str; - lex.next(); - temp_str = lex.GetString(); - } - params.user_defined_bullets[index].setText(sum_str); - params.temp_bullets[index].setText(sum_str); - } else if (token == "\\secnumdepth") { - lex.nextToken(); - params.secnumdepth = lex.GetInteger(); - } else if (token == "\\tocdepth") { - lex.nextToken(); - params.tocdepth = lex.GetInteger(); - } else if (token == "\\baselinestretch") { // obsolete - lex.nextToken(); // should not be used directly - // anymore. - // Will probably keep a kind of support just for - // compability. - params.spacing.set(Spacing::Other, lex.GetFloat()); - } else if (token == "\\spacing") { - lex.next(); - string tmp = strip(lex.GetString()); - if (tmp == "single") { - params.spacing.set(Spacing::Single); - } else if (tmp == "onehalf") { - params.spacing.set(Spacing::Onehalf); - } else if (tmp == "double") { - params.spacing.set(Spacing::Double); - } else if (tmp == "other") { - lex.next(); - params.spacing.set(Spacing::Other, - lex.GetFloat()); - } else { - lex.printError("Unknown spacing token: '$$Token'"); - } - } else if (token == "\\float_placement") { - lex.nextToken(); - params.float_placement = lex.GetString(); - } else if (token == "\\cursor") { // obsolete - // this is obsolete, so we just skip it. - lex.nextToken(); - } else if (token == "\\family") { + sum_str += temp_str; lex.next(); - font.setLyXFamily(lex.GetString()); - } else if (token == "\\series") { - lex.next(); - font.setLyXSeries(lex.GetString()); - } else if (token == "\\shape") { - lex.next(); - font.setLyXShape(lex.GetString()); - } else if (token == "\\size") { - lex.next(); - font.setLyXSize(lex.GetString()); - } else if (token == "\\latex") { - lex.next(); - string tok = lex.GetString(); - // This is dirty, but gone with LyX3. (Asger) - if (tok == "no_latex") - font.setLatex(LyXFont::OFF); - else if (tok == "latex") - font.setLatex(LyXFont::ON); - else if (tok == "default") - font.setLatex(LyXFont::INHERIT); - else - lex.printError("Unknown LaTeX font flag " - "`$$Token'"); - } else if (token == "\\direction") { - lex.next(); - string tok = lex.GetString(); - if (tok == "ltr") - font.setDirection(LyXFont::LTR_DIR); - else if (tok == "rtl") - font.setDirection(LyXFont::RTL_DIR); - else if (tok == "default") - font.setDirection(LyXFont::INHERIT_DIR); - else - lex.printError("Unknown font flag " - "`$$Token'"); - } else if (token == "\\emph") { - lex.next(); - font.setEmph(font.setLyXMisc(lex.GetString())); - } else if (token == "\\bar") { + temp_str = lex.GetString(); + } + params.user_defined_bullets[index].setText(sum_str); + params.temp_bullets[index].setText(sum_str); + } else if (token == "\\secnumdepth") { + lex.nextToken(); + params.secnumdepth = lex.GetInteger(); + } else if (token == "\\tocdepth") { + lex.nextToken(); + params.tocdepth = lex.GetInteger(); + } else if (token == "\\baselinestretch") { // obsolete + lex.nextToken(); // should not be used directly + // anymore. + // Will probably keep a kind of support just for + // compability. + params.spacing.set(Spacing::Other, lex.GetFloat()); + } else if (token == "\\spacing") { + lex.next(); + string tmp = strip(lex.GetString()); + if (tmp == "single") { + params.spacing.set(Spacing::Single); + } else if (tmp == "onehalf") { + params.spacing.set(Spacing::Onehalf); + } else if (tmp == "double") { + params.spacing.set(Spacing::Double); + } else if (tmp == "other") { lex.next(); - string tok = lex.GetString(); - // This is dirty, but gone with LyX3. (Asger) - if (tok == "under") - font.setUnderbar(LyXFont::ON); - else if (tok == "no") - font.setUnderbar(LyXFont::OFF); - else if (tok == "default") - font.setUnderbar(LyXFont::INHERIT); + params.spacing.set(Spacing::Other, + lex.GetFloat()); + } else { + lex.printError("Unknown spacing token: '$$Token'"); + } + } else if (token == "\\float_placement") { + lex.nextToken(); + params.float_placement = lex.GetString(); + } else if (token == "\\cursor") { // obsolete + // this is obsolete, so we just skip it. + lex.nextToken(); + } else if (token == "\\family") { + lex.next(); + font.setLyXFamily(lex.GetString()); + } else if (token == "\\series") { + lex.next(); + font.setLyXSeries(lex.GetString()); + } else if (token == "\\shape") { + lex.next(); + font.setLyXShape(lex.GetString()); + } else if (token == "\\size") { + lex.next(); + font.setLyXSize(lex.GetString()); + } else if (token == "\\latex") { + lex.next(); + string tok = lex.GetString(); + // This is dirty, but gone with LyX3. (Asger) + if (tok == "no_latex") + font.setLatex(LyXFont::OFF); + else if (tok == "latex") + font.setLatex(LyXFont::ON); + else if (tok == "default") + font.setLatex(LyXFont::INHERIT); + else + lex.printError("Unknown LaTeX font flag " + "`$$Token'"); + } else if (token == "\\lang") { + lex.next(); + string tok = lex.GetString(); + Languages::iterator lit = languages.find(tok); + if (lit != languages.end()) { + font.setLanguage(&(*lit).second); + } else { + font.setLanguage(params.language_info); + lex.printError("Unknown language `$$Token'"); + } + } else if (token == "\\direction") { // obsolete + if (format >= 2.16) + lex.printError("Command \\direction is obsolete"); + lex.next(); + string tok = lex.GetString(); + if (tok == "rtl") + font.setLanguage(&languages["hebrew"]); + else if (tok == "default") + if (params.language == "hebrew") + font.setLanguage(default_language); else - lex.printError("Unknown bar font flag " - "`$$Token'"); - } else if (token == "\\noun") { - lex.next(); - font.setNoun(font.setLyXMisc(lex.GetString())); - } else if (token == "\\color") { - lex.next(); - font.setLyXColor(lex.GetString()); - } else if (token == "\\align") { - tmpret = lex.FindToken(string_align); - if (tmpret == -1) ++tmpret; - if (tmpret != LYX_LAYOUT_DEFAULT) { // tmpret != 99 ??? - tmpret2 = 1; - for (; tmpret > 0; --tmpret) - tmpret2 = tmpret2 * 2; - par->align = LyXAlignment(tmpret2); - } - } else if (token == "\\added_space_top") { - lex.nextToken(); - par->added_space_top = lex.GetString(); - } else if (token == "\\added_space_bottom") { - lex.nextToken(); - par->added_space_bottom = lex.GetString(); - } else if (token == "\\pextra_type") { - lex.nextToken(); - par->pextra_type = lex.GetInteger(); - } else if (token == "\\pextra_width") { - lex.nextToken(); - par->pextra_width = lex.GetString(); - } else if (token == "\\pextra_widthp") { - lex.nextToken(); - par->pextra_widthp = lex.GetString(); - } else if (token == "\\pextra_alignment") { - lex.nextToken(); - par->pextra_alignment = lex.GetInteger(); - } else if (token == "\\pextra_hfill") { - lex.nextToken(); - par->pextra_hfill = lex.GetInteger(); - } else if (token == "\\pextra_start_minipage") { - lex.nextToken(); - par->pextra_start_minipage = lex.GetInteger(); - } else if (token == "\\labelwidthstring") { - lex.EatLine(); - par->labelwidthstring = lex.GetString(); - /* do not delete this token, it is still needed! */ - } else if (token == "\\end_inset") { - /* simple ignore this. The insets do not have - * to read this */ - // but insets should read it, it is a part of - //the inset isn't it? Lgb. - } else if (token == "\\begin_inset") { - lex.next(); - tmptok = lex.GetString(); - /* test the different insets */ - if (tmptok == "Quotes") { - inset = new InsetQuotes; - inset->Read(lex); - par->InsertChar(pos, LyXParagraph::META_INSET); - par->InsertInset(pos, inset); - par->SetFont(pos, font); - ++pos; -#if 0 // should not be used any more - } else if (tmptok == "Latex") { - // This one is on its way out - lex.EatLine(); - tmptok = strip(lex.GetString()); - //lyxerr <scanCommand(tmptok); - inset = tmpinset; - } else { - // This should not use InsetLaTexDel - // it should rather insert text into - // the paragraph and mark it as tex. - inset = new InsetLatex(tmptok); - } - par->InsertChar(pos, LyXParagraph::META_INSET); - par->InsertInset(pos, inset); - par->SetFont(pos, font); - ++pos; + font.setLanguage(params.language_info); + else + lex.printError("Unknown direction `$$Token'"); + } else if (token == "\\emph") { + lex.next(); + font.setEmph(font.setLyXMisc(lex.GetString())); + } else if (token == "\\bar") { + lex.next(); + string tok = lex.GetString(); + // This is dirty, but gone with LyX3. (Asger) + if (tok == "under") + font.setUnderbar(LyXFont::ON); + else if (tok == "no") + font.setUnderbar(LyXFont::OFF); + else if (tok == "default") + font.setUnderbar(LyXFont::INHERIT); + else + lex.printError("Unknown bar font flag " + "`$$Token'"); + } else if (token == "\\noun") { + lex.next(); + font.setNoun(font.setLyXMisc(lex.GetString())); + } else if (token == "\\color") { + lex.next(); + font.setLyXColor(lex.GetString()); + } else if (token == "\\align") { + tmpret = lex.FindToken(string_align); + if (tmpret == -1) ++tmpret; + if (tmpret != LYX_LAYOUT_DEFAULT) { // tmpret != 99 ??? + tmpret2 = 1; + for (; tmpret > 0; --tmpret) + tmpret2 = tmpret2 * 2; + par->align = LyXAlignment(tmpret2); + } + } else if (token == "\\added_space_top") { + lex.nextToken(); + par->added_space_top = VSpace(lex.GetString()); + } else if (token == "\\added_space_bottom") { + lex.nextToken(); + par->added_space_bottom = VSpace(lex.GetString()); + } else if (token == "\\pextra_type") { + lex.nextToken(); + par->pextra_type = lex.GetInteger(); + } else if (token == "\\pextra_width") { + lex.nextToken(); + par->pextra_width = lex.GetString(); + } else if (token == "\\pextra_widthp") { + lex.nextToken(); + par->pextra_widthp = lex.GetString(); + } else if (token == "\\pextra_alignment") { + lex.nextToken(); + par->pextra_alignment = lex.GetInteger(); + } else if (token == "\\pextra_hfill") { + lex.nextToken(); + par->pextra_hfill = lex.GetInteger(); + } else if (token == "\\pextra_start_minipage") { + lex.nextToken(); + par->pextra_start_minipage = lex.GetInteger(); + } else if (token == "\\labelwidthstring") { + lex.EatLine(); + par->labelwidthstring = lex.GetString(); + /* do not delete this token, it is still needed! */ + } else if (token == "\\end_inset") { + /* simple ignore this. The insets do not have + * to read this */ + // but insets should read it, it is a part of + //the inset isn't it? Lgb. + } else if (token == "\\begin_inset") { + lex.next(); + tmptok = lex.GetString(); + /* test the different insets */ + if (tmptok == "Quotes") { + inset = new InsetQuotes; + inset->Read(lex); + par->InsertChar(pos, LyXParagraph::META_INSET); + par->InsertInset(pos, inset); + par->SetFont(pos, font); + ++pos; + } else if (tmptok == "\\i") { + inset = new InsetLatexAccent; + inset->Read(lex); + par->InsertChar(pos, LyXParagraph::META_INSET); + par->InsertInset(pos, inset); + par->SetFont(pos, font); + ++pos; + } else if (tmptok == "FormulaMacro") { + inset = new InsetFormulaMacro; + inset->Read(lex); + par->InsertChar(pos, LyXParagraph::META_INSET); + par->InsertInset(pos, inset); + par->SetFont(pos, font); + ++pos; + } else if (tmptok == "Formula") { + inset = new InsetFormula; + inset->Read(lex); + par->InsertChar(pos, LyXParagraph::META_INSET); + par->InsertInset(pos, inset); + par->SetFont(pos, font); + ++pos; + } else if (tmptok == "Figure") { + inset = new InsetFig(100, 100, this); + inset->Read(lex); + par->InsertChar(pos, LyXParagraph::META_INSET); + par->InsertInset(pos, inset); + par->SetFont(pos, font); + ++pos; + } else if (tmptok == "Info") { + inset = new InsetInfo; + inset->Read(lex); + par->InsertChar(pos, LyXParagraph::META_INSET); + par->InsertInset(pos, inset); + par->SetFont(pos, font); + ++pos; + } else if (tmptok == "Include") { + inset = new InsetInclude(string(), this); + inset->Read(lex); + par->InsertChar(pos, LyXParagraph::META_INSET); + par->InsertInset(pos, inset); + par->SetFont(pos, font); + ++pos; + } else if (tmptok == "ERT") { + inset = new InsetERT(this); + inset->Read(lex); + par->InsertChar(pos, LyXParagraph::META_INSET); + par->InsertInset(pos, inset); + par->SetFont(pos, font); + ++pos; + } else if (tmptok == "Text") { + inset = new InsetText(this); + inset->Read(lex); + par->InsertChar(pos, LyXParagraph::META_INSET); + par->InsertInset(pos, inset); + par->SetFont(pos, font); + ++pos; +#if 0 + } else if (tmptok == "Number") { + inset = new InsetNumber(this); + inset->Read(lex); + par->InsertChar(pos, LyXParagraph::META_INSET); + par->InsertInset(pos, inset); + par->SetFont(pos, font); + ++pos; #endif -#if 0 // should not be used any more - } else if (tmptok == "LatexDel") { - // This one is on its way out... - lex.EatLine(); - tmptok = strip(lex.GetString()); - //lyxerr <Read(lex); + par->InsertChar(pos, LyXParagraph::META_INSET); + par->InsertInset(pos, inset); + par->SetFont(pos, font); + ++pos; + } else if (tmptok == "GRAPHICS") { + inset = new InsetGraphics; + //inset->Read(lex); + par->InsertChar(pos, LyXParagraph::META_INSET); + par->InsertInset(pos, inset); + par->SetFont(pos, font); + } else if (tmptok == "LatexCommand") { + InsetCommand inscmd; + inscmd.Read(lex); + if (inscmd.getCmdName() == "cite") { + inset = new InsetCitation(inscmd.getContents(), inscmd.getOptions()); + } else if (inscmd.getCmdName() == "bibitem") { + lex.printError("Wrong place for bibitem"); + inset = inscmd.Clone(); + } else if (inscmd.getCmdName() == "BibTeX") { + inset = new InsetBibtex(inscmd.getContents(), inscmd.getOptions(), this); + } else if (inscmd.getCmdName() == "index") { + inset = new InsetIndex(inscmd.getContents()); + } else if (inscmd.getCmdName() == "include") { + inset = new InsetInclude(inscmd.getContents(), this); + } else if (inscmd.getCmdName() == "label") { + inset = new InsetLabel(inscmd.getCommand()); + } else if (inscmd.getCmdName() == "url" + || inscmd.getCmdName() == "htmlurl") { + inset = new InsetUrl(inscmd.getCommand()); + } else if (inscmd.getCmdName() == "ref" + || inscmd.getCmdName() == "pageref") { + if (!inscmd.getOptions().empty() || !inscmd.getContents().empty()) { + inset = new InsetRef(inscmd, this); + } +#warning Check if this else clause is still needed. (Lgb) +#if 0 + // This condition comes from a + // temporary solution to the latexdel + // ref inset that was transformed to + // an empty ref inset plus the body + // surronded by latexdel insets + else { string cont, opt, tmptmptok, cmdname; lex.next(); while(lex.IsOK() && lex.GetString() != "\\end_inset" ) { @@ -846,278 +927,153 @@ bool Buffer::readLyXformat2(LyXLex & lex, LyXParagraph * par) while(lex.IsOK() && lex.GetString() != "\\end_inset" ) { lex.next(); } - if(contains(tmptok, "\\url{")) - cmdname = string("url"); - else - cmdname = string("htmlurl"); + cont = strip(cont); opt = strip(opt); - inset = new InsetUrl(cmdname, cont, opt); - } else if (tmptok[0] == '\\') { - // then this latex del is a - // latex command - InsetCommand * tmpinset = - new InsetCommand(); - tmpinset->scanCommand(tmptok); - inset = tmpinset; - } - par->InsertChar(pos, LyXParagraph::META_INSET); - par->InsertInset(pos, inset); - par->SetFont(pos, font); - ++pos; -#endif - } else if (tmptok == "\\i") { - inset = new InsetLatexAccent; - inset->Read(lex); - par->InsertChar(pos, LyXParagraph::META_INSET); - par->InsertInset(pos, inset); - par->SetFont(pos, font); - ++pos; - } else if (tmptok == "FormulaMacro") { - inset = new InsetFormulaMacro; - inset->Read(lex); - par->InsertChar(pos, LyXParagraph::META_INSET); - par->InsertInset(pos, inset); - par->SetFont(pos, font); - ++pos; - } else if (tmptok == "Formula") { - inset = new InsetFormula; - inset->Read(lex); - par->InsertChar(pos, LyXParagraph::META_INSET); - par->InsertInset(pos, inset); - par->SetFont(pos, font); - ++pos; - } else if (tmptok == "Figure") { - inset = new InsetFig(100, 100, this); - inset->Read(lex); - par->InsertChar(pos, LyXParagraph::META_INSET); - par->InsertInset(pos, inset); - par->SetFont(pos, font); - ++pos; -#if 0 - } else if (tmptok == "Label") { - // Kept for compability. Remove in 0.13. - if (lex.EatLine()) { - string tmp = "\\label{"; - tmp += lex.GetString(); - tmp += '}'; - inset = new InsetLabel(tmp); - par->InsertChar(pos, LyXParagraph::META_INSET); - par->InsertInset(pos, inset); - par->SetFont(pos, font); - ++pos; + cmdname = "\\" + inscmd.getCmdName(); + cmdname += "[" + cont + "]"; + cmdname += "{" + opt + "}"; + inset = new InsetRef(cmdname, this); } #endif - } else if (tmptok == "Info") { - inset = new InsetInfo; - inset->Read(lex); - par->InsertChar(pos, LyXParagraph::META_INSET); - par->InsertInset(pos, inset); - par->SetFont(pos, font); - ++pos; - } else if (tmptok == "Include") { - inset = new InsetInclude(string(), this); - inset->Read(lex); - par->InsertChar(pos, LyXParagraph::META_INSET); + } else if (inscmd.getCmdName() == "tableofcontents") { + inset = new InsetTOC(this); + } else if (inscmd.getCmdName() == "listoffigures") { + inset = new InsetLOF(this); + } else if (inscmd.getCmdName() == "listofalgorithms") { + inset = new InsetLOA(this); + } else if (inscmd.getCmdName() == "listoftables") { + inset = new InsetLOT(this); + } else if (inscmd.getCmdName() == "printindex") { + inset = new InsetPrintIndex(this); + } else if (inscmd.getCmdName() == "lyxparent") { + inset = new InsetParent(inscmd.getContents(), this); + } + + if (inset) { + par->InsertChar(pos, LyXParagraph::META_INSET); par->InsertInset(pos, inset); par->SetFont(pos, font); ++pos; - } else if (tmptok == "LatexCommand") { - InsetCommand inscmd; - inscmd.Read(lex); - if (inscmd.getCmdName() == "cite") { - inset = new InsetCitation(inscmd.getContents(), inscmd.getOptions()); - } else if (inscmd.getCmdName() == "bibitem") { - lex.printError("Wrong place for bibitem"); - inset = inscmd.Clone(); - } else if (inscmd.getCmdName() == "BibTeX") { - inset = new InsetBibtex(inscmd.getContents(), inscmd.getOptions(), this); - } else if (inscmd.getCmdName() == "index") { - inset = new InsetIndex(inscmd.getContents()); - } else if (inscmd.getCmdName() == "include") { - inset = new InsetInclude(inscmd.getContents(), this); - } else if (inscmd.getCmdName() == "label") { - inset = new InsetLabel(inscmd.getCommand()); - } else if (inscmd.getCmdName() == "url" - || inscmd.getCmdName() == "htmlurl") { - inset = new InsetUrl(inscmd.getCommand()); - } else if (inscmd.getCmdName() == "ref" - || inscmd.getCmdName() == "pageref") { - if (!inscmd.getOptions().empty() || !inscmd.getContents().empty()) { - inset = new InsetRef(inscmd, this); - } - // This condition comes from a - // temporary solution to the latexdel - // ref inset that was transformed to - // an empty ref inset plus the body - // surronded by latexdel insets - else { - string cont, opt, tmptmptok, cmdname; - lex.next(); - while(lex.IsOK() && lex.GetString() != "\\end_inset" ) { - lex.next(); - } - lex.next(); - while(lex.IsOK()) { - tmptmptok = lex.GetString(); - if(tmptmptok[0] == '\\') { - if( tmptmptok == "\\backslash") - opt += '\\'; - else - break; - } - else - opt += tmptmptok; - opt += ' '; - lex.next(); - } - while(lex.IsOK() && lex.GetString() != "\\end_inset" ) { - lex.next(); - } - lex.next(); - while(lex.IsOK()) { - tmptmptok = lex.GetString(); - if(tmptmptok[0] == '\\') { - if( tmptmptok == "\\backslash") - cont += '\\'; - else - break; - } - else - cont += tmptmptok; - cont += ' '; - lex.next(); - } - while(lex.IsOK() && lex.GetString() != "\\end_inset" ) { - lex.next(); - } - - cont = strip(cont); - opt = strip(opt); - cmdname = "\\" + inscmd.getCmdName(); - cmdname += "[" + cont + "]"; - cmdname += "{" + opt + "}"; - inset = new InsetRef(cmdname, this); - } - } else if (inscmd.getCmdName() == "tableofcontents") { - inset = new InsetTOC(this); - } else if (inscmd.getCmdName() == "listoffigures") { - inset = new InsetLOF(this); - } else if (inscmd.getCmdName() == "listofalgorithms") { - inset = new InsetLOA(this); - } else if (inscmd.getCmdName() == "listoftables") { - inset = new InsetLOT(this); - } else if (inscmd.getCmdName() == "printindex") { - inset = new InsetPrintIndex(this); - } else if (inscmd.getCmdName() == "lyxparent") { - inset = new InsetParent(inscmd.getContents(), this); - } -#if 0 - // Do we need this at all now? - else - // The following three are only for compatibility - if (inscmd.getCmdName() == "-") { - inset = new InsetSpecialChar(InsetSpecialChar::HYPHENATION); - } else if (inscmd.getCmdName() == "@.") { - inset = new InsetSpecialChar(InsetSpecialChar::END_OF_SENTENCE); - } else if (inscmd.getCmdName() == "ldots") { - inset = new InsetSpecialChar(InsetSpecialChar::LDOTS); - } else - inset = inscmd.Clone(); -#endif - - if (inset) { - par->InsertChar(pos, LyXParagraph::META_INSET); - par->InsertInset(pos, inset); + } + } + } else if (token == "\\InsetQuotes") { + inset = new InsetQuotes; + inset->Read(lex); + par->InsertChar(pos, LyXParagraph::META_INSET); + par->InsertInset(pos, inset); + par->SetFont(pos, font); + ++pos; + } else if (token == "\\InsetFormula") { + inset = new InsetFormula; + inset->Read(lex); + par->InsertChar(pos, LyXParagraph::META_INSET); + par->InsertInset(pos, inset); + par->SetFont(pos, font); + ++pos; + } else if (token == "\\SpecialChar") { + LyXLayout const & layout = + textclasslist.Style(params.textclass, + par->GetLayout()); + + // Insets don't make sense in a free-spacing context! ---Kayvan + if (layout.free_spacing) + { + if (lex.IsOK()) { + string next_token; + lex.next(); + next_token = lex.GetString(); + if (next_token == "\\-") { + par->InsertChar(pos, '-'); + par->SetFont(pos, font); + } else if (next_token == "\\protected_separator") { + par->InsertChar(pos, ' '); par->SetFont(pos, font); - ++pos; + } else { + lex.printError("Token `$$Token' " + "is in free space " + "paragraph layout!"); + pos--; } } - } else if (token == "\\InsetQuotes") { - inset = new InsetQuotes; - inset->Read(lex); - par->InsertChar(pos, LyXParagraph::META_INSET); - par->InsertInset(pos, inset); - par->SetFont(pos, font); - ++pos; -#if 0 - } else if (token == "\\InsetLatex") { - inset = new InsetLatex; + } + else + { + inset = new InsetSpecialChar; inset->Read(lex); par->InsertChar(pos, LyXParagraph::META_INSET); par->InsertInset(pos, inset); par->SetFont(pos, font); - ++pos; - } else if (token == "\\InsetLatexDel") { - lex.printError(_("Warning: Ignoring Old Inset")); + } + ++pos; + } else if (token == "\\Figure") { + inset = new InsetFig(100, 100, this); + inset->Read(lex); + par->InsertChar(pos, LyXParagraph::META_INSET); + par->InsertInset(pos, inset); + par->SetFont(pos, font); + ++pos; + } else if (token == "\\newline") { // soon obsolete +#if 1 + par->InsertChar(pos, LyXParagraph::META_NEWLINE); + par->SetFont(pos, font); +#else + inset = new InsetSpecialChar(InsetSpecialChar::NEWLINE); + par->InsertChar(pos, LyXParagraph::META_INSET); + par->InsertInset(pos, inset); + par->SetFont(pos, font); #endif - } else if (token == "\\InsetFormula") { - inset = new InsetFormula; - inset->Read(lex); - par->InsertChar(pos, LyXParagraph::META_INSET); - par->InsertInset(pos, inset); - par->SetFont(pos, font); - ++pos; - } else if (token == "\\SpecialChar") { - inset = new InsetSpecialChar; - inset->Read(lex); - par->InsertChar(pos, LyXParagraph::META_INSET); - par->InsertInset(pos, inset); + ++pos; + } else if (token == "\\LyXTable") { + par->table = new LyXTable(lex); + } else if (token == "\\hfill") { + par->InsertChar(pos, LyXParagraph::META_HFILL); + par->SetFont(pos, font); + ++pos; + } else if (token == "\\protected_separator") { // obsolete +#if 1 + LyXLayout const & layout = + textclasslist.Style(params.textclass, + par->GetLayout()); + + if (layout.free_spacing) { + par->InsertChar(pos, ' '); par->SetFont(pos, font); - ++pos; - } else if (token == "\\Figure") { - inset = new InsetFig(100, 100, this); - inset->Read(lex); - par->InsertChar(pos, LyXParagraph::META_INSET); + } else { + inset = new InsetSpecialChar(InsetSpecialChar::PROTECTED_SEPARATOR); + par->InsertChar(pos, LyXParagraph::META_INSET); par->InsertInset(pos, inset); par->SetFont(pos, font); - ++pos; - } else if (token == "\\newline") { - par->InsertChar(pos, LyXParagraph::META_NEWLINE); - par->SetFont(pos, font); - ++pos; - } else if (token == "\\LyXTable") { - par->table = new LyXTable(lex); - } else if (token == "\\hfill") { - par->InsertChar(pos, LyXParagraph::META_HFILL); - par->SetFont(pos, font); - ++pos; - } else if (token == "\\protected_separator") { - par->InsertChar(pos, LyXParagraph::META_PROTECTED_SEPARATOR); - par->SetFont(pos, font); - ++pos; - } else if (token == "\\bibitem") { // ale970302 - if (!par->bibkey) - par->bibkey = new InsetBibKey; - par->bibkey->Read(lex); - }else if (token == "\\backslash") { - par->InsertChar(pos, '\\'); + } +#else + par->InsertChar(pos, LyXParagraph::META_PROTECTED_SEPARATOR); + par->SetFont(pos, font); +#endif + ++pos; + } else if (token == "\\bibitem") { // ale970302 + if (!par->bibkey) + par->bibkey = new InsetBibKey; + par->bibkey->Read(lex); + }else if (token == "\\backslash") { + par->InsertChar(pos, '\\'); + par->SetFont(pos, font); + ++pos; + }else if (token == "\\the_end") { + the_end_read = true; + } else { + // This should be insurance for the future: (Asger) + lex.printError("Unknown token `$$Token'. " + "Inserting as text."); + int n = token.length(); + for (int i = 0; i < n; ++i) { + par->InsertChar(pos, token[i]); par->SetFont(pos, font); ++pos; - }else if (token == "\\the_end") { - the_end_read = true; - } else { - // This should be insurance for the future: (Asger) - lex.printError("Unknown token `$$Token'. " - "Inserting as text."); - int n = token.length(); - for (int i = 0; i < n; ++i) { - par->InsertChar(pos, token[i]); - par->SetFont(pos, font); - ++pos; - } } } - - if (!return_par) - return_par = par; - - paragraph = return_par; - return the_end_read; } - bool Buffer::readFile(LyXLex & lex, LyXParagraph * par) { string token; @@ -1141,16 +1097,9 @@ bool Buffer::readFile(LyXLex & lex, LyXParagraph * par) // Formats >= 2.13 support "\the_end" marker if (format < 2.13) the_end = true; -#if 0 - // Formats >= 2.14 changed papersize stuff - if (format < 2.14) { - setOldPaperStuff(); - } else { -#endif - setPaperStuff(); -#if 0 - } -#endif + + setPaperStuff(); + if (!the_end) WriteAlert(_("Warning!"), _("Reading of document is not complete"), @@ -1175,8 +1124,98 @@ bool Buffer::readFile(LyXLex & lex, LyXParagraph * par) } + +// Should probably be moved to somewhere else: BufferView? LyXView? +bool Buffer::save() const +{ + // We don't need autosaves in the immediate future. (Asger) + resetAutosaveTimers(); + + // make a backup + string s; + if (lyxrc.make_backup) { + s = fileName() + '~'; + if (!lyxrc.backupdir_path.empty()) + s = AddName(lyxrc.backupdir_path, + subst(CleanupPath(s),'/','!')); + + // Rename is the wrong way of making a backup, + // this is the correct way. + /* truss cp fil fil2: + lstat("LyXVC3.lyx", 0xEFFFF898) Err#2 ENOENT + stat("LyXVC.lyx", 0xEFFFF688) = 0 + open("LyXVC.lyx", O_RDONLY) = 3 + open("LyXVC3.lyx", O_WRONLY|O_CREAT|O_TRUNC, 0600) = 4 + fstat(4, 0xEFFFF508) = 0 + fstat(3, 0xEFFFF508) = 0 + read(3, " # T h i s f i l e w".., 8192) = 5579 + write(4, " # T h i s f i l e w".., 5579) = 5579 + read(3, 0xEFFFD4A0, 8192) = 0 + close(4) = 0 + close(3) = 0 + chmod("LyXVC3.lyx", 0100644) = 0 + lseek(0, 0, SEEK_CUR) = 46440 + _exit(0) + */ + + // Should proabaly have some more error checking here. + // Should be cleaned up in 0.13, at least a bit. + // Doing it this way, also makes the inodes stay the same. + // This is still not a very good solution, in particular we + // might loose the owner of the backup. + FileInfo finfo(fileName()); + if (finfo.exist()) { + mode_t fmode = finfo.getMode(); + struct utimbuf times = { + finfo.getAccessTime(), + finfo.getModificationTime() }; + + ifstream ifs(fileName().c_str()); + ofstream ofs(s.c_str(), ios::out|ios::trunc); + if (ifs && ofs) { + ofs << ifs.rdbuf(); + ifs.close(); + ofs.close(); + ::chmod(s.c_str(), fmode); + + if (::utime(s.c_str(), ×)) { + lyxerr << "utime error." << endl; + } + } else { + lyxerr << "LyX was not able to make " + "backupcopy. Beware." << endl; + } + } + } + + if (writeFile(fileName(), false)) { + markLyxClean(); + + // now delete the autosavefile + string a = OnlyPath(fileName()); + a += '#'; + a += OnlyFilename(fileName()); + a += '#'; + FileInfo fileinfo(a); + if (fileinfo.exist()) { + if (::remove(a.c_str()) != 0) { + WriteFSAlert(_("Could not delete " + "auto-save file!"), a); + } + } + } else { + // Saving failed, so backup is not backup + if (lyxrc.make_backup) { + ::rename(s.c_str(), fileName().c_str()); + } + return false; + } + return true; +} + + // Returns false if unsuccesful -bool Buffer::writeFile(string const & fname, bool flag) +bool Buffer::writeFile(string const & fname, bool flag) const { // if flag is false writeFile will not create any GUI // warnings, only cerr. @@ -1346,11 +1385,16 @@ void Buffer::writeFileAscii(string const & fname, int linelen) noparbreak = 1; } + LyXLayout const & layout = + textclasslist.Style(params.textclass, + par->GetLayout()); + bool free_spc = layout.free_spacing; + /* It might be a table */ if (par->table){ #if 0 - if (!lyxrc->ascii_roff_command.empty() && - lyxrc->ascii_roff_command != "none") { + if (!lyxrc.ascii_roff_command.empty() && + lyxrc.ascii_roff_command != "none") { RoffAsciiTable(ofs, par); par = par->next; continue; @@ -1361,18 +1405,35 @@ void Buffer::writeFileAscii(string const & fname, int linelen) cells = par->table->columns; clen = new int [cells]; memset(clen, 0, sizeof(int) * cells); + for (i = 0, j = 0, h = 1; i < par->size(); ++i, ++h) { c = par->GetChar(i); if (c == LyXParagraph::META_INSET) { if ((inset = par->GetInset(i))) { +#if 1 +#ifdef HAVE_SSTREAM + std::ostringstream ost; + inset->Latex(ost, -1, free_spc); + h += ost.str().length(); +#else + ostrstream ost; + inset->Latex(ost, -1, free_spc); + ost << '\0'; + char * tmp = ost.str(); + string tstr(tmp); + h += tstr.length(); + delete [] tmp; +#endif +#else ofstream fs(fname1.c_str()); if (!fs) { WriteFSAlert(_("Error: Cannot open temporary file:"), fname1); return; } - inset->Latex(fs, -1); + inset->Latex(fs, -1, free_spc); h += fs.tellp() - 1; - remove(fname1.c_str()); + ::remove(fname1.c_str()); +#endif } } else if (c == LyXParagraph::META_NEWLINE) { if (clen[j] < h) @@ -1386,7 +1447,7 @@ void Buffer::writeFileAscii(string const & fname, int linelen) clen[j] = h; } - font1 = LyXFont(LyXFont::ALL_INHERIT); + font1 = LyXFont(LyXFont::ALL_INHERIT,params.language_info); actcell = 0; for (i = 0, actpos = 1; i < par->size(); ++i, ++actpos) { if (!i && !footnoteflag && !noparbreak){ @@ -1395,7 +1456,7 @@ void Buffer::writeFileAscii(string const & fname, int linelen) ofs << " "; currlinelen = depth * 2; switch(ltype) { - case 0: /* Standart */ + case 0: /* Standard */ case 4: /* (Sub)Paragraph */ case 5: /* Description */ break; @@ -1454,7 +1515,7 @@ void Buffer::writeFileAscii(string const & fname, int linelen) case LyXParagraph::META_INSET: if ((inset = par->GetInset(i))) { fpos = ofs.tellp(); - inset->Latex(ofs, -1); + inset->Latex(ofs, -1, free_spc); currlinelen += (ofs.tellp() - fpos); actpos += (ofs.tellp() - fpos) - 1; } @@ -1515,9 +1576,11 @@ void Buffer::writeFileAscii(string const & fname, int linelen) case LyXParagraph::META_HFILL: ofs << "\t"; break; +#if 0 case LyXParagraph::META_PROTECTED_SEPARATOR: ofs << " "; break; +#endif case '\\': ofs << "\\"; break; @@ -1575,12 +1638,9 @@ void Buffer::makeLaTeXFile(string const & fname, { lyxerr[Debug::LATEX] << "makeLaTeXFile..." << endl; - // How the **** can this be needed? - //params.textclass = current_view->buffer()->params.textclass; - niceFile = nice; // this will be used by Insetincludes. - tex_code_break_column = lyxrc->ascii_linelen; + tex_code_break_column = lyxrc.ascii_linelen; LyXTextClass const & tclass = textclasslist.TextClass(params.textclass); @@ -1593,7 +1653,7 @@ void Buffer::makeLaTeXFile(string const & fname, // validate the buffer. lyxerr[Debug::LATEX] << " Validating buffer..." << endl; - LaTeXFeatures features(tclass.numLayouts()); + LaTeXFeatures features(params, tclass.numLayouts()); validate(features); lyxerr[Debug::LATEX] << " Buffer validation done." << endl; @@ -1602,12 +1662,11 @@ void Buffer::makeLaTeXFile(string const & fname, // first paragraph of the document. (Asger) texrow.start(paragraph, 0); - string LFile; - if (!only_body && nice) { - LFile += "%% " LYX_DOCVERSION " created this file. " - "For more info, see http://www.lyx.org/.\n"; - LFile += "%% Do not edit unless you really know what you are doing.\n"; + ofs << "%% " LYX_DOCVERSION " created this file. " + "For more info, see http://www.lyx.org/.\n" + "%% Do not edit unless you really know what " + "you are doing.\n"; texrow.newline(); texrow.newline(); } @@ -1624,21 +1683,21 @@ void Buffer::makeLaTeXFile(string const & fname, if (!only_body) { if (!nice){ // code for usual, NOT nice-latex-file - LFile += "\\batchmode\n"; // changed + ofs << "\\batchmode\n"; // changed // from \nonstopmode texrow.newline(); } if (!original_path.empty()) { - LFile += "\\makeatletter\n"; + ofs << "\\makeatletter\n" + << "\\def\\input@path{{" + << original_path << "/}}\n" + << "\\makeatother\n"; texrow.newline(); - LFile += "\\def\\input@path{{" + original_path - + "/}}\n"; texrow.newline(); - LFile += "\\makeatother\n"; texrow.newline(); } - LFile += "\\documentclass"; + ofs << "\\documentclass"; string options; // the document class options. @@ -1675,10 +1734,15 @@ void Buffer::makeLaTeXFile(string const & fname, // if needed if (params.sides != tclass.sides()) { - if (params.sides == 2) - options += "twoside,"; - else + switch (params.sides) { + case LyXTextClass::OneSide: options += "oneside,"; + break; + case LyXTextClass::TwoSides: + options += "twoside,"; + break; + } + } // if needed @@ -1693,15 +1757,20 @@ void Buffer::makeLaTeXFile(string const & fname, && params.orientation == BufferParams::ORIENTATION_LANDSCAPE) options += "landscape,"; - // language should be a parameter to \documentclass - if (params.language != "default") { - if (params.language == "hebrew") - options += "english,"; - else if (lyxrc->rtl_support) - options += "hebrew,"; - options += params.language + ','; - } else if (lyxrc->rtl_support) - options += "hebrew,english,"; + // language should be a parameter to \documentclass + bool use_babel = false; + if (params.language != "default" || + !features.UsedLanguages.empty() ) { + use_babel = true; + for (LaTeXFeatures::LanguageList::const_iterator cit = + features.UsedLanguages.begin(); + cit != features.UsedLanguages.end(); ++cit) { + options += (*cit)->lang + ","; + } + if (default_language != params.language_info) + options += default_language ->lang + ','; + options += params.language_info->lang + ','; + } // the user-defined options if (!params.options.empty()) { @@ -1710,31 +1779,29 @@ void Buffer::makeLaTeXFile(string const & fname, if (!options.empty()){ options = strip(options, ','); - LFile += '['; - LFile += options; - LFile += ']'; + ofs << '[' << options << ']'; } - LFile += '{'; - LFile += textclasslist.LatexnameOfClass(params.textclass); - LFile += "}\n"; + ofs << '{' + << textclasslist.LatexnameOfClass(params.textclass) + << "}\n"; texrow.newline(); // end of \documentclass defs // font selection must be done before loading fontenc.sty if (params.fonts != "default") { - LFile += "\\usepackage{" + params.fonts + "}\n"; + ofs << "\\usepackage{" << params.fonts << "}\n"; texrow.newline(); } // this one is not per buffer - if (lyxrc->fontenc != "default") { - LFile += "\\usepackage[" + lyxrc->fontenc - + "]{fontenc}\n"; + if (lyxrc.fontenc != "default") { + ofs << "\\usepackage[" << lyxrc.fontenc + << "]{fontenc}\n"; texrow.newline(); } if (params.inputenc != "default") { - LFile += "\\usepackage[" + params.inputenc - + "]{inputenc}\n"; + ofs << "\\usepackage[" << params.inputenc + << "]{inputenc}\n"; texrow.newline(); } @@ -1742,180 +1809,177 @@ void Buffer::makeLaTeXFile(string const & fname, if (params.paperpackage != BufferParams::PACKAGE_NONE) { switch (params.paperpackage) { case BufferParams::PACKAGE_A4: - LFile += "\\usepackage{a4}\n"; + ofs << "\\usepackage{a4}\n"; texrow.newline(); break; case BufferParams::PACKAGE_A4WIDE: - LFile += "\\usepackage{a4wide}\n"; + ofs << "\\usepackage{a4wide}\n"; texrow.newline(); break; case BufferParams::PACKAGE_WIDEMARGINSA4: - LFile += "\\usepackage[widemargins]{a4}\n"; + ofs << "\\usepackage[widemargins]{a4}\n"; texrow.newline(); break; } } if (params.use_geometry) { - LFile += "\\usepackage{geometry}\n"; + ofs << "\\usepackage{geometry}\n"; texrow.newline(); - LFile += "\\geometry{verbose"; + ofs << "\\geometry{verbose"; if (params.orientation == BufferParams::ORIENTATION_LANDSCAPE) - LFile += ",landscape"; + ofs << ",landscape"; switch (params.papersize2) { case BufferParams::VM_PAPER_CUSTOM: if (!params.paperwidth.empty()) - LFile += ",paperwidth=" - + params.paperwidth; + ofs << ",paperwidth=" + << params.paperwidth; if (!params.paperheight.empty()) - LFile += ",paperheight=" - + params.paperheight; + ofs << ",paperheight=" + << params.paperheight; break; case BufferParams::VM_PAPER_USLETTER: - LFile += ",letterpaper"; + ofs << ",letterpaper"; break; case BufferParams::VM_PAPER_USLEGAL: - LFile += ",legalpaper"; + ofs << ",legalpaper"; break; case BufferParams::VM_PAPER_USEXECUTIVE: - LFile += ",executivepaper"; + ofs << ",executivepaper"; break; case BufferParams::VM_PAPER_A3: - LFile += ",a3paper"; + ofs << ",a3paper"; break; case BufferParams::VM_PAPER_A4: - LFile += ",a4paper"; + ofs << ",a4paper"; break; case BufferParams::VM_PAPER_A5: - LFile += ",a5paper"; + ofs << ",a5paper"; break; case BufferParams::VM_PAPER_B3: - LFile += ",b3paper"; + ofs << ",b3paper"; break; case BufferParams::VM_PAPER_B4: - LFile += ",b4paper"; + ofs << ",b4paper"; break; case BufferParams::VM_PAPER_B5: - LFile += ",b5paper"; + ofs << ",b5paper"; break; default: // default papersize ie BufferParams::VM_PAPER_DEFAULT - switch (lyxrc->default_papersize) { + switch (lyxrc.default_papersize) { case BufferParams::PAPER_DEFAULT: // keep compiler happy case BufferParams::PAPER_USLETTER: - LFile += ",letterpaper"; + ofs << ",letterpaper"; break; case BufferParams::PAPER_LEGALPAPER: - LFile += ",legalpaper"; + ofs << ",legalpaper"; break; case BufferParams::PAPER_EXECUTIVEPAPER: - LFile += ",executivepaper"; + ofs << ",executivepaper"; break; case BufferParams::PAPER_A3PAPER: - LFile += ",a3paper"; + ofs << ",a3paper"; break; case BufferParams::PAPER_A4PAPER: - LFile += ",a4paper"; + ofs << ",a4paper"; break; case BufferParams::PAPER_A5PAPER: - LFile += ",a5paper"; + ofs << ",a5paper"; break; case BufferParams::PAPER_B5PAPER: - LFile += ",b5paper"; + ofs << ",b5paper"; break; } } if (!params.topmargin.empty()) - LFile += ",tmargin=" + params.topmargin; + ofs << ",tmargin=" << params.topmargin; if (!params.bottommargin.empty()) - LFile += ",bmargin=" + params.bottommargin; + ofs << ",bmargin=" << params.bottommargin; if (!params.leftmargin.empty()) - LFile += ",lmargin=" + params.leftmargin; + ofs << ",lmargin=" << params.leftmargin; if (!params.rightmargin.empty()) - LFile += ",rmargin=" + params.rightmargin; + ofs << ",rmargin=" << params.rightmargin; if (!params.headheight.empty()) - LFile += ",headheight=" + params.headheight; + ofs << ",headheight=" << params.headheight; if (!params.headsep.empty()) - LFile += ",headsep=" + params.headsep; + ofs << ",headsep=" << params.headsep; if (!params.footskip.empty()) - LFile += ",footskip=" + params.footskip; - LFile += "}\n"; + ofs << ",footskip=" << params.footskip; + ofs << "}\n"; texrow.newline(); } if (params.use_amsmath && !prefixIs(textclasslist.LatexnameOfClass(params.textclass), "ams")) { - LFile += "\\usepackage{amsmath}\n"; + ofs << "\\usepackage{amsmath}\n"; + texrow.newline(); } if (tokenPos(tclass.opt_pagestyle(), '|', params.pagestyle) >= 0) { if (params.pagestyle == "fancy") { - LFile += "\\usepackage{fancyhdr}\n"; + ofs << "\\usepackage{fancyhdr}\n"; texrow.newline(); } - LFile += "\\pagestyle{" + params.pagestyle + "}\n"; + ofs << "\\pagestyle{" << params.pagestyle << "}\n"; texrow.newline(); } // We try to load babel late, in case it interferes // with other packages. - if (params.language != "default" || lyxrc->rtl_support ) { - LFile += "\\usepackage{babel}\n"; + if (use_babel) { + ofs << lyxrc.language_package << endl; texrow.newline(); } if (params.secnumdepth != tclass.secnumdepth()) { - LFile += "\\setcounter{secnumdepth}{"; - LFile += tostr(params.secnumdepth); - LFile += "}\n"; + ofs << "\\setcounter{secnumdepth}{" + << params.secnumdepth + << "}\n"; texrow.newline(); } if (params.tocdepth != tclass.tocdepth()) { - LFile += "\\setcounter{tocdepth}{"; - LFile += tostr(params.tocdepth); - LFile += "}\n"; + ofs << "\\setcounter{tocdepth}{" + << params.tocdepth + << "}\n"; texrow.newline(); } if (params.paragraph_separation) { switch (params.defskip.kind()) { case VSpace::SMALLSKIP: - LFile += "\\setlength\\parskip{\\smallskipamount}\n"; + ofs << "\\setlength\\parskip{\\smallskipamount}\n"; break; case VSpace::MEDSKIP: - LFile += "\\setlength\\parskip{\\medskipamount}\n"; + ofs << "\\setlength\\parskip{\\medskipamount}\n"; break; case VSpace::BIGSKIP: - LFile += "\\setlength\\parskip{\\bigskipamount}\n"; + ofs << "\\setlength\\parskip{\\bigskipamount}\n"; break; case VSpace::LENGTH: - LFile += "\\setlength\\parskip{" - + params.defskip.length().asLatexString() - + "}\n"; + ofs << "\\setlength\\parskip{" + << params.defskip.length().asLatexString() + << "}\n"; break; default: // should never happen // Then delete it. - LFile += "\\setlength\\parskip{\\medskipamount}\n"; + ofs << "\\setlength\\parskip{\\medskipamount}\n"; break; } texrow.newline(); - LFile += "\\setlength\\parindent{0pt}\n"; + ofs << "\\setlength\\parindent{0pt}\n"; texrow.newline(); } - // Write out what we've generated so far...and reset LFile - ofs << LFile; - LFile.clear(); - // Now insert the LyX specific LaTeX commands... string preamble, tmppreamble; // The optional packages; - preamble = features.getPackages(params); + preamble = features.getPackages(); // this might be useful... preamble += "\n\\makeatletter\n\n"; // Some macros LyX will need - tmppreamble = features.getMacros(params); + tmppreamble = features.getMacros(); if (!tmppreamble.empty()) { preamble += "\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% " @@ -1924,7 +1988,7 @@ void Buffer::makeLaTeXFile(string const & fname, } // the text class specific preamble - tmppreamble = features.getTClassPreamble(params); + tmppreamble = features.getTClassPreamble(); if (!tmppreamble.empty()) { preamble += "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% " "Textclass specific LaTeX commands.\n" @@ -1982,29 +2046,46 @@ void Buffer::makeLaTeXFile(string const & fname, ofs << preamble; // make the body. - LFile += "\\begin{document}\n\n"; + ofs << "\\begin{document}\n\n"; texrow.newline(); texrow.newline(); } // only_body lyxerr.debug() << "preamble finished, now the body." << endl; + if (!lyxrc.language_auto_begin && params.language != "default") { + ofs << subst(lyxrc.language_command_begin, "$$lang", + params.language) + << endl; + texrow.newline(); + } bool was_title = false; bool already_title = false; - string ftnote; +#ifdef HAVE_SSTREAM + std::ostringstream ftnote; +#else + char * tmpholder = 0; +#endif TexRow ft_texrow; int ftcount = 0; - int loop_count = 0; LyXParagraph * par = paragraph; // if only_body while (par) { - ++loop_count; +#ifndef HAVE_SSTREAM + ostrstream ftnote; + if (tmpholder) { + ftnote << tmpholder; + delete [] tmpholder; + tmpholder = 0; + } +#endif if (par->IsDummy()) lyxerr[Debug::LATEX] << "Error in MakeLateXFile." << endl; - LyXLayout const & layout = textclasslist.Style(params.textclass, - par->layout); + LyXLayout const & layout = + textclasslist.Style(params.textclass, + par->layout); if (layout.intitle) { if (already_title) { @@ -2014,7 +2095,7 @@ void Buffer::makeLaTeXFile(string const & fname, } else was_title = true; } else if (was_title && !already_title) { - LFile += "\\maketitle\n"; + ofs << "\\maketitle\n"; texrow.newline(); already_title = true; was_title = false; @@ -2025,45 +2106,57 @@ void Buffer::makeLaTeXFile(string const & fname, ftcount = -1; if (layout.isEnvironment() || par->pextra_type != LyXParagraph::PEXTRA_NONE) { - par = par->TeXEnvironment(LFile, texrow, + par = par->TeXEnvironment(ofs, texrow, ftnote, ft_texrow, ftcount); } else { - par = par->TeXOnePar(LFile, texrow, + par = par->TeXOnePar(ofs, texrow, ftnote, ft_texrow, ftcount); } - // Write out what we've generated...and reset LFile + // Write out what we've generated... if (ftcount >= 1) { if (ftcount > 1) { - LFile += "\\addtocounter{footnote}{-"; - LFile += tostr(ftcount - 1); - LFile += '}'; + ofs << "\\addtocounter{footnote}{-" + << ftcount - 1 + << '}'; } - LFile += ftnote; + ofs << ftnote.str(); texrow += ft_texrow; - ftnote.clear(); +#ifdef HAVE_SSTREAM + // The extra .c_str() is needed when we use + // lyxstring instead of the STL string class. + ftnote.str(string().c_str()); +#else + delete [] ftnote.str(); +#endif ft_texrow.reset(); ftcount = 0; } - if (loop_count == 2) { - // fwrite()ing every second time through the loop - // gains a few extra % of speed; going higher than - // 2 will slow things down again. I'll look at - // LFile.length() in a future revision. ARRae - ofs << LFile; - LFile.clear(); - loop_count = 0; +#ifndef HAVE_SSTREAM + else { + // I hate strstreams + tmpholder = ftnote.str(); } +#endif } - +#ifndef HAVE_SSTREAM + delete [] tmpholder; +#endif // It might be that we only have a title in this document if (was_title && !already_title) { - LFile += "\\maketitle\n"; + ofs << "\\maketitle\n"; + texrow.newline(); + } + + if (!lyxrc.language_auto_end && params.language != "default") { + ofs << subst(lyxrc.language_command_end, "$$lang", + params.language) + << endl; texrow.newline(); } if (!only_body) { - LFile += "\\end{document}\n"; + ofs << "\\end{document}\n"; texrow.newline(); lyxerr[Debug::LATEX] << "makeLaTeXFile...done" << endl; @@ -2075,18 +2168,17 @@ void Buffer::makeLaTeXFile(string const & fname, // Just to be sure. (Asger) texrow.newline(); - // Write out what we've generated...and reset LFile - ofs << LFile; - LFile.clear(); - // tex_code_break_column's value is used to decide // if we are in batchmode or not (within mathed_write() // in math_write.C) so we must set it to a non-zero // value when we leave otherwise we save incorrect .lyx files. - tex_code_break_column = lyxrc->ascii_linelen; + tex_code_break_column = lyxrc.ascii_linelen; - // How to check if the close went ok when using fstreams ofs.close(); + if (ofs.fail()) { + lyxerr << "File was not closed properly." << endl; + } + lyxerr.debug() << "Finished making latex file." << endl; } @@ -2326,7 +2418,6 @@ void Buffer::DocBookHandleCaption(ostream & os, string & inner_tag, LyXParagraph * & par) { LyXParagraph * tpar = par; - string tmp_par, extra_par; while (tpar && (tpar->footnoteflag != LyXParagraph::NO_FOOTNOTE) && (tpar->layout != textclasslist.NumberOfLayout(params.textclass, "Caption").second)) @@ -2335,11 +2426,9 @@ void Buffer::DocBookHandleCaption(ostream & os, string & inner_tag, tpar->layout == textclasslist.NumberOfLayout(params.textclass, "Caption").second) { sgmlOpenTag(os, depth + 1, inner_tag); - SimpleDocBookOnePar(tmp_par, extra_par, tpar, + string extra_par; + SimpleDocBookOnePar(os, extra_par, tpar, desc_on, depth + 2); - tmp_par = strip(tmp_par); - tmp_par = frontStrip(tmp_par); - os << tmp_par; sgmlCloseTag(os, depth+1, inner_tag); if(!extra_par.empty()) os << extra_par; @@ -2355,16 +2444,16 @@ void Buffer::DocBookHandleFootnote(ostream & os, LyXParagraph * & par, bool inner_span = false; int desc_on = 4; - // This is not how I like to see enums. They should not be anonymous - // and variables of its type should not be declared right after the - // last brace. (Lgb) - enum { + // Someone should give this enum a proper name (Lgb) + enum SOME_ENUM { NO_ONE, FOOTNOTE_LIKE, MARGIN_LIKE, FIG_LIKE, TAB_LIKE - } last = NO_ONE, present = FOOTNOTE_LIKE; + }; + SOME_ENUM last = NO_ONE; + SOME_ENUM present = FOOTNOTE_LIKE; while (par && par->footnoteflag != LyXParagraph::NO_FOOTNOTE) { if(last == present) { @@ -2372,15 +2461,16 @@ void Buffer::DocBookHandleFootnote(ostream & os, LyXParagraph * & par, if(!tmp_par.empty()) { os << tmp_par; tmp_par.clear(); - sgmlCloseTag(os, depth+1, inner_tag); - sgmlOpenTag(os, depth+1, inner_tag); + sgmlCloseTag(os, depth + 1, inner_tag); + sgmlOpenTag(os, depth + 1, inner_tag); } } else os << "\n"; } else { os << tmp_par; - if(!inner_tag.empty()) sgmlCloseTag(os, depth+1, inner_tag); + if(!inner_tag.empty()) sgmlCloseTag(os, depth + 1, + inner_tag); if(!extra_par.empty()) os << extra_par; if(!tag.empty()) sgmlCloseTag(os, depth, tag); extra_par.clear(); @@ -2424,10 +2514,24 @@ void Buffer::DocBookHandleFootnote(ostream & os, LyXParagraph * & par, } } // ignore all caption here, we processed them above!!! - if (par->layout != textclasslist.NumberOfLayout(params.textclass, - "Caption").second) { - SimpleDocBookOnePar(tmp_par, extra_par, par, + if (par->layout != textclasslist + .NumberOfLayout(params.textclass, + "Caption").second) { +#ifdef HAVE_SSTREAM + std::ostringstream ost; +#else + ostrstream ost; +#endif + SimpleDocBookOnePar(ost, extra_par, par, desc_on, depth + 2); +#ifdef HAVE_SSTREAM + tmp_par += ost.str().c_str(); +#else + ost << '\0'; + char * ctmp = ost.str(); + tmp_par += ctmp; + delete [] ctmp; +#endif } tmp_par = frontStrip(strip(tmp_par)); @@ -2435,7 +2539,7 @@ void Buffer::DocBookHandleFootnote(ostream & os, LyXParagraph * & par, par = par->next; } os << tmp_par; - if(!inner_tag.empty()) sgmlCloseTag(os, depth+1, inner_tag); + if(!inner_tag.empty()) sgmlCloseTag(os, depth + 1, inner_tag); if(!extra_par.empty()) os << extra_par; if(!tag.empty()) sgmlCloseTag(os, depth, tag); } @@ -2458,23 +2562,24 @@ void Buffer::push_tag(ostream & os, char const * tag, } -// pop a tag from a style stack void Buffer::pop_tag(ostream & os, char const * tag, - int & pos, char stack[5][3]) + int & pos, char stack[5][3]) { - // pop all tags till specified one - for (int j = pos; (j >= 0) && (strcmp(stack[j], tag)); --j) - os << ""; + int j; - // closes the tag - os << ""; + // pop all tags till specified one + for (j = pos; (j >= 0) && (strcmp(stack[j], tag)); --j) + os << ""; - // push all tags, but the specified one - for (int i = 0; i <= pos; ++i) { - os << "<" << stack[i] << ">"; - strcpy(stack[i - 1], stack[i]); - } - --pos; + // closes the tag + os << ""; + + // push all tags, but the specified one + for (j = j + 1; j <= pos; ++j) { + os << "<" << stack[j] << ">"; + strcpy(stack[j-1], stack[j]); + } + --pos; } @@ -2487,7 +2592,7 @@ void linux_doc_line_break(ostream & os, unsigned int & colcount, const unsigned int newcol) { colcount += newcol; - if (colcount > lyxrc->ascii_linelen) { + if (colcount > lyxrc.ascii_linelen) { os << "\n"; colcount = newcol; // assume write after this call } @@ -2633,16 +2738,13 @@ void Buffer::SimpleLinuxDocOnePar(ostream & os, LyXParagraph * par, if (font2.latex() == LyXFont::ON) { // "TeX"-Mode on == > SGML-Mode on. - if (c!= '\0') + if (c != '\0') os << c; // see LaTeX-Generation... ++char_line_count; } else if (c == LyXParagraph::META_INSET) { inset = par->GetInset(i); - string tmp_out; - inset->Linuxdoc(tmp_out); - os << tmp_out; - } - else { + inset->Linuxdoc(os); + } else { string sgml_string; if (par->linuxDocConvertChar(c, sgml_string) && !style.free_spacing) { // in freespacing @@ -2762,9 +2864,10 @@ void Buffer::makeDocBookFile(string const & fname, int column) } while (par) { - int desc_on= 0; /* description mode*/ - LyXLayout const & style = textclasslist.Style(users->buffer()->params.textclass, - par->layout); + int desc_on = 0; /* description mode*/ + LyXLayout const & style = + textclasslist.Style(users->buffer()->params.textclass, + par->layout); par->AutoDeleteInsets(); /* environment tag closing */ @@ -2927,12 +3030,9 @@ void Buffer::makeDocBookFile(string const & fname, int column) } do { - string tmp_par, extra_par; - - SimpleDocBookOnePar(tmp_par, extra_par, par, desc_on, + string extra_par; + SimpleDocBookOnePar(ofs, extra_par, par, desc_on, depth + 1 + command_depth); - ofs << tmp_par; - par = par->next; DocBookHandleFootnote(ofs, par, depth + 1 + command_depth); @@ -2997,64 +3097,70 @@ void Buffer::makeDocBookFile(string const & fname, int column) } -void Buffer::SimpleDocBookOnePar(string & file, string & extra, +void Buffer::SimpleDocBookOnePar(ostream & os, string & extra, LyXParagraph * par, int & desc_on, int const depth) { if (par->table) { - par->SimpleDocBookOneTablePar(file, extra, desc_on, depth); + par->SimpleDocBookOneTablePar(os, extra, desc_on, depth); return; } - LyXFont font1, font2; - char c; - Inset *inset; - LyXParagraph::size_type main_body; - int j; - string emph= "emphasis"; - bool emph_flag= false; - int char_line_count= 0; + + bool emph_flag = false; LyXLayout const & style = textclasslist.Style(params.textclass, par->GetLayout()); + LyXParagraph::size_type main_body; if (style.labeltype != LABEL_MANUAL) main_body = 0; else main_body = par->BeginningOfMainBody(); - /* gets paragraph main font */ - if (main_body > 0) - font1 = style.labelfont; - else - font1 = style.font; - - char_line_count = depth; + // gets paragraph main font + //if (main_body > 0) + // font1 = style.labelfont; + //else + // font1 = style.font; + LyXFont font1 = main_body > 0 ? style.labelfont : style.font; + + int char_line_count = depth; if(!style.free_spacing) - for (j = 0; j < depth; ++j) - file += ' '; + for (int j = 0; j < depth; ++j) + os << ' '; - /* parsing main loop */ + // parsing main loop for (LyXParagraph::size_type i = 0; i < par->size(); ++i) { - font2 = par->getFont(i); + LyXFont font2 = par->getFont(i); - /* handle tag */ + // handle tag if (font1.emph() != font2.emph() && i) { if (font2.emph() == LyXFont::ON) { - file += ""; - emph_flag= true; + os << ""; + emph_flag = true; }else { - file += ""; - emph_flag= false; + os << ""; + emph_flag = false; } } - c = par->GetChar(i); + char c = par->GetChar(i); if (c == LyXParagraph::META_INSET) { - inset = par->GetInset(i); - string tmp_out; - inset->DocBook(tmp_out); + Inset * inset = par->GetInset(i); +#ifdef HAVE_SSTREAM + std::ostringstream ost; + inset->DocBook(ost); + string tmp_out = ost.str().c_str(); +#else + ostrstream ost; + inset->DocBook(ost); + ost << '\0'; + char * ctmp = ost.str(); + string tmp_out(ctmp); + delete [] ctmp; +#endif // // This code needs some explanation: // Two insets are treated specially @@ -3070,15 +3176,15 @@ void Buffer::SimpleDocBookOnePar(string & file, string & extra, if(desc_on == 4) extra += frontStrip(tmp_out, '@'); else - file += frontStrip(tmp_out, '@'); + os << frontStrip(tmp_out, '@'); } else - file += tmp_out; + os << tmp_out; } } else if (font2.latex() == LyXFont::ON) { // "TeX"-Mode on ==> SGML-Mode on. - if (c!= '\0') - file += c; + if (c != '\0') + os << c; ++char_line_count; } else { @@ -3090,16 +3196,15 @@ void Buffer::SimpleDocBookOnePar(string & file, string & extra, // char is ' ' if (desc_on == 1) { ++char_line_count; - file += '\n'; - file += ""; + os << "\n"; desc_on = 2; } else { - file += c; + os << c; } } else { - file += sgml_string; + os << sgml_string; } } font1 = font2; @@ -3110,50 +3215,17 @@ void Buffer::SimpleDocBookOnePar(string & file, string & extra, font1 = style.font; } if (emph_flag) { - file += ""; + os << ""; } /* resets description flag correctly */ switch(desc_on){ case 1: /* not closed... */ - file += ""; + os << ""; break; } - file += '\n'; -} - - -bool BufferView::removeAutoInsets() -{ - LyXParagraph * par = buffer()->paragraph; - - LyXCursor cursor = text->cursor; - LyXCursor tmpcursor = cursor; - cursor.par = tmpcursor.par->ParFromPos(tmpcursor.pos); - cursor.pos = tmpcursor.par->PositionInParFromPos(tmpcursor.pos); - - bool a = false; - while (par) { - if (par->AutoDeleteInsets()){ - a = true; - if (par->footnoteflag != LyXParagraph::CLOSED_FOOTNOTE){ - // this is possible now, since SetCursor takes - // care about footnotes - text->SetCursorIntern(par, 0); - text->RedoParagraphs(text->cursor, - text->cursor.par->Next()); - text->FullRebreak(); - } - } - par = par->next; - } - // avoid forbidden cursor positions caused by error removing - if (cursor.pos > cursor.par->Last()) - cursor.pos = cursor.par->Last(); - text->SetCursorIntern(cursor.par, cursor.pos); - - return a; + os << '\n'; } @@ -3169,7 +3241,7 @@ int Buffer::runLaTeX() string path = OnlyPath(filename); string org_path = path; - if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)) { + if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1)) { path = tmppath; } @@ -3185,8 +3257,8 @@ int Buffer::runLaTeX() // do the LaTex run(s) TeXErrors terr; - string latex_command = lyxrc->pdf_mode ? - lyxrc->pdflatex_command : lyxrc->latex_command; + string latex_command = lyxrc.pdf_mode ? + lyxrc.pdflatex_command : lyxrc.latex_command; LaTeX latex(latex_command, name, filepath); int res = latex.run(terr, users->owner()->getMiniBuffer()); // running latex @@ -3232,12 +3304,12 @@ int Buffer::runLiterate() string name = getLatexName(); // get Literate-Filename string lit_name = ChangeExtension (getLatexName(), - lyxrc->literate_extension, true); + lyxrc.literate_extension, true); string path = OnlyPath(filename); string org_path = path; - if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)) { + if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1)) { path = tmppath; } @@ -3253,12 +3325,12 @@ int Buffer::runLiterate() markDviDirty(); } - string latex_command = lyxrc->pdf_mode ? - lyxrc->pdflatex_command : lyxrc->latex_command; + string latex_command = lyxrc.pdf_mode ? + lyxrc.pdflatex_command : lyxrc.latex_command; Literate literate(latex_command, name, filepath, lit_name, - lyxrc->literate_command, lyxrc->literate_error_filter, - lyxrc->build_command, lyxrc->build_error_filter); + lyxrc.literate_command, lyxrc.literate_error_filter, + lyxrc.build_command, lyxrc.build_error_filter); TeXErrors terr; int res = literate.weave(terr, users->owner()->getMiniBuffer()); @@ -3303,12 +3375,12 @@ int Buffer::buildProgram() string name = getLatexName(); // get Literate-Filename string lit_name = ChangeExtension(getLatexName(), - lyxrc->literate_extension, true); + lyxrc.literate_extension, true); string path = OnlyPath(filename); string org_path = path; - if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)) { + if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1)) { path = tmppath; } @@ -3324,12 +3396,12 @@ int Buffer::buildProgram() markNwDirty(); } - string latex_command = lyxrc->pdf_mode ? - lyxrc->pdflatex_command : lyxrc->latex_command; + string latex_command = lyxrc.pdf_mode ? + lyxrc.pdflatex_command : lyxrc.latex_command; Literate literate(latex_command, name, filepath, lit_name, - lyxrc->literate_command, lyxrc->literate_error_filter, - lyxrc->build_command, lyxrc->build_error_filter); + lyxrc.literate_command, lyxrc.literate_error_filter, + lyxrc.build_command, lyxrc.build_error_filter); TeXErrors terr; int res = literate.build(terr, users->owner()->getMiniBuffer()); @@ -3377,7 +3449,7 @@ int Buffer::runChktex() string path = OnlyPath(filename); string org_path = path; - if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)) { + if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1)) { path = tmppath; } @@ -3394,7 +3466,7 @@ int Buffer::runChktex() } TeXErrors terr; - Chktex chktex(lyxrc->chktex_command, name, filepath); + Chktex chktex(lyxrc.chktex_command, name, filepath); int res = chktex.run(terr); // run chktex if (res == -1) { @@ -3418,73 +3490,10 @@ int Buffer::runChktex() } -void BufferView::insertErrors(TeXErrors & terr) -{ - // Save the cursor position - LyXCursor cursor = text->cursor; - - // This is drastic, but it's the only fix, I could find. (Asger) - allFloats(1, 0); - allFloats(1, 1); - - for (TeXErrors::Errors::const_iterator cit = terr.begin(); - cit != terr.end(); - ++cit) { - string desctext((*cit).error_desc); - string errortext((*cit).error_text); - string msgtxt = desctext + '\n' + errortext; - int errorrow = (*cit).error_in_line; - - // Insert error string for row number - int tmpid = -1; - int tmppos = -1; - - buffer()->texrow.getIdFromRow(errorrow, tmpid, tmppos); - - LyXParagraph * texrowpar = 0; - - if (tmpid == -1) { - texrowpar = text->FirstParagraph(); - tmppos = 0; - } else { - texrowpar = text->GetParFromID(tmpid); - } - - if (texrowpar == 0) - continue; - - InsetError * new_inset = new InsetError(msgtxt); - text->SetCursorIntern(texrowpar, tmppos); - text->InsertInset(new_inset); - text->FullRebreak(); - } - // Restore the cursor position - text->SetCursorIntern(cursor.par, cursor.pos); -} - - -void BufferView::setCursorFromRow(int row) -{ - int tmpid = -1; - int tmppos = -1; - - buffer()->texrow.getIdFromRow(row, tmpid, tmppos); - - LyXParagraph * texrowpar; - - if (tmpid == -1) { - texrowpar = text->FirstParagraph(); - tmppos = 0; - } else { - texrowpar = text->GetParFromID(tmpid); - } - text->SetCursor(texrowpar, tmppos); -} - - +#if 0 void Buffer::RoffAsciiTable(ostream & os, LyXParagraph * par) { - LyXFont font1 = LyXFont(LyXFont::ALL_INHERIT); + LyXFont font1(LyXFont::ALL_INHERIT,params.language_info); LyXFont font2; Inset * inset; LyXParagraph::size_type i; @@ -3516,6 +3525,34 @@ void Buffer::RoffAsciiTable(ostream & os, LyXParagraph * par) switch (c) { case LyXParagraph::META_INSET: if ((inset = par->GetInset(i))) { +#if 1 +#ifdef HAVE_SSTREAM + stringstresm ss(ios::in | ios::out); + inset->Latex(ss, -1); + ss.seekp(0); + ss.get(c); + while (!ss) { + if (c == '\\') + ofs << "\\\\"; + else + ofs << c; + ss.get(c); + } +#else + strstream ss; + inset->Latex(ss, -1); + ss.seekp(0); + ss.get(c); + while (!ss) { + if (c == '\\') + ofs << "\\\\"; + else + ofs << c; + ss.get(c); + } + delete [] ss.str(); +#endif +#else fstream fs(fname2.c_str(), ios::in|ios::out); if (!fs) { WriteAlert(_("LYX_ERROR:"), @@ -3535,6 +3572,7 @@ void Buffer::RoffAsciiTable(ostream & os, LyXParagraph * par) fs >> c; } fs.close(); +#endif } break; case LyXParagraph::META_NEWLINE: @@ -3545,8 +3583,10 @@ void Buffer::RoffAsciiTable(ostream & os, LyXParagraph * par) break; case LyXParagraph::META_HFILL: break; +#if 0 case LyXParagraph::META_PROTECTED_SEPARATOR: break; +#endif case '\\': ofs << "\\\\"; break; @@ -3562,7 +3602,7 @@ void Buffer::RoffAsciiTable(ostream & os, LyXParagraph * par) } par->table->RoffEndOfCell(ofs, cell); ofs.close(); - string cmd = lyxrc->ascii_roff_command + " >" + fname2; + string cmd = lyxrc.ascii_roff_command + " >" + fname2; cmd = subst(cmd, "$$FName", fname1); Systemcalls one(Systemcalls::System, cmd); if (!(lyxerr.debugging(Debug::ROFF))) { @@ -3597,12 +3637,13 @@ void Buffer::RoffAsciiTable(ostream & os, LyXParagraph * par) ifs.close(); remove(fname2.c_str()); } +#endif /// changed Heinrich Bauer, 23/03/98 -bool Buffer::isDviClean() +bool Buffer::isDviClean() const { - if (lyxrc->use_tempdir) + if (lyxrc.use_tempdir) return dvi_clean_tmpd; else return dvi_clean_orgd; @@ -3612,7 +3653,7 @@ bool Buffer::isDviClean() /// changed Heinrich Bauer, 23/03/98 void Buffer::markDviClean() { - if (lyxrc->use_tempdir) + if (lyxrc.use_tempdir) dvi_clean_tmpd = true; else dvi_clean_orgd = true; @@ -3622,14 +3663,14 @@ void Buffer::markDviClean() /// changed Heinrich Bauer, 23/03/98 void Buffer::markDviDirty() { - if (lyxrc->use_tempdir) + if (lyxrc.use_tempdir) dvi_clean_tmpd = false; else dvi_clean_orgd = false; } -void Buffer::validate(LaTeXFeatures & features) +void Buffer::validate(LaTeXFeatures & features) const { LyXParagraph * par = paragraph; LyXTextClass const & tclass = @@ -3680,7 +3721,7 @@ void Buffer::validate(LaTeXFeatures & features) } if (lyxerr.debugging(Debug::LATEX)) { - features.showStruct(params); + features.showStruct(); } } @@ -3712,100 +3753,6 @@ void Buffer::setPaperStuff() } -#if 0 -void Buffer::setOldPaperStuff() -{ - char c = params.papersize = params.papersize2; - params.papersize2 = BufferParams::VM_PAPER_DEFAULT; - params.paperpackage = BufferParams::PACKAGE_NONE; - if (c == OLD_PAPER_A4PAPER) - params.papersize2 = BufferParams::VM_PAPER_A4; - else if (c == OLD_PAPER_A4) - params.paperpackage = BufferParams::PACKAGE_A4; - else if (c == OLD_PAPER_A4WIDE) - params.paperpackage = BufferParams::PACKAGE_A4WIDE; - else if (c == OLD_PAPER_WIDEMARGINSA4) - params.paperpackage = BufferParams::PACKAGE_WIDEMARGINSA4; - else if (c == OLD_PAPER_USLETTER) - params.papersize2 = BufferParams::VM_PAPER_USLETTER; - else if (c == OLD_PAPER_A5PAPER) - params.papersize2 = BufferParams::VM_PAPER_A5; - else if (c == OLD_PAPER_B5PAPER) - params.papersize2 = BufferParams::VM_PAPER_B5; - else if (c == OLD_PAPER_EXECUTIVEPAPER) - params.papersize2 = BufferParams::VM_PAPER_USEXECUTIVE; - else if (c == OLD_PAPER_LEGALPAPER) - params.papersize2 = BufferParams::VM_PAPER_USLEGAL; - setPaperStuff(); -} -#endif - - -void BufferView::insertInset(Inset * inset, string const & lout, - bool no_table) -{ - // check for table/list in tables - if (no_table && text->cursor.par->table){ - WriteAlert(_("Impossible Operation!"), - _("Cannot insert table/list in table."), - _("Sorry.")); - return; - } - // not quite sure if we want this... - text->SetCursorParUndo(); - text->FreezeUndo(); - - beforeChange(); - if (!lout.empty()) { - update(-2); - text->BreakParagraph(); - update(-1); - - if (text->cursor.par->Last()) { - text->CursorLeft(); - - text->BreakParagraph(); - update(-1); - } - - int lay = textclasslist.NumberOfLayout(buffer()->params.textclass, - lout).second; - if (lay == -1) // layout not found - // use default layout "Standard" (0) - lay = 0; - - text->SetLayout(lay); - - text->SetParagraph(0, 0, - 0, 0, - VSpace(VSpace::NONE), VSpace(VSpace::NONE), - LYX_ALIGN_LAYOUT, - string(), - 0); - update(-1); - - text->current_font.setLatex(LyXFont::OFF); - } - - text->InsertInset(inset); - update(-1); - - text->UnFreezeUndo(); -} - - -// Open and lock an updatable inset -void BufferView::open_new_inset(UpdatableInset * new_inset) -{ - beforeChange(); - text->FinishUndo(); - insertInset(new_inset); - text->CursorLeft(); - update(1); - new_inset->Edit(0, 0); -} - - // This function should be in Buffer because it's a buffer's property (ale) string Buffer::getIncludeonlyList(char delim) { @@ -3922,37 +3869,6 @@ string Buffer::getBibkeyList(char delim) } -/* This is also a buffer property (ale) */ -// Not so sure about that. a goto Label function can not be buffer local, just -// think how this will work in a multiwindo/buffer environment, all the -// cursors in all the views showing this buffer will move. (Lgb) -// OK, then no cursor action should be allowed in buffer. (ale) -bool BufferView::gotoLabel(string const & label) - -{ - LyXParagraph * par = buffer()->paragraph; - LyXParagraph::size_type pos; - Inset * inset; - while (par) { - pos = -1; - while ((inset = par->ReturnNextInsetPointer(pos))){ - for (int i = 0; i < inset->GetNumberOfLabels(); ++i) { - if (label == inset->getLabel(i)) { - beforeChange(); - text->SetCursor(par, pos); - text->sel_cursor = text->cursor; - update(0); - return true; - } - } - ++pos; - } - par = par->next; - } - return false; -} - - bool Buffer::isDepClean(string const & name) const { DEPCLEAN * item = dep_clean; @@ -4009,3 +3925,25 @@ void Buffer::Dispatch(int action, string const & argument) } // end of switch } + +void Buffer::ChangeLanguage(Language const * from, Language const * to) +{ + + LyXParagraph * par = paragraph; + while (par) { + par->ChangeLanguage(from,to); + par = par->next; + } +} + +bool Buffer::isMultiLingual() +{ + + LyXParagraph * par = paragraph; + while (par) { + if (par->isMultiLingual()) + return true; + par = par->next; + } + return false; +}