X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FLayoutFile.cpp;h=541f2dae84290c8f69c305a0c713fc53e66b4f85;hb=55a3dd7b346d29a52ba305a4558e9e380ef50f47;hp=b4387deee5426a6d948fbcb5fa3fde65c1993c01;hpb=907df4570d113bac83e3cda759fedeee363d3fb4;p=lyx.git diff --git a/src/LayoutFile.cpp b/src/LayoutFile.cpp index b4387deee5..541f2dae84 100644 --- a/src/LayoutFile.cpp +++ b/src/LayoutFile.cpp @@ -27,8 +27,8 @@ #include "support/lassert.h" #include "support/lstrings.h" -#include -#include +#include "support/bind.h" +#include "support/regex.h" #include @@ -37,9 +37,7 @@ using namespace lyx::support; namespace lyx { -using boost::bind; -using boost::regex; -using boost::smatch; + LayoutFile::LayoutFile(string const & fn, string const & cln, string const & desc, string const & prereq, @@ -99,86 +97,72 @@ LayoutFile & LayoutFileList::operator[](string const & classname) // Reads LyX textclass definitions according to textclass config file bool LayoutFileList::read() { + bool success = false; Lexer lex; FileName const real_file = libFileSearch("", "textclass.lst"); - LYXERR(Debug::TCLASS, "Reading textclasses from `" << real_file << '\''); + LYXERR(Debug::TCLASS, "Reading textclasses from `" << real_file << "'."); if (real_file.empty()) { - lyxerr << "LayoutFileList::Read: unable to find " - "textclass file `" - << to_utf8(makeDisplayPath(real_file.absFilename(), 1000)) - << "'. Exiting." << endl; - return false; - // This causes LyX to end... Not a desirable behaviour. Lgb - // What do you propose? That the user gets a file dialog - // and is allowed to hunt for the file? (Asger) - // more that we have a layout for minimal.cls statically - // compiled in... (Lgb) - } - - if (!lex.setFile(real_file)) { - lyxerr << "LayoutFileList::Read: " - "lyxlex was not able to set file: " - << real_file << endl; - } - - if (!lex.isOK()) { - lyxerr << "LayoutFileList::Read: unable to open " - "textclass file `" - << to_utf8(makeDisplayPath(real_file.absFilename(), 1000)) - << "'\nCheck your installation. LyX can't continue." - << endl; - return false; - } - - bool finished = false; - // Parse config-file - LYXERR(Debug::TCLASS, "Starting parsing of textclass.lst"); - while (lex.isOK() && !finished) { - 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); - if (!lex.next()) - break; - string const clname = lex.getString(); - LYXERR(Debug::TCLASS, "Clname: " << clname); - if (!lex.next()) - break; - string const desc = lex.getString(); - LYXERR(Debug::TCLASS, "Desc: " << desc); - if (!lex.next()) - break; - bool avail = lex.getBool(); - LYXERR(Debug::TCLASS, "Avail: " << avail); - if (!lex.next()) + LYXERR0("LayoutFileList::Read: unable to find textclass file " + << "`textclass.lst'."); + } else if (!lex.setFile(real_file)) { + LYXERR0("LayoutFileList::Read: lyxlex was not able to set file: " + << real_file << '.'); + } else if (!lex.isOK()) { + LYXERR0("LayoutFileList::Read: unable to open textclass file `" + << makeDisplayPath(real_file.absFileName(), 1000) + << "'\nCheck your installation."); + } else { + // we have a file we can read. + bool finished = false; + LYXERR(Debug::TCLASS, "Starting parsing of textclass.lst"); + while (lex.isOK() && !finished) { + LYXERR(Debug::TCLASS, "\tline by line"); + switch (lex.lex()) { + case Lexer::LEX_FEOF: + finished = true; break; - string const prereq = lex.getString(); - LYXERR(Debug::TCLASS, "Prereq: " << prereq); - // This code is run when we have - // fname, clname, desc, prereq, and avail - LayoutFile * tmpl = new LayoutFile(fname, clname, desc, prereq, avail); - if (lyxerr.debugging(Debug::TCLASS)) { - // only system layout files are loaded here so no - // buffer path is needed. - tmpl->load(); - } - classmap_[fname] = tmpl; - } - } - LYXERR(Debug::TCLASS, "End of parsing of textclass.lst"); - - // lyx will start with an empty classmap_, but only reconfigure is allowed - // in this case. This gives users a second chance to configure lyx if - // initial configuration fails. (c.f. bug 2829) + default: + string const fname = lex.getString(); + LYXERR(Debug::TCLASS, "Fname: " << fname); + if (!lex.next()) + break; + string const clname = lex.getString(); + LYXERR(Debug::TCLASS, "Clname: " << clname); + if (!lex.next()) + break; + string const desc = lex.getString(); + LYXERR(Debug::TCLASS, "Desc: " << desc); + if (!lex.next()) + break; + bool avail = lex.getBool(); + LYXERR(Debug::TCLASS, "Avail: " << avail); + if (!lex.next()) + break; + string const prereq = lex.getString(); + LYXERR(Debug::TCLASS, "Prereq: " << prereq); + // This code is run when we have + // fname, clname, desc, prereq, and avail + LayoutFile * tmpl = new LayoutFile(fname, clname, desc, prereq, avail); + if (lyxerr.debugging(Debug::TCLASS)) { + // only system layout files are loaded here so no + // buffer path is needed. + tmpl->load(); + } + classmap_[fname] = tmpl; + } // end of switch + } // end of while loop + LYXERR(Debug::TCLASS, "End parsing of textclass.lst"); + success = true; + } // end of else + + // LyX will start with an empty classmap_. This is OK because + // (a) we will give the user a chance to reconfigure (see bug 2829) and + // (b) even if that fails, we can use addEmptyClass() to get some basic + // functionality. if (classmap_.empty()) - lyxerr << "LayoutFileList::Read: no textclasses found!" - << endl; - return true; + LYXERR0("LayoutFileList::Read: no textclasses found!"); + return success; } @@ -234,7 +218,7 @@ LayoutFileIndex LayoutFileList::addEmptyClass(string const & textclass) // stdclass.inc. That would give us something moderately usable. ofs << "# This layout is automatically generated\n" "# \\DeclareLaTeXClass{" << textclass << "}\n\n" - "Format 26\n" + "Format " << LAYOUT_FORMAT << "\n" "Input stdclass.inc\n\n" << layoutpost; ofs.close(); @@ -245,18 +229,17 @@ LayoutFileIndex LayoutFileList::addEmptyClass(string const & textclass) LayoutFile * tc = new LayoutFile(textclass, textclass, "Unknown text class " + textclass, textclass + ".cls", true); - if (!tc->load(tempLayout.absFilename())) { + if (!tc->load(tempLayout.absFileName())) { // The only way this happens is because the hardcoded layout file - // aboveis wrong or stdclass.inc cannot be found. So try again + // above is wrong or stdclass.inc cannot be found. So try again // without stdclass.inc. ofstream ofs2(tempLayout.toFilesystemEncoding().c_str()); ofs2 << "# This layout is automatically generated\n" "# \\DeclareLaTeXClass{" << textclass << "}\n\n" - "Format 26\n" - "Input stdclass.inc\n\n" + "Format " << LAYOUT_FORMAT << "\n" << layoutpost; ofs2.close(); - if (!tc->load(tempLayout.absFilename())) { + if (!tc->load(tempLayout.absFileName())) { // This can only happen if the hardcoded file above is wrong. LASSERT(false, /* */); } @@ -331,13 +314,7 @@ bool LayoutFileList::load(string const & name, string const & buf_path) } LayoutFile * tc = classmap_[name]; - if (!tc->load(buf_path)) { - docstring s = bformat(_("The document class %1$s " - "could not be loaded."), from_utf8(name)); - frontend::Alert::error(_("Could not load class"), s); - return false; - } - return true; + return tc->load(buf_path); } @@ -346,26 +323,10 @@ LayoutFileIndex defaultBaseclass() if (LayoutFileList::get().haveClass("article")) return string("article"); if (LayoutFileList::get().empty()) - return string(); + // we'll call it that, since this gives the user a chance to + // have a functioning document when things improve. + return string("article"); return LayoutFileList::get().classList().front(); } - - -// Reads the style files -bool LyXSetStyle() -{ - LYXERR(Debug::TCLASS, "LyXSetStyle: parsing configuration..."); - - if (!LayoutFileList::get().read()) { - LYXERR(Debug::TCLASS, "LyXSetStyle: an error occured " - "during parsing.\n Exiting."); - return false; - } - - LYXERR(Debug::TCLASS, "LyXSetStyle: configuration parsed."); - return true; -} - - } // namespace lyx