]> git.lyx.org Git - lyx.git/blobdiff - src/Layout.cpp
In r35952 we reverted r35933, but InsetParamsWidget.h was forgotten.
[lyx.git] / src / Layout.cpp
index c9abc0e04eff8cae7d204c828adf5e1fa36ba1f2..fd4709e35659bf8927e4974b014f3efc588b5a14 100644 (file)
 #include <config.h>
 
 #include "Layout.h"
+#include "FontInfo.h"
 #include "Language.h"
-#include "TextClass.h"
 #include "Lexer.h"
-#include "FontInfo.h"
+#include "output_xhtml.h"
+#include "TextClass.h"
 
-#include "support/Messages.h"
 #include "support/debug.h"
 #include "support/lassert.h"
 #include "support/lstrings.h"
+#include "support/Messages.h"
 
-#include <boost/regex.hpp>
+#include "support/regex.h"
 
 using namespace std;
 using namespace lyx::support;
@@ -55,6 +56,7 @@ enum LayoutTags {
        LT_FONT,
        LT_FREE_SPACING,
        LT_PASS_THRU,
+       LT_PARBREAK_IS_NEWLINE,
        //LT_HEADINGS,
        LT_ITEMSEP,
        LT_KEEPEMPTY,
@@ -105,6 +107,8 @@ enum LayoutTags {
        LT_INPREAMBLE,
        LT_HTMLTITLE,
        LT_SPELLCHECK,
+       LT_REFPREFIX,
+       LT_REQARGS,
        LT_INTITLE // keep this last!
 };
 
@@ -117,7 +121,6 @@ Layout::Layout()
        latextype = LATEX_PARAGRAPH;
        intitle = false;
        inpreamble = false;
-       optionalargs = 0;
        needprotect = false;
        keepempty = false;
        font = inherit_font;
@@ -142,12 +145,15 @@ Layout::Layout()
        newline_allowed = true;
        free_spacing = false;
        pass_thru = false;
+       parbreak_is_newline = false;
        toclevel = NOT_IN_TOC;
        commanddepth = 0;
        htmllabelfirst_ = false;
        htmlforcecss_ = false;
        htmltitle_ = false;
        spellcheck = true;
+       optargs = 0;
+       reqargs = 0;
 }
 
 
@@ -207,11 +213,14 @@ bool Layout::read(Lexer & lex, TextClass const & tclass)
                { "nextnoindent",   LT_NEXTNOINDENT },
                { "obsoletedby",    LT_OBSOLETEDBY },
                { "optionalargs",   LT_OPTARGS },
+               { "parbreakisnewline", LT_PARBREAK_IS_NEWLINE },
                { "parindent",      LT_PARINDENT },
                { "parsep",         LT_PARSEP },
                { "parskip",        LT_PARSKIP },
                { "passthru",       LT_PASS_THRU },
                { "preamble",       LT_PREAMBLE },
+               { "refprefix",      LT_REFPREFIX },
+               { "requiredargs",   LT_REQARGS },
                { "requires",       LT_REQUIRES },
                { "rightmargin",    LT_RIGHTMARGIN },
                { "spacing",        LT_SPACING },
@@ -318,7 +327,11 @@ bool Layout::read(Lexer & lex, TextClass const & tclass)
                        break;
 
                case LT_OPTARGS:
-                       lex >> optionalargs ;
+                       lex >> optargs;
+                       break;
+
+               case LT_REQARGS:
+                       lex >> reqargs;
                        break;
 
                case LT_NEED_PROTECT:
@@ -486,6 +499,10 @@ bool Layout::read(Lexer & lex, TextClass const & tclass)
                        lex >> pass_thru;
                        break;
 
+               case LT_PARBREAK_IS_NEWLINE:
+                       lex >> parbreak_is_newline;
+                       break;
+
                case LT_SPACING: // setspace.sty
                        readSpacing(lex);
                        break;
@@ -497,6 +514,16 @@ bool Layout::read(Lexer & lex, TextClass const & tclass)
                        requires_.insert(req.begin(), req.end());
                        break;
                }
+                       
+               case LT_REFPREFIX: {
+                       docstring arg;
+                       lex >> arg;
+                       if (arg == "OFF")
+                               refprefix.clear();
+                       else
+                               refprefix = arg;
+                       break;
+               }
 
                case LT_HTMLTAG:
                        lex >> htmltag_;
@@ -532,6 +559,7 @@ bool Layout::read(Lexer & lex, TextClass const & tclass)
 
                case LT_HTMLFORCECSS:
                        lex >> htmlforcecss_;
+                       break;
 
                case LT_HTMLPREAMBLE:
                        htmlpreamble_ = from_utf8(lex.getLongString("EndPreamble"));
@@ -547,8 +575,14 @@ bool Layout::read(Lexer & lex, TextClass const & tclass)
                }
        }
        lex.popTable();
