]> git.lyx.org Git - lyx.git/blobdiff - src/Buffer.cpp
Disentangle CiteEngines and Modules
[lyx.git] / src / Buffer.cpp
index 2dcdefec5378892228c0f755f1ed4ea29db03da4..3652e7af12eff8927f559c37711f8a4f2b1a5cd8 100644 (file)
@@ -79,6 +79,7 @@
 #include "mathed/MathMacroTemplate.h"
 #include "mathed/MathSupport.h"
 
+#include "graphics/GraphicsCache.h"
 #include "graphics/PreviewLoader.h"
 
 #include "frontends/alert.h"
@@ -421,8 +422,8 @@ Buffer::Impl::Impl(Buffer * owner, FileName const & file, bool readonly_,
          ignore_parent(false),  toc_backend(owner), macro_lock(false), timestamp_(0),
          checksum_(0), wa_(0),  gui_(0), undo_(*owner), bibinfo_cache_valid_(false),
          bibfile_cache_valid_(false), cite_labels_valid_(false), preview_error_(false),
-         inset(0), preview_loader_(0), cloned_buffer_(cloned_buffer), clone_list_(0),
-         doing_export(false), parent_buffer(0),
+         inset(0), preview_loader_(0), cloned_buffer_(cloned_buffer),
+         clone_list_(0), doing_export(false), parent_buffer(0),
          word_count_(0), char_count_(0), blank_count_(0)
 {
        if (!cloned_buffer_) {
@@ -949,15 +950,13 @@ int Buffer::readHeader(Lexer & lex)
                                                                        "%1$s %2$s\n"),
                                                         from_utf8(token),
                                                         lex.getDocString());
-                               errorList.push_back(ErrorItem(_("Document header error"),
-                                       s, -1, 0, 0));
+                               errorList.push_back(ErrorItem(_("Document header error"), s));
                        }
                }
        }
        if (begin_header_line) {
                docstring const s = _("\\begin_header is missing");
-               errorList.push_back(ErrorItem(_("Document header error"),
-                       s, -1, 0, 0));
+               errorList.push_back(ErrorItem(_("Document header error"), s));
        }
 
        params().makeDocumentClass();
@@ -979,8 +978,7 @@ bool Buffer::readDocument(Lexer & lex)
 
        if (!lex.checkFor("\\begin_document")) {
                docstring const s = _("\\begin_document is missing");
-               errorList.push_back(ErrorItem(_("Document header error"),
-                       s, -1, 0, 0));
+               errorList.push_back(ErrorItem(_("Document header error"), s));
        }
 
        readHeader(lex);
@@ -1707,17 +1705,17 @@ bool Buffer::makeLaTeXFile(FileName const & fname,
                errorList.push_back(ErrorItem(msg, _("Some characters of your document are probably not "
                                "representable in the chosen encoding.\n"
                                "Changing the document encoding to utf8 could help."),
-                               e.par_id, e.pos, e.pos + 1));
+                                             {e.par_id, e.pos}, {e.par_id, e.pos + 1}));
                failed_export = true;
        }
        catch (iconv_codecvt_facet_exception const & e) {
                errorList.push_back(ErrorItem(_("iconv conversion failed"),
-                       _(e.what()), -1, 0, 0));
+                                             _(e.what())));
                failed_export = true;
        }
        catch (exception const & e) {
                errorList.push_back(ErrorItem(_("conversion failed"),
-                       _(e.what()), -1, 0, 0));
+                                             _(e.what())));
                failed_export = true;
        }
        catch (...) {
@@ -1877,6 +1875,47 @@ void Buffer::writeLaTeXSource(otexstream & os,
                // Write the preamble
                runparams.use_babel = params().writeLaTeX(os, features,
                                                          d->filename.onlyPath());
+               
+               if (!runparams.dryrun && features.hasPolyglossiaExclusiveLanguages()
+                   && !features.hasOnlyPolyglossiaLanguages()) {
+                       docstring blangs;
+                       docstring plangs;
+                       vector<string> bll = features.getBabelExclusiveLanguages();
+                       vector<string> pll = features.getPolyglossiaExclusiveLanguages();
+                       if (!bll.empty()) {
+                               docstring langs;
+                               for (vector<string>::const_iterator it = bll.begin(); it != bll.end(); ++it) {
+                                       if (!langs.empty())
+                                               langs += ", ";
+                                       langs += _(*it);
+                               }
+                               blangs = bll.size() > 1 ?
+                                           support::bformat(_("The languages %1$s are only supported by Babel."), langs)
+                                         : support::bformat(_("The language %1$s is only supported by Babel."), langs);
+                       }
+                       if (!pll.empty()) {
+                               docstring langs;
+                               for (vector<string>::const_iterator it = pll.begin(); it != pll.end(); ++it) {
+                                       if (!langs.empty())
+                                               langs += ", ";
+                                       langs += _(*it);
+                               }
+                               plangs = pll.size() > 1 ?
+                                           support::bformat(_("The languages %1$s are only supported by Polyglossia."), langs)
+                                         : support::bformat(_("The language %1$s is only supported by Polyglossia."), langs);
+                               if (!blangs.empty())
+                                       plangs += "\n"; 
+                       }
+
+                       frontend::Alert::warning(
+                               _("Incompatible Languages!"),
+                               support::bformat(
+                                 _("You cannot use the following languages "
+                                   "together in one LaTeX document because "
+                                   "they require conflicting language packages:\n"
+                                   "%1$s%2$s"),
+                                 plangs, blangs));
+               }
 
                // Japanese might be required only in some children of a document,
                // but once required, we must keep use_japanese true.
@@ -1890,8 +1929,14 @@ void Buffer::writeLaTeXSource(otexstream & os,
                }
 
                // make the body.
+               // mark the beginning of the body to separate it from InPreamble insets
+               os.texrow().start(TexRow::beginDocument());
                os << "\\begin{document}\n";
 
+               // mark the start of a new paragraph by simulating a newline,
+               // so that os.afterParbreak() returns true at document start
+               os.lastChar('\n');
+
                // output the parent macros
                MacroSet::iterator it = parentMacros.begin();
                MacroSet::iterator end = parentMacros.end();
@@ -2479,7 +2524,7 @@ bool Buffer::getStatus(FuncRequest const & cmd, FuncStatus & flag)
                size_t pos = format.find(' ');
                if (pos != string::npos)
                        format = format.substr(0, pos);
-               enable = params().isExportable(format);
+               enable = params().isExportable(format, false);
                if (!enable)
                        flag.message(bformat(
                                             _("Don't know how to export to format: %1$s"), arg));
@@ -2491,7 +2536,7 @@ bool Buffer::getStatus(FuncRequest const & cmd, FuncStatus & flag)
                break;
 
        case LFUN_BUILD_PROGRAM:
-               enable = params().isExportable("program");
+               enable = params().isExportable("program", false);
                break;
 
        case LFUN_BRANCH_ACTIVATE:
@@ -3511,7 +3556,7 @@ void Buffer::updateMacroInstances(UpdateType utype) const
                MacroContext mc = MacroContext(this, it);
                for (DocIterator::idx_type i = 0; i < n; ++i) {
                        MathData & data = minset->cell(i);
-                       data.updateMacros(0, mc, utype);
+                       data.updateMacros(0, mc, utype, 0);
                }
        }
 }
