// Do not remove the comment below, so we get merge conflict in
// independent branches. Instead add your own.
-int const LYX_FORMAT = 410; // rgh: dummy format for list->labeling
+int const LYX_FORMAT = 413; // rgh: html_css_as_file
typedef map<string, bool> DepClean;
typedef map<docstring, pair<InsetLabel const *, Buffer::References> > RefCache;
backupName = FileName(addName(lyxrc.backupdir_path,
mangledName));
}
- // do not copy because of #6587
- if (fileName().moveTo(backupName)) {
- madeBackup = true;
- } else {
+
+ // Except file is symlink do not copy because of #6587.
+ // Hard links have bad luck.
+ if (fileName().isSymLink())
+ madeBackup = fileName().copyTo(backupName);
+ else
+ madeBackup = fileName().moveTo(backupName);
+
+ if (!madeBackup) {
Alert::error(_("Backup failure"),
bformat(_("Cannot create backup file %1$s.\n"
"Please check whether the directory exists and is writable."),
// The top of the file should not be written by params().
// write out a comment in the top of the file
- ofs << "#LyX " << lyx_version
+ ofs << "#LyX " << lyx_version_major << "." << lyx_version_minor
<< " created this file. For more info see http://www.lyx.org/\n"
<< "\\lyxformat " << LYX_FORMAT << "\n"
<< "\\begin_document\n";
ErrorList & errorList = d->errorLists["Export"];
errorList.clear();
bool failed_export = false;
+ otexstream os(ofs, d->texrow);
try {
- d->texrow.reset();
- writeLaTeXSource(ofs, original_path,
+ os.texrow().reset();
+ writeLaTeXSource(os, original_path,
runparams, output_preamble, output_body);
}
catch (EncodingException & e) {
}
-void Buffer::writeLaTeXSource(odocstream & os,
+void Buffer::writeLaTeXSource(otexstream & os,
string const & original_path,
OutputParams const & runparams_in,
bool const output_preamble, bool const output_body) const
"For more info, see http://www.lyx.org/.\n"
"%% Do not edit unless you really know what "
"you are doing.\n";
- d->texrow.newline();
- d->texrow.newline();
}
LYXERR(Debug::INFO, "lyx document header finished");
if (output_preamble) {
if (!runparams.nice) {
// code for usual, NOT nice-latex-file
- os << "\\batchmode\n"; // changed
- // from \nonstopmode
- d->texrow.newline();
+ os << "\\batchmode\n"; // changed from \nonstopmode
}
if (!original_path.empty()) {
// FIXME UNICODE
<< "\\def\\input@path{{"
<< inputpath << "/}}\n"
<< "\\makeatother\n";
- d->texrow.newline();
- d->texrow.newline();
- d->texrow.newline();
}
}
runparams.use_polyglossia = features.usePolyglossia();
// Write the preamble
runparams.use_babel = params().writeLaTeX(os, features,
- d->texrow,
d->filename.onlyPath());
runparams.use_japanese = features.isRequired("japanese");
// make the body.
os << "\\begin{document}\n";
- d->texrow.newline();
// output the parent macros
MacroSet::iterator it = parentMacros.begin();
MacroSet::iterator end = parentMacros.end();
for (; it != end; ++it) {
- int num_lines = (*it)->write(os, true);
- d->texrow.newlines(num_lines);
+ int num_lines = (*it)->write(os.os(), true);
+ os.texrow().newlines(num_lines);
}
} // output_preamble
- d->texrow.start(paragraphs().begin()->id(), 0);
+ os.texrow().start(paragraphs().begin()->id(), 0);
LYXERR(Debug::INFO, "preamble finished, now the body.");
}
// the real stuff
- latexParagraphs(*this, text(), os, d->texrow, runparams);
+ latexParagraphs(*this, text(), os, runparams);
// Restore the parenthood if needed
if (output_preamble)
// add this just in case after all the paragraphs
os << endl;
- d->texrow.newline();
if (output_preamble) {
os << "\\end{document}\n";
- d->texrow.newline();
LYXERR(Debug::LATEX, "makeLaTeXFile...done");
} else {
LYXERR(Debug::LATEX, "LaTeXFile for inclusion made.");
runparams_in.encoding = runparams.encoding;
// Just to be sure. (Asger)
- d->texrow.newline();
+ os.texrow().newline();
//for (int i = 0; i<d->texrow.rows(); i++) {
// int id,pos;
//}
LYXERR(Debug::INFO, "Finished making LaTeX file.");
- LYXERR(Debug::INFO, "Row count was " << d->texrow.rows() - 1 << '.');
+ LYXERR(Debug::INFO, "Row count was " << os.texrow().rows() - 1 << '.');
}
void Buffer::saveCheckSum() const
{
FileName const & file = d->filename;
+
+ file.refresh();
if (file.exists()) {
d->timestamp_ = file.lastModified();
d->checksum_ = file.checksum();
ListOfBuffers Buffer::allRelatives() const
{
ListOfBuffers lb = masterBuffer()->getDescendents();
- lb.push_front(const_cast<Buffer *>(this));
+ lb.push_front(const_cast<Buffer *>(masterBuffer()));
return lb;
}
// scope ends behind pos?
if (pos < it->second.first
- && theBufferList().isLoaded(it->second.second)) {
+ && (cloned_buffer_ ||
+ theBufferList().isLoaded(it->second.second))) {
// look for macro in external file
macro_lock = true;
MacroData const * data
writeDocBookSource(os, absFileName(), runparams, false);
else if (runparams.flavor == OutputParams::HTML)
writeLyXHTMLSource(os, runparams, false);
- else
+ else {
// latex or literate
- writeLaTeXSource(os, string(), runparams, true, true);
+ otexstream ots(os, d->texrow);
+ writeLaTeXSource(ots, string(), runparams, true, true);
+ }
} else {
runparams.par_begin = par_begin;
runparams.par_end = par_end;
else if (runparams.flavor == OutputParams::HTML) {
XHTMLStream xs(os);
xhtmlParagraphs(text(), *this, xs, runparams);
- } else
+ } else {
// latex or literate
- latexParagraphs(*this, text(), os, texrow, runparams);
+ otexstream ots(os, texrow);
+ latexParagraphs(*this, text(), ots, runparams);
+ }
}
}
if (!params().default_output_format.empty()
&& params().default_output_format != "default")
return params().default_output_format;
- typedef vector<Format const *> Formats;
- Formats formats = exportableFormats(true);
if (isDocBook()
- || isLiterate()
|| params().useNonTeXFonts
|| params().encoding().package() == Encoding::japanese) {
+ vector<Format const *> const formats = exportableFormats(true);
if (formats.empty())
return string();
// return the first we find
void Buffer::setExportStatus(bool e) const
{
d->doing_export = e;
+ ListOfBuffers clist = getDescendents();
+ ListOfBuffers::const_iterator cit = clist.begin();
+ ListOfBuffers::const_iterator const cen = clist.end();
+ for (; cit != cen; ++cit)
+ (*cit)->d->doing_export = e;
}
runparams.linelen = lyxrc.plaintext_linelen;
runparams.includeall = includeall;
vector<string> backs = backends();
+ Converters converters = theConverters();
if (find(backs.begin(), backs.end(), format) == backs.end()) {
// Get shortest path to format
- theConverters().buildGraph();
+ converters.buildGraph();
Graph::EdgePath path;
for (vector<string>::const_iterator it = backs.begin();
it != backs.end(); ++it) {
- Graph::EdgePath p = theConverters().getPath(*it, format);
+ Graph::EdgePath p = converters.getPath(*it, format);
if (!p.empty() && (path.empty() || p.size() < path.size())) {
backend_format = *it;
path = p;
}
return false;
}
- runparams.flavor = theConverters().getFlavor(path);
+ runparams.flavor = converters.getFlavor(path);
} else {
backend_format = format;
// LaTeX backend
else if (backend_format == format) {
runparams.nice = true;
- if (!makeLaTeXFile(FileName(filename), string(), runparams))
+ if (!makeLaTeXFile(FileName(filename), string(), runparams)) {
+ if (d->cloned_buffer_) {
+ d->cloned_buffer_->d->errorLists["Export"] =
+ d->errorLists["Export"];
+ }
return false;
+ }
} else if (!lyxrc.tex_allows_spaces
&& contains(filePath(), ' ')) {
Alert::error(_("File name error"),
return false;
} else {
runparams.nice = false;
- if (!makeLaTeXFile(FileName(filename), filePath(), runparams))
+ if (!makeLaTeXFile(FileName(filename), filePath(), runparams)) {
+ if (d->cloned_buffer_) {
+ d->cloned_buffer_->d->errorLists["Export"] =
+ d->errorLists["Export"];
+ }
return false;
+ }
}
string const error_type = (format == "program")
ErrorList & error_list = d->errorLists[error_type];
string const ext = formats.extension(format);
FileName const tmp_result_file(changeExtension(filename, ext));
- bool const success = theConverters().convert(this, FileName(filename),
+ bool const success = converters.convert(this, FileName(filename),
tmp_result_file, FileName(absFileName()), backend_format, format,
error_list);
// Emit the signal to show the error list or copy it back to the
- // cloned Buffer so that it cab be emitted afterwards.
+ // cloned Buffer so that it can be emitted afterwards.
if (format != backend_format) {
if (d->cloned_buffer_) {
d->cloned_buffer_->d->errorLists[error_type] =
ListOfBuffers::const_iterator const cen = clist.end();
for (; cit != cen; ++cit) {
if (d->cloned_buffer_) {
+ // Enable reverse search by copying back the
+ // texrow object to the cloned buffer.
+ // FIXME: this is not thread safe.
+ (*cit)->d->cloned_buffer_->d->texrow = (*cit)->d->texrow;
(*cit)->d->cloned_buffer_->d->errorLists[error_type] =
(*cit)->d->errorLists[error_type];
} else
vector<Format const *> Buffer::exportableFormats(bool only_viewable) const
{
vector<string> const backs = backends();
+ set<string> excludes;
+ if (params().useNonTeXFonts) {
+ excludes.insert("latex");
+ excludes.insert("pdflatex");
+ }
vector<Format const *> result =
- theConverters().getReachable(backs[0], only_viewable, true);
+ theConverters().getReachable(backs[0], only_viewable, true, excludes);
for (vector<string>::const_iterator it = backs.begin() + 1;
it != backs.end(); ++it) {
vector<Format const *> r =
- theConverters().getReachable(*it, only_viewable, false);
+ theConverters().getReachable(*it, only_viewable, false, excludes);
result.insert(result.end(), r.begin(), r.end());
}
return result;
void Buffer::bufferErrors(TeXErrors const & terr, ErrorList & errorList) const
{
- TeXErrors::Errors::const_iterator cit = terr.begin();
+ TeXErrors::Errors::const_iterator it = terr.begin();
TeXErrors::Errors::const_iterator end = terr.end();
+ ListOfBuffers clist = getDescendents();
+ ListOfBuffers::const_iterator cen = clist.end();
- for (; cit != end; ++cit) {
+ for (; it != end; ++it) {
int id_start = -1;
int pos_start = -1;
- int errorRow = cit->error_in_line;
- bool found = d->texrow.getIdFromRow(errorRow, id_start,
- pos_start);
+ int errorRow = it->error_in_line;
+ Buffer const * buf = 0;
+ Impl const * p = d;
+ if (it->child_name.empty())
+ p->texrow.getIdFromRow(errorRow, id_start, pos_start);
+ else {
+ // The error occurred in a child
+ ListOfBuffers::const_iterator cit = clist.begin();
+ for (; cit != cen; ++cit) {
+ string const child_name =
+ DocFileName(changeExtension(
+ (*cit)->absFileName(), "tex")).
+ mangledFileName();
+ if (it->child_name != child_name)
+ continue;
+ (*cit)->d->texrow.getIdFromRow(errorRow,
+ id_start, pos_start);
+ if (id_start != -1) {
+ buf = d->cloned_buffer_
+ ? (*cit)->d->cloned_buffer_->d->owner_
+ : (*cit)->d->owner_;
+ p = (*cit)->d;
+ break;
+ }
+ }
+ }
int id_end = -1;
int pos_end = -1;
+ bool found;
do {
++errorRow;
- found = d->texrow.getIdFromRow(errorRow, id_end, pos_end);
+ found = p->texrow.getIdFromRow(errorRow, id_end, pos_end);
} while (found && id_start == id_end && pos_start == pos_end);
- errorList.push_back(ErrorItem(cit->error_desc,
- cit->error_text, id_start, pos_start, pos_end));
+ if (id_start != id_end) {
+ // Next registered position is outside the inset where
+ // the error occurred, so signal end-of-paragraph
+ pos_end = 0;
+ }
+
+ errorList.push_back(ErrorItem(it->error_desc,
+ it->error_text, id_start, pos_start, pos_end, buf));
}
}
updateTitles();
markClean();
message(bformat(_("Document %1$s reloaded."), disp_fn));
+ d->undo_.clear();
} else {
message(bformat(_("Could not reload document %1$s."), disp_fn));
}