]> git.lyx.org Git - lyx.git/blobdiff - src/TextClass.cpp
GuiBox.cpp: fix logic
[lyx.git] / src / TextClass.cpp
index 89813ed39940f8029d1d005851c2802fe6f0d062..02fc86e9f96aaadd48a1f085b1e8ffc775dcde28 100644 (file)
@@ -36,6 +36,7 @@
 #include "support/gettext.h"
 #include "support/lstrings.h"
 #include "support/os.h"
+#include "support/TempFile.h"
 
 #include <algorithm>
 #include <fstream>
@@ -57,11 +58,10 @@ namespace lyx {
 // LayoutFile.cpp. Additions will never do so, but syntax changes
 // could. See LayoutFileList::addEmptyClass() and, especially, the
 // definition of the layoutpost string.
-// You should also run (or ask someone who has bash to run) the
-// development/tools/updatelayouts.sh script, to update the format of
-// all of our layout files.
+// You should also run the development/tools/updatelayouts.py script,
+// to update the format of all of our layout files.
 //
-int const LAYOUT_FORMAT = 45; // rgh: New Tag "NoInsetLayout"
+int const LAYOUT_FORMAT = 55; //spitz: InsetLayout and Layout tags PassThruChars
 
 namespace {
 
@@ -126,7 +126,7 @@ string translateReadType(TextClass::ReadType rt)
 
 // This string should not be translated here,
 // because it is a layout identifier.
-docstring const TextClass::plain_layout_ = from_ascii("Plain Layout");
+docstring const TextClass::plain_layout_ = from_ascii(N_("Plain Layout"));
 
 
 InsetLayout DocumentClass::plain_insetlayout_;
@@ -155,7 +155,6 @@ TextClass::TextClass()
        titletype_ = TITLE_COMMAND_AFTER;
        titlename_ = "maketitle";
        loaded_ = false;
-       _("Plain Layout"); // a hack to make this translatable
 }
 
 
@@ -197,6 +196,7 @@ enum TextClassTags {
        TC_HTMLSTYLES,
        TC_PROVIDES,
        TC_REQUIRES,
+       TC_PKGOPTS,
        TC_LEFTMARGIN,
        TC_RIGHTMARGIN,
        TC_FLOAT,
@@ -218,7 +218,7 @@ enum TextClassTags {
        TC_CITEENGINETYPE,
        TC_CITEFORMAT,
        TC_DEFAULTBIBLIO,
-       TC_FULLAUTHORLIST,
+       TC_FULLAUTHORLIST
 };
 
 
@@ -256,6 +256,7 @@ LexerKeyword textClassTags[] = {
        { "nostyle",           TC_NOSTYLE },
        { "outputformat",      TC_OUTPUTFORMAT },
        { "outputtype",        TC_OUTPUTTYPE },
+       { "packageoptions",        TC_PKGOPTS },
        { "pagestyle",         TC_PAGESTYLE },
        { "preamble",          TC_PREAMBLE },
        { "provides",          TC_PROVIDES },
@@ -276,22 +277,24 @@ LexerKeyword textClassTags[] = {
 bool TextClass::convertLayoutFormat(support::FileName const & filename, ReadType rt)
 {
        LYXERR(Debug::TCLASS, "Converting layout file to " << LAYOUT_FORMAT);
-       FileName const tempfile = FileName::tempName("convert_layout");
+       TempFile tmp("convertXXXXXX.layout");
+       FileName const tempfile = tmp.name();
        bool success = layout2layout(filename, tempfile);
        if (success)
                success = readWithoutConv(tempfile, rt) == OK;
-       tempfile.removeFile();
        return success;
 }
 
 
 std::string TextClass::convert(std::string const & str)
 {
-       FileName const fn = FileName::tempName("locallayout");
+       TempFile tmp1("localXXXXXX.layout");
+       FileName const fn = tmp1.name();
        ofstream os(fn.toFilesystemEncoding().c_str());
        os << str;
        os.close();
-       FileName const tempfile = FileName::tempName("convert_locallayout");
+       TempFile tmp2("convert_localXXXXXX.layout");
+       FileName const tempfile = tmp2.name();
        bool success = layout2layout(fn, tempfile);
        if (!success)
                return "";
@@ -303,7 +306,6 @@ std::string TextClass::convert(std::string const & str)
                ret += tmp + '\n';
        }
        is.close();
-       tempfile.removeFile();
        return ret;
 }
 
@@ -368,7 +370,8 @@ TextClass::ReturnValues TextClass::read(std::string const & str, ReadType rt)
                return retval;
 
        // write the layout string to a temporary file
-       FileName const tempfile = FileName::tempName("TextClass_read");
+       TempFile tmp("TextClass_read");
+       FileName const tempfile = tmp.name();
        ofstream os(tempfile.toFilesystemEncoding().c_str());
        if (!os) {
                LYXERR0("Unable to create temporary file");
@@ -384,7 +387,6 @@ TextClass::ReturnValues TextClass::read(std::string const & str, ReadType rt)
                        << LAYOUT_FORMAT);
                return ERROR;
        }
-       tempfile.removeFile();
        return OK_OLDFORMAT;
 }
 
@@ -634,6 +636,15 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
                        break;
                }
 
