VSpace defskip;
PDFOptions pdfoptions;
LayoutFileIndex baseClass_;
+ FormatList exportableFormatList;
+ FormatList viewableFormatList;
+ bool isViewCacheValid;
+ bool isExportCacheValid;
};
BufferParams::Impl::Impl()
- : defskip(VSpace::MEDSKIP), baseClass_(string(""))
+ : defskip(VSpace::MEDSKIP), baseClass_(string("")),
+ isViewCacheValid(false), isExportCacheValid(false)
{
// set initial author
// FIXME UNICODE
os << "\\usepackage[dot]{bibtopic}\n";
// Will be surrounded by \makeatletter and \makeatother when not empty
- docstring atlyxpreamble;
+ otexstringstream atlyxpreamble;
// Some macros LyX will need
- docstring tmppreamble(features.getMacros());
-
- if (!tmppreamble.empty())
- atlyxpreamble += "\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% "
- "LyX specific LaTeX commands.\n"
- + tmppreamble + '\n';
-
+ {
+ TexString tmppreamble = features.getMacros();
+ if (!tmppreamble.str.empty())
+ atlyxpreamble << "\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% "
+ "LyX specific LaTeX commands.\n"
+ << move(tmppreamble)
+ << '\n';
+ }
// the text class specific preamble
- tmppreamble = features.getTClassPreamble();
- if (!tmppreamble.empty())
- atlyxpreamble += "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% "
- "Textclass specific LaTeX commands.\n"
- + tmppreamble + '\n';
-
+ {
+ docstring tmppreamble = features.getTClassPreamble();
+ if (!tmppreamble.empty())
+ atlyxpreamble << "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% "
+ "Textclass specific LaTeX commands.\n"
+ << tmppreamble
+ << '\n';
+ }
// suppress date if selected
// use \@ifundefined because we cannot be sure that every document class
// has a \date command
if (suppress_date)
- atlyxpreamble += "\\@ifundefined{date}{}{\\date{}}\n";
+ atlyxpreamble << "\\@ifundefined{date}{}{\\date{}}\n";
/* the user-defined preamble */
if (!containsOnly(preamble, " \n\t")) {
// FIXME UNICODE
- atlyxpreamble += "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% "
- "User specified LaTeX commands.\n";
+ atlyxpreamble << "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% "
+ "User specified LaTeX commands.\n";
// Check if the user preamble contains uncodable glyphs
odocstringstream user_preamble;
"preamble code accordingly."),
uncodable_glyphs));
}
- atlyxpreamble += user_preamble.str() + '\n';
+ atlyxpreamble << user_preamble.str() << '\n';
}
// footmisc must be loaded after setspace
// preamble. For that reason we also pass the options via
// \PassOptionsToPackage in getPreamble() and not here.
if (features.mustProvide("footmisc"))
- atlyxpreamble += "\\usepackage{footmisc}\n";
+ atlyxpreamble << "\\usepackage{footmisc}\n";
// subfig loads internally the LaTeX package "caption". As
// caption is a very popular package, users will load it in
// koma's own caption commands are used instead of caption. We
// use \PassOptionsToPackage here because the user could have
// already loaded subfig in the preamble.
- if (features.mustProvide("subfig")) {
- atlyxpreamble += "\\@ifundefined{showcaptionsetup}{}{%\n"
- " \\PassOptionsToPackage{caption=false}{subfig}}\n"
- "\\usepackage{subfig}\n";
- }
+ if (features.mustProvide("subfig"))
+ atlyxpreamble << "\\@ifundefined{showcaptionsetup}{}{%\n"
+ " \\PassOptionsToPackage{caption=false}{subfig}}\n"
+ "\\usepackage{subfig}\n";
// Itemize bullet settings need to be last in case the user
// defines their own bullets that use a package included
}
if (!bullets_def.empty())
- atlyxpreamble += bullets_def + "}\n\n";
+ atlyxpreamble << bullets_def << "}\n\n";
- if (!atlyxpreamble.empty()) {
+ if (!atlyxpreamble.empty())
os << "\n\\makeatletter\n"
- << atlyxpreamble
+ << atlyxpreamble.release()
<< "\\makeatother\n\n";
- }
// We try to load babel late, in case it interferes with other packages.
// Jurabib, hyperref, varioref, bicaption and listings (bug 8995) have to be
{
// evil, but this function is evil
doc_class_ = const_pointer_cast<DocumentClass>(tc);
+ invalidateConverterCache();
}
if (!baseClass())
return;
+ invalidateConverterCache();
LayoutModuleList mods;
LayoutModuleList::iterator it = layout_modules_.begin();
LayoutModuleList::iterator en = layout_modules_.end();
}
-bool BufferParams::isExportable(string const & format) const
+bool BufferParams::isExportable(string const & format, bool need_viewable) const
{
- vector<string> backs = backends();
- for (vector<string>::const_iterator it = backs.begin();
- it != backs.end(); ++it)
- if (theConverters().isReachable(*it, format))
+ FormatList const & formats = exportableFormats(need_viewable);
+ FormatList::const_iterator fit = formats.begin();
+ FormatList::const_iterator end = formats.end();
+ for (; fit != end ; ++fit) {
+ if ((*fit)->name() == format)
return true;
+ }
return false;
}
-vector<Format const *> BufferParams::exportableFormats(bool only_viewable) const
+FormatList const & BufferParams::exportableFormats(bool only_viewable) const
{
+ FormatList & cached = only_viewable ?
+ pimpl_->viewableFormatList : pimpl_->exportableFormatList;
+ bool & valid = only_viewable ?
+ pimpl_->isViewCacheValid : pimpl_->isExportCacheValid;
+ if (valid)
+ return cached;
+
vector<string> const backs = backends();
set<string> excludes;
if (useNonTeXFonts) {
excludes.insert("latex");
excludes.insert("pdflatex");
}
- vector<Format const *> result =
+ FormatList result =
theConverters().getReachable(backs[0], only_viewable, true, excludes);
for (vector<string>::const_iterator it = backs.begin() + 1;
it != backs.end(); ++it) {
- vector<Format const *> r =
- theConverters().getReachable(*it, only_viewable, false, excludes);
+ FormatList r = theConverters().getReachable(*it, only_viewable,
+ false, excludes);
result.insert(result.end(), r.begin(), r.end());
}
- return result;
-}
-
-
-bool BufferParams::isExportableFormat(string const & format) const
-{
- typedef vector<Format const *> Formats;
- Formats formats;
- formats = exportableFormats(true);
- Formats::const_iterator fit = formats.begin();
- Formats::const_iterator end = formats.end();
- for (; fit != end ; ++fit) {
- if ((*fit)->name() == format)
- return true;
- }
- return false;
+ sort(result.begin(), result.end(), Format::formatSorter);
+ cached = result;
+ valid = true;
+ return cached;
}
return default_output_format;
if (isDocBook()
|| encoding().package() == Encoding::japanese) {
- vector<Format const *> const formats = exportableFormats(true);
+ FormatList const & formats = exportableFormats(true);
if (formats.empty())
return string();
// return the first we find
return styles;
}
+void BufferParams::invalidateConverterCache() const
+{
+ pimpl_->isExportCacheValid = false;
+ pimpl_->isViewCacheValid = false;
+}
+
} // namespace lyx