]> git.lyx.org Git - lyx.git/blobdiff - src/TextClass.cpp
* GuiDocument.cpp: before accessing the buffer() in paramsToDialog(), check
[lyx.git] / src / TextClass.cpp
index 79e8b0e7d1e39c955bd13a4a67831eca0acbd9f5..981dcd185c23b99d256cfca5f4add1c9fb26b8e9 100644 (file)
 #include <fstream>
 #include <sstream>
 
+#ifdef ERROR
+#undef ERROR
+#endif
+
 using namespace std;
 using namespace lyx::support;
 
@@ -62,7 +66,7 @@ private:
 };
 
 // Keep the changes documented in the Customization manual. 
-int const FORMAT = 14;
+int const FORMAT = 22;
 
 
 bool layout2layout(FileName const & filename, FileName const & tempfile)
@@ -127,6 +131,7 @@ InsetLayout DocumentClass::plain_insetlayout_;
 TextClass::TextClass()
 {
        outputType_ = LATEX;
+       outputFormat_ = "latex";
        columns_ = 1;
        sides_ = OneSide;
        secnumdepth_ = 3;
@@ -160,8 +165,10 @@ bool TextClass::readStyle(Lexer & lexrc, Layout & lay) const
 
 enum TextClassTags {
        TC_OUTPUTTYPE = 1,
+       TC_OUTPUTFORMAT,
        TC_INPUT,
        TC_STYLE,
+       TC_IFSTYLE,
        TC_DEFAULTSTYLE,
        TC_INSETLAYOUT,
        TC_NOSTYLE,
@@ -173,54 +180,64 @@ enum TextClassTags {
        TC_TOCDEPTH,
        TC_CLASSOPTIONS,
        TC_PREAMBLE,
+       TC_HTMLPREAMBLE,
        TC_PROVIDES,
        TC_REQUIRES,
        TC_LEFTMARGIN,
        TC_RIGHTMARGIN,
        TC_FLOAT,
        TC_COUNTER,
+       TC_IFCOUNTER,
        TC_NOFLOAT,
        TC_TITLELATEXNAME,
        TC_TITLELATEXTYPE,
        TC_FORMAT,
        TC_ADDTOPREAMBLE,
+       TC_ADDTOHTMLPREAMBLE,
        TC_DEFAULTMODULE,
        TC_PROVIDESMODULE,
-       TC_EXCLUDESMODULE
+       TC_EXCLUDESMODULE,
+       TC_HTMLTOCSECTION
 };
 
 
 namespace {
 
        LexerKeyword textClassTags[] = {
-               { "addtopreamble",   TC_ADDTOPREAMBLE },
-               { "classoptions",    TC_CLASSOPTIONS },
-               { "columns",         TC_COLUMNS },
-               { "counter",         TC_COUNTER },
-               { "defaultfont",     TC_DEFAULTFONT },
-               { "defaultmodule",   TC_DEFAULTMODULE },
-               { "defaultstyle",    TC_DEFAULTSTYLE },
-               { "excludesmodule",  TC_EXCLUDESMODULE },
-               { "float",           TC_FLOAT },
-               { "format",          TC_FORMAT },
-               { "input",           TC_INPUT },
-               { "insetlayout",     TC_INSETLAYOUT },
-               { "leftmargin",      TC_LEFTMARGIN },
-               { "nofloat",         TC_NOFLOAT },
-               { "nostyle",         TC_NOSTYLE },
-               { "outputtype",      TC_OUTPUTTYPE },
-               { "pagestyle",       TC_PAGESTYLE },
-               { "preamble",        TC_PREAMBLE },
-               { "provides",        TC_PROVIDES },
-               { "providesmodule",  TC_PROVIDESMODULE },
-               { "requires",        TC_REQUIRES },
-               { "rightmargin",     TC_RIGHTMARGIN },
-               { "secnumdepth",     TC_SECNUMDEPTH },
-               { "sides",           TC_SIDES },
-               { "style",           TC_STYLE },
-               { "titlelatexname",  TC_TITLELATEXNAME },
-               { "titlelatextype",  TC_TITLELATEXTYPE },
-               { "tocdepth",        TC_TOCDEPTH }
+               { "addtohtmlpreamble", TC_ADDTOHTMLPREAMBLE },
+               { "addtopreamble",     TC_ADDTOPREAMBLE },
+               { "classoptions",      TC_CLASSOPTIONS },
+               { "columns",           TC_COLUMNS },
+               { "counter",           TC_COUNTER },
+               { "defaultfont",       TC_DEFAULTFONT },
+               { "defaultmodule",     TC_DEFAULTMODULE },
+               { "defaultstyle",      TC_DEFAULTSTYLE },
+               { "excludesmodule",    TC_EXCLUDESMODULE },
+               { "float",             TC_FLOAT },
+               { "format",            TC_FORMAT },
+               { "htmlpreamble",      TC_HTMLPREAMBLE },
+               { "htmltocsection",    TC_HTMLTOCSECTION },
+               { "ifcounter",         TC_IFCOUNTER },
+               { "ifstyle",           TC_IFSTYLE },
+               { "input",             TC_INPUT },
+               { "insetlayout",       TC_INSETLAYOUT },
+               { "leftmargin",        TC_LEFTMARGIN },
+               { "nofloat",           TC_NOFLOAT },
+               { "nostyle",           TC_NOSTYLE },
+               { "outputformat",      TC_OUTPUTFORMAT },
+               { "outputtype",        TC_OUTPUTTYPE },
+               { "pagestyle",         TC_PAGESTYLE },
+               { "preamble",          TC_PREAMBLE },
+               { "provides",          TC_PROVIDES },
+               { "providesmodule",    TC_PROVIDESMODULE },
+               { "requires",          TC_REQUIRES },
+               { "rightmargin",       TC_RIGHTMARGIN },
+               { "secnumdepth",       TC_SECNUMDEPTH },
+               { "sides",             TC_SIDES },
+               { "style",             TC_STYLE },
+               { "titlelatexname",    TC_TITLELATEXNAME },
+               { "titlelatextype",    TC_TITLELATEXTYPE },
+               { "tocdepth",          TC_TOCDEPTH }
        };
        
 } //namespace anon
@@ -345,6 +362,10 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
                        break;
                }
 
+               // used below to track whether we are in an IfStyle or IfCounter tag.
+               bool ifstyle    = false;
+               bool ifcounter  = false;
+
                switch (static_cast<TextClassTags>(le)) {
 
                case TC_FORMAT:
@@ -352,8 +373,24 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
                                format = lexrc.getInteger();
                        break;
 
-               case TC_OUTPUTTYPE:   // output type definition
+               case TC_OUTPUTFORMAT:
+                       if (lexrc.next())
+                               outputFormat_ = lexrc.getString();
+                       break;
+
+               case TC_OUTPUTTYPE:
                        readOutputType(lexrc);
+                       switch(outputType_) {
+                       case LATEX:
+                               outputFormat_ = "latex";
+                               break;
+                       case DOCBOOK:
+                               outputFormat_ = "docbook";
+                               break;
+                       case LITERATE:
+                               outputFormat_ = "literate";
+                               break;
+                       }
                        break;
 
                case TC_INPUT: // Include file
@@ -381,6 +418,9 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
                        }
                        break;
 
+               case TC_IFSTYLE:
+                       ifstyle = true;
+                       // fall through
                case TC_STYLE: {
                        if (!lexrc.next()) {
                                lexrc.printError("No name given for style: `$$Token'.");
@@ -400,7 +440,7 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
                        } else if (hasLayout(name)) {
                                Layout & lay = operator[](name);
                                error = !readStyle(lexrc, lay);
-                       } else {
+                       } else if (!ifstyle) {
                                Layout layout;
                                layout.setName(name);
                                error = !readStyle(lexrc, layout);
@@ -413,6 +453,15 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
                                        defaultlayout_ = name;
                                }
                        }
+                       else {
+                               // scan the rest and discard it
+                               Layout lay;
+                               readStyle(lexrc, lay);
+                               error = false;
+                       }
+
+                       // reset flag
+                       ifstyle = false;
                        break;
                }
 