+               case TC_PKGOPTS : {
+                       lexrc.next();
+                       string const pkg = lexrc.getString();
+                       lexrc.next();
+                       string const options = lexrc.getString();
+                       package_options_[pkg] = options;
+                       break;
+               }
+
                case TC_DEFAULTMODULE: {
                        lexrc.next();
                        string const module = lexrc.getString();
@@ -962,6 +973,8 @@ bool TextClass::readCiteEngine(Lexer & lexrc)
                cite_styles_[ENGINE_TYPE_AUTHORYEAR].clear();
        if (type & ENGINE_TYPE_NUMERICAL)
                cite_styles_[ENGINE_TYPE_NUMERICAL].clear();
+       if (type & ENGINE_TYPE_DEFAULT)
+               cite_styles_[ENGINE_TYPE_DEFAULT].clear();
        string def;
        bool getout = false;
        while (!getout && lexrc.isOK()) {
@@ -1001,6 +1014,8 @@ bool TextClass::readCiteEngine(Lexer & lexrc)
                        cite_styles_[ENGINE_TYPE_AUTHORYEAR].push_back(cs);
                if (type & ENGINE_TYPE_NUMERICAL)
                        cite_styles_[ENGINE_TYPE_NUMERICAL].push_back(cs);
+               if (type & ENGINE_TYPE_DEFAULT)
+                       cite_styles_[ENGINE_TYPE_DEFAULT].push_back(cs);
        }
        return getout;
 }
@@ -1008,8 +1023,8 @@ bool TextClass::readCiteEngine(Lexer & lexrc)
 
 int TextClass::readCiteEngineType(Lexer & lexrc) const
 {
-       int const ENGINE_TYPE_DEFAULT =
-               ENGINE_TYPE_AUTHORYEAR | ENGINE_TYPE_NUMERICAL;
+       LATTEST(ENGINE_TYPE_DEFAULT ==
+               (ENGINE_TYPE_AUTHORYEAR | ENGINE_TYPE_NUMERICAL));
        if (!lexrc.next()) {
                lexrc.printError("No cite engine type given for token: `$$Token'.");
                return ENGINE_TYPE_DEFAULT;
@@ -1050,11 +1065,15 @@ bool TextClass::readCiteFormat(Lexer & lexrc)
                                cite_macros_[ENGINE_TYPE_AUTHORYEAR][etype] = definition;
                        if (type & ENGINE_TYPE_NUMERICAL)
                                cite_macros_[ENGINE_TYPE_NUMERICAL][etype] = definition;
+                       if (type & ENGINE_TYPE_DEFAULT)
+                               cite_macros_[ENGINE_TYPE_DEFAULT][etype] = definition;
                } else {
                        if (type & ENGINE_TYPE_AUTHORYEAR)
                                cite_formats_[ENGINE_TYPE_AUTHORYEAR][etype] = definition;
                        if (type & ENGINE_TYPE_NUMERICAL)
                                cite_formats_[ENGINE_TYPE_NUMERICAL][etype] = definition;
+                       if (type & ENGINE_TYPE_DEFAULT)
+                               cite_formats_[ENGINE_TYPE_DEFAULT][etype] = definition;
                }
        }
        return true;
