]> git.lyx.org Git - lyx.git/blobdiff - src/TextClass.cpp
Fix thinko in loop detection
[lyx.git] / src / TextClass.cpp
index a4f0857c285fd6b3dd357c5a65eed26c1ee9953a..23fd1eed9a43bb43a5a0fe256ec190c309ead0dd 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>
@@ -61,7 +62,7 @@ namespace lyx {
 // development/tools/updatelayouts.sh script, to update the format of
 // all of our layout files.
 //
-int const LAYOUT_FORMAT = 46; // gb: New Tag "ForceLocal"
+int const LAYOUT_FORMAT = 51; //spitz: add ToggleIndent tag
 
 namespace {
 
@@ -197,6 +198,7 @@ enum TextClassTags {
        TC_HTMLSTYLES,
        TC_PROVIDES,
        TC_REQUIRES,
+       TC_PKGOPTS,
        TC_LEFTMARGIN,
        TC_RIGHTMARGIN,
        TC_FLOAT,
@@ -218,7 +220,7 @@ enum TextClassTags {
        TC_CITEENGINETYPE,
        TC_CITEFORMAT,
        TC_DEFAULTBIBLIO,
-       TC_FULLAUTHORLIST,
+       TC_FULLAUTHORLIST
 };
 
 
@@ -256,6 +258,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 +279,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 +308,6 @@ std::string TextClass::convert(std::string const & str)
                ret += tmp + '\n';
        }
        is.close();
-       tempfile.removeFile();
        return ret;
 }
 
@@ -368,7 +372,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 +389,6 @@ TextClass::ReturnValues TextClass::read(std::string const & str, ReadType rt)
                        << LAYOUT_FORMAT);
                return ERROR;
        }
-       tempfile.removeFile();
        return OK_OLDFORMAT;
 }
 
@@ -634,6 +638,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();
@@ -1478,7 +1491,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));
@@ -1493,10 +1507,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"