#include "LayoutFile.h"
#include "LayoutModuleList.h"
#include "LyX.h"
-#include "LyXFunc.h"
#include "LyXRC.h"
#include "Lexer.h"
#include "MetricsInfo.h"
+#include "output_xhtml.h"
#include "OutputParams.h"
#include "TextClass.h"
#include "TocBackend.h"
}
-InsetLabel * createLabel(docstring const & label_str)
+InsetLabel * createLabel(Buffer * buf, docstring const & label_str)
{
if (label_str.empty())
return 0;
InsetCommandParams icp(LABEL_CODE);
icp["name"] = label_str;
- return new InsetLabel(icp);
+ return new InsetLabel(buf, icp);
}
} // namespace anon
-InsetInclude::InsetInclude(InsetCommandParams const & p)
- : InsetCommand(p, "include"), include_label(uniqueID()),
+InsetInclude::InsetInclude(Buffer * buf, InsetCommandParams const & p)
+ : InsetCommand(buf, p, "include"), include_label(uniqueID()),
preview_(new RenderMonitoredPreview(this)), failedtoload_(false),
set_label_(false), label_(0), child_buffer_(0)
{
if (isListings(params())) {
InsetListingsParams listing_params(to_utf8(p["lstparams"]));
- label_ = createLabel(from_utf8(listing_params.getParamValue("label")));
+ label_ = createLabel(buffer_, from_utf8(listing_params.getParamValue("label")));
}
}
}
+void InsetInclude::setChildBuffer(Buffer * buffer)
+{
+ child_buffer_ = buffer;
+}
+
+
ParamInfo const & InsetInclude::findInfo(string const & /* cmdName */)
{
// FIXME
void InsetInclude::doDispatch(Cursor & cur, FuncRequest & cmd)
{
- switch (cmd.action) {
+ switch (cmd.action()) {
case LFUN_INSET_EDIT: {
editIncluded(to_utf8(params()["filename"]));
if (label_)
old_label = label_->getParam("name");
else {
- label_ = createLabel(new_label);
+ label_ = createLabel(buffer_, new_label);
label_->setBuffer(buffer());
}
bool InsetInclude::getStatus(Cursor & cur, FuncRequest const & cmd,
FuncStatus & flag) const
{
- switch (cmd.action) {
+ switch (cmd.action()) {
case LFUN_INSET_EDIT:
flag.setEnabled(true);
}
+bool InsetInclude::isChildIncluded() const
+{
+ std::list<std::string> includeonlys =
+ buffer().params().getIncludedChildren();
+ if (includeonlys.empty())
+ return true;
+ return (std::find(includeonlys.begin(),
+ includeonlys.end(),
+ to_utf8(params()["filename"])) != includeonlys.end());
+}
+
+
docstring InsetInclude::screenLabel() const
{
docstring temp;
temp = buffer().B_("Verbatim Input*");
break;
case INCLUDE:
- temp = buffer().B_("Include");
+ if (isChildIncluded())
+ temp = buffer().B_("Include");
+ else
+ temp += buffer().B_("Include (excluded)");
break;
case LISTINGS:
temp = listings_label_;
Buffer * InsetInclude::loadIfNeeded() const
{
+ // This is for background export and preview. We don't even want to
+ // 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;
+ FileName const included_file = includedFilename(buffer(), params());
// Use cached Buffer if possible.
if (child_buffer_ != 0) {
- if (theBufferList().isLoaded(child_buffer_))
+ if (theBufferList().isLoaded(child_buffer_)
+ // additional sanity check: make sure the Buffer really is
+ // associated with the file we want.
+ && child_buffer_ == theBufferList().getBuffer(included_file))
return child_buffer_;
// Buffer vanished, so invalidate cache and try to reload.
child_buffer_ = 0;
}
- string const parent_filename = buffer().absFileName();
- FileName const included_file =
- makeAbsPath(to_utf8(params()["filename"]), onlyPath(parent_filename));
-
- if (!isLyXFilename(included_file.absFilename()))
+ if (!isLyXFilename(included_file.absFileName()))
return 0;
Buffer * child = theBufferList().getBuffer(included_file);
if (!included_file.exists())
return 0;
- child = theBufferList().newBuffer(included_file.absFilename());
+ child = theBufferList().newBuffer(included_file.absFileName());
if (!child)
// Buffer creation is not possible.
return 0;
// This isn't sufficient, as the inclusion could be downstream.
// But it'll have to do for now.
if (isInputOrInclude(params()) &&
- buffer().absFileName() == included_file.absFilename())
+ buffer().absFileName() == included_file.absFileName())
{
Alert::error(_("Recursive input"),
bformat(_("Attempted to include file %1$s in itself! "
// buffer directory.
if (!FileName::isAbsolute(incfile)) {
// FIXME UNICODE
- incfile = to_utf8(makeRelPath(from_utf8(included_file.absFilename()),
+ incfile = to_utf8(makeRelPath(from_utf8(included_file.absFileName()),
from_utf8(masterBuffer->filePath())));
}
mangled = DocFileName(included_file).mangledFilename();
} else {
exportfile = changeExtension(incfile, ".tex");
- mangled = DocFileName(changeExtension(included_file.absFilename(), ".tex")).
+ mangled = DocFileName(changeExtension(included_file.absFileName(), ".tex")).
mangledFilename();
}
//Don't try to load or copy the file if we're
//in a comment or doing a dryrun
} else if (isInputOrInclude(params()) &&
- isLyXFilename(included_file.absFilename())) {
+ isLyXFilename(included_file.absFileName())) {
//if it's a LyX file and we're inputting or including,
//try to load it so we can write the associated latex
if (!loadIfNeeded())
Encoding const * const oldEnc = runparams.encoding;
Language const * const oldLang = runparams.master_language;
runparams.encoding = &tmp->params().encoding();
- runparams.master_language = masterBuffer->params().language;
+ runparams.master_language = buffer().params().language;
tmp->makeLaTeXFile(writefile,
- masterFileName(buffer()).onlyPath().absFilename(),
+ masterFileName(buffer()).onlyPath().absFileName(),
runparams, false);
runparams.encoding = oldEnc;
runparams.master_language = oldLang;
LYXERR(Debug::LATEX,
to_utf8(bformat(_("Could not copy the file\n%1$s\n"
"into the temporary directory."),
- from_utf8(included_file.absFilename()))));
+ from_utf8(included_file.absFileName()))));
return 0;
}
}
exportfile);
// \input wants file with extension (default is .tex)
- if (!isLyXFilename(included_file.absFilename())) {
+ if (!isLyXFilename(included_file.absFileName())) {
incfile = latex_path(incfile);
// FIXME UNICODE
os << '\\' << from_ascii(params().getCmdName())
}
-docstring InsetInclude::xhtml(odocstream & os, OutputParams const &rp) const
+docstring InsetInclude::xhtml(XHTMLStream & xs, OutputParams const &rp) const
{
if (rp.inComment)
return docstring();
bool const listing = isListings(params());
if (listing || isVerbatim(params())) {
if (listing)
- os << "<pre>\n";
+ xs << html::StartTag("pre");
// FIXME: We don't know the encoding of the file, default to UTF-8.
- os << includedFilename(buffer(), params()).fileContents("UTF-8");
+ xs << includedFilename(buffer(), params()).fileContents("UTF-8");
if (listing)
- os << "</pre>\n";
+ xs << html::EndTag("pre");
return docstring();
}
// We don't (yet) know how to Input or Include non-LyX files.
// (If we wanted to get really arcane, we could run some tex2html
// converter on the included file. But that's just masochistic.)
- string const parent_filename = buffer().absFileName();
- FileName const included_file =
- makeAbsPath(to_utf8(params()["filename"]), onlyPath(parent_filename));
- if (!isLyXFilename(included_file.absFilename())) {
+ FileName const included_file = includedFilename(buffer(), params());
+ if (!isLyXFilename(included_file.absFileName())) {
frontend::Alert::warning(_("Unsupported Inclusion"),
bformat(_("LyX does not know how to include non-LyX files when "
"generating HTML output. Offending file:\n%1$s"),
// Check we're not trying to include ourselves.
// FIXME RECURSIVE INCLUDE
- if (buffer().absFileName() == included_file.absFilename()) {
+ if (buffer().absFileName() == included_file.absFileName()) {
Alert::error(_("Recursive input"),
bformat(_("Attempted to include file %1$s in itself! "
"Ignoring inclusion."), params()["filename"]));
Buffer const * const ibuf = loadIfNeeded();
if (!ibuf)
return docstring();
- ibuf->writeLyXHTMLSource(os, rp, true);
+ ibuf->writeLyXHTMLSource(xs.os(), rp, true);
return docstring();
}
if (incfile.empty())
return 0;
- string const included_file = includedFilename(buffer(), params()).absFilename();
+ string const included_file = includedFilename(buffer(), params()).absFileName();
// Check we're not trying to include ourselves.
// FIXME RECURSIVE INCLUDE
LASSERT(&buffer() == &features.buffer(), /**/);
string const included_file =
- includedFilename(buffer(), params()).absFilename();
+ includedFilename(buffer(), params()).absFileName();
if (isLyXFilename(included_file))
writefile = changeExtension(included_file, ".sgml");
if (!features.runparams().nice && !isVerbatim(params()) && !isListings(params())) {
incfile = DocFileName(writefile).mangledFilename();
writefile = makeAbsPath(incfile,
- buffer().masterBuffer()->temppath()).absFilename();
+ buffer().masterBuffer()->temppath()).absFileName();
}
features.includeFile(include_label, writefile);
InsetIterator const & /*di*/) const
{
if (loadIfNeeded()) {
- string const included_file = includedFilename(buffer(), params()).absFilename();
+ string const included_file = includedFilename(buffer(), params()).absFileName();
Buffer * tmp = theBufferList().getBuffer(FileName(included_file));
BiblioInfo const & newkeys = tmp->localBibInfo();
keys.mergeBiblioInfo(newkeys);
} // namespace anon
-void InsetInclude::addPreview(graphics::PreviewLoader & ploader) const
+void InsetInclude::addPreview(DocIterator const & /*inset_pos*/,
+ graphics::PreviewLoader & ploader) const
{
Buffer const & buffer = ploader.buffer();
if (!preview_wanted(params(), buffer))
setParams(p);
}
-void InsetInclude::updateLabels(ParIterator const & it)
+void InsetInclude::updateBuffer(ParIterator const & it, UpdateType utype)
{
Buffer const * const childbuffer = getChildBuffer();
if (childbuffer) {
- childbuffer->updateLabels(Buffer::UpdateChildOnly);
+ childbuffer->updateBuffer(Buffer::UpdateChildOnly, utype);
return;
}
if (!isListings(params()))
return;
if (label_)
- label_->updateLabels(it);
+ label_->updateBuffer(it, utype);
InsetListingsParams const par(to_utf8(params()["lstparams"]));
if (par.getParamValue("caption").empty()) {
docstring const cnt = from_ascii("listing");
listings_label_ = master.B_("Program Listing");
if (counters.hasCounter(cnt)) {
- counters.step(cnt);
+ counters.step(cnt, utype);
listings_label_ += " " + convert<docstring>(counters.value(cnt));
}
}