]> git.lyx.org Git - lyx.git/blobdiff - src/TextClass.cpp
Fix 'Export As...' in non-English localizations
[lyx.git] / src / TextClass.cpp
index a34cf9020feb21ca0ec24002f9fc5e61c26ea20c..b77f31b3369c68b7422fe8f5e99ec8b1657d29c1 100644 (file)
@@ -30,6 +30,7 @@
 
 #include "support/lassert.h"
 #include "support/debug.h"
+#include "support/ExceptionMessage.h"
 #include "support/FileName.h"
 #include "support/filetools.h"
 #include "support/gettext.h"
@@ -60,7 +61,7 @@ namespace lyx {
 // development/tools/updatelayouts.sh script, to update the format of
 // all of our layout files.
 //
-int const LAYOUT_FORMAT = 44; // rgh: change LabelType declarations
+int const LAYOUT_FORMAT = 48; //rgh: initial values for counter
 
 namespace {
 
@@ -196,6 +197,7 @@ enum TextClassTags {
        TC_HTMLSTYLES,
        TC_PROVIDES,
        TC_REQUIRES,
+       TC_PKGOPTS,
        TC_LEFTMARGIN,
        TC_RIGHTMARGIN,
        TC_FLOAT,
@@ -255,6 +257,7 @@ LexerKeyword textClassTags[] = {
        { "nostyle",           TC_NOSTYLE },
        { "outputformat",      TC_OUTPUTFORMAT },
        { "outputtype",        TC_OUTPUTTYPE },
+       { "packageoptions",        TC_PKGOPTS },
        { "pagestyle",         TC_PAGESTYLE },
        { "preamble",          TC_PREAMBLE },
        { "provides",          TC_PROVIDES },
@@ -633,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();
@@ -961,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()) {
@@ -1000,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;
 }
@@ -1007,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;
@@ -1049,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;
@@ -1271,20 +1291,20 @@ bool TextClass::hasInsetLayout(docstring const & n) const
 
 Layout const & TextClass::operator[](docstring const & name) const
 {
-       LASSERT(!name.empty(), /**/);
+       LATTEST(!name.empty());
 
        const_iterator it =
                find_if(begin(), end(), LayoutNamesEqual(name));
 
        if (it == end()) {
-               lyxerr << "We failed to find the layout '" << to_utf8(name)
-                      << "' in the layout list. You MUST investigate!"
-                      << endl;
+               LYXERR0("We failed to find the layout '" << name
+                      << "' in the layout list. You MUST investigate!");
                for (const_iterator cit = begin(); cit != end(); ++cit)
                        lyxerr  << " " << to_utf8(cit->name()) << endl;
 
-               // we require the name to exist
-               LASSERT(false, /**/);
+               // We require the name to exist
+               static const Layout dummy;
+               LASSERT(false, return dummy);
        }
 
        return *it;
@@ -1293,7 +1313,8 @@ Layout const & TextClass::operator[](docstring const & name) const
 
 Layout & TextClass::operator[](docstring const & name)
 {
-       LASSERT(!name.empty(), /**/);
+       LATTEST(!name.empty());
+       // Safe to continue, given what we do below.
 
        iterator it = find_if(begin(), end(), LayoutNamesEqual(name));
 
@@ -1304,7 +1325,10 @@ Layout & TextClass::operator[](docstring const & name)
                        LYXERR0(" " << to_utf8(cit->name()));
 
                // we require the name to exist
-               LASSERT(false, /**/);
+               LATTEST(false);
+               // we are here only in release mode
+               layoutlist_.push_back(createBasicLayout(name, true));
+               it = find_if(begin(), end(), LayoutNamesEqual(name));
        }
 
        return *it;
@@ -1371,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:
@@ -1440,7 +1482,7 @@ Layout TextClass::createBasicLayout(docstring const & name, bool unknown) const
        if (!readStyle(lex, *defaultLayout)) {
                // The only way this happens is because the hardcoded layout above
                // is wrong.
-               LASSERT(false, /**/);
+               LATTEST(false);
        };
        return *defaultLayout;
 }
@@ -1531,8 +1573,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;