]> git.lyx.org Git - lyx.git/blobdiff - src/Layout.cpp
version.h: tex2lyx can have the same actual fileformat
[lyx.git] / src / Layout.cpp
index 080e41a85d3e11c30d623f66acdc6fb7b4e6bfb6..46035513c7bd163a28d15c6505941f48c2001d12 100644 (file)
@@ -104,6 +104,7 @@ enum LayoutTags {
        LT_REFPREFIX,
        LT_RESETARGS,
        LT_RIGHTDELIM,
+       LT_FORCELOCAL,
        LT_INTITLE // keep this last!
 };
 
@@ -145,11 +146,32 @@ Layout::Layout()
        htmlforcecss_ = false;
        htmltitle_ = false;
        spellcheck = true;
+       forcelocal = 0;
        itemcommand_ = "item";
 }
 
 
 bool Layout::read(Lexer & lex, TextClass const & tclass)
+{
+       // If this is an empty layout, or if no force local version is set,
+       // we know that we will not discard the stuff to read
+       if (forcelocal == 0)
+               return readIgnoreForcelocal(lex, tclass);
+       Layout tmp(*this);
+       tmp.forcelocal = 0;
+       bool const ret = tmp.readIgnoreForcelocal(lex, tclass);
+       // Keep the stuff if
+       // - the read version is higher
+       // - both versions are infinity (arbitrary decision)
+       // - the file did not contain any local version (needed for not
+       //   skipping user defined local layouts)
+       if (tmp.forcelocal <= 0 || tmp.forcelocal > forcelocal)
+               *this = tmp;
+       return ret;
+}
+
+
+bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass)
 {
        // This table is sorted alphabetically [asierra 30March96]
        LexerKeyword layoutTags[] = {
@@ -166,6 +188,7 @@ bool Layout::read(Lexer & lex, TextClass const & tclass)
                { "endlabelstring", LT_ENDLABELSTRING },
                { "endlabeltype",   LT_ENDLABELTYPE },
                { "font",           LT_FONT },
+               { "forcelocal",     LT_FORCELOCAL },
                { "freespacing",    LT_FREE_SPACING },
                { "htmlattr",       LT_HTMLATTR },
                { "htmlforcecss",   LT_HTMLFORCECSS },
@@ -582,6 +605,10 @@ bool Layout::read(Lexer & lex, TextClass const & tclass)
                case LT_SPELLCHECK:
                        lex >> spellcheck;
                        break;
+
+               case LT_FORCELOCAL:
+                       lex >> forcelocal;
+                       break;
                }
        }
        lex.popTable();
