]> git.lyx.org Git - lyx.git/blobdiff - src/Layout.cpp
add busy.gif to resources (in line with cmake)
[lyx.git] / src / Layout.cpp
index 1f68979dd44adfe9833ac4f20c979c63b49b0481..7dc41e4810894989e73a50dd96cf23b97418f240 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 "support/regex.h"
+#include "support/textutils.h"
+
 
 using namespace std;
 using namespace lyx::support;
@@ -55,6 +57,7 @@ enum LayoutTags {
        LT_FONT,
        LT_FREE_SPACING,
        LT_PASS_THRU,
+       LT_PARBREAK_IS_NEWLINE,
        //LT_HEADINGS,
        LT_ITEMSEP,
        LT_KEEPEMPTY,
@@ -143,6 +146,7 @@ Layout::Layout()
        newline_allowed = true;
        free_spacing = false;
        pass_thru = false;
+       parbreak_is_newline = false;
        toclevel = NOT_IN_TOC;
        commanddepth = 0;
        htmllabelfirst_ = false;
@@ -180,7 +184,7 @@ bool Layout::read(Lexer & lex, TextClass const & tclass)
                { "htmllabel",      LT_HTMLLABEL },
                { "htmllabelattr",  LT_HTMLLABELATTR },
                { "htmllabelfirst", LT_HTMLLABELFIRST },
-               { "htmlpremable",   LT_HTMLPREAMBLE },
+               { "htmlpreamble",   LT_HTMLPREAMBLE },
                { "htmlstyle",      LT_HTMLSTYLE },
                { "htmltag",        LT_HTMLTAG },
                { "htmltitle",      LT_HTMLTITLE },
@@ -210,6 +214,7 @@ 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 },
@@ -495,6 +500,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;
@@ -551,6 +560,7 @@ bool Layout::read(Lexer & lex, TextClass const & tclass)
 
                case LT_HTMLFORCECSS:
                        lex >> htmlforcecss_;
+                       break;
 
                case LT_HTMLPREAMBLE:
                        htmlpreamble_ = from_utf8(lex.getLongString("EndPreamble"));
@@ -567,8 +577,8 @@ 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.");
+       if (inpreamble && latextype != LATEX_COMMAND && latextype != LATEX_PARAGRAPH) {
+               LYXERR0("InPreamble not permitted except with command and paragraph layouts.");
                LYXERR0("Layout name: " << name());
                inpreamble = false;
        }
@@ -867,12 +877,14 @@ void Layout::readSpacing(Lexer & lex)
 
 namespace {
 
-docstring const i18npreamble(Language const * lang, docstring const & templ)
+docstring const i18npreamble(Language const * lang, docstring const & templ, bool const polyglossia)
 {
        if (templ.empty())
                return templ;
 
-       string preamble = subst(to_utf8(templ), "$$lang", lang->babel());
+       string preamble = polyglossia ?
+               subst(to_utf8(templ), "$$lang", lang->polyglossia()) :
+               subst(to_utf8(templ), "$$lang", lang->babel());
 
 #ifdef TEX2LYX
        // tex2lyx does not have getMessages()
@@ -902,15 +914,15 @@ docstring const i18npreamble(Language const * lang, docstring const & templ)
 }
 
 
-docstring const Layout::langpreamble(Language const * lang) const
+docstring const Layout::langpreamble(Language const * lang, bool const polyglossia) const
 {
-       return i18npreamble(lang, langpreamble_);
+       return i18npreamble(lang, langpreamble_, polyglossia);
 }
 
 
-docstring const Layout::babelpreamble(Language const * lang) const
+docstring const Layout::babelpreamble(Language const * lang, bool const polyglossia) const
 {
-       return i18npreamble(lang, babelpreamble_);
+       return i18npreamble(lang, babelpreamble_, polyglossia);
 }
 
 
@@ -948,8 +960,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_; 
 }
 
@@ -982,40 +999,96 @@ string Layout::defaultCSSClass() const
        docstring::const_iterator it = name().begin();
        docstring::const_iterator en = name().end();
        for (; it != en; ++it) {
-               if (!isalpha(*it))
-                       continue;
-               if (islower(*it))
-                       d += *it;
-               else 
-                       d += lowercase(*it);
+               char_type const c = *it;
+               if (!isAlphaASCII(c)) {
+                       if (d.empty())
+                               // make sure we don't start with an underscore,
+                               // as that sometimes causes problems.
+                               d = from_ascii("lyx_");
+                       else
+                               d += '_';
+               } else if (islower(c))
+                       d += c;
+               else
+                       // this is slow, so do it only if necessary
+                       d += lowercase(c);
        }
-       // are there other characters we need to remove?
        defaultcssclass_ = to_utf8(d);
        return defaultcssclass_;
 }
 
 
-// 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");
 }