Buffer::Buffer(string const & file, bool ronly)
- : paragraph(0), lyx_clean(true), bak_clean(true),
+ : paragraph(0), niceFile(true), lyx_clean(true), bak_clean(true),
unnamed(false), dep_clean(0), read_only(ronly),
filename_(file), users(0)
{
if (!par) {
par = new Paragraph;
+ par->layout(textclasslist[params.textclass].defaultLayoutName());
} else {
// We are inserting into an existing document
users->text->breakParagraph(users);
if (!ert_comp.contents.empty()) {
lyxerr[Debug::INSETS] << "ERT contents:\n'"
<< ert_comp.contents << "'" << endl;
- Inset * inset = new InsetERT(params.language, ert_comp.contents, true);
+ Inset * inset = new InsetERT(params, params.language,
+ ert_comp.contents, true);
par->insertInset(pos++, inset, ert_comp.font);
ert_comp.contents.erase();
}
static int call_depth;
++call_depth;
bool checkminipage = false;
- static Paragraph * minipar;
+ static Paragraph * minipar = 0;
static Paragraph * parBeforeMinipage;
#endif
#endif
insertErtContents(par, pos);
#endif
lex.eatLine();
- string const layoutname = lowercase(lex.getString());
- //lyxerr << "Looking for layout '"
- // << layoutname << "'!" << endl;
+ string layoutname = lex.getString();
+
+ LyXTextClass const & tclass = textclasslist[params.textclass];
- //lyxerr << "Result: " << pp.first << "/" << pp.second << endl;
+ if (layoutname.empty()) {
+ layoutname = tclass.defaultLayoutName();
+ }
+
+ bool hasLayout = tclass.hasLayout(layoutname);
+ if (!hasLayout) {
+ lyxerr << "Layout '" << layoutname << "' does not"
+ << " exist in textclass '" << tclass.name()
+ << "'." << endl;
+ lyxerr << "Trying to use default layout instead."
+ << endl;
+ layoutname = tclass.defaultLayoutName();
+ }
#ifndef NO_COMPABILITY
if (compare_no_case(layoutname, "latex") == 0) {
first_par = par;
else {
par = new Paragraph(par);
+ par->layout(textclasslist[params.textclass].defaultLayoutName());
}
pos = 0;
par->layout(layoutname);
stringstream old_float;
if (tmptok == "footnote") {
- inset = new InsetFoot;
+ inset = new InsetFoot(params);
old_float << "collapsed true\n";
} else if (tmptok == "margin") {
- inset = new InsetMarginal;
+ inset = new InsetMarginal(params);
old_float << "collapsed true\n";
} else if (tmptok == "fig") {
- inset = new InsetFloat("figure");
+ inset = new InsetFloat(params, "figure");
old_float << "placement htbp\n"
<< "wide false\n"
<< "collapsed false\n";
} else if (tmptok == "tab") {
- inset = new InsetFloat("table");
+ inset = new InsetFloat(params, "table");
old_float << "placement htbp\n"
<< "wide false\n"
<< "collapsed false\n";
} else if (tmptok == "alg") {
- inset = new InsetFloat("algorithm");
+ inset = new InsetFloat(params, "algorithm");
old_float << "placement htbp\n"
<< "wide false\n"
<< "collapsed false\n";
} else if (tmptok == "wide-fig") {
- inset = new InsetFloat("figure");
+ inset = new InsetFloat(params, "figure");
//InsetFloat * tmp = new InsetFloat("figure");
//tmp->wide(true);
//inset = tmp;
<< "wide true\n"
<< "collapsed false\n";
} else if (tmptok == "wide-tab") {
- inset = new InsetFloat("table");
+ inset = new InsetFloat(params, "table");
//InsetFloat * tmp = new InsetFloat("table");
//tmp->wide(true);
//inset = tmp;
the_end_read = true;
#ifndef NO_COMPABILITY
#ifndef NO_PEXTRA_REALLY
+ if (minipar == par)
+ par = 0;
minipar = parBeforeMinipage = 0;
#endif
#endif
if (checkminipage && (call_depth == 1)) {
checkminipage = false;
if (minipar && (minipar != par) &&
- (par->params().pextraType() == Paragraph::PEXTRA_MINIPAGE)) {
+ (par->params().pextraType() == Paragraph::PEXTRA_MINIPAGE))
+ {
lyxerr << "minipages in a row" << endl;
if (par->params().pextraStartMinipage()) {
lyxerr << "start new minipage" << endl;
p->params().depth(parBeforeMinipage->params().depth());
parBeforeMinipage = p;
}
- InsetMinipage * mini = new InsetMinipage;
+ InsetMinipage * mini = new InsetMinipage(params);
mini->pos(static_cast<InsetMinipage::Position>(par->params().pextraAlignment()));
mini->pageWidth(LyXLength(par->params().pextraWidth()));
if (!par->params().pextraWidthp().empty()) {
lyxerr << "WP:" << mini->pageWidth().asString() << endl;
- mini->pageWidth(LyXLength((par->params().pextraWidthp())+"%"));
+ mini->pageWidth(LyXLength((par->params().pextraWidthp())+"p%"));
}
Paragraph * op = mini->firstParagraph();
mini->inset.paragraph(par);
if (!first_par || (first_par == par))
first_par = p;
- InsetMinipage * mini = new InsetMinipage;
+ InsetMinipage * mini = new InsetMinipage(params);
mini->pos(static_cast<InsetMinipage::Position>(minipar->params().pextraAlignment()));
mini->pageWidth(LyXLength(minipar->params().pextraWidth()));
if (!par->params().pextraWidthp().empty()) {
lyxerr << "WP:" << mini->pageWidth().asString() << endl;
- mini->pageWidth(LyXLength((par->params().pextraWidthp())+"%"));
+ mini->pageWidth(LyXLength((par->params().pextraWidthp())+"p%"));
}
+
+ Paragraph * op = mini->firstParagraph();
mini->inset.paragraph(minipar);
+ //
+ // and free the old ones!
+ //
+ while(op) {
+ Paragraph * pp = op->next();
+ delete op;
+ op = pp;
+ }
// Insert the minipage last in the
// previous paragraph.
true);
alreadyread = true;
} else if (tmptok == "Note") {
- inset = new InsetNote;
+ inset = new InsetNote(params);
} else if (tmptok == "Include") {
InsetCommandParams p("Include");
inset = new InsetInclude(p, *this);
} else if (tmptok == "ERT") {
- inset = new InsetERT;
+ inset = new InsetERT(params);
} else if (tmptok == "Tabular") {
inset = new InsetTabular(*this);
} else if (tmptok == "Text") {
- inset = new InsetText;
+ inset = new InsetText(params);
} else if (tmptok == "Foot") {
- inset = new InsetFoot;
+ inset = new InsetFoot(params);
} else if (tmptok == "Marginal") {
- inset = new InsetMarginal;
+ inset = new InsetMarginal(params);
} else if (tmptok == "Minipage") {
- inset = new InsetMinipage;
+ inset = new InsetMinipage(params);
} else if (tmptok == "Float") {
lex.next();
string tmptok = lex.getString();
- inset = new InsetFloat(tmptok);
+ inset = new InsetFloat(params, tmptok);
#if 0
} else if (tmptok == "List") {
inset = new InsetList;
inset = new InsetList;
#endif
} else if (tmptok == "Caption") {
- inset = new InsetCaption;
+ inset = new InsetCaption(params);
} else if (tmptok == "FloatList") {
inset = new InsetFloatList;
}
}
+namespace {
+
+pair<int, string> const addDepth(int depth, int ldepth)
+{
+ int d = depth * 2;
+ if (ldepth > depth)
+ d += (ldepth - depth) * 2;
+ return make_pair(d, string(d, ' '));
+}
+
+}
+
+
string const Buffer::asciiParagraph(Paragraph const * par,
unsigned int linelen,
bool noparbreak) const
{
ostringstream buffer;
- ostringstream word;
Paragraph::depth_type depth = 0;
int ltype = 0;
Paragraph::depth_type ltype_depth = 0;
- string::size_type currlinelen = 0;
bool ref_printed = false;
// if (!par->previous()) {
#if 0
#endif
// First write the layout
- string const & tmp = lowercase(par->layout());
- if (tmp == "itemize") {
+ string const & tmp = par->layout();
+ if (compare_no_case(tmp, "itemize") == 0) {
ltype = 1;
ltype_depth = depth + 1;
- } else if (tmp == "enumerate") {
+ } else if (compare_no_case(tmp, "enumerate") == 0) {
ltype = 2;
ltype_depth = depth + 1;
- } else if (contains(tmp, "ection")) {
+ } else if (contains(lowercase(tmp), "ection")) {
ltype = 3;
ltype_depth = depth + 1;
- } else if (contains(tmp, "aragraph")) {
+ } else if (contains(lowercase(tmp), "aragraph")) {
ltype = 4;
ltype_depth = depth + 1;
- } else if (tmp == "description") {
+ } else if (compare_no_case(tmp, "description") == 0) {
ltype = 5;
ltype_depth = depth + 1;
- } else if (tmp == "abstract") {
+ } else if (compare_no_case(tmp, "abstract") == 0) {
ltype = 6;
ltype_depth = 0;
- } else if (tmp == "bibliography") {
+ } else if (compare_no_case(tmp, "bibliography") == 0) {
ltype = 7;
ltype_depth = 0;
} else {
// }
// linelen <= 0 is special and means we don't have pargraph breaks
+
+ string::size_type currlinelen = 0;
+
if (!noparbreak) {
if (linelen > 0)
buffer << "\n\n";
- for (Paragraph::depth_type j = 0; j < depth; ++j)
- buffer << " ";
- currlinelen = depth * 2;
+
+ buffer << string(depth * 2, ' ');
+ currlinelen += depth * 2;
+
//--
// we should probably change to the paragraph language in the
// gettext here (if possible) so that strings are outputted in
case 5: // Description
break;
case 6: // Abstract
- if (linelen > 0)
+ if (linelen > 0) {
buffer << _("Abstract") << "\n\n";
- else
- buffer << _("Abstract: ");
+ currlinelen = 0;
+ } else {
+ string const abst = _("Abstract: ");
+ buffer << abst;
+ currlinelen += abst.length();
+ }
break;
case 7: // Bibliography
if (!ref_printed) {
- if (linelen > 0)
+ if (linelen > 0) {
buffer << _("References") << "\n\n";
- else
- buffer << _("References: ");
+ currlinelen = 0;
+ } else {
+ string const refs = _("References: ");
+ buffer << refs;
+ currlinelen += refs.length();
+ }
+
ref_printed = true;
}
break;
default:
- buffer << par->params().labelString() << " ";
- break;
+ {
+ string const parlab = par->params().labelString();
+ buffer << parlab << " ";
+ currlinelen += parlab.length() + 1;
+ }
+ break;
+
}
}
- string s = buffer.str();
- if (s.rfind('\n') != string::npos) {
- string dummy;
- s = rsplit(buffer.str().c_str(), dummy, '\n');
- }
- currlinelen = s.length();
+
if (!currlinelen) {
- for (Paragraph::depth_type j = 0; j < depth; ++j)
- buffer << " ";
- currlinelen = depth * 2;
- if (ltype_depth > depth) {
- for (Paragraph::depth_type j = ltype_depth;
- j > depth; --j)
- {
- buffer << " ";
- }
- currlinelen += (ltype_depth-depth)*2;
- }
+ pair<int, string> p = addDepth(depth, ltype_depth);
+ buffer << p.second;
+ currlinelen += p.first;
}
- // this is to change the linebreak to do it by word a bit more intelligent
- // hopefully! (only in the case where we have a max linelenght!) (Jug)
+
+ // this is to change the linebreak to do it by word a bit more
+ // intelligent hopefully! (only in the case where we have a
+ // max linelenght!) (Jug)
+
+ string word;
+
for (pos_type i = 0; i < par->size(); ++i) {
char c = par->getUChar(params, i);
switch (c) {
Inset const * inset = par->getInset(i);
if (inset) {
if (linelen > 0) {
- buffer << word.str();
- word.str("");
+ buffer << word;
+ currlinelen += word.length();
+ word.erase();
}
if (inset->ascii(this, buffer, linelen)) {
// to be sure it breaks paragraph
currlinelen += linelen;
}
-#if 0
- else {
- string dummy;
- string const s =
- rsplit(buffer.str().c_str(),
- dummy, '\n');
- currlinelen = s.length();
- }
-#endif
}
}
break;
case Paragraph::META_NEWLINE:
if (linelen > 0) {
- buffer << word.str() << "\n";
- word.str("");
- for (Paragraph::depth_type j = 0;
- j < depth; ++j)
- buffer << " ";
- currlinelen = depth * 2;
- if (ltype_depth > depth) {
- for (Paragraph::depth_type j = ltype_depth;
- j > depth; --j)
- buffer << " ";
- currlinelen += (ltype_depth - depth) * 2;
- }
+ buffer << word << "\n";
+ word.erase();
+
+ pair<int, string> p = addDepth(depth,
+ ltype_depth);
+ buffer << p.second;
+ currlinelen = p.first;
}
break;
case Paragraph::META_HFILL:
- buffer << word.str() << "\t";
- currlinelen += word.str().length() + 1;
- word.str("");
+ buffer << word << "\t";
+ currlinelen += word.length() + 1;
+ word.erase();
break;
default:
if (c == ' ') {
- buffer << word.str() << ' ';
- currlinelen += word.str().length() + 1;
- word.str("");
+ if (linelen > 0 &&
+ currlinelen + word.length() > linelen - 10) {
+ buffer << "\n";
+ pair<int, string> p =
+ addDepth(depth, ltype_depth);
+ buffer << p.second;
+ currlinelen = p.first;
+ }
+
+ buffer << word << ' ';
+ currlinelen += word.length() + 1;
+ word.erase();
+
} else {
if (c != '\0') {
- word << c;
+ word += c;
} else {
lyxerr[Debug::INFO] <<
"writeAsciiFile: NULL char in structure." << endl;
}
if ((linelen > 0) &&
- (currlinelen+word.str().length()) > linelen)
+ (currlinelen + word.length()) > linelen)
{
buffer << "\n";
- for (Paragraph::depth_type j = 0; j < depth; ++j)
- buffer << " ";
- currlinelen = depth * 2;
- if (ltype_depth > depth) {
- for (Paragraph::depth_type j = ltype_depth;
- j > depth; --j)
- {
- buffer << " ";
- }
- currlinelen += (ltype_depth-depth)*2;
- }
+
+ pair<int, string> p =
+ addDepth(depth, ltype_depth);
+ buffer << p.second;
+ currlinelen = p.first;
}
}
break;
}
}
- buffer << word.str();
+ buffer << word;
return buffer.str().c_str();
}
{
lyxerr[Debug::LATEX] << "makeLaTeXFile..." << endl;
- niceFile = nice; // this will be used by Insetincludes.
-
- tex_code_break_column = lyxrc.ascii_linelen;
-
ofstream ofs(fname.c_str());
if (!ofs) {
Alert::err_alert(_("Error: Cannot open file: "), fname);
return;
}
+ niceFile = nice; // this will be used by Insetincludes.
+
+ tex_code_break_column = lyxrc.ascii_linelen;
+
// validate the buffer.
lyxerr[Debug::LATEX] << " Validating buffer..." << endl;
LaTeXFeatures features(params);
texrow.newline();
}
if (!original_path.empty()) {
+ string inputpath = os::external_path(original_path);
+ subst(inputpath, "~", "\\string~");
ofs << "\\makeatletter\n"
<< "\\def\\input@path{{"
- << os::external_path(original_path) << "/}}\n"
+ << inputpath << "/}}\n"
<< "\\makeatother\n";
texrow.newline();
texrow.newline();
lyxerr[Debug::INFO] << "Finished making latex file." << endl;
lyxerr[Debug::INFO] << "Row count was " << texrow.rows()-1 << "." << endl;
+
+ // we want this to be true outside previews (for insetexternal)
+ niceFile = true;
}
}
-void Buffer::sgmlOpenTag(ostream & os, Paragraph::depth_type depth,
+void Buffer::sgmlOpenTag(ostream & os, Paragraph::depth_type,
string const & latexname) const
{
if (!latexname.empty() && latexname != "!-- --")
//os << "<!-- " << depth << " -->" << "<" << latexname << ">";
- os << string(depth, ' ') << "<" << latexname << ">\n";
+ os << "<" << latexname << ">";
}
-void Buffer::sgmlCloseTag(ostream & os, Paragraph::depth_type depth,
+void Buffer::sgmlCloseTag(ostream & os, Paragraph::depth_type,
string const & latexname) const
{
if (!latexname.empty() && latexname != "!-- --")
//os << "<!-- " << depth << " -->" << "</" << latexname << ">\n";
- os << string(depth, ' ') << "</" << latexname << ">\n";
+ os << "</" << latexname << ">";
}
ofs << "<!doctype linuxdoc system";
string preamble = params.preamble;
- preamble += features.getIncludedFiles(fname);
+ const string name = nice ? ChangeExtension(filename_, ".sgml")
+ : fname;
+ preamble += features.getIncludedFiles(name);
preamble += features.getLyXSGMLEntities();
if (!preamble.empty()) {
ofs.close();
// How to check for successful close
+
+ // we want this to be true outside previews (for insetexternal)
+ niceFile = true;
}
<< " PUBLIC \"-//OASIS//DTD DocBook V4.1//EN\"";
string preamble = params.preamble;
- preamble += features.getIncludedFiles(fname);
+ const string name = nice ? ChangeExtension(filename_, ".sgml")
+ : fname;
+ preamble += features.getIncludedFiles(name);
preamble += features.getLyXSGMLEntities();
if (!preamble.empty()) {
ofs.close();
// How to check for successful close
+
+ // we want this to be true outside previews (for insetexternal)
+ niceFile = true;
}
// resets description flag correctly
if (desc_on == 1) {
// <term> not closed...
- os << "</term>";
+ os << "</term>\n<listitem><para> </para>";
}
if (style.free_spacing) os << '\n';
}
Paragraph * par = paragraph;
LyXTextClass const & textclass = textclasslist[params.textclass];
- bool found = textclass.hasLayout("caption");
- string const layout("caption");
+ bool found = textclass.hasLayout("Caption");
+ string const layout("Caption");
while (par) {
char const labeltype = textclass[par->layout()].labeltype;
}
}
} else {
- lyxerr << "caption not found" << endl;
+ lyxerr << "Caption not found" << endl;
}
par = par->next();