@@ -3709,7 +3754,7 @@ unique_ptr<TexRow> Buffer::getSourceCode(odocstream & os, string const & format,
                        // in order to know if we should output polyglossia
                        // macros (instead of babel macros)
                        LaTeXFeatures features(*this, params(), runparams);
-                       params().validate(features);
+                       validate(features);
                        runparams.use_polyglossia = features.usePolyglossia();
                        // latex or literate
                        otexstream ots(os);
@@ -4474,56 +4519,33 @@ Buffer::ReadStatus Buffer::loadThisLyXFile(FileName const & fn)
 
 void Buffer::bufferErrors(TeXErrors const & terr, ErrorList & errorList) const
 {
-       TeXErrors::Errors::const_iterator it = terr.begin();
-       TeXErrors::Errors::const_iterator end = terr.end();
-       ListOfBuffers clist = getDescendents();
-       ListOfBuffers::const_iterator cen = clist.end();
-
-       for (; it != end; ++it) {
-               int id_start = -1;
-               int pos_start = -1;
-               int errorRow = it->error_in_line;
+       for (auto const & err : terr) {
+               TexRow::TextEntry start, end = TexRow::text_none;
+               int errorRow = err.error_in_line;
                Buffer const * buf = 0;
                Impl const * p = d;
-               if (it->child_name.empty())
-                   p->texrow.getIdFromRow(errorRow, id_start, pos_start);
+               if (err.child_name.empty())
+                       tie(start, end) = p->texrow.getEntriesFromRow(errorRow);
                else {
                        // The error occurred in a child
-                       ListOfBuffers::const_iterator cit = clist.begin();
-                       for (; cit != cen; ++cit) {
+                       for (Buffer const * child : getDescendents()) {
                                string const child_name =
-                                       DocFileName(changeExtension(
-                                               (*cit)->absFileName(), "tex")).
-                                                       mangledFileName();
-                               if (it->child_name != child_name)
+                                       DocFileName(changeExtension(child->absFileName(), "tex")).
+                                       mangledFileName();
+                               if (err.child_name != child_name)
                                        continue;
-                               (*cit)->d->texrow.getIdFromRow(errorRow,
-                                                       id_start, pos_start);
-                               if (id_start != -1) {
+                               tie(start, end) = child->d->texrow.getEntriesFromRow(errorRow);
+                               if (!TexRow::isNone(start)) {
                                        buf = d->cloned_buffer_
-                                               ? (*cit)->d->cloned_buffer_->d->owner_
-                                               : (*cit)->d->owner_;
-                                       p = (*cit)->d;
+                                               ? child->d->cloned_buffer_->d->owner_
+                                               : child->d->owner_;
+                                       p = child->d;
                                        break;
                                }
                        }
                }
-               int id_end = -1;
-               int pos_end = -1;
-               bool found;
-               do {
-                       ++errorRow;
-                       found = p->texrow.getIdFromRow(errorRow, id_end, pos_end);
-               } while (found && id_start == id_end && 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));
+               errorList.push_back(ErrorItem(err.error_desc, err.error_text,
+                                             start, end, buf));
        }
 }