#include "Lexer.h"
#include "LyXAction.h"
#include "LyX.h"
-#include "LyXFunc.h"
#include "LyXRC.h"
#include "LyXVC.h"
#include "output_docbook.h"
// Do not remove the comment below, so we get merge conflict in
// independent branches. Instead add your own.
-int const LYX_FORMAT = 376; // jspitzm: support for unincluded file maintenance
+int const LYX_FORMAT = 378; // ps: rev insetinfo
typedef map<string, bool> DepClean;
typedef map<docstring, pair<InsetLabel const *, Buffer::References> > RefCache;
<< ' ' << quoteName(lyx2lyx.toFilesystemEncoding())
<< " -t " << convert<string>(LYX_FORMAT)
<< " -o " << quoteName(tmpfile.toFilesystemEncoding())
- << ' ' << quoteName(filename.toFilesystemEncoding());
+ << ' ' << quoteName(filename.toSafeFilesystemEncoding());
string const command_str = command.str();
LYXERR(Debug::INFO, "Running '" << command_str << '\'');
bformat(_("%1$s ended unexpectedly, which means"
" that it is probably corrupted."),
from_utf8(filename.absFilename())));
+ return failure;
}
d->file_fully_loaded = true;
}
-// Should probably be moved to somewhere else: BufferView? LyXView?
+// Should probably be moved to somewhere else: BufferView? GuiView?
bool Buffer::save() const
{
// We don't need autosaves in the immediate future. (Asger)
resetAutosaveTimers();
- string const encodedFilename = d->filename.toFilesystemEncoding();
-
FileName backupName;
bool madeBackup = false;
makeDisplayPath(fname.absFilename()));
message(str);
+ string const encoded_fname = fname.toSafeFilesystemEncoding(os::CREATE);
+
if (params().compressed) {
- gz::ogzstream ofs(fname.toFilesystemEncoding().c_str(), ios::out|ios::trunc);
+ gz::ogzstream ofs(encoded_fname.c_str(), ios::out|ios::trunc);
retval = ofs && write(ofs);
} else {
- ofstream ofs(fname.toFilesystemEncoding().c_str(), ios::out|ios::trunc);
+ ofstream ofs(encoded_fname.c_str(), ios::out|ios::trunc);
retval = ofs && write(ofs);
}
// FIXME UNICODE
// We don't know the encoding of inputpath
docstring const inputpath = from_utf8(latex_path(original_path));
- os << "\\makeatletter\n"
- << "\\def\\input@path{{"
- << inputpath << "/}}\n"
- << "\\makeatother\n";
- d->texrow.newline();
- d->texrow.newline();
- d->texrow.newline();
+ docstring uncodable_glyphs;
+ Encoding const * const enc = runparams.encoding;
+ if (enc) {
+ for (size_t n = 0; n < inputpath.size(); ++n) {
+ docstring const glyph =
+ docstring(1, inputpath[n]);
+ if (enc->latexChar(inputpath[n], true) != glyph) {
+ LYXERR0("Uncodable character '"
+ << glyph
+ << "' in input path!");
+ uncodable_glyphs += glyph;
+ }
+ }
+ }
+
+ // warn user if we found uncodable glyphs.
+ if (!uncodable_glyphs.empty()) {
+ frontend::Alert::warning(_("Uncodable character in file path"),
+ support::bformat(_("The path of your document\n"
+ "(%1$s)\n"
+ "contains glyphs that are unknown in the\n"
+ "current document encoding (namely %2$s).\n"
+ "This will likely result in incomplete output.\n\n"
+ "Chose an appropriate document encoding (such as utf8)\n"
+ "or change the file path name."), inputpath, uncodable_glyphs));
+ } else {
+ os << "\\makeatletter\n"
+ << "\\def\\input@path{{"
+ << inputpath << "/}}\n"
+ << "\\makeatother\n";
+ d->texrow.newline();
+ d->texrow.newline();
+ d->texrow.newline();
+ }
}
// get parent macros (if this buffer has a parent) which will be
// output the parent macros
MacroSet::iterator it = parentMacros.begin();
MacroSet::iterator end = parentMacros.end();
- for (; it != end; ++it)
- (*it)->write(os, true);
+ for (; it != end; ++it) {
+ int num_lines = (*it)->write(os, true);
+ d->texrow.newlines(num_lines);
+ }
+
} // output_preamble
d->texrow.start(paragraphs().begin()->id(), 0);
{
LaTeXFeatures features(*this, params(), runparams);
validate(features);
- updateLabels(UpdateMaster, OutputUpdate);
+ updateBuffer(UpdateMaster, OutputUpdate);
checkBibInfoCache();
d->bibinfo_.makeCitationLabels(*this);
updateMacros();
OutputParams runparams(¶ms().encoding());
runparams.flavor = OutputParams::LATEX;
runparams.nice = false;
+ runparams.linelen = lyxrc.plaintext_linelen;
makeLaTeXFile(FileName(name), org_path, runparams);
TeXErrors terr;
case LFUN_BUFFER_EXPORT: {
bool success = doExport(argument, false, false);
- dr.setError(success);
+ dr.setError(!success);
if (!success)
dr.setMessage(bformat(_("Error exporting to format: %1$s."),
func.argument()));
}
+std::set<Language const *> Buffer::getLanguages() const
+{
+ std::set<Language const *> languages;
+ getLanguages(languages);
+ return languages;
+}
+
+
+void Buffer::getLanguages(std::set<Language const *> & languages) const
+{
+ ParConstIterator end = par_iterator_end();
+ // add the buffer language, even if it's not actively used
+ languages.insert(language());
+ // iterate over the paragraphs
+ for (ParConstIterator it = par_iterator_begin(); it != end; ++it)
+ it->getLanguages(languages);
+ // also children
+ std::vector<Buffer *> clist = getChildren();
+ for (vector<Buffer *>::const_iterator cit = clist.begin();
+ cit != clist.end(); ++cit)
+ (*cit)->getLanguages(languages);
+}
+
+
DocIterator Buffer::getParFromID(int const id) const
{
Buffer * buf = const_cast<Buffer *>(this);
void Buffer::moveAutosaveFile(support::FileName const & oldauto) const
{
FileName const newauto = getAutosaveFilename();
- if (!(oldauto == newauto || oldauto.moveTo(newauto)))
- LYXERR0("Unable to remove autosave file `" << oldauto << "'!");
+ oldauto.refresh();
+ if (newauto != oldauto && oldauto.exists())
+ if (!oldauto.moveTo(newauto))
+ LYXERR0("Unable to move autosave file `" << oldauto << "'!");
}
&& !LyXVC::file_not_found_hook(s))
return false;
- if (s.isReadableFile()
- && readFileHelper(s)) {
+ if (s.isReadableFile()){
+ // InsetInfo needs to know if file is under VCS
lyxvc().file_found_hook(s);
- setReadonly(!s.isWritable());
- return true;
+ if (readFileHelper(s)) {
+ d->read_only = !s.isWritable();
+ return true;
+ }
}
return false;
}
}
-void Buffer::updateLabels(UpdateScope scope, UpdateType utype) const
+void Buffer::updateBuffer(UpdateScope scope, UpdateType utype) const
{
// Use the master text class also for child documents
Buffer const * const master = masterBuffer();
// If this is a child document start with the master
if (master != this) {
bufToUpdate.insert(this);
- master->updateLabels(UpdateMaster, utype);
+ master->updateBuffer(UpdateMaster, utype);
// Do this here in case the master has no gui associated with it. Then,
// the TocModel is not updated and TocModel::toc_ is invalid (bug 5699).
if (!master->d->gui_)
// do the real work
ParIterator parit = cbuf.par_iterator_begin();
- updateLabels(parit, utype);
+ updateBuffer(parit, utype);
if (master != this)
// TocBackend update will be done later.
}
-void Buffer::updateLabels(ParIterator & parit, UpdateType utype) const
+void Buffer::updateBuffer(ParIterator & parit, UpdateType utype) const
{
LASSERT(parit.pit() == 0, /**/);
InsetList::const_iterator end = parit->insetList().end();
for (; iit != end; ++iit) {
parit.pos() = iit->pos;
- iit->inset->updateLabels(parit, utype);
+ iit->inset->updateBuffer(parit, utype);
}
}
}
bool const success = loadLyXFile(d->filename);
if (success) {
- updateLabels();
+ updateBuffer();
changed(true);
markClean();
message(bformat(_("Document %1$s reloaded."), disp_fn));