+       // make sure we only have inpreamble = true for commands
+       if (inpreamble && latextype != LATEX_COMMAND) {
+               LYXERR0("InPreamble not permitted except with Command-type layouts.");
+               LYXERR0("Layout name: " << name());
+               inpreamble = false;
+       }
 
-       return !error;
+       return finished && !error;
 }
 
 
@@ -854,11 +888,11 @@ docstring const i18npreamble(Language const * lang, docstring const & templ)
        LASSERT(false, /**/);
 #else
        // FIXME UNICODE
-       // boost::regex is not unicode-safe.
+       // lyx::regex is not unicode-safe.
        // Should use QRegExp or (boost::u32regex, but that requires ICU)
-       static boost::regex const reg("_\\(([^\\)]+)\\)");
-       boost::smatch sub;
-       while (boost::regex_search(preamble, sub, reg)) {
+       static regex const reg("_\\(([^\\)]+)\\)");
+       smatch sub;
+       while (regex_search(preamble, sub, reg)) {
                string const key = sub.str(1);
                string translated;
                if (isAscii(key))
@@ -923,8 +957,13 @@ string const & Layout::htmlitemattr() const
 
 string const & Layout::htmllabeltag() const 
 { 
-       if (htmllabeltag_.empty())
-               htmllabeltag_ = "span";
+       if (htmllabeltag_.empty()) {
+               if (labeltype != LABEL_TOP_ENVIRONMENT &&
+                   labeltype != LABEL_CENTERED_TOP_ENVIRONMENT)
+                       htmllabeltag_ = "span";
+               else
+                       htmllabeltag_ = "div";
+       }
        return htmllabeltag_; 
 }
 
@@ -970,27 +1009,77 @@ string Layout::defaultCSSClass() const
 }
 
 
-// NOTE There is a whole ton of stuff that could go into this.
-// Things like bottomsep, topsep, and parsep could become various
-// sorts of margins or padding, for example. But for now we are
-// going to keep it simple.
+namespace {
+       string makeMarginValue(char const * side, double d) {
+               ostringstream os;
+               os << "margin-" << side << ": " << d << "ex;\n";
+               return os.str();
+       }
+}
+
+
 void Layout::makeDefaultCSS() const {
        // this never needs to be redone, since reloading layouts will
        // wipe out what we did before.
        if (!htmldefaultstyle_.empty()) 
                return;
-       docstring const mainfontCSS = font.asCSS();
-       if (!mainfontCSS.empty())
+       
+       // main font
+       htmldefaultstyle_ = font.asCSS();
+       
+       // bottom margins
+       string tmp;
+       if (topsep > 0)
+               tmp += makeMarginValue("top", topsep);
+       if (bottomsep > 0)
+               tmp += makeMarginValue("bottom", bottomsep);
+       if (!leftmargin.empty()) {
+               // we can't really do what LyX does with the margin, so 
+               // we'll just figure out how many characters it is
+               int const len = leftmargin.length();
+               tmp += makeMarginValue("left", len);
+       }
+       if (!rightmargin.empty()) {
+               int const len = rightmargin.length();
+               tmp += makeMarginValue("right", len);
+       }
+               
+       if (!tmp.empty()) {
+               if (!htmldefaultstyle_.empty())
+                       htmldefaultstyle_ += from_ascii("\n");
+               htmldefaultstyle_ += from_ascii(tmp);
+       }
+
+// tex2lyx does not see output_xhtml.cpp
+#ifndef TEX2LYX
+       // alignment
+       string where = alignmentToCSS(align);
+       if (!where.empty()) {
+               htmldefaultstyle_ += from_ascii("text-align: " + where + ";\n");
+       }
+#endif
+       
+       // wrap up what we have, if anything
+       if (!htmldefaultstyle_.empty())
                htmldefaultstyle_ = 
                        from_ascii(htmltag() + "." + defaultCSSClass() + " {\n") +
-                       mainfontCSS + from_ascii("\n}\n");
-       if (labelfont == font || htmllabeltag() == "NONE")
+                       htmldefaultstyle_ + from_ascii("\n}\n");
+       
+       if (labeltype == LABEL_NO_LABEL || htmllabeltag() == "NONE")
                return;
-       docstring const labelfontCSS = labelfont.asCSS();
-       if (!labelfontCSS.empty())
+       
+       docstring labelCSS;
+       
+       // label font
+       if (labelfont != font)
+               labelCSS = labelfont.asCSS() + from_ascii("\n");
+       if (labeltype == LABEL_CENTERED_TOP_ENVIRONMENT)
+               labelCSS += from_ascii("text-align: center;\n");
+       
+       if (!labelCSS.empty())
                htmldefaultstyle_ +=
                        from_ascii(htmllabeltag() + "." + defaultCSSLabelClass() + " {\n") +
-                       labelfontCSS + from_ascii("\n}\n");
+                       labelCSS + from_ascii("\n}\n");
 }