@@ -479,10 +528,22 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
                        preamble_ = from_utf8(lexrc.getLongString("EndPreamble"));
                        break;
 
+               case TC_HTMLPREAMBLE:
+                       htmlpreamble_ = from_utf8(lexrc.getLongString("EndPreamble"));
+                       break;
+               
+               case TC_HTMLTOCSECTION:
+                       html_toc_section_ = from_utf8(trim(lexrc.getString()));
+                       break;
+
                case TC_ADDTOPREAMBLE:
                        preamble_ += from_utf8(lexrc.getLongString("EndPreamble"));
                        break;
 
+               case TC_ADDTOHTMLPREAMBLE:
+                       htmlpreamble_ += from_utf8(lexrc.getLongString("EndPreamble"));
+                       break;
+
                case TC_PROVIDES: {
                        lexrc.next();
                        string const feature = lexrc.getString();
@@ -574,6 +635,8 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
                        readFloat(lexrc);
                        break;
 
+               case TC_IFCOUNTER:
+                       ifcounter = true;
                case TC_COUNTER:
                        if (lexrc.next()) {
                                docstring const name = lexrc.getDocString();
@@ -586,12 +649,14 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
                                        // and discard it.
                                        c.read(lexrc);
                                } else
-                                       error = !counters_.read(lexrc, name);
+                                       error = !counters_.read(lexrc, name, !ifcounter);
                        }
                        else {
                                lexrc.printError("No name given for style: `$$Token'.");
                                error = true;
                        }