@@ -999,11 +1026,14 @@ void writeArgument(ostream & os, string const & id, Layout::latexarg const & arg
 void Layout::write(ostream & os) const
 {
        os << "Style " << to_utf8(name_) << '\n';
-       if (!category_.empty())
-               os << "\tCategory " << to_utf8(category_) << '\n';
+       if (!category_.empty() && obsoleted_by_.empty())
+               os << "\tCategory \"" << to_utf8(category_) << "\"\n";
        // Can't deduce Copystyle here :-(
-       if (!obsoleted_by_.empty())
-               os << "\tObsoletedby " << to_utf8(obsoleted_by_) << '\n';
+       if (!obsoleted_by_.empty()) {
+               os << "\tObsoletedBy \"" << to_utf8(obsoleted_by_)
+                  << "\"\nEnd\n";
+               return;
+       }
        if (!depends_on_.empty())
                os << "\tDependsOn " << to_utf8(depends_on_) << '\n';
        switch (margintype) {
@@ -1067,10 +1097,10 @@ void Layout::write(ostream & os) const
        os << "\tNextNoIndent " << nextnoindent << "\n"
              "\tCommandDepth " << commanddepth << '\n';
        if (!latexname_.empty())
-               os << "\tLatexName " << latexname_ << '\n';
+               os << "\tLatexName \"" << latexname_ << "\"\n";
        if (!latexparam_.empty())
-               os << "\tLatexParam " << subst(latexparam_, "\"", "&quot;")
-                  << '\n';
+               os << "\tLatexParam \"" << subst(latexparam_, "\"", "&quot;")
+                  << "\"\n";
        if (!leftdelim_.empty())
                os << "\tLeftDelim "
                   << to_utf8(subst(leftdelim_, from_ascii("\n"), from_ascii("<br/>")))
@@ -1080,24 +1110,27 @@ void Layout::write(ostream & os) const
                   << to_utf8(subst(rightdelim_, from_ascii("\n"), from_ascii("<br/>")))
                   << '\n';
        if (!innertag_.empty())
-               os << "\tInnerTag " << innertag_ << '\n';
+               os << "\tInnerTag \"" << innertag_ << "\"\n";
        if (!labeltag_.empty())
-               os << "\tLabelTag " << labeltag_ << '\n';
+               os << "\tLabelTag \"" << labeltag_ << "\"\n";
        if (!itemtag_.empty())
-               os << "\tItemTag " << itemtag_ << '\n';
+               os << "\tItemTag \"" << itemtag_ << "\"\n";
        if (!itemcommand_.empty())
                os << "\tItemCommand " << itemcommand_ << '\n';
        if (!preamble_.empty())
-               os << "\tPreamble\n"
-                  << to_utf8(rtrim(preamble_, "\n"))
+               os << "\tPreamble\n\t"
+                  << to_utf8(subst(rtrim(preamble_, "\n"),
+                                   from_ascii("\n"), from_ascii("\n\t")))
                   << "\n\tEndPreamble\n";
        if (!langpreamble_.empty())
-               os << "\tLangPreamble\n"
-                  << to_utf8(rtrim(langpreamble_, "\n"))
+               os << "\tLangPreamble\n\t"
+                  << to_utf8(subst(rtrim(langpreamble_, "\n"),
+                                   from_ascii("\n"), from_ascii("\n\t")))
                   << "\n\tEndLangPreamble\n";
        if (!babelpreamble_.empty())
-               os << "\tBabelPreamble\n"
-                  << to_utf8(rtrim(babelpreamble_, "\n"))
+               os << "\tBabelPreamble\n\t"
+                  << to_utf8(subst(rtrim(babelpreamble_, "\n"),
+                                   from_ascii("\n"), from_ascii("\n\t")))
                   << "\n\tEndBabelPreamble\n";
        switch (labeltype) {
        case LABEL_ABOVE:
@@ -1143,9 +1176,9 @@ void Layout::write(ostream & os) const
                break;
        }
        if (!leftmargin.empty())
-               os << "\tLeftMargin " << to_utf8(leftmargin) << '\n';
+               os << "\tLeftMargin \"" << to_utf8(leftmargin) << "\"\n";
        if (!rightmargin.empty())
-               os << "\tRightMargin " << to_utf8(rightmargin) << '\n';
+               os << "\tRightMargin \"" << to_utf8(rightmargin) << "\"\n";
        if (!labelindent.empty())
                os << "\tLabelIndent " << to_utf8(labelindent) << '\n';
        if (!parindent.empty())
@@ -1284,6 +1317,7 @@ void Layout::write(ostream & os) const
                   << "\n\tEndPreamble\n";
        os << "\tHTMLTitle " << htmltitle_ << "\n"
              "\tSpellcheck " << spellcheck << "\n"
+             "\tForceLocal " << forcelocal << "\n"
              "End\n";
 }
 
@@ -1472,7 +1506,7 @@ void Layout::makeDefaultCSS() const
        }
 
 // tex2lyx does not see output_xhtml.cpp
-#ifndef TEX2LYX
+#ifndef NO_LAYOUT_CSS
        // alignment
        string where = alignmentToCSS(align);
        if (!where.empty()) {