#include <config.h>
#include "TextClass.h"
-#include "debug.h"
-#include "Lexer.h"
+
+#include "Color.h"
#include "Counters.h"
+#include "support/debug.h"
+#include "support/gettext.h"
#include "Floating.h"
#include "FloatList.h"
+#include "Layout.h"
+#include "Lexer.h"
+#include "Font.h"
+
+#include "frontends/alert.h"
#include "support/lstrings.h"
-#include "support/lyxlib.h"
+#include "support/FileName.h"
#include "support/filetools.h"
#include "support/os.h"
-#include <boost/filesystem/operations.hpp>
-namespace fs = boost::filesystem;
-
#include <sstream>
+using namespace std;
+using namespace lyx::support;
namespace lyx {
-using support::FileName;
-using support::libFileSearch;
-using support::makeDisplayPath;
-using support::quoteName;
-using support::rtrim;
-using support::subst;
-using support::addName;
-
-using std::endl;
-using std::find_if;
-using std::remove_if;
-using std::string;
-using std::ostream;
-
-
namespace {
-class LayoutNamesEqual : public std::unary_function<Layout_ptr, bool> {
+class LayoutNamesEqual : public unary_function<LayoutPtr, bool> {
public:
- LayoutNamesEqual(string const & name)
+ LayoutNamesEqual(docstring const & name)
: name_(name)
{}
- bool operator()(Layout_ptr const & c) const
+ bool operator()(LayoutPtr const & c) const
{
return c->name() == name_;
}
private:
- string name_;
+ docstring name_;
};
-int const FORMAT = 4;
+int const FORMAT = 6;
bool layout2layout(FileName const & filename, FileName const & tempfile)
return false;
}
- std::ostringstream command;
- command << support::os::python() << ' ' << quoteName(script.toFilesystemEncoding())
+ ostringstream command;
+ command << os::python() << ' ' << quoteName(script.toFilesystemEncoding())
<< ' ' << quoteName(filename.toFilesystemEncoding())
<< ' ' << quoteName(tempfile.toFilesystemEncoding());
string const command_str = command.str();
- LYXERR(Debug::TCLASS) << "Running `" << command_str << '\'' << endl;
+ LYXERR(Debug::TCLASS, "Running `" << command_str << '\'');
- support::cmd_ret const ret =
- support::runCommand(command_str);
+ cmd_ret const ret =
+ runCommand(command_str);
if (ret.first != 0) {
lyxerr << "Could not run layout conversion "
"script layout2layout.py." << endl;
TextClass::TextClass(string const & fn, string const & cln,
string const & desc, bool texClassAvail )
: name_(fn), latexname_(cln), description_(desc),
- floatlist_(new FloatList), ctrs_(new Counters),
+ floatlist_(new FloatList), counters_(new Counters),
texClassAvail_(texClassAvail)
{
+ modular_ = false;
outputType_ = LATEX;
columns_ = 1;
sides_ = OneSide;
secnumdepth_ = 3;
tocdepth_ = 3;
pagestyle_ = "default";
- defaultfont_ = Font(Font::ALL_SANE);
+ defaultfont_ = sane_font;
opt_fontsize_ = "10|11|12";
opt_pagestyle_ = "empty|plain|headings|fancy";
titletype_ = TITLE_COMMAND_AFTER;
}
-bool TextClass::do_readStyle(Lexer & lexrc, Layout & lay)
+bool TextClass::readStyle(Lexer & lexrc, Layout & lay)
{
- LYXERR(Debug::TCLASS) << "Reading style " << lay.name() << endl;
+ LYXERR(Debug::TCLASS, "Reading style " << to_utf8(lay.name()));
if (!lay.read(lexrc, *this)) {
// Resolve fonts
lay.resfont = lay.font;
lay.reslabelfont.realize(defaultfont());
return false; // no errors
}
- lyxerr << "Error parsing style `" << lay.name() << '\'' << endl;
+ lyxerr << "Error parsing style `" << to_utf8(lay.name()) << '\'' << endl;
return true;
}
TC_INPUT,
TC_STYLE,
TC_DEFAULTSTYLE,
- TC_CHARSTYLE,
+ TC_INSETLAYOUT,
TC_ENVIRONMENT,
TC_NOSTYLE,
TC_COLUMNS,
TC_CLASSOPTIONS,
TC_PREAMBLE,
TC_PROVIDES,
+ TC_REQUIRES,
TC_LEFTMARGIN,
TC_RIGHTMARGIN,
TC_FLOAT,
// Reads a textclass structure from file.
-bool TextClass::read(FileName const & filename, bool merge)
+bool TextClass::read(FileName const & filename, ReadType rt)
{
- if (!support::isFileReadable(filename)) {
+ if (!filename.isReadableFile()) {
lyxerr << "Cannot read layout file `" << filename << "'."
<< endl;
return true;
}
keyword_item textClassTags[] = {
- { "charstyle", TC_CHARSTYLE },
{ "classoptions", TC_CLASSOPTIONS },
{ "columns", TC_COLUMNS },
{ "counter", TC_COUNTER },
{ "float", TC_FLOAT },
{ "format", TC_FORMAT },
{ "input", TC_INPUT },
+ { "insetlayout", TC_INSETLAYOUT },
{ "leftmargin", TC_LEFTMARGIN },
{ "nofloat", TC_NOFLOAT },
{ "nostyle", TC_NOSTYLE },
{ "pagestyle", TC_PAGESTYLE },
{ "preamble", TC_PREAMBLE },
{ "provides", TC_PROVIDES },
+ { "requires", TC_REQUIRES },
{ "rightmargin", TC_RIGHTMARGIN },
{ "secnumdepth", TC_SECNUMDEPTH },
{ "sides", TC_SIDES },
{ "tocdepth", TC_TOCDEPTH }
};
- if (!merge)
- LYXERR(Debug::TCLASS) << "Reading textclass "
- << to_utf8(makeDisplayPath(filename.absFilename()))
- << endl;
- else
- LYXERR(Debug::TCLASS) << "Reading input file "
- << to_utf8(makeDisplayPath(filename.absFilename()))
- << endl;
+ switch (rt) {
+ case BASECLASS:
+ LYXERR(Debug::TCLASS, "Reading textclass ");
+ break;
+ case MERGE:
+ LYXERR(Debug::TCLASS, "Reading input file ");
+ break;
+ case MODULE:
+ LYXERR(Debug::TCLASS, "Reading module file ");
+ break;
+ default:
+ BOOST_ASSERT(false);
+ }
+ LYXERR(Debug::TCLASS, to_utf8(makeDisplayPath(filename.absFilename())));
Lexer lexrc(textClassTags,
sizeof(textClassTags) / sizeof(textClassTags[0]));
"layout");
if (tmp.empty()) {
- lexrc.printError("Could not find input"
- "file: " + inc);
+ lexrc.printError("Could not find input file: " + inc);
error = true;
- } else if (read(tmp, true)) {
+ } else if (read(tmp, MERGE)) {
lexrc.printError("Error reading input"
"file: " + tmp.absFilename());
error = true;
case TC_DEFAULTSTYLE:
if (lexrc.next()) {
- string const name = subst(lexrc.getString(),
- '_', ' ');
+ docstring const name = from_utf8(subst(lexrc.getString(),
+ '_', ' '));
defaultlayout_ = name;
}
break;
case TC_ENVIRONMENT:
case TC_STYLE:
if (lexrc.next()) {
- string const name = subst(lexrc.getString(),
- '_', ' ');
- if (hasLayout(name)) {
+ docstring const name = from_utf8(subst(lexrc.getString(),
+ '_', ' '));
+ if (name.empty()) {
+ string s = "Could not read name for style: `$$Token' "
+ + lexrc.getString() + " is probably not valid UTF-8!";
+ lexrc.printError(s.c_str());
+ Layout lay;
+ error = readStyle(lexrc, lay);
+ } else if (hasLayout(name)) {
Layout * lay = operator[](name).get();
- error = do_readStyle(lexrc, *lay);
+ error = readStyle(lexrc, *lay);
} else {
Layout lay;
lay.setName(name);
if (le == TC_ENVIRONMENT)
lay.is_environment = true;
- error = do_readStyle(lexrc, lay);
+ error = readStyle(lexrc, lay);
if (!error)
layoutlist_.push_back(
boost::shared_ptr<Layout>(new Layout(lay))
case TC_NOSTYLE:
if (lexrc.next()) {
- string const style = subst(lexrc.getString(),
- '_', ' ');
- if (!delete_layout(style))
+ docstring const style = from_utf8(subst(lexrc.getString(),
+ '_', ' '));
+ if (!deleteLayout(style))
lyxerr << "Cannot delete style `"
- << style << '\'' << endl;
+ << to_utf8(style) << '\'' << endl;
// lexrc.printError("Cannot delete style"
// " `$$Token'");
}
break;
case TC_DEFAULTFONT:
- defaultfont_.lyxRead(lexrc);
+ defaultfont_ = lyxRead(lexrc);
if (!defaultfont_.resolved()) {
lexrc.printError("Warning: defaultfont should "
"be fully instantiated!");
- defaultfont_.realize(Font(Font::ALL_SANE));
+ defaultfont_.realize(sane_font);
}
break;
break;
}
+ case TC_REQUIRES: {
+ lexrc.eatLine();
+ vector<string> const req
+ = getVectorFromString(lexrc.getString());
+ requires_.insert(req.begin(), req.end());
+ break;
+ }
+
case TC_LEFTMARGIN: // left margin type
if (lexrc.next())
- leftmargin_ = lexrc.getString();
+ leftmargin_ = lexrc.getDocString();
break;
case TC_RIGHTMARGIN: // right margin type
if (lexrc.next())
- rightmargin_ = lexrc.getString();
+ rightmargin_ = lexrc.getDocString();
break;
- case TC_CHARSTYLE:
+ case TC_INSETLAYOUT:
if (lexrc.next()) {
- string const name = subst(lexrc.getString(), '_', ' ');
- readCharStyle(lexrc, name);
+ docstring const name = subst(lexrc.getDocString(), '_', ' ');
+ readInsetLayout(lexrc, name);
}
break;
case TC_FLOAT:
}
if (format != FORMAT) {
- LYXERR(Debug::TCLASS) << "Converting layout file from format "
- << format << " to " << FORMAT << endl;
- FileName const tempfile(support::tempName());
+ LYXERR(Debug::TCLASS, "Converting layout file from format "
+ << format << " to " << FORMAT);
+ FileName const tempfile = FileName::tempName();
error = !layout2layout(filename, tempfile);
if (!error)
- error = read(tempfile, merge);
- support::unlink(tempfile);
+ error = read(tempfile, rt);
+ tempfile.removeFile();
return error;
}
- if (!merge) { // we are at top level here.
- LYXERR(Debug::TCLASS) << "Finished reading textclass "
- << to_utf8(makeDisplayPath(filename.absFilename()))
- << endl;
+ if (rt == MODULE)
+ LYXERR(Debug::TCLASS, "Finished reading module file "
+ << to_utf8(makeDisplayPath(filename.absFilename())));
+ else if (rt == MERGE)
+ LYXERR(Debug::TCLASS, "Finished reading input file "
+ << to_utf8(makeDisplayPath(filename.absFilename())));
+ else { // we are at top level here.
+ LYXERR(Debug::TCLASS, "Finished reading textclass "
+ << to_utf8(makeDisplayPath(filename.absFilename())));
if (defaultlayout_.empty()) {
lyxerr << "Error: Textclass '" << name_
<< "' is missing a defaultstyle." << endl;
if (min_toclevel_ == Layout::NOT_IN_TOC)
min_toclevel_ = toclevel;
else
- min_toclevel_ = std::min(min_toclevel_,
+ min_toclevel_ = min(min_toclevel_,
toclevel);
- max_toclevel_ = std::max(max_toclevel_,
+ max_toclevel_ = max(max_toclevel_,
toclevel);
}
}
- LYXERR(Debug::TCLASS)
- << "Minimum TocLevel is " << min_toclevel_
- << ", maximum is " << max_toclevel_ <<endl;
+ LYXERR(Debug::TCLASS, "Minimum TocLevel is " << min_toclevel_
+ << ", maximum is " << max_toclevel_);
- } else
- LYXERR(Debug::TCLASS) << "Finished reading input file "
- << to_utf8(makeDisplayPath(filename.absFilename()))
- << endl;
+ }
return error;
}
return;
case TITLE_COMMAND_AFTER:
case TITLE_ENVIRONMENT:
- titletype_ = static_cast<LYX_TITLE_LATEX_TYPES>(le);
+ titletype_ = static_cast<TitleLatexType>(le);
break;
default:
lyxerr << "Unhandled value " << le
lexrc.popTable();
}
-enum CharStyleTags {
- CS_FONT = 1,
- CS_LABELFONT,
- CS_LATEXTYPE,
- CS_LATEXNAME,
- CS_LATEXPARAM,
- CS_PREAMBLE,
- CS_END
+
+enum InsetLayoutTags {
+ IL_FONT = 1,
+ IL_BGCOLOR,
+ IL_DECORATION,
+ IL_FREESPACING,
+ IL_FORCELTR,
+ IL_LABELFONT,
+ IL_LABELSTRING,
+ IL_LATEXNAME,
+ IL_LATEXPARAM,
+ IL_LATEXTYPE,
+ IL_LYXTYPE,
+ IL_KEEPEMPTY,
+ IL_MULTIPAR,
+ IL_NEEDPROTECT,
+ IL_PASSTHRU,
+ IL_PREAMBLE,
+ IL_REQUIRES,
+ IL_END
};
-void TextClass::readCharStyle(Lexer & lexrc, string const & name)
+void TextClass::readInsetLayout(Lexer & lexrc, docstring const & name)
{
keyword_item elementTags[] = {
- { "end", CS_END },
- { "font", CS_FONT },
- { "labelfont", CS_LABELFONT },
- { "latexname", CS_LATEXNAME },
- { "latexparam", CS_LATEXPARAM },
- { "latextype", CS_LATEXTYPE },
- { "preamble", CS_PREAMBLE}
+ { "bgcolor", IL_BGCOLOR },
+ { "decoration", IL_DECORATION },
+ { "end", IL_END },
+ { "font", IL_FONT },
+ { "forceltr", IL_FORCELTR },
+ { "freespacing", IL_FREESPACING },
+ { "keepempty", IL_KEEPEMPTY },
+ { "labelfont", IL_LABELFONT },
+ { "labelstring", IL_LABELSTRING },
+ { "latexname", IL_LATEXNAME },
+ { "latexparam", IL_LATEXPARAM },
+ { "latextype", IL_LATEXTYPE },
+ { "lyxtype", IL_LYXTYPE },
+ { "multipar", IL_MULTIPAR },
+ { "needprotect", IL_NEEDPROTECT },
+ { "passthru", IL_PASSTHRU },
+ { "preamble", IL_PREAMBLE },
+ { "requires", IL_REQUIRES }
};
- lexrc.pushTable(elementTags, CS_END);
+ lexrc.pushTable(elementTags, IL_END);
+ string lyxtype;
+ docstring labelstring;
string latextype;
+ string decoration;
string latexname;
string latexparam;
- Font font(Font::ALL_INHERIT);
- Font labelfont(Font::ALL_INHERIT);
+ FontInfo font = inherit_font;
+ FontInfo labelfont = inherit_font;
+ ColorCode bgcolor(Color_background);
string preamble;
+ set<string> requires;
+ bool multipar = false;
+ bool passthru = false;
+ bool needprotect = false;
+ bool keepempty = false;
+ bool freespacing = false;
+ bool forceltr = false;
bool getout = false;
while (!getout && lexrc.isOK()) {
int le = lexrc.lex();
switch (le) {
case Lexer::LEX_UNDEF:
- lexrc.printError("Unknown ClassOption tag `$$Token'");
+ lexrc.printError("Unknown InsetLayout tag `$$Token'");
continue;
default: break;
}
- switch (static_cast<CharStyleTags>(le)) {
- case CS_LATEXTYPE:
+ switch (static_cast<InsetLayoutTags>(le)) {
+ case IL_LYXTYPE:
+ lexrc.next();
+ lyxtype = lexrc.getString();
+ break;
+ case IL_LATEXTYPE:
lexrc.next();
latextype = lexrc.getString();
break;
- case CS_LATEXNAME:
+ case IL_LABELSTRING:
+ lexrc.next();
+ labelstring = lexrc.getDocString();
+ break;
+ case IL_DECORATION:
+ lexrc.next();
+ decoration = lexrc.getString();
+ break;
+ case IL_LATEXNAME:
lexrc.next();
latexname = lexrc.getString();
break;
- case CS_LATEXPARAM:
+ case IL_LATEXPARAM:
lexrc.next();
latexparam = subst(lexrc.getString(), """, "\"");
break;
- case CS_LABELFONT:
- labelfont.lyxRead(lexrc);
+ case IL_LABELFONT:
+ labelfont = lyxRead(lexrc, inherit_font);
+ break;
+ case IL_FORCELTR:
+ lexrc.next();
+ forceltr = lexrc.getBool();
break;
- case CS_FONT:
- font.lyxRead(lexrc);
+ case IL_MULTIPAR:
+ lexrc.next();
+ multipar = lexrc.getBool();
+ break;
+ case IL_PASSTHRU:
+ lexrc.next();
+ passthru = lexrc.getBool();
+ break;
+ case IL_KEEPEMPTY:
+ lexrc.next();
+ keepempty = lexrc.getBool();
+ break;
+ case IL_FREESPACING:
+ lexrc.next();
+ freespacing = lexrc.getBool();
+ break;
+ case IL_NEEDPROTECT:
+ lexrc.next();
+ needprotect = lexrc.getBool();
+ break;
+ case IL_FONT:
+ font = lyxRead(lexrc, inherit_font);
+ // So: define font before labelfont
labelfont = font;
break;
- case CS_PREAMBLE:
+ case IL_BGCOLOR: {
+ lexrc.next();
+ string const token = lexrc.getString();
+ bgcolor = lcolor.getFromLyXName(token);
+ break;
+ }
+ case IL_PREAMBLE:
preamble = lexrc.getLongString("EndPreamble");
break;
- case CS_END:
+ case IL_REQUIRES: {
+ lexrc.eatLine();
+ vector<string> const req
+ = getVectorFromString(lexrc.getString());
+ requires.insert(req.begin(), req.end());
+ break;
+ }
+ case IL_END:
getout = true;
break;
}
}
- //
// Here add element to list if getout == true
if (getout) {
- CharStyle cs;
- cs.name = name;
- cs.latextype = latextype;
- cs.latexname = latexname;
- cs.latexparam = latexparam;
- cs.font = font;
- cs.labelfont = labelfont;
- cs.preamble = from_utf8(preamble);
- charstyles().push_back(cs);
+ InsetLayout il;
+ il.name = to_ascii(name);
+ il.lyxtype = lyxtype;
+ il.labelstring = labelstring;
+ il.decoration = decoration;
+ il.latextype = latextype;
+ il.latexname = latexname;
+ il.latexparam = latexparam;
+ il.multipar = multipar;
+ il.passthru = passthru;
+ il.needprotect = needprotect;
+ il.freespacing = freespacing;
+ il.forceltr = forceltr;
+ il.keepempty = keepempty;
+ il.font = font;
+ // The label font is generally used as-is without
+ // any realization against a given context.
+ labelfont.realize(sane_font);
+ il.labelfont = labelfont;
+ il.bgcolor = bgcolor;
+ il.preamble = preamble;
+ il.requires = requires;
+ insetlayoutlist_[name] = il;
}
lexrc.popTable();
}
+
enum FloatTags {
FT_TYPE = 1,
FT_NAME,
string within;
string style;
string name;
- string listname;
+ string listName;
bool builtin = false;
bool getout = false;
int le = lexrc.lex();
switch (le) {
case Lexer::LEX_UNDEF:
- lexrc.printError("Unknown ClassOption tag `$$Token'");
+ lexrc.printError("Unknown float tag `$$Token'");
continue;
default: break;
}
case FT_TYPE:
lexrc.next();
type = lexrc.getString();
- // Here we could check if this type is already defined
- // and modify it with the rest of the vars instead.
+ if (floatlist_->typeExist(type)) {
+ Floating const & fl = floatlist_->getType(type);
+ placement = fl.placement();
+ ext = fl.ext();
+ within = fl.within();
+ style = fl.style();
+ name = fl.name();
+ listName = fl.listName();
+ builtin = fl.builtin();
+ }
break;
case FT_NAME:
lexrc.next();
break;
case FT_LISTNAME:
lexrc.next();
- listname = lexrc.getString();
+ listName = lexrc.getString();
break;
case FT_BUILTIN:
lexrc.next();
// Here if have a full float if getout == true
if (getout) {
- Floating newfloat(type, placement, ext, within,
- style, name, listname, builtin);
- floatlist_->newFloat(newfloat);
+ Floating fl(type, placement, ext, within,
+ style, name, listName, builtin);
+ floatlist_->newFloat(fl);
+ // each float has its own counter
+ counters_->newCounter(from_ascii(type), from_ascii(within),
+ docstring(), docstring());
}
lexrc.popTable();
enum CounterTags {
CT_NAME = 1,
CT_WITHIN,
+ CT_LABELSTRING,
+ CT_LABELSTRING_APPENDIX,
CT_END
};
+
void TextClass::readCounter(Lexer & lexrc)
{
keyword_item counterTags[] = {
{ "end", CT_END },
+ { "labelstring", CT_LABELSTRING },
+ { "labelstringappendix", CT_LABELSTRING_APPENDIX },
{ "name", CT_NAME },
{ "within", CT_WITHIN }
};
docstring name;
docstring within;
+ docstring labelstring;
+ docstring labelstring_appendix;
bool getout = false;
while (!getout && lexrc.isOK()) {
int le = lexrc.lex();
switch (le) {
case Lexer::LEX_UNDEF:
- lexrc.printError("Unknown ClassOption tag `$$Token'");
+ lexrc.printError("Unknown counter tag `$$Token'");
continue;
default: break;
}
switch (static_cast<CounterTags>(le)) {
case CT_NAME:
lexrc.next();
- name = from_ascii(lexrc.getString());
+ name = lexrc.getDocString();
+ if (counters_->hasCounter(name))
+ LYXERR(Debug::TCLASS, "Reading existing counter " << to_utf8(name));
+ else
+ LYXERR(Debug::TCLASS, "Reading new counter " << to_utf8(name));
break;
case CT_WITHIN:
lexrc.next();
- within = from_ascii(lexrc.getString());
+ within = lexrc.getDocString();
if (within == "none")
within.erase();
break;
+ case CT_LABELSTRING:
+ lexrc.next();
+ labelstring = lexrc.getDocString();
+ labelstring_appendix = labelstring;
+ break;
+ case CT_LABELSTRING_APPENDIX:
+ lexrc.next();
+ labelstring_appendix = lexrc.getDocString();
+ break;
case CT_END:
getout = true;
break;
}
// Here if have a full counter if getout == true
- if (getout) {
- if (within.empty())
- ctrs_->newCounter(name);
- else
- ctrs_->newCounter(name, within);
- }
+ if (getout)
+ counters_->newCounter(name, within,
+ labelstring, labelstring_appendix);
lexrc.popTable();
}
-Font const & TextClass::defaultfont() const
+FontInfo const & TextClass::defaultfont() const
{
return defaultfont_;
}
-string const & TextClass::leftmargin() const
+docstring const & TextClass::leftmargin() const
{
return leftmargin_;
}
-string const & TextClass::rightmargin() const
+docstring const & TextClass::rightmargin() const
{
return rightmargin_;
}
-bool TextClass::hasLayout(string const & n) const
+bool TextClass::hasLayout(docstring const & n) const
{
- string const name = (n.empty() ? defaultLayoutName() : n);
+ docstring const name = n.empty() ? defaultLayoutName() : n;
return find_if(layoutlist_.begin(), layoutlist_.end(),
LayoutNamesEqual(name))
-Layout_ptr const & TextClass::operator[](string const & name) const
+LayoutPtr const & TextClass::operator[](docstring const & name) const
{
BOOST_ASSERT(!name.empty());
LayoutNamesEqual(name));
if (cit == layoutlist_.end()) {
- lyxerr << "We failed to find the layout '" << name
+ lyxerr << "We failed to find the layout '" << to_utf8(name)
<< "' in the layout list. You MUST investigate!"
<< endl;
for (LayoutList::const_iterator it = layoutlist_.begin();
it != layoutlist_.end(); ++it)
- lyxerr << " " << it->get()->name() << endl;
+ lyxerr << " " << to_utf8(it->get()->name()) << endl;
// we require the name to exist
BOOST_ASSERT(false);
}
- return (*cit);
+ return *cit;
}
-
-bool TextClass::delete_layout(string const & name)
+bool TextClass::deleteLayout(docstring const & name)
{
if (name == defaultLayoutName())
return false;
FileName layout_file;
if (!path.empty())
layout_file = FileName(addName(path, name_ + ".layout"));
- if (layout_file.empty() || !fs::exists(layout_file.toFilesystemEncoding()))
+ if (layout_file.empty() || !layout_file.exists())
layout_file = libFileSearch("layouts", name_, "layout");
loaded_ = const_cast<TextClass*>(this)->read(layout_file) == 0;
Counters & TextClass::counters() const
{
- return *ctrs_.get();
+ return *counters_.get();
}
-CharStyles::iterator TextClass::charstyle(string const & s) const
+// Return the layout object of an inset given by name. If the name
+// is not found as such, the part after the ':' is stripped off, and
+// searched again. In this way, an error fallback can be provided:
+// An erroneous 'CharStyle:badname' (e.g., after a documentclass switch)
+// will invoke the layout object defined by name = 'CharStyle'.
+// If that doesn't work either, an empty object returns (shouldn't
+// happen). -- Idea JMarc, comment MV
+InsetLayout const & TextClass::insetlayout(docstring const & name) const
{
- CharStyles::iterator cs = charstyles().begin();
- CharStyles::iterator csend = charstyles().end();
- for (; cs != csend; ++cs) {
- if (cs->name == s)
- return cs;
+ docstring n = name;
+ while (!n.empty()) {
+ if (insetlayoutlist_.count(n) > 0)
+ return insetlayoutlist_[n];
+ docstring::size_type i = n.find(':');
+ if (i == string::npos)
+ break;
+ n = n.substr(0,i);
}
- return csend;
+ static InsetLayout empty;
+ empty.labelstring = from_utf8("UNDEFINED");
+ empty.labelfont = sane_font;
+ empty.labelfont.setColor(Color_error);
+ empty.bgcolor = Color_error;
+ return empty;
}
-string const & TextClass::defaultLayoutName() const
+docstring const & TextClass::defaultLayoutName() const
{
// This really should come from the actual layout... (Lgb)
return defaultlayout_;
}
-Layout_ptr const & TextClass::defaultLayout() const
+LayoutPtr const & TextClass::defaultLayout() const
{
return operator[](defaultLayoutName());
}
}
-TextClass::PageSides TextClass::sides() const
+PageSides TextClass::sides() const
{
return sides_;
}
}
-LYX_TITLE_LATEX_TYPES TextClass::titletype() const
+TitleLatexType TextClass::titletype() const
{
return titletype_;
}
}
-ostream & operator<<(ostream & os, TextClass::PageSides p)
+ostream & operator<<(ostream & os, PageSides p)
{
switch (p) {
- case TextClass::OneSide:
+ case OneSide:
os << '1';
break;
- case TextClass::TwoSides:
+ case TwoSides:
os << '2';
break;
}