]> git.lyx.org Git - lyx.git/blobdiff - src/Buffer.cpp
Remove hardcoded values
[lyx.git] / src / Buffer.cpp
index 99641e278c5af05157316f3208703c269dda8d69..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_) {
@@ -909,8 +910,8 @@ int Buffer::readHeader(Lexer & lex)
        params().html_latex_end.clear();
        params().html_math_img_scale = 1.0;
        params().output_sync_macro.erase();
-       params().setLocalLayout(string(), false);
-       params().setLocalLayout(string(), true);
+       params().setLocalLayout(docstring(), false);
+       params().setLocalLayout(docstring(), true);
 
        for (int i = 0; i < 4; ++i) {
                params().user_defined_bullet(i) = ITEMIZE_DEFAULTS[i];
@@ -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();
@@ -1902,8 +1947,6 @@ void Buffer::writeLaTeXSource(otexstream & os,
 
        } // output_preamble
 
-       os.texrow().start(paragraphs().begin()->id(), 0);
-
        LYXERR(Debug::INFO, "preamble finished, now the body.");
 
        // the real stuff
@@ -1985,7 +2028,7 @@ void Buffer::writeDocBookSource(odocstream & os, string const & fname,
                else
                        os << " PUBLIC \"-//OASIS//DTD DocBook V4.2//EN\"";
 
-               docstring preamble = from_utf8(params().preamble);
+               docstring preamble = params().preamble;
                if (runparams.flavor != OutputParams::XML ) {
                        preamble += "<!ENTITY % output.print.png \"IGNORE\">\n";
                        preamble += "<!ENTITY % output.print.pdf \"IGNORE\">\n";
@@ -2088,14 +2131,14 @@ void Buffer::writeLyXHTMLSource(odocstream & os,
                if (!styles.empty())
                        os << "\n<!-- Text Class Preamble -->\n" << styles << '\n';
 
-               styles = from_utf8(features.getPreambleSnippets());
+               styles = features.getPreambleSnippets().str;
                if (!styles.empty())
                        os << "\n<!-- Preamble Snippets -->\n" << styles << '\n';
 
                // we will collect CSS information in a stream, and then output it
                // either here, as part of the header, or else in a separate file.
                odocstringstream css;
-               styles = from_utf8(features.getCSSSnippets());
+               styles = features.getCSSSnippets();
                if (!styles.empty())
                        css << "/* LyX Provided Styles */\n" << styles << '\n';
 
@@ -2481,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));
@@ -2493,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:
@@ -3513,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);
                }
        }
 }
@@ -3711,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);
@@ -4476,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));
        }
 }
 
@@ -4673,7 +4693,7 @@ static bool needEnumCounterReset(ParIterator const & it)
                --prev_it.top().pit();
                Paragraph const & prev_par = *prev_it;
                if (prev_par.getDepth() <= cur_depth)
-                       return  prev_par.layout().labeltype != LABEL_ENUMERATE;
+                       return prev_par.layout().name() != par.layout().name();
        }
        // start of nested inset: reset
        return true;
@@ -4757,8 +4777,12 @@ void Buffer::Impl::setLabel(ParIterator & it, UpdateType utype) const
                        break;
                }
 
+               // Increase the master counter?
+               if (layout.stepmastercounter && needEnumCounterReset(it))
+                       counters.stepMaster(enumcounter, utype);
+
                // Maybe we have to reset the enumeration counter.
-               if (needEnumCounterReset(it))
+               if (!layout.resumecounter && needEnumCounterReset(it))
                        counters.reset(enumcounter);
                counters.step(enumcounter, utype);