X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLayout.cpp;h=85fe11a8abebe336c26f44a022d08418ece50c29;hb=f37a1b8aeaf8f3a3a66a22bf0b396f7d1ceca2ff;hp=e59374a99260636928de8210f04f3a276b6021cf;hpb=cd27d171d5b94eb3345d4be435271030e015bdb6;p=lyx.git diff --git a/src/Layout.cpp b/src/Layout.cpp index e59374a992..85fe11a8ab 100644 --- a/src/Layout.cpp +++ b/src/Layout.cpp @@ -16,7 +16,7 @@ #include "Language.h" #include "TextClass.h" #include "Lexer.h" -#include "Font.h" +#include "FontInfo.h" #include "support/Messages.h" #include "support/debug.h" @@ -56,7 +56,6 @@ enum LayoutTags { LT_FREE_SPACING, LT_PASS_THRU, //LT_HEADINGS, - LT_I18NPREAMBLE, LT_ITEMSEP, LT_KEEPEMPTY, LT_LABEL_BOTTOMSEP, @@ -83,6 +82,8 @@ enum LayoutTags { LT_PARSKIP, //LT_PLAIN, LT_PREAMBLE, + LT_LANGPREAMBLE, + LT_BABELPREAMBLE, LT_REQUIRES, LT_RIGHTMARGIN, LT_SPACING, @@ -91,6 +92,17 @@ enum LayoutTags { LT_INNERTAG, LT_LABELTAG, LT_ITEMTAG, + LT_HTMLTAG, + LT_HTMLATTR, + LT_HTMLITEM, + LT_HTMLITEMATTR, + LT_HTMLLABEL, + LT_HTMLLABELATTR, + LT_HTMLLABELFIRST, + LT_HTMLPREAMBLE, + LT_HTMLSTYLE, + LT_HTMLFORCECSS, + LT_INPREAMBLE, LT_INTITLE // keep this last! }; @@ -102,6 +114,7 @@ Layout::Layout() margintype = MARGIN_STATIC; latextype = LATEX_PARAGRAPH; intitle = false; + inpreamble = false; optionalargs = 0; needprotect = false; keepempty = false; @@ -129,6 +142,8 @@ Layout::Layout() pass_thru = false; toclevel = NOT_IN_TOC; commanddepth = 0; + htmllabelfirst_ = false; + htmlforcecss_ = false; } @@ -138,6 +153,7 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) LexerKeyword layoutTags[] = { { "align", LT_ALIGN }, { "alignpossible", LT_ALIGNPOSSIBLE }, + { "babelpreamble", LT_BABELPREAMBLE }, { "bottomsep", LT_BOTTOMSEP }, { "category", LT_CATEGORY }, { "commanddepth", LT_COMMANDDEPTH }, @@ -150,8 +166,18 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) { "fill_top", LT_FILL_TOP }, { "font", LT_FONT }, { "freespacing", LT_FREE_SPACING }, - { "i18npreamble", LT_I18NPREAMBLE }, + { "htmlattr", LT_HTMLATTR }, + { "htmlforcecss", LT_HTMLFORCECSS }, + { "htmlitem", LT_HTMLITEM }, + { "htmlitemattr", LT_HTMLITEMATTR }, + { "htmllabel", LT_HTMLLABEL }, + { "htmllabelattr", LT_HTMLLABELATTR }, + { "htmllabelfirst", LT_HTMLLABELFIRST }, + { "htmlpremable", LT_HTMLPREAMBLE }, + { "htmlstyle", LT_HTMLSTYLE }, + { "htmltag", LT_HTMLTAG }, { "innertag", LT_INNERTAG }, + { "inpreamble", LT_INPREAMBLE }, { "intitle", LT_INTITLE }, { "itemsep", LT_ITEMSEP }, { "itemtag", LT_ITEMTAG }, @@ -165,6 +191,7 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) { "labelstringappendix", LT_LABELSTRING_APPENDIX }, { "labeltag", LT_LABELTAG }, { "labeltype", LT_LABELTYPE }, + { "langpreamble", LT_LANGPREAMBLE }, { "latexname", LT_LATEXNAME }, { "latexparam", LT_LATEXPARAM }, { "latextype", LT_LATEXTYPE }, @@ -203,7 +230,9 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) lex.printError("Unknown layout tag `$$Token'"); error = true; continue; - default: break; + + default: + break; } switch (static_cast(le)) { case LT_END: // end of structure @@ -274,6 +303,10 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) lex >> intitle; break; + case LT_INPREAMBLE: + lex >> inpreamble; + break; + case LT_TOCLEVEL: lex >> toclevel; break; @@ -336,8 +369,12 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) preamble_ = from_utf8(lex.getLongString("EndPreamble")); break; - case LT_I18NPREAMBLE: - i18npreamble_ = from_utf8(lex.getLongString("EndI18NPreamble")); + case LT_LANGPREAMBLE: + langpreamble_ = from_utf8(lex.getLongString("EndLangPreamble")); + break; + + case LT_BABELPREAMBLE: + babelpreamble_ = from_utf8(lex.getLongString("EndBabelPreamble")); break; case LT_LABELTYPE: @@ -447,12 +484,52 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) readSpacing(lex); break; - case LT_REQUIRES: + case LT_REQUIRES: { lex.eatLine(); vector const req = getVectorFromString(lex.getString()); requires_.insert(req.begin(), req.end()); break; + } + + case LT_HTMLTAG: + lex >> htmltag_; + break; + + case LT_HTMLATTR: + lex >> htmlattr_; + break; + + case LT_HTMLITEM: + lex >> htmlitemtag_; + break; + + case LT_HTMLITEMATTR: + lex >> htmlitemattr_; + break; + + case LT_HTMLLABEL: + lex >> htmllabeltag_; + break; + + case LT_HTMLLABELATTR: + lex >> htmllabelattr_; + break; + + case LT_HTMLLABELFIRST: + lex >> htmllabelfirst_; + break; + + case LT_HTMLSTYLE: + htmlstyle_ = from_utf8(lex.getLongString("EndHTMLStyle")); + break; + + case LT_HTMLFORCECSS: + lex >> htmlforcecss_; + + case LT_HTMLPREAMBLE: + htmlpreamble_ = from_utf8(lex.getLongString("EndPreamble")); + break; } } @@ -750,36 +827,15 @@ void Layout::readSpacing(Lexer & lex) } -docstring const & Layout::name() const -{ - return name_; -} - +namespace { -void Layout::setName(docstring const & name) +docstring const i18npreamble(Language const * lang, docstring const & templ) { - name_ = name; -} - + if (templ.empty()) + return templ; -docstring const & Layout::obsoleted_by() const -{ - return obsoleted_by_; -} + string preamble = subst(to_utf8(templ), "$$lang", lang->babel()); - -docstring const & Layout::depends_on() const -{ - return depends_on_; -} - - -docstring const Layout::i18npreamble(Language const * lang) const -{ - if (i18npreamble_.empty()) - return i18npreamble_; - string preamble = subst(to_utf8(i18npreamble_), "$$lang", - lang->babel()); #ifdef TEX2LYX // tex2lyx does not have getMessages() LASSERT(false, /**/); @@ -805,6 +861,125 @@ docstring const Layout::i18npreamble(Language const * lang) const return from_utf8(preamble); } +} + + +docstring const Layout::langpreamble(Language const * lang) const +{ + return i18npreamble(lang, langpreamble_); +} + + +docstring const Layout::babelpreamble(Language const * lang) const +{ + return i18npreamble(lang, babelpreamble_); +} + + +string const & Layout::htmltag() const +{ + if (htmltag_.empty()) + htmltag_ = "div"; + return htmltag_; +} + + +string const & Layout::htmlattr() const +{ + if (htmlattr_.empty()) + htmlattr_ = "class=\"" + defaultCSSClass() + "\""; + return htmlattr_; +} + + +string const & Layout::htmlitemtag() const +{ + if (htmlitemtag_.empty()) + htmlitemtag_ = "div"; + return htmlitemtag_; +} + + +string const & Layout::htmlitemattr() const +{ + if (htmlitemattr_.empty()) + htmlitemattr_ = "class=\"" + defaultCSSItemClass() + "\""; + return htmlitemattr_; +} + + +string const & Layout::htmllabeltag() const +{ + if (htmllabeltag_.empty()) + htmllabeltag_ = "span"; + return htmllabeltag_; +} + + +string const & Layout::htmllabelattr() const +{ + if (htmllabelattr_.empty()) + htmllabelattr_ = "class=\"" + defaultCSSLabelClass() + "\""; + return htmllabelattr_; +} + + +docstring Layout::htmlstyle() const { + if (!htmlstyle_.empty() && !htmlforcecss_) + return htmlstyle_; + if (htmldefaultstyle_.empty()) + makeDefaultCSS(); + docstring retval = htmldefaultstyle_; + if (!htmlstyle_.empty()) + retval += '\n' + htmlstyle_; + return retval; +} + + +string Layout::defaultCSSClass() const +{ + if (!defaultcssclass_.empty()) + return defaultcssclass_; + docstring d; + 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); + } + // 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. +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()) + htmldefaultstyle_ = + from_ascii(htmltag() + "." + defaultCSSClass() + " {\n") + + mainfontCSS + from_ascii("\n}\n"); + if (labelfont == font || htmllabeltag() == "NONE") + return; + docstring const labelfontCSS = labelfont.asCSS(); + if (!labelfontCSS.empty()) + htmldefaultstyle_ += + from_ascii(htmllabeltag() + "." + defaultCSSLabelClass() + " {\n") + + labelfontCSS + from_ascii("\n}\n"); +} + bool Layout::operator==(Layout const & rhs) const {