#include "TextClass.h"
-#include "LayoutFile.h"
#include "CiteEnginesList.h"
-#include "Color.h"
#include "Counters.h"
#include "Floating.h"
#include "FloatList.h"
#include "Layout.h"
+#include "LayoutFile.h"
#include "Lexer.h"
-#include "Font.h"
#include "ModuleList.h"
#include "frontends/alert.h"
#include "support/lassert.h"
#include "support/debug.h"
-#include "support/ExceptionMessage.h"
#include "support/FileName.h"
#include "support/filetools.h"
#include "support/gettext.h"
// You should also run the development/tools/updatelayouts.py script,
// to update the format of all of our layout files.
//
-int const LAYOUT_FORMAT = 80; // spitz: Requires for floats
+int const LAYOUT_FORMAT = 90; // spitz: semantic label colors
// Layout format for the current lyx file format. Controls which format is
namespace {
-class LayoutNamesEqual : public unary_function<Layout, bool> {
-public:
- LayoutNamesEqual(docstring const & name)
- : name_(name)
- {}
- bool operator()(Layout const & c) const
- {
- return c.name() == name_;
- }
-private:
- docstring name_;
-};
-
-
bool layout2layout(FileName const & filename, FileName const & tempfile,
int const format = LAYOUT_FORMAT)
{
LYXERR(Debug::TCLASS, "Running `" << command_str << '\'');
cmd_ret const ret = runCommand(command_str);
- if (ret.first != 0) {
+ if (!ret.valid) {
if (format == LAYOUT_FORMAT)
LYXERR0("Conversion of layout with layout2layout.py has failed.");
return false;
opt_pagesize_("default|a4|a5|b5|letter|legal|executive"),
opt_pagestyle_("empty|plain|headings|fancy"), fontsize_format_("$$spt"), pagesize_("default"),
pagesize_format_("$$spaper"), pagestyle_("default"), tablestyle_("default"),
+ docbookroot_("article"), docbookforceabstract_(false),
columns_(1), sides_(OneSide), secnumdepth_(3), tocdepth_(3), outputType_(LATEX),
outputFormat_("latex"), has_output_format_(false), defaultfont_(sane_font),
titletype_(TITLE_COMMAND_AFTER), titlename_("maketitle"),
min_toclevel_(0), max_toclevel_(0), maxcitenames_(2),
- cite_full_author_list_(true), bibintoc_(false)
-{
+ cite_full_author_list_(true), bibintoc_(false) {
}
-bool TextClass::readStyle(Lexer & lexrc, Layout & lay) const
+bool TextClass::readStyle(Lexer & lexrc, Layout & lay, ReadType rt) const
{
LYXERR(Debug::TCLASS, "Reading style " << to_utf8(lay.name()));
- if (!lay.read(lexrc, *this)) {
+ if (!lay.read(lexrc, *this, rt == VALIDATION)) {
LYXERR0("Error parsing style `" << to_utf8(lay.name()) << '\'');
return false;
}
TC_FULLAUTHORLIST,
TC_OUTLINERNAME,
TC_TABLESTYLE,
- TC_BIBINTOC
+ TC_BIBINTOC,
+ TC_DOCBOOKROOT,
+ TC_DOCBOOKFORCEABSTRACT
};
{ "defaultfont", TC_DEFAULTFONT },
{ "defaultmodule", TC_DEFAULTMODULE },
{ "defaultstyle", TC_DEFAULTSTYLE },
+ { "docbookforceabstract", TC_DOCBOOKFORCEABSTRACT },
+ { "docbookroot", TC_DOCBOOKROOT },
{ "excludesmodule", TC_EXCLUDESMODULE },
{ "float", TC_FLOAT },
{ "format", TC_FORMAT },
case LATEX:
outputFormat_ = "latex";
break;
- case DOCBOOK:
- outputFormat_ = "docbook";
- break;
case LITERATE:
outputFormat_ = "literate";
break;
Layout lay;
// Since we couldn't read the name, we just scan the rest
// of the style and discard it.
- error = !readStyle(lexrc, lay);
+ error = !readStyle(lexrc, lay, rt);
break;
}
// block.
if (have_layout && !providestyle) {
Layout & lay = operator[](name);
- error = !readStyle(lexrc, lay);
+ error = !readStyle(lexrc, lay, rt);
}
// If the layout does not exist, then we want to create a new
// one, but not if we are in a ModifyStyle block.
else if (!have_layout && !modifystyle) {
Layout layout;
layout.setName(name);
- error = !readStyle(lexrc, layout);
+ error = !readStyle(lexrc, layout, rt);
if (!error)
layoutlist_.push_back(layout);
else {
Layout lay;
// signal to coverity that we do not care about the result
- (void)readStyle(lexrc, lay);
+ (void)readStyle(lexrc, lay, rt);
}
break;
}
lexrc.eatLine();
vector<string> const req
= getVectorFromString(lexrc.getString());
- requires_.insert(req.begin(), req.end());
+ required_.insert(req.begin(), req.end());
break;
}
error = !readOutlinerName(lexrc);
break;
- case TC_TABLESTYLE:
+ case TC_TABLESTYLE:
lexrc.next();
tablestyle_ = rtrim(lexrc.getString());
break;
+
+ case TC_DOCBOOKROOT:
+ if (lexrc.next())
+ docbookroot_ = lexrc.getString();
+ break;
+
+ case TC_DOCBOOKFORCEABSTRACT:
+ if (lexrc.next())
+ docbookforceabstract_ = lexrc.getBool();
+ break;
} // end of switch
}
// If we do not succeed, then it was not there, which means that
// the textclass did not provide the definitions of the standard
// insets. So we need to try to load them.
- int erased = provides_.erase("stdinsets");
+ size_type const erased = provides_.erase("stdinsets");
if (!erased) {
FileName tmp = libFileSearch("layouts", "stdinsets.inc");
void TextClass::readOutputType(Lexer & lexrc)
{
LexerKeyword outputTypeTags[] = {
- { "docbook", DOCBOOK },
{ "latex", LATEX },
{ "literate", LITERATE }
};
lexrc.printError("Unknown output type `$$Token'");
return;
case LATEX:
- case DOCBOOK:
case LITERATE:
outputType_ = static_cast<OutputType>(le);
break;
CO_PAGESIZE_FORMAT,
CO_PAGESTYLE,
CO_OTHER,
- CO_HEADER,
CO_END
};
{"end", CO_END },
{"fontsize", CO_FONTSIZE },
{"fontsizeformat", CO_FONTSIZE_FORMAT },
- {"header", CO_HEADER },
{"other", CO_OTHER },
{"pagesize", CO_PAGESIZE },
{"pagesizeformat", CO_PAGESIZE_FORMAT },
else
options_ += ',' + lexrc.getString();
break;
- case CO_HEADER:
- lexrc.next();
- class_header_ = subst(lexrc.getString(), """, "\"");
- break;
case CO_END:
getout = true;
break;
FT_HTMLSTYLE,
FT_HTMLATTR,
FT_HTMLTAG,
+ FT_DOCBOOKATTR,
+ FT_DOCBOOKTAG,
+ FT_DOCBOOKTAGTYPE,
FT_LISTCOMMAND,
FT_REFPREFIX,
FT_ALLOWED_PLACEMENT,
{ "allowedplacement", FT_ALLOWED_PLACEMENT },
{ "allowssideways", FT_ALLOWS_SIDEWAYS },
{ "allowswide", FT_ALLOWS_WIDE },
+ { "docbookattr", FT_DOCBOOKATTR },
+ { "docbooktag", FT_DOCBOOKTAG },
+ { "docbooktagtype", FT_DOCBOOKTAGTYPE },
{ "end", FT_END },
{ "extension", FT_EXT },
{ "guiname", FT_NAME },
string htmlattr;
docstring htmlstyle;
string htmltag;
+ string docbookattr;
+ string docbooktag;
+ string docbooktagtype;
string listname;
string listcommand;
string name;
string style;
string type;
string within;
- string requires;
+ string required;
bool usesfloat = true;
bool ispredefined = false;
bool allowswide = true;
break;
case FT_REQUIRES:
lexrc.next();
- requires = lexrc.getString();
+ required = lexrc.getString();
break;
case FT_PREDEFINED:
lexrc.next();
lexrc.next();
htmltag = lexrc.getString();
break;
+ case FT_DOCBOOKATTR:
+ lexrc.next();
+ docbookattr = lexrc.getString();
+ break;
+ case FT_DOCBOOKTAG:
+ lexrc.next();
+ docbooktag = lexrc.getString();
+ break;
+ case FT_DOCBOOKTAGTYPE:
+ lexrc.next();
+ docbooktagtype = lexrc.getString();
+ break;
case FT_END:
getout = true;
break;
"not be able to produce a float list.");
}
Floating fl(type, placement, ext, within, style, name,
- listname, listcommand, refprefix, allowed_placement,
- htmltag, htmlattr, htmlstyle, requires, usesfloat,
- ispredefined, allowswide, allowssideways);
+ listname, listcommand, refprefix, allowed_placement,
+ htmltag, htmlattr, htmlstyle, docbookattr,
+ docbooktagtype, required, usesfloat, ispredefined,
+ allowswide, allowssideways);
floatlist_.newFloat(fl);
// each float has its own counter
counters_.newCounter(from_ascii(type), from_ascii(within),
- docstring(), docstring());
+ docstring(), docstring(),
+ bformat(_("%1$s (Float)"), _(name)));
// also define sub-float counters
docstring const subtype = "sub-" + from_ascii(type);
counters_.newCounter(subtype, from_ascii(type),
- "\\alph{" + subtype + "}", docstring());
+ "\\alph{" + subtype + "}", docstring(),
+ bformat(_("Sub-%1$s (Float)"), _(name)));
}
return getout;
}
bool TextClass::hasLayout(docstring const & n) const
{
docstring const name = n.empty() ? defaultLayoutName() : n;
-
- return find_if(layoutlist_.begin(), layoutlist_.end(),
- LayoutNamesEqual(name))
- != layoutlist_.end();
+ return getLayout(name) != nullptr;
}
{
LATTEST(!name.empty());
- const_iterator it =
- find_if(begin(), end(), LayoutNamesEqual(name));
-
- if (it == end()) {
+ Layout const * c = getLayout(name);
+ if (!c) {
LYXERR0("We failed to find the layout '" << name
<< "' in the layout list. You MUST investigate!");
for (auto const & lay : *this)
LASSERT(false, return dummy);
}
- return *it;
+ return *c;
}
LATTEST(!name.empty());
// Safe to continue, given what we do below.
- iterator it = find_if(begin(), end(), LayoutNamesEqual(name));
-
- if (it == end()) {
+ Layout * c = getLayout(name);
+ if (!c) {
LYXERR0("We failed to find the layout '" << to_utf8(name)
<< "' in the layout list. You MUST investigate!");
for (auto const & lay : *this)
LATTEST(false);
// we are here only in release mode
layoutlist_.push_back(createBasicLayout(name, true));
- it = find_if(begin(), end(), LayoutNamesEqual(name));
+ c = getLayout(name);
}
- return *it;
+ return *c;
}
LayoutList::iterator it =
remove_if(layoutlist_.begin(), layoutlist_.end(),
- LayoutNamesEqual(name));
+ [name](const Layout &c) { return c.name() == name; });
- LayoutList::iterator end = layoutlist_.end();
+ LayoutList::iterator const end = layoutlist_.end();
bool const ret = (it != end);
layoutlist_.erase(it, end);
return ret;
}
+Layout const * TextClass::getLayout(docstring const & name) const
+{
+ LayoutList::const_iterator cit =
+ find_if(begin(), end(),
+ [name](const Layout &c) { return c.name() == name; });
+ if (cit == layoutlist_.end())
+ return nullptr;
+
+ return &(*cit);
+}
+
+
+Layout * TextClass::getLayout(docstring const & name)
+{
+ LayoutList::iterator it =
+ find_if(layoutlist_.begin(), layoutlist_.end(),
+ [name](const Layout &c) { return c.name() == name; });
+ if (it == layoutlist_.end())
+ return nullptr;
+
+ return &(*it);
+}
+
+
bool DocumentClass::addLayoutIfNeeded(docstring const & n) const
{
if (hasLayout(n))
defaultLayout = new Layout;
defaultLayout->setUnknown(unknown);
defaultLayout->setName(name);
- if (!readStyle(lex, *defaultLayout)) {
+ if (!readStyle(lex, *defaultLayout, BASECLASS)) {
// The only way this happens is because the hardcoded layout above
// is wrong.
LATTEST(false);
{
vector<CitationStyle> const styles = citeStyles(type);
vector<string> cmds;
+ cmds.reserve(styles.size());
for (auto const & cs : styles)
cmds.push_back(cs.name);