@@ -1376,6 +1395,24 @@ bool DocumentClass::addLayoutIfNeeded(docstring const & n) const
 }
 
 
+string DocumentClass::forcedLayouts() const
+{
+       ostringstream os;
+       bool first = true;
+       const_iterator const e = end();
+       for (const_iterator i = begin(); i != e; ++i) {
+               if (i->forcelocal > 0) {
+                       if (first) {
+                               os << "Format " << LAYOUT_FORMAT << '\n';
+                               first = false;
+                       }
+                       i->write(os);
+               }
+       }
+       return os.str();
+}
+
+
 InsetLayout const & DocumentClass::insetLayout(docstring const & name) const
 {
        // FIXME The fix for the InsetLayout part of 4812 would be here:
@@ -1384,13 +1421,20 @@ InsetLayout const & DocumentClass::insetLayout(docstring const & name) const
        InsetLayouts::const_iterator cen = insetlayoutlist_.end();
        while (!n.empty()) {
                InsetLayouts::const_iterator cit = insetlayoutlist_.lower_bound(n);
-               if (cit != cen && cit->first == n)
-                       return cit->second;
+               if (cit != cen && cit->first == n) {
+                       if (cit->second.obsoleted_by().empty())
+                               return cit->second;
+                       n = cit->second.obsoleted_by();
+                       return insetLayout(n);
+               }
+               // If we have a generic prefix (e.g., "Note:"),
+               // try if this one alone is found.
                size_t i = n.find(':');
                if (i == string::npos)
                        break;
                n = n.substr(0, i);
        }
+       // Layout "name" not found.
        return plain_insetlayout_;
 }
 
@@ -1452,7 +1496,8 @@ Layout TextClass::createBasicLayout(docstring const & name, bool unknown) const
 
 
 DocumentClassPtr getDocumentClass(
-               LayoutFile const & baseClass, LayoutModuleList const & modlist)
+               LayoutFile const & baseClass, LayoutModuleList const & modlist,
+               bool const clone)
 {
        DocumentClassPtr doc_class =
            DocumentClassPtr(new DocumentClass(baseClass));
@@ -1467,10 +1512,11 @@ DocumentClassPtr getDocumentClass(
                                                "this document but has not been found in the list of\n"
                                                "available modules. If you recently installed it, you\n"
                                                "probably need to reconfigure LyX.\n"), from_utf8(modName));
-                       frontend::Alert::warning(_("Module not available"), msg);
+                       if (!clone)
+                               frontend::Alert::warning(_("Module not available"), msg);
                        continue;
                }
-               if (!lm->isAvailable()) {
+               if (!lm->isAvailable() && !clone) {
                        docstring const prereqs = from_utf8(getStringFromVector(lm->prerequisites(), "\n\t"));
                        docstring const msg =
                                bformat(_("The module %1$s requires a package that is not\n"
@@ -1536,8 +1582,9 @@ Layout const & DocumentClass::getTOCLayout() const
        Layout const * lay = NULL;
        for (; lit != len; ++lit) {
                int const level = lit->toclevel;
-               // we don't want Part
-               if (level == Layout::NOT_IN_TOC || level < 0 || level >= minlevel)
+               // we don't want Part or unnumbered sections
+               if (level == Layout::NOT_IN_TOC || level < 0 
+                   || level >= minlevel || lit->counter.empty())
                        continue;
                lay = &*lit;
                minlevel = level;