#include "TextClassList.h"
#include "TextClass.h"
-#include "debug.h"
+#include "support/debug.h"
#include "Lexer.h"
+#include "support/FileName.h"
#include "support/filetools.h"
#include <boost/bind.hpp>
#include <boost/regex.hpp>
-#include <boost/filesystem/operations.hpp>
+
#include <fstream>
+using namespace std;
+using namespace lyx::support;
namespace lyx {
-namespace fs = boost::filesystem;
-
-using support::FileName;
-using support::addName;
-using support::libFileSearch;
-using support::makeDisplayPath;
using boost::bind;
using boost::regex;
using boost::smatch;
-using std::endl;
-using std::equal_to;
-using std::find_if;
-using std::make_pair;
-using std::sort;
-using std::string;
-using std::pair;
-using std::ifstream;
-
-
// Gets textclass number from name
pair<bool, textclass_type> const
TextClassList::numberOfClass(string const & textclass) const
// used when sorting the textclass list.
class less_textclass_avail_desc
- : public std::binary_function<TextClass, TextClass, int>
+ : public binary_function<TextClass, TextClass, int>
{
public:
int operator()(TextClass const & tc1,
bool TextClassList::read()
{
Lexer lex(0, 0);
- support::FileName const real_file = libFileSearch("", "textclass.lst");
- LYXERR(Debug::TCLASS) << "Reading textclasses from `"
- << real_file << '\'' << endl;
+ FileName const real_file = libFileSearch("", "textclass.lst");
+ LYXERR(Debug::TCLASS, "Reading textclasses from `" << real_file << '\'');
if (real_file.empty()) {
lyxerr << "TextClassList::Read: unable to find "
bool finished = false;
// Parse config-file
- LYXERR(Debug::TCLASS) << "Starting parsing of textclass.lst" << endl;
+ LYXERR(Debug::TCLASS, "Starting parsing of textclass.lst");
while (lex.isOK() && !finished) {
- LYXERR(Debug::TCLASS) << "\tline by line" << endl;
+ LYXERR(Debug::TCLASS, "\tline by line");
switch (lex.lex()) {
case Lexer::LEX_FEOF:
finished = true;
break;
default:
string const fname = lex.getString();
- LYXERR(Debug::TCLASS) << "Fname: " << fname << endl;
+ LYXERR(Debug::TCLASS, "Fname: " << fname);
if (lex.next()) {
string const clname = lex.getString();
- LYXERR(Debug::TCLASS) << "Clname: " << clname << endl;
+ LYXERR(Debug::TCLASS, "Clname: " << clname);
if (lex.next()) {
string const desc = lex.getString();
- LYXERR(Debug::TCLASS) << "Desc: " << desc << endl;
+ LYXERR(Debug::TCLASS, "Desc: " << desc);
if (lex.next()) {
bool avail = lex.getBool();
- LYXERR(Debug::TCLASS) << "Avail: " << avail << endl;
+ LYXERR(Debug::TCLASS, "Avail: " << avail);
// This code is run when we have
// fname, clname, desc, and avail
TextClass tmpl(fname, clname, desc, avail);
}
}
}
- LYXERR(Debug::TCLASS) << "End of parsing of textclass.lst" << endl;
+ LYXERR(Debug::TCLASS, "End of parsing of textclass.lst");
// lyx will start with an empty classlist_, but only reconfigure is allowed
// in this case. This gives users a second chance to configure lyx if
}
-std::pair<bool, textclass_type> const
-TextClassList::addTextClass(std::string const & textclass, std::string const & path)
+pair<bool, textclass_type> const
+TextClassList::addTextClass(string const & textclass, string const & path)
{
// only check for textclass.layout file, .cls can be anywhere in $TEXINPUTS
// NOTE: latex class name is defined in textclass.layout, which can be different from textclass
FileName const layout_file(addName(path, textclass + ".layout"));
- if (fs::exists(layout_file.toFilesystemEncoding())) {
- LYXERR(Debug::TCLASS) << "Adding class " << textclass << " from directory " << path << endl;
+ if (layout_file.exists()) {
+ LYXERR(Debug::TCLASS, "Adding class " << textclass << " from directory " << path);
// Read .layout file and get description, real latex classname etc
//
// This is a C++ version of function processLayoutFile in configure.py,
if (regex_match(line, sub, reg)) {
// returns: whole string, classtype (not used here), first option, description
BOOST_ASSERT(sub.size()==4);
- // now, add the layout to textclass.
+ // now, create a TextClass with description containing path information
TextClass tmpl(textclass, sub.str(2)==""?textclass:sub.str(2),
sub.str(3) + " <" + path + ">", true);
if (lyxerr.debugging(Debug::TCLASS))
tmpl.load(path);
+ // Do not add this local TextClass to classlist_ if it has
+ // already been loaded by, for example, a master buffer.
+ pair<bool, lyx::textclass_type> pp =
+ textclasslist.numberOfClass(textclass);
+ // only layouts from the same directory are considered to be identical.
+ if (pp.first && classlist_[pp.second].description() == tmpl.description())
+ return pp;
classlist_.push_back(tmpl);
return make_pair(true, classlist_.size() - 1);
}
TextClassList textclasslist;
+textclass_type defaultTextclass()
+{
+ // We want to return the article class. if `first' is
+ // true in the returned pair, then `second' is the textclass
+ // number; if it is false, second is 0. In both cases, second
+ // is what we want.
+ return textclasslist.numberOfClass("article").second;
+}
+
+
+
// Reads the style files
bool LyXSetStyle()
{
- LYXERR(Debug::TCLASS) << "LyXSetStyle: parsing configuration..." << endl;
+ LYXERR(Debug::TCLASS, "LyXSetStyle: parsing configuration...");
if (!textclasslist.read()) {
- LYXERR(Debug::TCLASS) << "LyXSetStyle: an error occured "
- "during parsing.\n Exiting." << endl;
+ LYXERR(Debug::TCLASS, "LyXSetStyle: an error occured "
+ "during parsing.\n Exiting.");
return false;
}
- LYXERR(Debug::TCLASS) << "LyXSetStyle: configuration parsed." << endl;
+ LYXERR(Debug::TCLASS, "LyXSetStyle: configuration parsed.");
return true;
}