#include <fstream>
#include <iomanip>
+#include <map>
+#include <stack>
+#include <list>
#include <cstdlib>
#include <cmath>
#endif
#ifdef __GNUG__
-#pragma implementation "buffer.h"
+#pragma implementation
#endif
#include "buffer.h"
#include "tex-strings.h"
#include "layout.h"
#include "bufferview_funcs.h"
-#include "minibuffer.h"
#include "lyxfont.h"
#include "version.h"
#include "mathed/formulamacro.h"
#include "insets/insettabular.h"
#include "insets/insettheorem.h"
#include "insets/insetcaption.h"
+#include "insets/insetfloatlist.h"
#include "support/filetools.h"
#include "support/path.h"
+#include "support/os.h"
#include "LaTeX.h"
#include "Chktex.h"
#include "LyXView.h"
#include "encoding.h"
#include "exporter.h"
#include "Lsstream.h"
+#include "converter.h"
+using std::stringstream;
using std::ostream;
using std::ofstream;
using std::ifstream;
using std::setw;
using std::endl;
using std::pair;
+using std::make_pair;
using std::vector;
+using std::map;
using std::max;
using std::set;
+using std::stack;
+using std::list;
// all these externs should eventually be removed.
extern BufferList bufferlist;
extern LyXAction lyxaction;
+namespace {
-#if 0
-static const float LYX_FORMAT = 2.17;
-#else
-static const int LYX_FORMAT = 218;
-#endif
+const int LYX_FORMAT = 218;
+
+} // namespace anon
extern int tex_code_break_column;
LyXParagraph * par = paragraph;
LyXParagraph * tmppar;
while (par) {
- tmppar = par->next;
+ tmppar = par->next();
delete par;
par = tmppar;
}
}
+pair<Buffer::LogType, string> const Buffer::getLogName(void) const
+{
+ string const filename = getLatexName(false);
+
+ if (filename.empty())
+ return make_pair(Buffer::latexlog, string());
+
+ string path = OnlyPath(filename);
+
+ if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1))
+ path = tmppath;
+
+ string const fname = AddName(path,
+ OnlyFilename(ChangeExtension(filename,
+ ".log")));
+ string const bname =
+ AddName(path, OnlyFilename(
+ ChangeExtension(filename,
+ formats.Extension("literate") + ".out")));
+
+ // If no Latex log or Build log is newer, show Build log
+
+ FileInfo const f_fi(fname);
+ FileInfo const b_fi(bname);
+
+ if (b_fi.exist() &&
+ (!f_fi.exist() || f_fi.getModificationTime() < b_fi.getModificationTime())) {
+ lyxerr[Debug::FILES] << "Log name calculated as : " << bname << endl;
+ return make_pair(Buffer::buildlog, bname);
+ }
+ lyxerr[Debug::FILES] << "Log name calculated as : " << fname << endl;
+ return make_pair(Buffer::latexlog, fname);
+}
+
+
void Buffer::setReadonly(bool flag)
{
if (read_only != flag) {
{
int pos = 0;
char depth = 0; // signed or unsigned?
-#ifndef NEW_INSETS
- LyXParagraph::footnote_flag footnoteflag = LyXParagraph::NO_FOOTNOTE;
- LyXParagraph::footnote_kind footnotekind = LyXParagraph::FOOTNOTE;
-#endif
bool the_end_read = false;
LyXParagraph * return_par = 0;
LyXFont font(LyXFont::ALL_INHERIT, params.language);
-#if 0
- if (format < 2.16 && params.language->lang() == "hebrew")
- font.setLanguage(default_language);
-#else
if (file_format < 216 && params.language->lang() == "hebrew")
font.setLanguage(default_language);
-#endif
// If we are inserting, we cheat and get a token in advance
bool has_token = false;
string pretoken;
parseSingleLyXformat2Token(lex, par, return_par,
pretoken, pos, depth,
font
-#ifndef NEW_INSETS
- , footnoteflag,
- footnotekind
-#endif
);
}
// We'll remove this later. (Lgb)
-static string last_inset_read;
+namespace {
+
+string last_inset_read;
+
+} // anon
bool
LyXParagraph *& return_par,
string const & token, int & pos,
char & depth, LyXFont & font
-#ifndef NEW_INSETS
- , LyXParagraph::footnote_flag & footnoteflag,
- LyXParagraph::footnote_kind & footnotekind
-#endif
)
{
bool the_end_read = false;
+#ifndef NO_PEXTRA_REALLY
+ // This is super temporary but is needed to get the compability
+ // mode for minipages work correctly together with new tabulars.
+ static int call_depth = 0;
+ ++call_depth;
+ bool checkminipage = false;
+ static LyXParagraph * minipar = 0;
+ static LyXParagraph * parBeforeMinipage = 0;
+#endif
if (token[0] != '\\') {
for (string::const_iterator cit = token.begin();
- cit != token.end(); ++cit) {
+ cit != token.end(); ++cit)
+ {
par->InsertChar(pos, (*cit), font);
++pos;
}
+ checkminipage = true;
} else if (token == "\\i") {
Inset * inset = new InsetLatexAccent;
inset->Read(this, lex);
par->InsertInset(pos, inset, font);
++pos;
} else if (token == "\\layout") {
- if (!return_par)
- return_par = par;
- else {
- par->fitToSize();
- par = new LyXParagraph(par);
- }
- pos = 0;
- lex.EatLine();
- string const layoutname = lex.GetString();
- pair<bool, LyXTextClass::LayoutList::size_type> 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;
-#ifndef NEW_INSETS
- par->footnoteflag = footnoteflag;
- par->footnotekind = footnotekind;
-#endif
- par->depth = depth;
- font = LyXFont(LyXFont::ALL_INHERIT, params.language);
-#if 0
- if (format < 2.16 && params.language->lang() == "hebrew")
- font.setLanguage(default_language);
-#else
- if (file_format < 216 && params.language->lang() == "hebrew")
- font.setLanguage(default_language);
+ lex.EatLine();
+ string const layoutname = lex.GetString();
+ pair<bool, LyXTextClass::LayoutList::size_type> pp
+ = textclasslist.NumberOfLayout(params.textclass,
+ layoutname);
+
+#ifdef USE_CAPTION
+ // The is the compability reading of layout caption.
+ // It can be removed in LyX version 1.3.0. (Lgb)
+ if (compare_no_case(layoutname, "caption") == 0) {
+ // We expect that the par we are now working on is
+ // really inside a InsetText inside a InsetFloat.
+ // We also know that captions can only be
+ // one paragraph. (Lgb)
+
+ // We should now read until the next "\layout"
+ // is reached.
+ // This is probably not good enough, what if the
+ // caption is the last par in the document (Lgb)
+ istream & ist = lex.getStream();
+ stringstream ss;
+ string line;
+ int begin = 0;
+ while (true) {
+ getline(ist, line);
+ if (prefixIs(line, "\\layout")) {
+ lex.pushToken(line);
+ break;
+ }
+ if (prefixIs(line, "\\begin_inset"))
+ ++begin;
+ if (prefixIs(line, "\\end_inset")) {
+ if (begin)
+ --begin;
+ else {
+ lex.pushToken(line);
+ break;
+ }
+ }
+
+ ss << line << '\n';
+ }
+ // Now we should have the whole layout in ss
+ // we should now be able to give this to the
+ // caption inset.
+ ss << "\\end_inset\n";
+
+ // This seems like a bug in stringstream.
+ // We really should be able to use ss
+ // directly. (Lgb)
+ istringstream is(ss.str());
+ LyXLex tmplex(0, 0);
+ tmplex.setStream(is);
+ Inset * inset = new InsetCaption;
+ inset->Read(this, tmplex);
+ par->InsertInset(pos, inset, font);
+ ++pos;
+ } else {
#endif
-#ifndef NEW_INSETS
- } 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);
-#if 0
- if (format < 2.16 && params.language->lang() == "hebrew")
- font.setLanguage(default_language);
-#else
- if (file_format < 216 && params.language->lang() == "hebrew")
- font.setLanguage(default_language);
+ if (!return_par)
+ return_par = par;
+ else {
+ par->fitToSize();
+ par = new LyXParagraph(par);
+ }
+ pos = 0;
+ 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->params.depth(depth);
+ font = LyXFont(LyXFont::ALL_INHERIT, params.language);
+ if (file_format < 216
+ && params.language->lang() == "hebrew")
+ font.setLanguage(default_language);
+#if USE_CAPTION
+ }
#endif
+
} else if (token == "\\begin_float") {
- int tmpret = lex.FindToken(string_footnotekinds);
- if (tmpret == -1) ++tmpret;
- if (tmpret != LYX_LAYOUT_DEFAULT)
- footnotekind = static_cast<LyXParagraph::footnote_kind>(tmpret); // bad
- if (footnotekind == LyXParagraph::FOOTNOTE
- || footnotekind == LyXParagraph::MARGIN)
- footnoteflag = LyXParagraph::CLOSED_FOOTNOTE;
- else
- footnoteflag = LyXParagraph::OPEN_FOOTNOTE;
-#else
- } else if (token == "\\begin_float") {
- // This is the compability reader, unfinished but tested.
- // (Lgb)
+ // This is the compability reader. It can be removed in
+ // LyX version 1.3.0. (Lgb)
lex.next();
string const tmptok = lex.GetString();
//lyxerr << "old float: " << tmptok << endl;
Inset * inset = 0;
- string old_float;
+ stringstream old_float;
if (tmptok == "footnote") {
inset = new InsetFoot;
inset = new InsetMarginal;
} else if (tmptok == "fig") {
inset = new InsetFloat("figure");
- old_float += "placement htbp\n";
+ old_float << "placement htbp\n";
} else if (tmptok == "tab") {
inset = new InsetFloat("table");
- old_float += "placement htbp\n";
+ old_float << "placement htbp\n";
} else if (tmptok == "alg") {
inset = new InsetFloat("algorithm");
- old_float += "placement htbp\n";
+ old_float << "placement htbp\n";
} else if (tmptok == "wide-fig") {
InsetFloat * tmp = new InsetFloat("figure");
tmp->wide(true);
inset = tmp;
- old_float += "placement htbp\n";
+ old_float << "placement htbp\n";
} else if (tmptok == "wide-tab") {
InsetFloat * tmp = new InsetFloat("table");
tmp->wide(true);
inset = tmp;
- old_float += "placement htbp\n";
+ old_float << "placement htbp\n";
}
- if (!inset) return false; // no end read yet
+ if (!inset) {
+ --call_depth;
+ return false; // no end read yet
+ }
- old_float += "collapsed true\n";
+ old_float << "collapsed true\n";
// Here we need to check for \end_deeper and handle that
// before we do the footnote parsing.
// This _is_ a hack! (Lgb)
- while(true) {
+ while (true) {
lex.next();
string const tmp = lex.GetString();
if (tmp == "\\end_deeper") {
- lyxerr << "\\end_deeper caught!" << endl;
+ //lyxerr << "\\end_deeper caught!" << endl;
if (!depth) {
lex.printError("\\end_deeper: "
"depth is already null");
--depth;
} else {
- old_float += tmp;
- old_float += ' ';
+ old_float << tmp << ' ';
break;
}
}
- old_float += lex.getLongString("\\end_float");
- old_float += "\n\\end_inset\n";
- //lyxerr << "float body: " << old_float << endl;
-
- istringstream istr(old_float);
-
+ old_float << lex.getLongString("\\end_float")
+ << "\n\\end_inset\n";
+ //lyxerr << "Float Body:\n" << old_float.str() << endl;
+ // That this does not work seems like a bug
+ // in stringstream. (Lgb)
+ istringstream istr(old_float.str());
LyXLex nylex(0, 0);
nylex.setStream(istr);
-
inset->Read(this, nylex);
par->InsertInset(pos, inset, font);
++pos;
-#endif
} else if (token == "\\begin_deeper") {
++depth;
} else if (token == "\\end_deeper") {
lex.EatLine();
params.fonts = lex.GetString();
} else if (token == "\\noindent") {
- par->noindent = true;
+ par->params.noindent(true);
} else if (token == "\\fill_top") {
- par->added_space_top = VSpace(VSpace::VFILL);
+ par->params.spaceTop(VSpace(VSpace::VFILL));
} else if (token == "\\fill_bottom") {
- par->added_space_bottom = VSpace(VSpace::VFILL);
+ par->params.spaceBottom(VSpace(VSpace::VFILL));
} else if (token == "\\line_top") {
- par->line_top = true;
+ par->params.lineTop(true);
} else if (token == "\\line_bottom") {
- par->line_bottom = true;
+ par->params.lineBottom(true);
} else if (token == "\\pagebreak_top") {
- par->pagebreak_top = true;
+ par->params.pagebreakTop(true);
} else if (token == "\\pagebreak_bottom") {
- par->pagebreak_bottom = true;
+ par->params.pagebreakBottom(true);
} else if (token == "\\start_of_appendix") {
- par->start_of_appendix = true;
+ par->params.startOfAppendix(true);
} else if (token == "\\paragraph_separation") {
int tmpret = lex.FindToken(string_paragraph_separation);
if (tmpret == -1) ++tmpret;
// Small hack so that files written with klyx will be
// parsed correctly.
if (return_par) {
- par->spacing.set(tmp_space, tmp_val);
+ par->params.spacing(Spacing(tmp_space, tmp_val));
} else {
params.spacing.set(tmp_space, tmp_val);
}
lex.next();
string const tmp = strip(lex.GetString());
if (tmp == "single") {
- par->spacing.set(Spacing::Single);
+ par->params.spacing(Spacing(Spacing::Single));
} else if (tmp == "onehalf") {
- par->spacing.set(Spacing::Onehalf);
+ par->params.spacing(Spacing(Spacing::Onehalf));
} else if (tmp == "double") {
- par->spacing.set(Spacing::Double);
+ par->params.spacing(Spacing(Spacing::Double));
} else if (tmp == "other") {
lex.next();
- par->spacing.set(Spacing::Other,
- lex.GetFloat());
+ par->params.spacing(Spacing(Spacing::Other,
+ lex.GetFloat()));
} else {
lex.printError("Unknown spacing token: '$$Token'");
}
int tmpret = lex.FindToken(string_align);
if (tmpret == -1) ++tmpret;
if (tmpret != LYX_LAYOUT_DEFAULT) { // tmpret != 99 ???
-#if 0
- int tmpret2 = 1;
- for (; tmpret > 0; --tmpret)
- tmpret2 = tmpret2 * 2;
-#else
int const tmpret2 = int(pow(2.0, tmpret));
-#endif
//lyxerr << "Tmpret2 = " << tmpret2 << endl;
- par->align = LyXAlignment(tmpret2);
+ par->params.align(LyXAlignment(tmpret2));
}
} else if (token == "\\added_space_top") {
lex.nextToken();
- par->added_space_top = VSpace(lex.GetString());
+ par->params.spaceTop(VSpace(lex.GetString()));
} else if (token == "\\added_space_bottom") {
lex.nextToken();
- par->added_space_bottom = VSpace(lex.GetString());
+ par->params.spaceBottom(VSpace(lex.GetString()));
+#ifndef NO_PEXTRA_REALLY
} else if (token == "\\pextra_type") {
lex.nextToken();
- par->pextra_type = lex.GetInteger();
+ par->params.pextraType(lex.GetInteger());
} else if (token == "\\pextra_width") {
lex.nextToken();
- par->pextra_width = lex.GetString();
+ par->params.pextraWidth(lex.GetString());
} else if (token == "\\pextra_widthp") {
lex.nextToken();
- par->pextra_widthp = lex.GetString();
+ par->params.pextraWidthp(lex.GetString());
} else if (token == "\\pextra_alignment") {
lex.nextToken();
- par->pextra_alignment = lex.GetInteger();
+ par->params.pextraAlignment(lex.GetInteger());
} else if (token == "\\pextra_hfill") {
lex.nextToken();
- par->pextra_hfill = lex.GetInteger();
+ par->params.pextraHfill(lex.GetInteger());
} else if (token == "\\pextra_start_minipage") {
lex.nextToken();
- par->pextra_start_minipage = lex.GetInteger();
+ par->params.pextraStartMinipage(lex.GetInteger());
+#endif
} else if (token == "\\labelwidthstring") {
lex.EatLine();
- par->labelwidthstring = lex.GetString();
+ par->params.labelWidthString(lex.GetString());
// do not delete this token, it is still needed!
} else if (token == "\\end_inset") {
lyxerr << "Solitary \\end_inset. Missing \\begin_inset?.\n"
inset->Read(this, lex);
par->InsertInset(pos, inset, font);
++pos;
+ // because of OLD_TABULAR_READ where tabulars have been
+ // one paragraph.
+ checkminipage = true;
} else if (token == "\\hfill") {
par->InsertChar(pos, LyXParagraph::META_HFILL, font);
++pos;
++pos;
} else if (token == "\\bibitem") { // ale970302
if (!par->bibkey) {
- InsetCommandParams p( "bibitem" );
+ InsetCommandParams p("bibitem", "dummy");
par->bibkey = new InsetBibKey(p);
}
par->bibkey->Read(this, lex);
++pos;
} else if (token == "\\the_end") {
the_end_read = true;
+ minipar = parBeforeMinipage = 0;
} else {
// This should be insurance for the future: (Asger)
lex.printError("Unknown token `$$Token'. "
++pos;
}
}
+#ifndef NO_PEXTRA_REALLY
+ // now check if we have a minipage paragraph as at this
+ // point we already read all the necessary data!
+ // this cannot be done in layout because there we did
+ // not read yet the paragraph PEXTRA-params (Jug)
+ //
+ // BEGIN pextra_minipage compability
+ // This should be removed in 1.3.x (Lgb)
+
+ // This compability code is not perfect. In a couple
+ // of rand cases it fails. When the minipage par is
+ // the first par in the document, and when there are
+ // none or only one regular paragraphs after the
+ // minipage. Currently I am not investing any effort
+ // in fixing those cases.
+
+ //lyxerr << "Call depth: " << call_depth << endl;
+ if (checkminipage && (call_depth == 1)) {
+ checkminipage = false;
+ if (minipar && (minipar != par) &&
+ (par->params.pextraType()==LyXParagraph::PEXTRA_MINIPAGE))
+ {
+ lyxerr << "minipages in a row" << endl;
+ if (par->params.pextraStartMinipage()) {
+ lyxerr << "start new minipage" << endl;
+ // minipages in a row
+ par->previous()->next(0);
+ par->previous(0);
+
+ LyXParagraph * tmp = minipar;
+ while (tmp) {
+ tmp->params.pextraType(0);
+ tmp->params.pextraWidth(string());
+ tmp->params.pextraWidthp(string());
+ tmp->params.pextraAlignment(0);
+ tmp->params.pextraHfill(false);
+ tmp->params.pextraStartMinipage(false);
+ tmp = tmp->next();
+ }
+ // create a new paragraph to insert the
+ // minipages in the following case
+ if (par->params.pextraStartMinipage() &&
+ !par->params.pextraHfill())
+ {
+ LyXParagraph * p = new LyXParagraph;
+ p->layout = 0;
+ p->previous(parBeforeMinipage);
+ parBeforeMinipage->next(p);
+ p->next(0);
+ p->params.depth(parBeforeMinipage->params.depth());
+ parBeforeMinipage = p;
+ }
+ InsetMinipage * mini = new InsetMinipage;
+ mini->pos(static_cast<InsetMinipage::Position>(par->params.pextraAlignment()));
+ mini->width(par->params.pextraWidth());
+ if (!par->params.pextraWidthp().empty()) {
+ lyxerr << "WP:" << mini->width() << endl;
+ mini->width(tostr(par->params.pextraWidthp())+"%");
+ }
+ mini->inset.par = par;
+ // Insert the minipage last in the
+ // previous paragraph.
+ if (par->params.pextraHfill()) {
+ parBeforeMinipage->InsertChar
+ (parBeforeMinipage->size(), LyXParagraph::META_HFILL);
+ }
+ parBeforeMinipage->InsertInset
+ (parBeforeMinipage->size(), mini);
+
+ minipar = par;
+ } else {
+ lyxerr << "new minipage par" << endl;
+ //nothing to do just continue reading
+ }
+
+ } else if (minipar && (minipar != par)) {
+ lyxerr << "last minipage par read" << endl;
+ // The last paragraph read was not part of a
+ // minipage but the par linked list is...
+ // So we need to remove the last par from the
+ // rest
+ if (par->previous())
+ par->previous()->next(0);
+ par->previous(parBeforeMinipage);
+ parBeforeMinipage->next(par);
+ LyXParagraph * tmp = minipar;
+ while (tmp) {
+ tmp->params.pextraType(0);
+ tmp->params.pextraWidth(string());
+ tmp->params.pextraWidthp(string());
+ tmp->params.pextraAlignment(0);
+ tmp->params.pextraHfill(false);
+ tmp->params.pextraStartMinipage(false);
+ tmp = tmp->next();
+ }
+ depth = parBeforeMinipage->params.depth();
+ minipar = parBeforeMinipage = 0;
+ } else if (!minipar &&
+ (par->params.pextraType() == LyXParagraph::PEXTRA_MINIPAGE))
+ {
+ // par is the first paragraph in a minipage
+ lyxerr << "begin minipage" << endl;
+ // To minimize problems for
+ // the users we will insert
+ // the first minipage in
+ // a sequence of minipages
+ // in its own paragraph.
+ LyXParagraph * p = new LyXParagraph;
+ p->layout = 0;
+ p->previous(par->previous());
+ p->next(0);
+ p->params.depth(depth);
+ par->params.depth(0);
+ depth = 0;
+ if (par->previous())
+ par->previous()->next(p);
+ par->previous(0);
+ parBeforeMinipage = p;
+ minipar = par;
+ if (!return_par || (return_par == par))
+ return_par = p;
+
+ InsetMinipage * mini = new InsetMinipage;
+ mini->pos(static_cast<InsetMinipage::Position>(minipar->params.pextraAlignment()));
+ mini->width(minipar->params.pextraWidth());
+ if (!par->params.pextraWidthp().empty()) {
+ lyxerr << "WP:" << mini->width() << endl;
+ mini->width(tostr(par->params.pextraWidthp())+"%");
+ }
+ mini->inset.par = minipar;
+
+ // Insert the minipage last in the
+ // previous paragraph.
+ if (minipar->params.pextraHfill()) {
+ parBeforeMinipage->InsertChar
+ (parBeforeMinipage->size(),LyXParagraph::META_HFILL);
+ }
+ parBeforeMinipage->InsertInset
+ (parBeforeMinipage->size(), mini);
+ }
+ }
+ // End of pextra_minipage compability
+#endif
+ --call_depth;
return the_end_read;
}
InsetCommandParams inscmd;
inscmd.Read(lex);
- if (inscmd.getCmdName() == "cite") {
+ string const cmdName = inscmd.getCmdName();
+
+ if (cmdName == "cite") {
inset = new InsetCitation(inscmd);
- } else if (inscmd.getCmdName() == "bibitem") {
+ } else if (cmdName == "bibitem") {
lex.printError("Wrong place for bibitem");
inset = new InsetBibKey(inscmd);
- } else if (inscmd.getCmdName() == "BibTeX") {
+ } else if (cmdName == "BibTeX") {
inset = new InsetBibtex(inscmd);
- } else if (inscmd.getCmdName() == "index") {
+ } else if (cmdName == "index") {
inset = new InsetIndex(inscmd);
- } else if (inscmd.getCmdName() == "include") {
+ } else if (cmdName == "include") {
inset = new InsetInclude(inscmd, *this);
- } else if (inscmd.getCmdName() == "label") {
+ } else if (cmdName == "label") {
inset = new InsetLabel(inscmd);
- } else if (inscmd.getCmdName() == "url"
- || inscmd.getCmdName() == "htmlurl") {
+ } else if (cmdName == "url"
+ || cmdName == "htmlurl") {
inset = new InsetUrl(inscmd);
- } else if (inscmd.getCmdName() == "ref"
- || inscmd.getCmdName() == "pageref"
- || inscmd.getCmdName() == "vref"
- || inscmd.getCmdName() == "vpageref"
- || inscmd.getCmdName() == "prettyref") {
+ } else if (cmdName == "ref"
+ || cmdName == "pageref"
+ || cmdName == "vref"
+ || cmdName == "vpageref"
+ || cmdName == "prettyref") {
if (!inscmd.getOptions().empty()
|| !inscmd.getContents().empty()) {
inset = new InsetRef(inscmd, *this);
}
- } else if (inscmd.getCmdName() == "tableofcontents"
- || inscmd.getCmdName() == "listofalgorithms"
- || inscmd.getCmdName() == "listoffigures"
- || inscmd.getCmdName() == "listoftables") {
+ } else if (cmdName == "tableofcontents") {
inset = new InsetTOC(inscmd);
- } else if (inscmd.getCmdName() == "printindex") {
+ } else if (cmdName == "listofalgorithms") {
+ inset = new InsetFloatList("algorithm");
+ } else if (cmdName == "listoffigures") {
+ inset = new InsetFloatList("figure");
+ } else if (cmdName == "listoftables") {
+ inset = new InsetFloatList("table");
+ } else if (cmdName == "printindex") {
inset = new InsetPrintIndex(inscmd);
- } else if (inscmd.getCmdName() == "lyxparent") {
+ } else if (cmdName == "lyxparent") {
inset = new InsetParent(inscmd, *this);
}
} else {
inset = new InsetCaption;
} else if (tmptok == "GRAPHICS") {
inset = new InsetGraphics;
+ } else if (tmptok == "FloatList") {
+ inset = new InsetFloatList;
}
if (inset) inset->Read(this, lex);
string const token(lex.GetString());
if (token == "\\lyxformat") { // the first token _must_ be...
lex.EatLine();
-#if 0
- format = lex.GetFloat();
- if (format > 1.0) {
- if (LYX_FORMAT - format > 0.05) {
- lyxerr << fmt(_("Warning: need lyxformat %.2f but found %.2f"),
- LYX_FORMAT, format) << endl;
- }
- if (format - LYX_FORMAT > 0.05) {
- lyxerr << fmt(_("ERROR: need lyxformat %.2f but found %.2f"),
- LYX_FORMAT, format) << endl;
- }
- bool the_end = readLyXformat2(lex, par);
- // Formats >= 2.13 support "\the_end" marker
- if (format < 2.13)
- the_end = true;
-
- setPaperStuff();
-
- if (!the_end)
- WriteAlert(_("Warning!"),
- _("Reading of document is not complete"),
- _("Maybe the document is truncated"));
- // We simulate a safe reading anyways to allow
- // users to take the chance... (Asger)
- return true;
- } // format < 1.0
- else {
- WriteAlert(_("ERROR!"),
- _("Old LyX file format found. "
- "Use LyX 0.10.x to read this!"));
- return false;
- }
-
-#else
string tmp_format = lex.GetString();
//lyxerr << "LyX Format: `" << tmp_format << "'" << endl;
// if present remove ".," from string.
_("Reading of document is not complete"),
_("Maybe the document is truncated"));
return true;
-#endif
} else { // "\\lyxformat" not found
WriteAlert(_("ERROR!"), _("Not a LyX file!"));
}
s = fileName() + '~';
if (!lyxrc.backupdir_path.empty())
s = AddName(lyxrc.backupdir_path,
- subst(CleanupPath(s),'/','!'));
+ subst(os::slashify_path(s),'/','!'));
// Rename is the wrong way of making a backup,
// this is the correct way.
// write out a comment in the top of the file
ofs << '#' << LYX_DOCVERSION
- << " created this file. For more info see http://www.lyx.org/\n";
-#if 0
- ofs.setf(ios::showpoint|ios::fixed);
- ofs.precision(2);
-#ifndef HAVE_LOCALE
- char dummy_format[512];
- sprintf(dummy_format, "%.2f", LYX_FORMAT);
- ofs << "\\lyxformat " << dummy_format << "\n";
-#else
- ofs << "\\lyxformat " << setw(4) << LYX_FORMAT << "\n";
-#endif
-#else
- ofs << "\\lyxformat" << LYX_FORMAT << "\n";
-#endif
+ << " created this file. For more info see http://www.lyx.org/\n"
+ << "\\lyxformat " << LYX_FORMAT << "\n";
+
// now write out the buffer paramters.
params.writeFile(ofs);
- char footnoteflag = 0;
char depth = 0;
// this will write out all the paragraphs
// using recursive descent.
- paragraph->writeFile(this, ofs, params, footnoteflag, depth);
+ paragraph->writeFile(this, ofs, params, depth);
// Write marker that shows file is complete
ofs << "\n\\the_end" << endl;
unsigned int linelen) const
{
ostringstream buffer;
- LyXFont font1;
- LyXFont font2;
- Inset const * inset;
- char c;
-#ifndef NEW_INSETS
- LyXParagraph::footnote_flag footnoteflag = LyXParagraph::NO_FOOTNOTE;
-#endif
char depth = 0;
int ltype = 0;
int ltype_depth = 0;
int noparbreak = 0;
int islatex = 0;
- if (
-#ifndef NEW_INSETS
- par->footnoteflag != LyXParagraph::NO_FOOTNOTE ||
-#endif
- !par->previous
-#ifndef NEW_INSETS
- || par->previous->footnoteflag == LyXParagraph::NO_FOOTNOTE
-#endif
- ){
-#ifndef NEW_INSETS
- /* begins a footnote environment ? */
- if (footnoteflag != par->footnoteflag) {
- footnoteflag = par->footnoteflag;
- if (footnoteflag) {
- size_t const j = strlen(string_footnotekinds[par->footnotekind]) + 4;
- if ((linelen > 0) &&
- ((currlinelen + j) > linelen)) {
- buffer << "\n";
- currlinelen = 0;
- }
- buffer << "(["
- << string_footnotekinds[par->footnotekind]
- << "] ";
- currlinelen += j;
- }
- }
-#endif
- /* begins or ends a deeper area ?*/
- if (depth != par->depth) {
- if (par->depth > depth) {
- while (par->depth > depth) {
+ if (!par->previous()) {
+ // begins or ends a deeper area ?
+ if (depth != par->params.depth()) {
+ if (par->params.depth() > depth) {
+ while (par->params.depth() > depth) {
++depth;
}
- }
- else {
- while (par->depth < depth) {
+ } else {
+ while (par->params.depth() < depth) {
--depth;
}
}
}
- /* First write the layout */
+ // First write the layout
string const tmp = textclasslist.NameOfLayout(params.textclass, par->layout);
if (tmp == "Itemize") {
ltype = 1;
- ltype_depth = depth+1;
+ ltype_depth = depth + 1;
} else if (tmp == "Enumerate") {
ltype = 2;
- ltype_depth = depth+1;
+ ltype_depth = depth + 1;
} else if (strstr(tmp.c_str(), "ection")) {
ltype = 3;
- ltype_depth = depth+1;
+ ltype_depth = depth + 1;
} else if (strstr(tmp.c_str(), "aragraph")) {
ltype = 4;
- ltype_depth = depth+1;
+ ltype_depth = depth + 1;
} else if (tmp == "Description") {
ltype = 5;
- ltype_depth = depth+1;
+ ltype_depth = depth + 1;
} else if (tmp == "Abstract") {
ltype = 6;
ltype_depth = 0;
/* what about the alignment */
} else {
-#ifndef NEW_INSETS
- /* dummy layout, that means a footnote ended */
- footnoteflag = LyXParagraph::NO_FOOTNOTE;
- buffer << ") ";
- noparbreak = 1;
-#else
lyxerr << "Should this ever happen?" << endl;
-#endif
}
- font1 = LyXFont(LyXFont::ALL_INHERIT, params.language);
+ LyXFont const font1 = LyXFont(LyXFont::ALL_INHERIT, params.language);
for (LyXParagraph::size_type i = 0; i < par->size(); ++i) {
- if (!i &&
-#ifndef NEW_INSETS
- !footnoteflag &&
-#endif
- !noparbreak) {
+ if (!i && !noparbreak) {
if (linelen > 0)
buffer << "\n\n";
for (char j = 0; j < depth; ++j)
buffer << " ";
currlinelen = depth * 2;
switch (ltype) {
- case 0: /* Standard */
- case 4: /* (Sub)Paragraph */
- case 5: /* Description */
+ case 0: // Standard
+ case 4: // (Sub)Paragraph
+ case 5: // Description
break;
- case 6: /* Abstract */
+ case 6: // Abstract
if (linelen > 0)
buffer << "Abstract\n\n";
else
buffer << "Abstract: ";
break;
- case 7: /* Bibliography */
+ case 7: // Bibliography
if (!ref_printed) {
if (linelen > 0)
buffer << "References\n\n";
}
break;
default:
- buffer << par->labelstring << " ";
+ buffer << par->params.labelString() << " ";
break;
}
if (ltype_depth > depth) {
currlinelen += (ltype_depth-depth)*2;
}
}
- font2 = par->GetFontSettings(params, i);
+ LyXFont const font2 = par->GetFontSettings(params, i);
if (font1.latex() != font2.latex()) {
if (font2.latex() == LyXFont::OFF)
islatex = 0;
} else {
islatex = 0;
}
- c = par->GetChar(i);
+
+ char c = par->GetUChar(params, i);
if (islatex)
continue;
switch (c) {
case LyXParagraph::META_INSET:
- if ((inset = par->GetInset(i))) {
+ {
+ Inset const * inset = par->GetInset(i);
+ if (inset) {
if (!inset->Ascii(this, buffer)) {
string dummy;
- string s = rsplit(buffer.str().c_str(),
- dummy, '\n');
+ string const s =
+ rsplit(buffer.str().c_str(),
+ dummy, '\n');
currlinelen += s.length();
} else {
// to be sure it breaks paragraph
currlinelen += linelen;
}
}
- break;
+ }
+ break;
+
case LyXParagraph::META_NEWLINE:
if (linelen > 0) {
buffer << "\n";
currlinelen += (ltype_depth - depth) * 2;
}
break;
+
case LyXParagraph::META_HFILL:
buffer << "\t";
break;
+
case '\\':
buffer << "\\";
break;
+
default:
if ((linelen > 0) && (currlinelen > (linelen - 10)) &&
(c == ' ') && ((i + 2) < par->size()))
LyXParagraph * par = paragraph;
while (par) {
ofs << asciiParagraph(par, linelen);
- par = par->next;
+ par = par->next();
}
ofs << "\n";
}
+bool use_babel;
void Buffer::makeLaTeXFile(string const & fname,
string const & original_path,
if (!original_path.empty()) {
ofs << "\\makeatletter\n"
<< "\\def\\input@path{{"
- << original_path << "/}}\n"
+ << os::external_path(original_path) << "/}}\n"
<< "\\makeatother\n";
texrow.newline();
texrow.newline();
ofs << "\\documentclass";
- string options; // the document class options.
+ ostringstream options; // the document class options.
if (tokenPos(tclass.opt_fontsize(),
'|', params.fontsize) >= 0) {
// only write if existing in list (and not default)
- options += params.fontsize;
- options += "pt,";
+ options << params.fontsize << "pt,";
}
(params.paperpackage == BufferParams::PACKAGE_NONE)) {
switch (params.papersize) {
case BufferParams::PAPER_A4PAPER:
- options += "a4paper,";
+ options << "a4paper,";
break;
case BufferParams::PAPER_USLETTER:
- options += "letterpaper,";
+ options << "letterpaper,";
break;
case BufferParams::PAPER_A5PAPER:
- options += "a5paper,";
+ options << "a5paper,";
break;
case BufferParams::PAPER_B5PAPER:
- options += "b5paper,";
+ options << "b5paper,";
break;
case BufferParams::PAPER_EXECUTIVEPAPER:
- options += "executivepaper,";
+ options << "executivepaper,";
break;
case BufferParams::PAPER_LEGALPAPER:
- options += "legalpaper,";
+ options << "legalpaper,";
break;
}
}
if (params.sides != tclass.sides()) {
switch (params.sides) {
case LyXTextClass::OneSide:
- options += "oneside,";
+ options << "oneside,";
break;
case LyXTextClass::TwoSides:
- options += "twoside,";
+ options << "twoside,";
break;
}
-
}
// if needed
if (params.columns != tclass.columns()) {
if (params.columns == 2)
- options += "twocolumn,";
+ options << "twocolumn,";
else
- options += "onecolumn,";
+ options << "onecolumn,";
}
if (!params.use_geometry
&& params.orientation == BufferParams::ORIENTATION_LANDSCAPE)
- options += "landscape,";
+ options << "landscape,";
// language should be a parameter to \documentclass
- bool use_babel = false;
- if (params.language->babel() == "hebrew") // This seems necessary
+ use_babel = false;
+ ostringstream language_options;
+ if (params.language->babel() == "hebrew"
+ && default_language->babel() != "hebrew")
+ // This seems necessary
features.UsedLanguages.insert(default_language);
-#ifdef DO_USE_DEFAULT_LANGUAGE
- if (params.language->lang() != "default" ||
+
+ if (lyxrc.language_use_babel ||
+ params.language->lang() != lyxrc.default_language ||
!features.UsedLanguages.empty()) {
-#endif
use_babel = true;
for (LaTeXFeatures::LanguageList::const_iterator cit =
features.UsedLanguages.begin();
cit != features.UsedLanguages.end(); ++cit)
- options += (*cit)->babel() + ",";
- options += params.language->babel() + ',';
-#ifdef DO_USE_DEFAULT_LANGUAGE
+ language_options << (*cit)->babel() << ',';
+ language_options << params.language->babel();
+ if (lyxrc.language_global_options)
+ options << language_options.str() << ',';
}
-#endif
// the user-defined options
if (!params.options.empty()) {
- options += params.options + ',';
+ options << params.options << ',';
}
-
- if (!options.empty()){
- options = strip(options, ',');
- ofs << '[' << options << ']';
+
+ string strOptions(options.str().c_str());
+ if (!strOptions.empty()){
+ strOptions = strip(strOptions, ',');
+ ofs << '[' << strOptions << ']';
}
ofs << '{'
// end of \documentclass defs
// font selection must be done before loading fontenc.sty
- if (params.fonts != "default") {
+ // The ae package is not needed when using OT1 font encoding.
+ if (params.fonts != "default" &&
+ (params.fonts != "ae" || lyxrc.fontenc != "default")) {
ofs << "\\usepackage{" << params.fonts << "}\n";
texrow.newline();
+ if (params.fonts == "ae") {
+ ofs << "\\usepackage{aecompl}\n";
+ texrow.newline();
+ }
}
// this one is not per buffer
if (lyxrc.fontenc != "default") {
ofs << "}\n";
texrow.newline();
}
- if (params.use_amsmath
+ if (features.amsstyle
&& !tclass.provides(LyXTextClass::amsmath)) {
ofs << "\\usepackage{amsmath}\n";
texrow.newline();
// We try to load babel late, in case it interferes
// with other packages.
if (use_babel) {
- ofs << lyxrc.language_package << endl;
+ string tmp = lyxrc.language_package;
+ if (!lyxrc.language_global_options
+ && tmp == "\\usepackage{babel}")
+ tmp = string("\\usepackage[") +
+ language_options.str().c_str() +
+ "]{babel}";
+ ofs << tmp << "\n";
texrow.newline();
}
texrow.newline();
} // only_body
lyxerr.debug() << "preamble finished, now the body." << endl;
-#ifdef DO_USE_DEFAULT_LANGUAGE
- if (!lyxrc.language_auto_begin && params.language->lang() != "default") {
-#else
+
if (!lyxrc.language_auto_begin) {
-#endif
ofs << subst(lyxrc.language_command_begin, "$$lang",
params.language->babel())
<< endl;
ofs << endl;
texrow.newline();
-#ifdef DO_USE_DEFAULT_LANGUAGE
- if (!lyxrc.language_auto_end && params.language->lang() != "default") {
-#else
- if (!lyxrc.language_auto_end) {
-#endif
+ if (!lyxrc.language_auto_end) {
ofs << subst(lyxrc.language_command_end, "$$lang",
params.language->babel())
<< endl;
{
bool was_title = false;
bool already_title = false;
- std::ostringstream ftnote;
- TexRow ft_texrow;
- int ftcount = 0;
// if only_body
while (par != endpar) {
-#ifndef NEW_INSETS
- if (par->IsDummy())
- lyxerr[Debug::LATEX] << "Error in latexParagraphs."
- << endl;
-#endif
LyXLayout const & layout =
textclasslist.Style(params.textclass,
par->layout);
already_title = true;
was_title = false;
}
- // We are at depth 0 so we can just use
- // ordinary \footnote{} generation
- // flag this with ftcount
- ftcount = -1;
- if (layout.isEnvironment()
- || par->pextra_type != LyXParagraph::PEXTRA_NONE) {
- par = par->TeXEnvironment(this, params, ofs, texrow
-#ifndef NEW_INSETS
- ,ftnote, ft_texrow, ftcount
-#endif
- );
+
+ if (layout.isEnvironment()) {
+ par = par->TeXEnvironment(this, params, ofs, texrow);
} else {
- par = par->TeXOnePar(this, params, ofs, texrow, false
-#ifndef NEW_INSETS
- ,
- ftnote, ft_texrow, ftcount
-#endif
- );
- }
-
- // Write out what we've generated...
- if (ftcount >= 1) {
- if (ftcount > 1) {
- ofs << "\\addtocounter{footnote}{-"
- << ftcount - 1
- << '}';
- }
- ofs << ftnote.str();
- texrow += ft_texrow;
-
- // The extra .c_str() is needed when we use
- // lyxstring instead of the STL string class.
- ftnote.str(string().c_str());
- ft_texrow.reset();
- ftcount = 0;
+ par = par->TeXOnePar(this, params, ofs, texrow, false);
}
}
// It might be that we only have a title in this document
void Buffer::sgmlOpenTag(ostream & os, int depth,
string const & latexname) const
{
- if (latexname != "!-- --")
+ if (!latexname.empty() && latexname != "!-- --")
os << string(depth, ' ') << "<" << latexname << ">\n";
}
void Buffer::sgmlCloseTag(ostream & os, int depth,
string const & latexname) const
{
- if (latexname != "!-- --")
+ if (!latexname.empty() && latexname != "!-- --")
os << string(depth, ' ') << "</" << latexname << ">\n";
}
void Buffer::makeLinuxDocFile(string const & fname, bool nice, bool body_only)
{
- LyXParagraph * par = paragraph;
-
- niceFile = nice; // this will be used by Insetincludes.
-
- string top_element = textclasslist.LatexnameOfClass(params.textclass);
- string environment_stack[10];
- string item_name;
-
- int depth = 0; // paragraph depth
-
ofstream ofs(fname.c_str());
if (!ofs) {
return;
}
+ niceFile = nice; // this will be used by included files.
+
LyXTextClass const & tclass =
textclasslist.TextClass(params.textclass);
LaTeXFeatures features(params, tclass.numLayouts());
validate(features);
- //if (nice)
- tex_code_break_column = lyxrc.ascii_linelen;
- //else
- //tex_code_break_column = 0;
-
texrow.reset();
+ string top_element = textclasslist.LatexnameOfClass(params.textclass);
+
if (!body_only) {
string sgml_includedfiles=features.getIncludedFiles(fname);
<< " created this file. For more info see http://www.lyx.org/"
<< " -->\n";
+ int depth = 0; // paragraph depth
+ LyXParagraph * par = paragraph;
+ string item_name;
+ vector<string> environment_stack(5);
+
while (par) {
- int desc_on = 0; // description mode
LyXLayout const & style =
textclasslist.Style(params.textclass,
par->layout);
string const temp = "toc";
sgmlOpenTag(ofs, depth, temp);
- par = par->next;
-#ifndef NEW_INSETS
- linuxDocHandleFootnote(ofs, par, depth);
-#endif
+ par = par->next();
continue;
}
}
// environment tag closing
- for (; depth > par->depth; --depth) {
+ for (; depth > par->params.depth(); --depth) {
sgmlCloseTag(ofs, depth, environment_stack[depth]);
environment_stack[depth].erase();
}
// write opening SGML tags
switch (style.latextype) {
case LATEX_PARAGRAPH:
- if (depth == par->depth
+ if (depth == par->params.depth()
&& !environment_stack[depth].empty()) {
sgmlCloseTag(ofs, depth, environment_stack[depth]);
environment_stack[depth].erase();
case LATEX_ENVIRONMENT:
case LATEX_ITEM_ENVIRONMENT:
- if (depth == par->depth
- && environment_stack[depth] != style.latexname()
- && !environment_stack[depth].empty()) {
-
+ if (depth == par->params.depth()
+ && environment_stack[depth] != style.latexname()) {
sgmlCloseTag(ofs, depth,
environment_stack[depth]);
environment_stack[depth].erase();
}
- if (depth < par->depth) {
- depth = par->depth;
+ if (depth < par->params.depth()) {
+ depth = par->params.depth();
environment_stack[depth].erase();
}
if (environment_stack[depth] != style.latexname()) {
if (depth == 0) {
- string const temp = "p";
- sgmlOpenTag(ofs, depth, temp);
+ sgmlOpenTag(ofs, depth, "p");
}
+ sgmlOpenTag(ofs, depth, style.latexname());
+
+ if (environment_stack.size() == depth + 1)
+ environment_stack.push_back("!-- --");
environment_stack[depth] = style.latexname();
- sgmlOpenTag(ofs, depth,
- environment_stack[depth]);
}
- if (style.latextype == LATEX_ENVIRONMENT) break;
- desc_on = (style.labeltype == LABEL_MANUAL);
+ if (style.latexparam() == "CDATA")
+ ofs << "<![CDATA[";
- if (desc_on)
+ if (style.latextype == LATEX_ENVIRONMENT) break;
+
+ if (style.labeltype == LABEL_MANUAL)
item_name = "tag";
else
item_name = "item";
break;
}
-#ifndef NEW_INSETS
- do {
-#endif
- SimpleLinuxDocOnePar(ofs, par, desc_on, depth);
+ SimpleLinuxDocOnePar(ofs, par, depth);
- par = par->next;
-#ifndef NEW_INSETS
- linuxDocHandleFootnote(ofs, par, depth);
- }
- while(par && par->IsDummy());
-#endif
+ par = par->next();
ofs << "\n";
// write closing SGML tags
switch (style.latextype) {
case LATEX_COMMAND:
+ break;
case LATEX_ENVIRONMENT:
case LATEX_ITEM_ENVIRONMENT:
+ if (style.latexparam() == "CDATA")
+ ofs << "]]>";
break;
default:
sgmlCloseTag(ofs, depth, style.latexname());
}
// Close open tags
- for (; depth > 0; --depth)
- sgmlCloseTag(ofs, depth, environment_stack[depth]);
-
- if (!environment_stack[depth].empty())
- sgmlCloseTag(ofs, depth, environment_stack[depth]);
+ for (int i=depth; i >= 0; --i)
+ sgmlCloseTag(ofs, depth, environment_stack[i]);
if (!body_only) {
ofs << "\n\n";
}
-#ifndef NEW_INSETS
-void Buffer::linuxDocHandleFootnote(ostream & os, LyXParagraph * & par,
- int depth)
-{
- string const tag = "footnote";
-
- while (par && par->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
- sgmlOpenTag(os, depth + 1, tag);
- SimpleLinuxDocOnePar(os, par, 0, depth + 1);
- sgmlCloseTag(os, depth + 1, tag);
- par = par->next;
- }
-}
-#endif
-
-
void Buffer::DocBookHandleCaption(ostream & os, string & inner_tag,
int depth, int desc_on,
LyXParagraph * & par)
{
LyXParagraph * tpar = par;
while (tpar
-#ifndef NEW_INSETS
- && (tpar->footnoteflag != LyXParagraph::NO_FOOTNOTE)
-#endif
&& (tpar->layout != textclasslist.NumberOfLayout(params.textclass,
- "Caption").second))
- tpar = tpar->next;
+ "Caption").second))
+ tpar = tpar->next();
+
if (tpar &&
tpar->layout == textclasslist.NumberOfLayout(params.textclass,
"Caption").second) {
}
-#ifndef NEW_INSETS
-void Buffer::DocBookHandleFootnote(ostream & os, LyXParagraph * & par,
- int depth)
-{
- string tag, inner_tag;
- string tmp_par, extra_par;
- bool inner_span = false;
- int desc_on = 4;
-
- // Someone should give this enum a proper name (Lgb)
- enum SOME_ENUM {
- NO_ONE,
- FOOTNOTE_LIKE,
- MARGIN_LIKE,
- FIG_LIKE,
- TAB_LIKE
- };
- SOME_ENUM last = NO_ONE;
- SOME_ENUM present = FOOTNOTE_LIKE;
-
- while (par && par->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
- if (last == present) {
- if (inner_span) {
- if (!tmp_par.empty()) {
- os << tmp_par;
- tmp_par.erase();
- 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 (!extra_par.empty()) os << extra_par;
- if (!tag.empty()) sgmlCloseTag(os, depth, tag);
- extra_par.erase();
-
- switch (par->footnotekind) {
- case LyXParagraph::FOOTNOTE:
- case LyXParagraph::ALGORITHM:
- tag = "footnote";
- inner_tag = "para";
- present = FOOTNOTE_LIKE;
- inner_span = true;
- break;
- case LyXParagraph::MARGIN:
- tag = "sidebar";
- inner_tag = "para";
- present = MARGIN_LIKE;
- inner_span = true;
- break;
- case LyXParagraph::FIG:
- case LyXParagraph::WIDE_FIG:
- tag = "figure";
- inner_tag = "title";
- present = FIG_LIKE;
- inner_span = false;
- break;
- case LyXParagraph::TAB:
- case LyXParagraph::WIDE_TAB:
- tag = "table";
- inner_tag = "title";
- present = TAB_LIKE;
- inner_span = false;
- break;
- }
- sgmlOpenTag(os, depth, tag);
- if ((present == TAB_LIKE) || (present == FIG_LIKE)) {
- DocBookHandleCaption(os, inner_tag, depth,
- desc_on, par);
- inner_tag.erase();
- } else {
- sgmlOpenTag(os, depth + 1, inner_tag);
- }
- }
- // ignore all caption here, we processed them above!!!
- if (par->layout != textclasslist
- .NumberOfLayout(params.textclass,
- "Caption").second) {
- std::ostringstream ost;
- SimpleDocBookOnePar(ost, extra_par, par,
- desc_on, depth + 2);
- tmp_par += ost.str().c_str();
- }
- tmp_par = frontStrip(strip(tmp_par));
+// checks, if newcol chars should be put into this line
+// writes newline, if necessary.
+namespace {
- last = present;
- par = par->next;
+void linux_doc_line_break(ostream & os, string::size_type & colcount,
+ string::size_type newcol)
+{
+ colcount += newcol;
+ if (colcount > lyxrc.ascii_linelen) {
+ os << "\n";
+ colcount = newcol; // assume write after this call
}
- os << tmp_par;
- if (!inner_tag.empty()) sgmlCloseTag(os, depth + 1, inner_tag);
- if (!extra_par.empty()) os << extra_par;
- if (!tag.empty()) sgmlCloseTag(os, depth, tag);
}
-#endif
-
-// push a tag in a style stack
-void Buffer::push_tag(ostream & os, string const & tag,
- int & pos, char stack[5][3])
-{
-#ifdef WITH_WARNINGS
-#warning Use a real stack! (Lgb)
-#endif
- // pop all previous tags
- for (int j = pos; j >= 0; --j)
- os << "</" << stack[j] << ">";
+enum PAR_TAG {
+ NONE=0,
+ TT = 1,
+ SF = 2,
+ BF = 4,
+ IT = 8,
+ SL = 16,
+ EM = 32
+};
+
+
+string tag_name(PAR_TAG const & pt) {
+ switch (pt) {
+ case NONE: return "!-- --";
+ case TT: return "tt";
+ case SF: return "sf";
+ case BF: return "bf";
+ case IT: return "it";
+ case SL: return "sl";
+ case EM: return "em";
+ }
+ return "";
+}
- // add new tag
- sprintf(stack[++pos], "%s", tag.c_str());
- // push all tags
- for (int i = 0; i <= pos; ++i)
- os << "<" << stack[i] << ">";
+inline
+void operator|=(PAR_TAG & p1, PAR_TAG const & p2)
+{
+ p1 = static_cast<PAR_TAG>(p1 | p2);
}
-void Buffer::pop_tag(ostream & os, string const & tag,
- int & pos, char stack[5][3])
+inline
+void reset(PAR_TAG & p1, PAR_TAG const & p2)
{
-#ifdef WITH_WARNINGS
-#warning Use a real stack! (Lgb)
-#endif
- // Please, Lars, do not remove the global variable. I already
- // had to reintroduce it twice! (JMarc)
- // but...but... I'll remove it anyway. (well not quite) (Lgb)
-#if 0
- int j;
-
- // pop all tags till specified one
- for (j = pos; (j >= 0) && (strcmp(stack[j], tag.c_str())); --j)
- os << "</" << stack[j] << ">";
-
- // closes the tag
- os << "</" << tag << ">";
-
- // push all tags, but the specified one
- for (j = j + 1; j <= pos; ++j) {
- os << "<" << stack[j] << ">";
- strcpy(stack[j - 1], stack[j]);
- }
- --pos;
-#else
- // pop all tags till specified one
- int j = pos;
- for (int j = pos; (j >= 0) && (strcmp(stack[j], tag.c_str())); --j)
- os << "</" << stack[j] << ">";
-
- // closes the tag
- os << "</" << tag << ">";
-
- // push all tags, but the specified one
- for (int i = j + 1; i <= pos; ++i) {
- os << "<" << stack[i] << ">";
- strcpy(stack[i - 1], stack[i]);
- }
- --pos;
-#endif
+ p1 = static_cast<PAR_TAG>( p1 & ~p2);
}
+} // namespace anon
-// Handle internal paragraph parsing -- layout already processed.
-// checks, if newcol chars should be put into this line
-// writes newline, if necessary.
-static
-void linux_doc_line_break(ostream & os, string::size_type & colcount,
- string::size_type newcol)
-{
- colcount += newcol;
- if (colcount > lyxrc.ascii_linelen) {
- os << "\n";
- colcount = newcol; // assume write after this call
- }
-}
-void Buffer::SimpleLinuxDocOnePar(ostream & os, LyXParagraph * par,
- int desc_on, int /*depth*/)
+// Handle internal paragraph parsing -- layout already processed.
+void Buffer::SimpleLinuxDocOnePar(ostream & os,
+ LyXParagraph * par, int /*depth*/)
{
- LyXFont font1;
- char c;
- Inset * inset;
- LyXParagraph::size_type main_body;
- int j;
LyXLayout const & style = textclasslist.Style(params.textclass,
par->GetLayout());
-
- char family_type = 0; // family font flag
- bool is_bold = false; // series font flag
- char shape_type = 0; // shape font flag
- bool is_em = false; // emphasis (italic) font flag
-
- int stack_num = -1; // style stack position
- // Can this be rewritten to use a std::stack, please. (Lgb)
- char stack[5][3]; // style stack
string::size_type char_line_count = 5; // Heuristic choice ;-)
- 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;
+ LyXFont font_old;
+ bool desc_on;
+ if (style.labeltype == LABEL_MANUAL) {
+ font_old = style.labelfont;
+ desc_on = true;
+ } else {
+ font_old = style.font;
+ desc_on = false;
+ }
+
+ LyXFont::FONT_FAMILY family_type = LyXFont::ROMAN_FAMILY;
+ LyXFont::FONT_SERIES series_type = LyXFont::MEDIUM_SERIES;
+ LyXFont::FONT_SHAPE shape_type = LyXFont::UP_SHAPE;
+ bool is_em = false;
-
+ stack < PAR_TAG > tag_state;
// parsing main loop
- for (LyXParagraph::size_type i = 0;
- i < par->size(); ++i) {
+ for (LyXParagraph::size_type i = 0; i < par->size(); ++i) {
- // handle quote tag
- if (i == main_body
-#ifndef NEW_INSETS
- && !par->IsDummy()
-#endif
- ) {
- if (main_body > 0)
- font1 = style.font;
- }
+ PAR_TAG tag_close = NONE;
+ list < PAR_TAG > tag_open;
- LyXFont const font2 = par->getFont(params, i);
+ LyXFont const font = par->getFont(params, i);
- if (font1.family() != font2.family()) {
+ if (font_old.family() != font.family()) {
switch (family_type) {
- case 0:
- if (font2.family() == LyXFont::TYPEWRITER_FAMILY) {
- push_tag(os, "tt", stack_num, stack);
- family_type = 1;
- }
- else if (font2.family() == LyXFont::SANS_FAMILY) {
- push_tag(os, "sf", stack_num, stack);
- family_type = 2;
- }
+ case LyXFont::SANS_FAMILY:
+ tag_close |= SF;
break;
- case 1:
- pop_tag(os, "tt", stack_num, stack);
- if (font2.family() == LyXFont::SANS_FAMILY) {
- push_tag(os, "sf", stack_num, stack);
- family_type = 2;
- } else {
- family_type = 0;
- }
+ case LyXFont::TYPEWRITER_FAMILY:
+ tag_close |= TT;
+ break;
+ default:
+ break;
+ }
+
+ family_type = font.family();
+
+ switch (family_type) {
+ case LyXFont::SANS_FAMILY:
+ tag_open.push_back(SF);
+ break;
+ case LyXFont::TYPEWRITER_FAMILY:
+ tag_open.push_back(TT);
+ break;
+ default:
break;
- case 2:
- pop_tag(os, "sf", stack_num, stack);
- if (font2.family() == LyXFont::TYPEWRITER_FAMILY) {
- push_tag(os, "tt", stack_num, stack);
- family_type = 1;
- } else {
- family_type = 0;
- }
}
}
- // handle bold face
- if (font1.series() != font2.series()) {
- if (font2.series() == LyXFont::BOLD_SERIES) {
- push_tag(os, "bf", stack_num, stack);
- is_bold = true;
- } else if (is_bold) {
- pop_tag(os, "bf", stack_num, stack);
- is_bold = false;
+ if (font_old.series() != font.series()) {
+ switch (series_type) {
+ case LyXFont::BOLD_SERIES:
+ tag_close |= BF;
+ break;
+ default:
+ break;
+ }
+
+ series_type = font.series();
+
+ switch (series_type) {
+ case LyXFont::BOLD_SERIES:
+ tag_open.push_back(BF);
+ break;
+ default:
+ break;
}
+
}
- // handle italic and slanted fonts
- if (font1.shape() != font2.shape()) {
+ if (font_old.shape() != font.shape()) {
switch (shape_type) {
- case 0:
- if (font2.shape() == LyXFont::ITALIC_SHAPE) {
- push_tag(os, "it", stack_num, stack);
- shape_type = 1;
- } else if (font2.shape() == LyXFont::SLANTED_SHAPE) {
- push_tag(os, "sl", stack_num, stack);
- shape_type = 2;
- }
+ case LyXFont::ITALIC_SHAPE:
+ tag_close |= IT;
break;
- case 1:
- pop_tag(os, "it", stack_num, stack);
- if (font2.shape() == LyXFont::SLANTED_SHAPE) {
- push_tag(os, "sl", stack_num, stack);
- shape_type = 2;
- } else {
- shape_type = 0;
- }
+ case LyXFont::SLANTED_SHAPE:
+ tag_close |= SL;
+ break;
+ default:
+ break;
+ }
+
+ shape_type = font.shape();
+
+ switch (shape_type) {
+ case LyXFont::ITALIC_SHAPE:
+ tag_open.push_back(IT);
+ break;
+ case LyXFont::SLANTED_SHAPE:
+ tag_open.push_back(SL);
+ break;
+ default:
break;
- case 2:
- pop_tag(os, "sl", stack_num, stack);
- if (font2.shape() == LyXFont::ITALIC_SHAPE) {
- push_tag(os, "it", stack_num, stack);
- shape_type = 1;
- } else {
- shape_type = 0;
- }
}
}
// handle <em> tag
- if (font1.emph() != font2.emph()) {
- if (font2.emph() == LyXFont::ON) {
- push_tag(os, "em", stack_num, stack);
+ if (font_old.emph() != font.emph()) {
+ if (font.emph() == LyXFont::ON) {
+ tag_open.push_back(EM);
is_em = true;
- } else if (is_em) {
- pop_tag(os, "em", stack_num, stack);
+ }
+ else if (is_em) {
+ tag_close |= EM;
is_em = false;
}
}
- c = par->GetChar(i);
+ list < PAR_TAG > temp;
+ while(!tag_state.empty() && tag_close ) {
+ PAR_TAG k = tag_state.top();
+ tag_state.pop();
+ os << "</" << tag_name(k) << ">";
+ if (tag_close & k)
+ reset(tag_close,k);
+ else
+ temp.push_back(k);
+ }
+
+ for(list< PAR_TAG >::const_iterator j = temp.begin();
+ j != temp.end(); ++j) {
+ tag_state.push(*j);
+ os << "<" << tag_name(*j) << ">";
+ }
+
+ for(list< PAR_TAG >::const_iterator j = tag_open.begin();
+ j != tag_open.end(); ++j) {
+ tag_state.push(*j);
+ os << "<" << tag_name(*j) << ">";
+ }
+
+ char c = par->GetChar(i);
if (c == LyXParagraph::META_INSET) {
- inset = par->GetInset(i);
+ Inset * inset = par->GetInset(i);
inset->Linuxdoc(this, os);
+ font_old = font;
+ continue;
}
- if (font2.latex() == LyXFont::ON) {
+ if (font.latex() == LyXFont::ON || style.latexparam() == "CDATA") {
// "TeX"-Mode on == > SGML-Mode on.
if (c != '\0')
- os << c; // see LaTeX-Generation...
+ os << c;
++char_line_count;
} else {
string sgml_string;
if (par->linuxDocConvertChar(c, sgml_string)
- && !style.free_spacing) { // in freespacing
- // mode, spaces are
- // non-breaking characters
- // char is ' '
- if (desc_on == 1) {
+ && !style.free_spacing) {
+ // in freespacing mode, spaces are
+ // non-breaking characters
+ if (desc_on) {// if char is ' ' then...
+
++char_line_count;
linux_doc_line_break(os, char_line_count, 6);
os << "</tag>";
- desc_on = 2;
+ desc_on = false;
} else {
linux_doc_line_break(os, char_line_count, 1);
os << c;
char_line_count += sgml_string.length();
}
}
- font1 = font2;
- }
-
- // needed if there is an optional argument but no contents
- if (main_body > 0 && main_body == par->size()) {
- font1 = style.font;
+ font_old = font;
}
- // pop all defined Styles
- for (j = stack_num; j >= 0; --j) {
- linux_doc_line_break(os,
- char_line_count,
- 3 + strlen(stack[j]));
- os << "</" << stack[j] << ">";
+ while (!tag_state.empty()) {
+ os << "</" << tag_name(tag_state.top()) << ">";
+ tag_state.pop();
}
// resets description flag correctly
- switch (desc_on){
- case 1:
+ if (desc_on) {
// <tag> not closed...
linux_doc_line_break(os, char_line_count, 6);
os << "</tag>";
- break;
- case 2:
- // fprintf(file, "</p>");
- break;
}
}
par->InsertInset(pos, new_inset);
}
-// This constant defines the maximum number of
-// environment layouts that can be nesteded.
-// The same applies for command layouts.
-// These values should be more than enough.
-// José Matos (1999/07/22)
-
-enum { MAX_NEST_LEVEL = 25};
void Buffer::makeDocBookFile(string const & fname, bool nice, bool only_body)
{
+ ofstream ofs(fname.c_str());
+ if (!ofs) {
+ WriteAlert(_("LYX_ERROR:"), _("Cannot write file"), fname);
+ return;
+ }
+
LyXParagraph * par = paragraph;
niceFile = nice; // this will be used by Insetincludes.
- string top_element= textclasslist.LatexnameOfClass(params.textclass);
- // Please use a real stack.
- string environment_stack[MAX_NEST_LEVEL];
- string environment_inner[MAX_NEST_LEVEL];
- // Please use a real stack.
- string command_stack[MAX_NEST_LEVEL];
- bool command_flag= false;
- int command_depth= 0, command_base= 0, cmd_depth= 0;
-
- string item_name, command_name;
- string c_depth, c_params, tmps;
-
- int depth = 0; // paragraph depth
LyXTextClass const & tclass =
textclasslist.TextClass(params.textclass);
LaTeXFeatures features(params, tclass.numLayouts());
validate(features);
-
- //if (nice)
- tex_code_break_column = lyxrc.ascii_linelen;
- //else
- //tex_code_break_column = 0;
-
- ofstream ofs(fname.c_str());
- if (!ofs) {
- WriteAlert(_("LYX_ERROR:"), _("Cannot write file"), fname);
- return;
- }
texrow.reset();
+ string top_element = textclasslist.LatexnameOfClass(params.textclass);
+
if (!only_body) {
- string sgml_includedfiles=features.getIncludedFiles(fname);
+ string sgml_includedfiles = features.getIncludedFiles(fname);
ofs << "<!doctype " << top_element
<< " public \"-//OASIS//DTD DocBook V3.1//EN\"";
<< sgml_includedfiles << " \n]>\n\n";
}
- if (params.options.empty())
- sgmlOpenTag(ofs, 0, top_element);
- else {
- string top = top_element;
+ string top = top_element;
+ top += " lang=\"";
+ top += params.language->code();
+ top += "\"";
+
+ if (!params.options.empty()) {
top += " ";
top += params.options;
- sgmlOpenTag(ofs, 0, top);
}
+ sgmlOpenTag(ofs, 0, top);
ofs << "<!-- DocBook file was created by " << LYX_DOCVERSION
<< "\n See http://www.lyx.org/ for more information -->\n";
+ vector<string> environment_stack(10);
+ vector<string> environment_inner(10);
+ vector<string> command_stack(10);
+
+ bool command_flag = false;
+ int command_depth = 0;
+ int command_base = 0;
+ int cmd_depth = 0;
+ int depth = 0; // paragraph depth
+
+ string item_name;
+ string command_name;
+
while (par) {
+ string sgmlparam;
+ string c_depth;
+ string c_params;
int desc_on = 0; // description mode
+
LyXLayout const & style =
textclasslist.Style(params.textclass,
par->layout);
// environment tag closing
- for (; depth > par->depth; --depth) {
+ for (; depth > par->params.depth(); --depth) {
if (environment_inner[depth] != "!-- --") {
- item_name= "listitem";
+ item_name = "listitem";
sgmlCloseTag(ofs, command_depth + depth,
item_name);
if (environment_inner[depth] == "varlistentry")
environment_inner[depth].erase();
}
- if (depth == par->depth
+ if (depth == par->params.depth()
&& environment_stack[depth] != style.latexname()
&& !environment_stack[depth].empty()) {
if (environment_inner[depth] != "!-- --") {
// Write opening SGML tags.
switch (style.latextype) {
case LATEX_PARAGRAPH:
- sgmlOpenTag(ofs, depth+command_depth, style.latexname());
+ sgmlOpenTag(ofs, depth + command_depth,
+ style.latexname());
break;
case LATEX_COMMAND:
- if (depth!= 0)
+ if (depth != 0)
LinuxDocError(par, 0,
_("Error : Wrong depth for "
"LatexType Command.\n"));
command_name = style.latexname();
- tmps = style.latexparam();
- c_params = split(tmps, c_depth,'|');
+ sgmlparam = style.latexparam();
+ c_params = split(sgmlparam, c_depth,'|');
- cmd_depth= lyx::atoi(c_depth);
+ cmd_depth = lyx::atoi(c_depth);
if (command_flag) {
- if (cmd_depth<command_base) {
- for (int j = command_depth;
- j >= command_base; --j)
- if (!command_stack[j].empty())
- sgmlCloseTag(ofs, j, command_stack[j]);
- command_depth= command_base= cmd_depth;
+ if (cmd_depth < command_base) {
+ for (int j = command_depth; j >= command_base; --j)
+ sgmlCloseTag(ofs, j, command_stack[j]);
+ command_depth = command_base = cmd_depth;
} else if (cmd_depth <= command_depth) {
- for (int j = command_depth;
- j >= cmd_depth; --j)
-
- if (!command_stack[j].empty())
- sgmlCloseTag(ofs, j, command_stack[j]);
- command_depth= cmd_depth;
+ for (int j = command_depth; j >= cmd_depth; --j)
+ sgmlCloseTag(ofs, j, command_stack[j]);
+ command_depth = cmd_depth;
} else
- command_depth= cmd_depth;
+ command_depth = cmd_depth;
} else {
command_depth = command_base = cmd_depth;
command_flag = true;
}
- command_stack[command_depth]= command_name;
+ if (command_stack.size() == command_depth + 1)
+ command_stack.push_back("");
+ command_stack[command_depth] = command_name;
// treat label as a special case for
// more WYSIWYM handling.
}
sgmlOpenTag(ofs, depth + command_depth, command_name);
- item_name = "title";
- if (command_name != "!-- --")
- sgmlOpenTag(ofs, depth + 1 + command_depth, item_name);
+ if (c_params.empty())
+ item_name = "title";
+ else
+ item_name = c_params;
+ sgmlOpenTag(ofs, depth + 1 + command_depth, item_name);
break;
case LATEX_ENVIRONMENT:
case LATEX_ITEM_ENVIRONMENT:
- if (depth < par->depth) {
- depth = par->depth;
+ if (depth < par->params.depth()) {
+ depth = par->params.depth();
environment_stack[depth].erase();
}
if (environment_stack[depth] != style.latexname()) {
+ if(environment_stack.size() == depth + 1) {
+ environment_stack.push_back("!-- --");
+ environment_inner.push_back("!-- --");
+ }
environment_stack[depth] = style.latexname();
environment_inner[depth] = "!-- --";
sgmlOpenTag(ofs, depth + command_depth,
}
if (style.latextype == LATEX_ENVIRONMENT) {
- if (!style.latexparam().empty())
- sgmlOpenTag(ofs, depth + command_depth,
- style.latexparam());
+ if (!style.latexparam().empty()) {
+ if(style.latexparam() == "CDATA")
+ ofs << "<![CDATA[";
+ else
+ sgmlOpenTag(ofs, depth + command_depth,
+ style.latexparam());
+ }
break;
}
break;
}
-#ifndef NEW_INSETS
- do {
-#endif
- string extra_par;
- SimpleDocBookOnePar(ofs, extra_par, par, desc_on,
- depth + 1 + command_depth);
- par = par->next;
-#ifndef NEW_INSETS
- DocBookHandleFootnote(ofs, par,
- depth + 1 + command_depth);
- }
- while(par && par->IsDummy());
-#endif
+ string extra_par;
+ SimpleDocBookOnePar(ofs, extra_par, par, desc_on,
+ depth + 1 + command_depth);
+ par = par->next();
+
string end_tag;
// write closing SGML tags
switch (style.latextype) {
case LATEX_COMMAND:
- end_tag = "title";
- if (command_name != "!-- --")
- sgmlCloseTag(ofs, depth + command_depth, end_tag);
+ if (c_params.empty())
+ end_tag = "title";
+ else
+ end_tag = c_params;
+ sgmlCloseTag(ofs, depth + command_depth, end_tag);
break;
case LATEX_ENVIRONMENT:
- if (!style.latexparam().empty())
- sgmlCloseTag(ofs, depth + command_depth,
- style.latexparam());
+ if (!style.latexparam().empty()) {
+ if(style.latexparam() == "CDATA")
+ ofs << "]]>";
+ else
+ sgmlCloseTag(ofs, depth + command_depth,
+ style.latexparam());
+ }
break;
case LATEX_ITEM_ENVIRONMENT:
if (desc_on == 1) break;
for (; depth >= 0; --depth) {
if (!environment_stack[depth].empty()) {
if (environment_inner[depth] != "!-- --") {
- item_name= "listitem";
+ item_name = "listitem";
sgmlCloseTag(ofs, command_depth + depth,
item_name);
if (environment_inner[depth] == "varlistentry")
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();
+ LyXFont font_old = style.labeltype == LABEL_MANUAL ? style.labelfont : style.font;
- // gets paragraph main font
- LyXFont font1 = main_body > 0 ? style.labelfont : style.font;
-
int char_line_count = depth;
if (!style.free_spacing)
- for (int j = 0; j < depth; ++j)
- os << ' ';
+ os << string(depth,' ');
// parsing main loop
for (LyXParagraph::size_type i = 0;
i < par->size(); ++i) {
- LyXFont font2 = par->getFont(params, i);
+ LyXFont font = par->getFont(params, i);
// handle <emphasis> tag
- if (font1.emph() != font2.emph() && i) {
- if (font2.emph() == LyXFont::ON) {
+ if (font_old.emph() != font.emph()) {
+ if (font.emph() == LyXFont::ON) {
os << "<emphasis>";
emph_flag = true;
- }else {
+ }else if(i) {
os << "</emphasis>";
emph_flag = false;
}
else
os << tmp_out;
}
- } else if (font2.latex() == LyXFont::ON) {
+ } else if (font.latex() == LyXFont::ON) {
// "TeX"-Mode on ==> SGML-Mode on.
if (c != '\0')
os << c;
os << sgml_string;
}
}
- font1 = font2;
+ font_old = font;
}
- // needed if there is an optional argument but no contents
- if (main_body > 0 && main_body == par->size()) {
- font1 = style.font;
- }
if (emph_flag) {
os << "</emphasis>";
}
// resets description flag correctly
- switch (desc_on){
- case 1:
+ if (desc_on == 1) {
// <term> not closed...
os << "</term>";
- break;
}
os << '\n';
}
}
Path p(path); // path to LaTeX file
- users->owner()->getMiniBuffer()->Set(_("Running chktex..."));
+ users->owner()->message(_("Running chktex..."));
// Remove all error insets
bool const removedErrorInsets = users->removeAutoInsets();
par->validate(features);
// and then the next paragraph
- par = par->next;
+ par = par->next();
}
// the bullet shapes are buffer level not paragraph level
if ((*it)->LyxCode() == Inset::INCLUDE_CODE) {
InsetInclude * insetinc =
static_cast<InsetInclude *>(*it);
- if (insetinc->isInclude()
- && insetinc->isNoLoad()) {
+ if (insetinc->isIncludeOnly()) {
if (!lst.empty())
lst += delim;
- lst += OnlyFilename(ChangeExtension(insetinc->getContents(), string()));
+ lst += insetinc->getRelFileBaseName();
}
}
}
}
-vector<vector<Buffer::TocItem> > const Buffer::getTocList()
+Buffer::Lists const Buffer::getLists() const
{
- int figs = 0;
- int tables = 0;
- int algs = 0;
- vector<vector<TocItem> > l(4);
+ Lists l;
LyXParagraph * par = paragraph;
+ bool found;
+ LyXTextClassList::size_type cap;
+ boost::tie(found, cap) = textclasslist
+ .NumberOfLayout(params.textclass, "Caption");
+
while (par) {
-#ifndef NEW_INSETS
- if (par->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
- if (textclasslist.Style(params.textclass,
- par->GetLayout()).labeltype
- == LABEL_SENSITIVE) {
- TocItem tmp;
- tmp.par = par;
- tmp.depth = 0;
- tmp.str = par->String(this, false);
- switch (par->footnotekind) {
- case LyXParagraph::FIG:
- case LyXParagraph::WIDE_FIG:
- tmp.str = tostr(++figs) + ". "
- + tmp.str;
- l[TOC_LOF].push_back(tmp);
- break;
- case LyXParagraph::TAB:
- case LyXParagraph::WIDE_TAB:
- tmp.str = tostr(++tables) + ". "
- + tmp.str;
- l[TOC_LOT].push_back(tmp);
- break;
- case LyXParagraph::ALGORITHM:
- tmp.str = tostr(++algs) + ". "
- + tmp.str;
- l[TOC_LOA].push_back(tmp);
- break;
- case LyXParagraph::FOOTNOTE:
- case LyXParagraph::MARGIN:
- break;
- }
- }
- } else if (!par->IsDummy()) {
-#endif
- char const labeltype =
- textclasslist.Style(params.textclass,
- par->GetLayout()).labeltype;
-
- if (labeltype >= LABEL_COUNTER_CHAPTER
- && labeltype <= LABEL_COUNTER_CHAPTER + params.tocdepth) {
+ char const labeltype =
+ textclasslist.Style(params.textclass,
+ par->GetLayout()).labeltype;
+
+ if (labeltype >= LABEL_COUNTER_CHAPTER
+ && labeltype <= LABEL_COUNTER_CHAPTER + params.tocdepth) {
// insert this into the table of contents
- TocItem tmp;
- tmp.par = par;
- tmp.depth = max(0,
- labeltype -
- textclasslist.TextClass(params.textclass).maxcounter());
- tmp.str = par->String(this, true);
- l[TOC_TOC].push_back(tmp);
+ SingleList & item = l["TOC"];
+ int depth = max(0,
+ labeltype -
+ textclasslist.TextClass(params.textclass).maxcounter());
+ item.push_back(TocItem(par, depth, par->String(this, true)));
+ }
+ // For each paragrph, traverse its insets and look for
+ // FLOAT_CODE
+
+ if (found) {
+ LyXParagraph::inset_iterator it =
+ par->inset_iterator_begin();
+ LyXParagraph::inset_iterator end =
+ par->inset_iterator_end();
+
+ for (; it != end; ++it) {
+ if ((*it)->LyxCode() == Inset::FLOAT_CODE) {
+ InsetFloat * il =
+ static_cast<InsetFloat*>(*it);
+
+ string const type = il->type();
+
+ // Now find the caption in the float...
+ // We now tranverse the paragraphs of
+ // the inset...
+ LyXParagraph * tmp = il->inset.par;
+ while (tmp) {
+ if (tmp->layout == cap) {
+ SingleList & item = l[type];
+ string const str =
+ tostr(item.size()+1) + ". " + tmp->String(this, false);
+ item.push_back(TocItem(tmp, 0 , str));
+ }
+ tmp = tmp->next();
+ }
+ }
}
-#ifndef NEW_INSETS
+ } else {
+ lyxerr << "caption not found" << endl;
}
-#endif
- par = par->next;
+
+ par = par->next();
}
return l;
}
// This is also a buffer property (ale)
-vector<pair<string,string> > const Buffer::getBibkeyList()
+vector<pair<string, string> > const Buffer::getBibkeyList()
{
/// if this is a child document and the parent is already loaded
/// Use the parent's list instead [ale990412]
if (par->bibkey)
keys.push_back(pair<string, string>(par->bibkey->getContents(),
par->String(this, false)));
- par = par->next;
+ par = par->next();
}
// Might be either using bibtex or a child has bibliography
{
/// then remove all LyXText in text-insets
LyXParagraph * par = paragraph;
- for (; par; par = par->next) {
+ for (; par; par = par->next()) {
par->resizeInsetsLyXText(bv);
}
}
+
void Buffer::ChangeLanguage(Language const * from, Language const * to)
{
LyXParagraph * par = paragraph;
while (par) {
par->ChangeLanguage(params, from, to);
- par = par->next;
+ par = par->next();
}
}
while (par) {
if (par->isMultiLingual(params))
return true;
- par = par->next;
+ par = par->next();
}
return false;
}
{
it = par->InsetIterator(pos);
if (it == par->inset_iterator_end()) {
- par = par->next;
+ par = par->next();
SetParagraph();
}
}
it = par->inset_iterator_begin();
if (it != par->inset_iterator_end())
return;
- par = par->next;
+ par = par->next();
}
//it = 0;
// We maintain an invariant that whenever par = 0 then it = 0