+                       // reset flag
+                       ifcounter = false;
                        break;
 
                case TC_TITLELATEXTYPE:
@@ -792,6 +857,9 @@ void TextClass::readFloat(Lexer & lexrc)
                FT_STYLE,
                FT_LISTNAME,
                FT_BUILTIN,
+               FT_HTMLSTYLE,
+               FT_HTMLATTR,
+               FT_HTMLTAG,
                FT_END
        };
 
@@ -799,6 +867,9 @@ void TextClass::readFloat(Lexer & lexrc)
                { "end", FT_END },
                { "extension", FT_EXT },
                { "guiname", FT_NAME },
+               { "htmlattr", FT_HTMLATTR },
+               { "htmlstyle", FT_HTMLSTYLE },
+               { "htmltag", FT_HTMLTAG },
                { "latexbuiltin", FT_BUILTIN },
                { "listname", FT_LISTNAME },
                { "numberwithin", FT_WITHIN },
@@ -809,13 +880,16 @@ void TextClass::readFloat(Lexer & lexrc)
 
        lexrc.pushTable(floatTags);
 
-       string type;
-       string placement;
        string ext;
-       string within;
-       string style;
-       string name;
+       string htmlattr;
+       string htmlstyle;
+       string htmltag;
        string listName;
+       string name;
+       string placement;
+       string style;
+       string type;
+       string within;
        bool builtin = false;
 
        bool getout = false;
@@ -872,6 +946,18 @@ void TextClass::readFloat(Lexer & lexrc)
                        lexrc.next();
                        builtin = lexrc.getBool();
                        break;
+               case FT_HTMLATTR:
+                       lexrc.next();
+                       htmlattr = lexrc.getString();
+                       break;
+               case FT_HTMLSTYLE:
+                       lexrc.next();
+                       htmlstyle = lexrc.getLongString("EndHTMLStyle");
+                       break;
+               case FT_HTMLTAG:
+                       lexrc.next();
+                       htmltag = lexrc.getString();
+                       break;
                case FT_END:
                        getout = true;
                        break;
@@ -880,8 +966,8 @@ void TextClass::readFloat(Lexer & lexrc)
 
        // Here if have a full float if getout == true
        if (getout) {
-               Floating fl(type, placement, ext, within,
-                           style, name, listName, builtin);
+               Floating fl(type, placement, ext, within, style, name, 
+                               listName, htmltag, htmlattr, htmlstyle, builtin);
                floatlist_.newFloat(fl);
                // each float has its own counter
                counters_.newCounter(from_ascii(type), from_ascii(within),
@@ -1086,6 +1172,7 @@ Layout TextClass::createBasicLayout(docstring const & name, bool unknown) const
        return *defaultLayout;
 }
 
+
 /////////////////////////////////////////////////////////////////////////
 //
 // DocumentClassBundle
@@ -1122,7 +1209,7 @@ DocumentClass & DocumentClassBundle::makeDocumentClass(
        LayoutModuleList::const_iterator en = modlist.end();
        for (; it != en; it++) {
                string const modName = *it;
-               LyXModule * lm = moduleList[modName];
+               LyXModule * lm = theModuleList[modName];
                if (!lm) {
                        docstring const msg =
                                                bformat(_("The module %1$s has been requested by\n"
@@ -1185,6 +1272,32 @@ bool DocumentClass::hasTocLevels() const
 }
 
 
+Layout const & DocumentClass::htmlTOCLayout() const
+{
+       if (html_toc_section_.empty()) {
+               // we're going to look for the layout with the minimum toclevel
+               TextClass::LayoutList::const_iterator lit = begin();
+               TextClass::LayoutList::const_iterator const len = end();
+               int minlevel = 1000;
+               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)
+                               continue;
+                       lay = &*lit;
+                       minlevel = level;
+               }
+               if (lay)
+                       html_toc_section_ = lay->name();
+               else
+                       // hmm. that is very odd, so we'll do our best
+                       html_toc_section_ = defaultLayoutName();
+       }
+       return operator[](html_toc_section_);
+}
+
+
 /////////////////////////////////////////////////////////////////////////
 //
 // PageSides