#include "Layout.h"
#include "Lexer.h"
#include "Font.h"
+#include "ModuleList.h"
#include "frontends/alert.h"
docstring name_;
};
-
-int const FORMAT = 11;
+// Keep the changes documented in the Customization manual.
+int const FORMAT = 16;
bool layout2layout(FileName const & filename, FileName const & tempfile)
TextClass::TextClass()
{
outputType_ = LATEX;
+ outputFormat_ = "latex";
columns_ = 1;
sides_ = OneSide;
secnumdepth_ = 3;
enum TextClassTags {
TC_OUTPUTTYPE = 1,
+ TC_OUTPUTFORMAT,
TC_INPUT,
TC_STYLE,
TC_DEFAULTSTYLE,
TC_TOCDEPTH,
TC_CLASSOPTIONS,
TC_PREAMBLE,
+ TC_HTMLPREAMBLE,
TC_PROVIDES,
TC_REQUIRES,
TC_LEFTMARGIN,
{ "excludesmodule", TC_EXCLUDESMODULE },
{ "float", TC_FLOAT },
{ "format", TC_FORMAT },
+ { "htmlpreamble", TC_HTMLPREAMBLE },
{ "input", TC_INPUT },
{ "insetlayout", TC_INSETLAYOUT },
{ "leftmargin", TC_LEFTMARGIN },
{ "nofloat", TC_NOFLOAT },
{ "nostyle", TC_NOSTYLE },
+ { "outputformat", TC_OUTPUTFORMAT },
{ "outputtype", TC_OUTPUTTYPE },
{ "pagestyle", TC_PAGESTYLE },
{ "preamble", TC_PREAMBLE },
FileName const tempfile = FileName::tempName("convert_layout");
bool success = layout2layout(filename, tempfile);
if (success)
- success = read(tempfile, rt);
+ success = readWithoutConv(tempfile, rt) == OK;
tempfile.removeFile();
return success;
}
-bool TextClass::read(FileName const & filename, ReadType rt)
+
+TextClass::ReturnValues TextClass::readWithoutConv(FileName const & filename, ReadType rt)
{
if (!filename.isReadableFile()) {
lyxerr << "Cannot read layout file `" << filename << "'."
<< endl;
- return false;
+ return ERROR;
}
LYXERR(Debug::TCLASS, "Reading " + translateRT(rt) + ": " +
LYXERR(Debug::TCLASS, "Finished reading " + translateRT(rt) + ": " +
to_utf8(makeDisplayPath(filename.absFilename())));
-
- if (retval != FORMAT_MISMATCH)
+
+ return retval;
+}
+
+
+bool TextClass::read(FileName const & filename, ReadType rt)
+{
+ ReturnValues const retval = readWithoutConv(filename, rt);
+ if (retval != FORMAT_MISMATCH)
return retval == OK;
-
+
bool const worx = convertLayoutFormat(filename, rt);
if (!worx) {
LYXERR0 ("Unable to convert " << filename <<
format = lexrc.getInteger();
break;
- case TC_OUTPUTTYPE: // output type definition
+ case TC_OUTPUTFORMAT:
+ if (lexrc.next())
+ outputFormat_ = lexrc.getString();
+ break;
+
+ case TC_OUTPUTTYPE:
readOutputType(lexrc);
+ switch(outputType_) {
+ case LATEX:
+ outputFormat_ = "latex";
+ break;
+ case DOCBOOK:
+ outputFormat_ = "docbook";
+ break;
+ case LITERATE:
+ outputFormat_ = "literate";
+ break;
+ }
break;
case TC_INPUT: // Include file
preamble_ = from_utf8(lexrc.getLongString("EndPreamble"));
break;
+ case TC_HTMLPREAMBLE:
+ htmlpreamble_ = from_utf8(lexrc.getLongString("EndPreamble"));
+ break;
+
case TC_ADDTOPREAMBLE:
preamble_ += from_utf8(lexrc.getLongString("EndPreamble"));
break;
rightmargin_ = lexrc.getDocString();
break;
- case TC_INSETLAYOUT:
- if (lexrc.next()) {
+ case TC_INSETLAYOUT: {
+ if (!lexrc.next()) {
+ lexrc.printError("No name given for InsetLayout: `$$Token'.");
+ error = true;
+ break;
+ }
+ docstring const name = subst(lexrc.getDocString(), '_', ' ');
+ if (name.empty()) {
+ string s = "Could not read name for InsetLayout: `$$Token' "
+ + lexrc.getString() + " is probably not valid UTF-8!";
+ lexrc.printError(s.c_str());
+ InsetLayout il;
+ // Since we couldn't read the name, we just scan the rest
+ // of the style and discard it.
+ il.read(lexrc, *this);
+ error = true;
+ } else if (hasInsetLayout(name)) {
+ InsetLayout & il = insetlayoutlist_[name];
+ error = !il.read(lexrc, *this);
+ } else {
InsetLayout il;
- if (il.read(lexrc, *this))
- insetlayoutlist_[il.name()] = il;
- // else there was an error, so forget it
+ il.setName(name);
+ error = !il.read(lexrc, *this);
+ if (!error)
+ insetlayoutlist_[name] = il;
}
break;
+ }
case TC_FLOAT:
readFloat(lexrc);
}
+bool TextClass::hasInsetLayout(docstring const & n) const
+{
+ if (n.empty())
+ return false;
+ InsetLayouts::const_iterator it = insetlayoutlist_.begin();
+ InsetLayouts::const_iterator en = insetlayoutlist_.end();
+ for (; it != en; ++it)
+ if (n == it->first)
+ return true;
+ return false;
+}
+
+
Layout const & TextClass::operator[](docstring const & name) const
{
LASSERT(!name.empty(), /**/);
}
+DocumentClass & DocumentClassBundle::makeDocumentClass(
+ LayoutFile const & baseClass, LayoutModuleList const & modlist)
+{
+ DocumentClass & doc_class = newClass(baseClass);
+ LayoutModuleList::const_iterator it = modlist.begin();
+ LayoutModuleList::const_iterator en = modlist.end();
+ for (; it != en; it++) {
+ string const modName = *it;
+ LyXModule * lm = moduleList[modName];
+ if (!lm) {
+ docstring const msg =
+ bformat(_("The module %1$s has been requested by\n"
+ "this document but has not been found in the list of\n"
+ "available modules. If you recently installed it, you\n"
+ "probably need to reconfigure LyX.\n"), from_utf8(modName));
+ ExceptionMessage(WarningException,_("Module not available"),
+ msg + _("Some layouts may not be available."));
+ continue;
+ }
+ if (!lm->isAvailable()) {
+ docstring const msg =
+ bformat(_("The module %1$s requires a package that is\n"
+ "not available in your LaTeX installation. LaTeX output\n"
+ "may not be possible.\n"), from_utf8(modName));
+ ExceptionMessage(WarningException, _("Package not available"), msg);
+ }
+ FileName layout_file = libFileSearch("layouts", lm->getFilename());
+ if (!doc_class.read(layout_file, TextClass::MODULE)) {
+ docstring const msg =
+ bformat(_("Error reading module %1$s\n"), from_utf8(modName));
+ throw ExceptionMessage(WarningException, _("Read Error"), msg);
+ }
+ }
+ return doc_class;
+}
+
+
/////////////////////////////////////////////////////////////////////////
//
// DocumentClass