X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FTextClassList.cpp;h=e1f3a27f5774d814cf8d0d6a68f38dda24e25683;hb=4056f0ddb150d0e5d60bc5941d51e365eed0ac86;hp=430e9e3ade1a885f2574439178e5e02d5edd8ba6;hpb=0e08bc5e164bf850c0c3a33d218cccf36711a924;p=lyx.git diff --git a/src/TextClassList.cpp b/src/TextClassList.cpp index 430e9e3ade..e1f3a27f57 100644 --- a/src/TextClassList.cpp +++ b/src/TextClassList.cpp @@ -13,9 +13,10 @@ #include "TextClassList.h" #include "TextClass.h" -#include "debug.h" #include "Lexer.h" +#include "support/debug.h" +#include "support/FileName.h" #include "support/filetools.h" #include @@ -23,30 +24,17 @@ #include +using namespace std; +using namespace lyx::support; namespace lyx { -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 const +pair const TextClassList::numberOfClass(string const & textclass) const { ClassList::const_iterator cit = @@ -56,14 +44,24 @@ TextClassList::numberOfClass(string const & textclass) const textclass)); return cit != classlist_.end() ? - make_pair(true, textclass_type(cit - classlist_.begin())) : - make_pair(false, textclass_type(0)); + make_pair(true, TextClassIndex(cit - classlist_.begin())) : + make_pair(false, TextClassIndex(0)); } // Gets a textclass structure from number TextClass const & -TextClassList::operator[](textclass_type textclass) const +TextClassList::operator[](TextClassIndex textclass) const +{ + if (textclass >= classlist_.size()) + return classlist_[0]; + + //FIXME I don't believe the following line is actually necessary (rgh) + classlist_[textclass].load(); + return classlist_[textclass]; +} + +TextClass & TextClassList::at(TextClassIndex textclass) { if (textclass >= classlist_.size()) return classlist_[0]; @@ -76,7 +74,7 @@ TextClassList::operator[](textclass_type textclass) const // used when sorting the textclass list. class less_textclass_avail_desc - : public std::binary_function + : public binary_function { public: int operator()(TextClass const & tc1, @@ -97,9 +95,8 @@ public: 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 " @@ -131,25 +128,25 @@ bool TextClassList::read() 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); @@ -162,7 +159,7 @@ bool TextClassList::read() } } } - 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 @@ -177,7 +174,8 @@ bool TextClassList::read() } -void TextClassList::reset(textclass_type const textclass) { +void TextClassList::reset(TextClassIndex const & textclass) +{ if (textclass >= classlist_.size()) return; TextClass const & tc = classlist_[textclass]; @@ -187,14 +185,14 @@ void TextClassList::reset(textclass_type const textclass) { } -std::pair const -TextClassList::addTextClass(std::string const & textclass, std::string const & path) +pair 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 (layout_file.exists()) { - LYXERR(Debug::TCLASS) << "Adding class " << textclass << " from directory " << path << endl; + 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, @@ -210,18 +208,25 @@ TextClassList::addTextClass(std::string const & textclass, std::string const & p 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 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); } } } // If .layout is not in local directory, or an invalid layout is found, return false - return make_pair(false, textclass_type(0)); + return make_pair(false, TextClassIndex(0)); } @@ -229,18 +234,29 @@ TextClassList::addTextClass(std::string const & textclass, std::string const & p TextClassList textclasslist; +TextClassIndex 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; }