]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetInclude.cpp
Properly communicate forced encodings
[lyx.git] / src / insets / InsetInclude.cpp
index 6ae77a657cc69d233e2302f1bd28134aca90e84b..d6e3ae2c63f9a7e808b6d0f62dd557b17528cc43 100644 (file)
@@ -165,7 +165,7 @@ InsetLabel * createLabel(Buffer * buf, docstring const & label_str)
        return new InsetLabel(buf, icp);
 }
 
-} // namespace anon
+} // namespace
 
 
 InsetInclude::InsetInclude(Buffer * buf, InsetCommandParams const & p)
@@ -265,24 +265,24 @@ void InsetInclude::doDispatch(Cursor & cur, FuncRequest & cmd)
                                InsetListingsParams new_params(to_utf8(p["lstparams"]));
                                docstring const new_label =
                                        from_utf8(new_params.getParamValue("label"));
-                               
+
                                if (new_label.empty()) {
                                        delete label_;
                                        label_ = 0;
                                } else {
                                        docstring old_label;
-                                       if (label_) 
+                                       if (label_)
                                                old_label = label_->getParam("name");
                                        else {
                                                label_ = createLabel(buffer_, new_label);
                                                label_->setBuffer(buffer());
-                                       }                                       
+                                       }
 
                                        if (new_label != old_label) {
                                                label_->updateLabelAndRefs(new_label, &cur);
                                                // the label might have been adapted (duplicate)
                                                if (new_label != label_->getParam("name")) {
-                                                       new_params.addParam("label", "{" + 
+                                                       new_params.addParam("label", "{" +
                                                                to_utf8(label_->getParam("name")) + "}", true);
                                                        p["lstparams"] = from_utf8(new_params.params());
                                                }
@@ -412,7 +412,7 @@ docstring InsetInclude::screenLabel() const
 
 Buffer * InsetInclude::getChildBuffer() const
 {
-       Buffer * childBuffer = loadIfNeeded(); 
+       Buffer * childBuffer = loadIfNeeded();
 
        // FIXME RECURSIVE INCLUDE
        // This isn't sufficient, as the inclusion could be downstream.
@@ -427,7 +427,7 @@ Buffer * InsetInclude::loadIfNeeded() const
        // try to load the cloned child document again.
        if (buffer().isClone())
                return child_buffer_;
-       
+
        // Don't try to load it again if we failed before.
        if (failedtoload_ || isVerbatim(params()) || isListings(params()))
                return 0;
@@ -436,7 +436,7 @@ Buffer * InsetInclude::loadIfNeeded() const
        // Use cached Buffer if possible.
        if (child_buffer_ != 0) {
                if (theBufferList().isLoaded(child_buffer_)
-               // additional sanity check: make sure the Buffer really is
+                   // additional sanity check: make sure the Buffer really is
                    // associated with the file we want.
                    && child_buffer_ == theBufferList().getBuffer(included_file))
                        return child_buffer_;
@@ -602,8 +602,11 @@ void InsetInclude::latex(otexstream & os, OutputParams const & runparams) const
                // Using listings, it is always possible to have a caption,
                // even for non-floats. Using minted, only floats can have a
                // caption. So, with minted we use the following strategy.
-               // If a caption or the float parameter are specified, we
-               // assume that the listing is floating. In this case, the
+               // If a caption was specified but the float parameter was not,
+               // we ourselves add a caption above the listing (because the
+               // listing comes from a file and might span several pages).
+               // Otherwise, if float was specified, the floating listing
+               // environment provided by minted is used. In either case, the
                // label parameter is taken as the label by which the float
                // can be referenced, otherwise it will have the meaning
                // intended by minted. In this last case, the label will
@@ -620,7 +623,7 @@ void InsetInclude::latex(otexstream & os, OutputParams const & runparams) const
                string caption;
                string label;
                string placement;
-               bool isfloat = false;
+               bool isfloat = lstparams.isFloat();
                if (use_minted) {
                        // Get float placement, language, caption, and
                        // label, then remove the relative options.
@@ -628,7 +631,6 @@ void InsetInclude::latex(otexstream & os, OutputParams const & runparams) const
                                getVectorFromString(parameters, ",", false);
                        for (size_t i = 0; i < opts.size(); ++i) {
                                if (prefixIs(opts[i], "float")) {
-                                       isfloat = true;
                                        if (prefixIs(opts[i], "float="))
                                                placement = opts[i].substr(6);
                                        opts.erase(opts.begin() + i--);
@@ -636,7 +638,6 @@ void InsetInclude::latex(otexstream & os, OutputParams const & runparams) const
                                        language = opts[i].substr(9);
                                        opts.erase(opts.begin() + i--);
                                } else if (prefixIs(opts[i], "caption=")) {
-                                       isfloat = true;
                                        caption = opts[i].substr(8);
                                        opts.erase(opts.begin() + i--);
                                } else if (prefixIs(opts[i], "label=")) {
@@ -645,7 +646,7 @@ void InsetInclude::latex(otexstream & os, OutputParams const & runparams) const
                                }
                        }
                        if (!label.empty()) {
-                               if (isfloat)
+                               if (isfloat || !caption.empty())
                                        label = trim(label, "{}");
                                else
                                        opts.push_back("label=" + label);
@@ -659,12 +660,17 @@ void InsetInclude::latex(otexstream & os, OutputParams const & runparams) const
                        if (!placement.empty())
                                os << '[' << placement << "]";
                        os << breakln;
+               } else if (use_minted && !caption.empty()) {
+                       os << breakln << "\\lyxmintcaption[t]{" << caption;
+                       if (!label.empty())
+                               os << "\\label{" << label << "}";
+                       os << "}\n";
                }
                os << (use_minted ? "\\inputminted" : "\\lstinputlisting");
                if (!parameters.empty())
                        os << "[" << parameters << "]";
                if (use_minted)
-                       os << '{'  << language << '}';
+                       os << '{'  << ascii_lowercase(language) << '}';
                os << '{'  << incfile << '}';
                if (use_minted && isfloat) {
                        if (!caption.empty())
@@ -892,20 +898,20 @@ docstring InsetInclude::xhtml(XHTMLStream & xs, OutputParams const & rp) const
                return docstring();
 
        // are we generating only some paragraphs, or all of them?
-       bool const all_pars = !rp.dryrun || 
-                       (rp.par_begin == 0 && 
+       bool const all_pars = !rp.dryrun ||
+                       (rp.par_begin == 0 &&
                         rp.par_end == (int)buffer().text().paragraphs().size());
-       
+
        OutputParams op = rp;
        if (all_pars) {
                op.par_begin = 0;
                op.par_end = 0;
                ibuf->writeLyXHTMLSource(xs.os(), op, Buffer::IncludedFile);
        } else
-               xs << XHTMLStream::ESCAPE_NONE 
-                  << "<!-- Included file: " 
-                  << from_utf8(included_file.absFileName()) 
-                  << XHTMLStream::ESCAPE_NONE 
+               xs << XHTMLStream::ESCAPE_NONE
+                  << "<!-- Included file: "
+                  << from_utf8(included_file.absFileName())
+                  << XHTMLStream::ESCAPE_NONE
                         << " -->";
        return docstring();
 }
@@ -1029,9 +1035,13 @@ void InsetInclude::validate(LaTeXFeatures & features) const
        if (isVerbatim(params()))
                features.require("verbatim");
        else if (isListings(params())) {
-               if (buffer().params().use_minted)
+               if (buffer().params().use_minted) {
                        features.require("minted");
-               else
+                       string const opts = to_utf8(params()["lstparams"]);
+                       InsetListingsParams lstpars(opts);
+                       if (!lstpars.isFloat() && contains(opts, "caption="))
+                               features.require("lyxmintcaption");
+               } else
                        features.require("listings");
        }
 
@@ -1062,7 +1072,7 @@ void InsetInclude::validate(LaTeXFeatures & features) const
 }
 
 
-void InsetInclude::collectBibKeys(InsetIterator const & /*di*/) const
+void InsetInclude::collectBibKeys(InsetIterator const & /*di*/, FileNameList & checkedFiles) const
 {
        Buffer * child = loadIfNeeded();
        if (!child)
@@ -1072,7 +1082,7 @@ void InsetInclude::collectBibKeys(InsetIterator const & /*di*/) const
        // But it'll have to do for now.
        if (child == &buffer())
                return;
-       child->collectBibKeys();
+       child->collectBibKeys(checkedFiles);
 }
 
 
@@ -1199,7 +1209,7 @@ void add_preview(RenderMonitoredPreview & renderer, InsetInclude const & inset,
        }
 }
 
-} // namespace anon
+} // namespace
 
 
 void InsetInclude::addPreview(DocIterator const & /*inset_pos*/,
@@ -1271,7 +1281,7 @@ void InsetInclude::updateCommand()
        InsetListingsParams par(to_utf8(params()["lstparams"]));
        par.addParam("label", "{" + to_utf8(new_label) + "}", true);
        p["lstparams"] = from_utf8(par.params());
-       setParams(p);   
+       setParams(p);
 }