]> git.lyx.org Git - lyx.git/blobdiff - src/TextClass.cpp
Initialize biblioChanged_ when we update the document settings dialog.
[lyx.git] / src / TextClass.cpp
index edf66b3b34048dc5e36d21d049a99d7061f0dd4c..92adfdc7507dd7173dfa7c9bfe6f764baff46fcc 100644 (file)
@@ -49,19 +49,19 @@ using namespace lyx::support;
 
 namespace lyx {
 
-// Keep the changes documented in the Customization manual. 
+// Keep the changes documented in the Customization manual.
 //
 // If you change this format, then you MUST also make sure that
-// your changes do not invalidate the hardcoded layout file in 
+// your changes do not invalidate the hardcoded layout file in
 // LayoutFile.cpp. Additions will never do so, but syntax changes
 // could. See LayoutFileList::addEmptyClass() and, especially, the
-// definition of the layoutpost string. 
+// definition of the layoutpost string.
 // You should also run (or ask someone who has bash to run) the
-// development/updatelayouts.sh script, to update the format of 
+// development/updatelayouts.sh script, to update the format of
 // all of our layout files.
 //
-int const LAYOUT_FORMAT = 33;
-       
+int const LAYOUT_FORMAT = 36;
+
 namespace {
 
 class LayoutNamesEqual : public unary_function<Layout, bool> {
@@ -104,7 +104,7 @@ bool layout2layout(FileName const & filename, FileName const & tempfile)
 }
 
 
-string translateReadType(TextClass::ReadType rt) 
+string translateReadType(TextClass::ReadType rt)
 {
        switch (rt) {
        case TextClass::BASECLASS:
@@ -123,7 +123,7 @@ string translateReadType(TextClass::ReadType rt)
 } // namespace anon
 
 
-// This string should not be translated here, 
+// This string should not be translated here,
 // because it is a layout identifier.
 docstring const TextClass::plain_layout_ = from_ascii("Plain Layout");
 
@@ -190,6 +190,7 @@ enum TextClassTags {
        TC_CLASSOPTIONS,
        TC_PREAMBLE,
        TC_HTMLPREAMBLE,
+       TC_HTMLSTYLES,
        TC_PROVIDES,
        TC_REQUIRES,
        TC_LEFTMARGIN,
@@ -204,6 +205,7 @@ enum TextClassTags {
        TC_FORMAT,
        TC_ADDTOPREAMBLE,
        TC_ADDTOHTMLPREAMBLE,
+       TC_ADDTOHTMLSTYLES,
        TC_DEFAULTMODULE,
        TC_PROVIDESMODULE,
        TC_EXCLUDESMODULE,
@@ -216,6 +218,7 @@ namespace {
 
        LexerKeyword textClassTags[] = {
                { "addtohtmlpreamble", TC_ADDTOHTMLPREAMBLE },
+         { "addtohtmlstyles",   TC_ADDTOHTMLSTYLES },
                { "addtopreamble",     TC_ADDTOPREAMBLE },
                { "citeformat",        TC_CITEFORMAT },
                { "classoptions",      TC_CLASSOPTIONS },
@@ -228,6 +231,7 @@ namespace {
                { "float",             TC_FLOAT },
                { "format",            TC_FORMAT },
                { "htmlpreamble",      TC_HTMLPREAMBLE },
+         { "htmlstyles",        TC_HTMLSTYLES },
                { "htmltocsection",    TC_HTMLTOCSECTION },
                { "ifcounter",         TC_IFCOUNTER },
                { "ifstyle",           TC_IFSTYLE },
@@ -252,7 +256,7 @@ namespace {
                { "titlelatextype",    TC_TITLELATEXTYPE },
                { "tocdepth",          TC_TOCDEPTH }
        };
-       
+
 } //namespace anon
 
 
@@ -268,6 +272,29 @@ bool TextClass::convertLayoutFormat(support::FileName const & filename, ReadType
 }
 
 
+std::string TextClass::convert(std::string const & str)
+{
+       FileName const fn = FileName::tempName("locallayout");
+       ofstream os(fn.toFilesystemEncoding().c_str());
+       os << str;
+       os.close();
+       FileName const tempfile = FileName::tempName("convert_locallayout");
+       bool success = layout2layout(fn, tempfile);
+       if (!success)
+               return "";
+       ifstream is(tempfile.toFilesystemEncoding().c_str());
+       string ret;
+       string tmp;
+       while (!is.eof()) {
+               getline(is, tmp);
+               ret += tmp + '\n';
+       }
+       is.close();
+       tempfile.removeFile();
+       return ret;
+}
+
+
 TextClass::ReturnValues TextClass::readWithoutConv(FileName const & filename, ReadType rt)
 {
        if (!filename.isReadableFile()) {
@@ -279,8 +306,8 @@ TextClass::ReturnValues TextClass::readWithoutConv(FileName const & filename, Re
        LYXERR(Debug::TCLASS, "Reading " + translateReadType(rt) + ": " +
                to_utf8(makeDisplayPath(filename.absFileName())));
 
-       // Define the plain layout used in table cells, ert, etc. Note that 
-       // we do this before loading any layout file, so that classes can 
+       // Define the plain layout used in table cells, ert, etc. Note that
+       // we do this before loading any layout file, so that classes can
        // override features of this layout if they should choose to do so.
        if (rt == BASECLASS && !hasLayout(plain_layout_))
                layoutlist_.push_back(createBasicLayout(plain_layout_));
@@ -288,7 +315,7 @@ TextClass::ReturnValues TextClass::readWithoutConv(FileName const & filename, Re
        Lexer lexrc(textClassTags);
        lexrc.setFile(filename);
        ReturnValues retval = read(lexrc, rt);
-       
+
        LYXERR(Debug::TCLASS, "Finished reading " + translateReadType(rt) + ": " +
                        to_utf8(makeDisplayPath(filename.absFileName())));
 
@@ -303,38 +330,36 @@ bool TextClass::read(FileName const & filename, ReadType rt)
                return retval == OK;
 
        bool const worx = convertLayoutFormat(filename, rt);
-       if (!worx) {
-               LYXERR0 ("Unable to convert " << filename << 
+       if (!worx)
+               LYXERR0 ("Unable to convert " << filename <<
                        " to format " << LAYOUT_FORMAT);
-               return false;
-       }
-       return true;
+       return worx;
 }
 
 
-bool TextClass::validate(std::string const & str)
+TextClass::ReturnValues TextClass::validate(std::string const & str)
 {
        TextClass tc;
        return tc.read(str, VALIDATION);
 }
 
 
-bool TextClass::read(std::string const & str, ReadType rt) 
+TextClass::ReturnValues TextClass::read(std::string const & str, ReadType rt)
 {
        Lexer lexrc(textClassTags);
        istringstream is(str);
        lexrc.setStream(is);
        ReturnValues retval = read(lexrc, rt);
 
-       if (retval != FORMAT_MISMATCH) 
-               return retval == OK;
+       if (retval != FORMAT_MISMATCH)
+               return retval;
 
        // write the layout string to a temporary file
        FileName const tempfile = FileName::tempName("TextClass_read");
        ofstream os(tempfile.toFilesystemEncoding().c_str());
        if (!os) {
                LYXERR0("Unable to create temporary file");
-               return false;
+               return ERROR;
        }
        os << str;
        os.close();
@@ -342,16 +367,17 @@ bool TextClass::read(std::string const & str, ReadType rt)
        // now try to convert it
        bool const worx = convertLayoutFormat(tempfile, rt);
        if (!worx) {
-               LYXERR0("Unable to convert internal layout information to format " 
+               LYXERR0("Unable to convert internal layout information to format "
                        << LAYOUT_FORMAT);
+               return ERROR;
        }
        tempfile.removeFile();
-       return worx;
+       return OK_OLDFORMAT;
 }
 
 
 // Reads a textclass structure from file.
-TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) 
+TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
 {
        if (!lexrc.isOK())
                return ERROR;
@@ -545,7 +571,11 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
                case TC_HTMLPREAMBLE:
                        htmlpreamble_ = from_utf8(lexrc.getLongString("EndPreamble"));
                        break;
-               
+
+               case TC_HTMLSTYLES:
+                       htmlstyles_ = from_utf8(lexrc.getLongString("EndStyles"));
+                       break;
+
                case TC_HTMLTOCSECTION:
                        html_toc_section_ = from_utf8(trim(lexrc.getString()));
                        break;
@@ -558,6 +588,10 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
                        htmlpreamble_ += from_utf8(lexrc.getLongString("EndPreamble"));
                        break;
 
+               case TC_ADDTOHTMLSTYLES:
+                       htmlstyles_ += from_utf8(lexrc.getLongString("EndStyles"));
+                       break;
+
                case TC_PROVIDES: {
                        lexrc.next();
                        string const feature = lexrc.getString();
@@ -571,7 +605,7 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
 
                case TC_REQUIRES: {
                        lexrc.eatLine();
-                       vector<string> const req 
+                       vector<string> const req
                                = getVectorFromString(lexrc.getString());
                        requires_.insert(req.begin(), req.end());
                        break;
@@ -649,7 +683,7 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
                case TC_FLOAT:
                        error = !readFloat(lexrc);
                        break;
-               
+
                case TC_CITEFORMAT:
                        readCiteFormat(lexrc);
                        break;
@@ -722,8 +756,8 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
                                                << "' is missing a defaultstyle.");
                return ERROR;
        }
-               
-       // Try to erase "stdinsets" from the provides_ set. 
+
+       // Try to erase "stdinsets" from the provides_ set.
        // The
        //   Provides stdinsets 1
        // declaration simply tells us that the standard insets have been
@@ -982,7 +1016,7 @@ bool TextClass::readFloat(Lexer & lexrc)
                                ispredefined = fl.isPredefined();
                                listcommand = fl.listCommand();
                                refprefix = fl.refPrefix();
-                       } 
+                       }
                        break;
                case FT_NAME:
                        lexrc.next();
@@ -1065,8 +1099,8 @@ bool TextClass::readFloat(Lexer & lexrc)
                                  "for the float `" << type << "'. LyX will " <<
                                  "not be able to produce a float list.");
                }
-               Floating fl(type, placement, ext, within, style, name, 
-                               listname, listcommand, refprefix, 
+               Floating fl(type, placement, ext, within, style, name,
+                               listname, listcommand, refprefix,
                                htmltag, htmlattr, htmlstyle, usesfloat, ispredefined);
                floatlist_.newFloat(fl);
                // each float has its own counter
@@ -1082,12 +1116,12 @@ bool TextClass::readFloat(Lexer & lexrc)
 
 
 string const & TextClass::prerequisites() const
-{ 
+{
        if (contains(prerequisites_, ',')) {
                vector<string> const pres = getVectorFromString(prerequisites_);
                prerequisites_ = getStringFromVector(pres, "\n\t");
        }
-       return prerequisites_; 
+       return prerequisites_;
 }
 
 bool TextClass::hasLayout(docstring const & n) const
@@ -1102,7 +1136,7 @@ bool TextClass::hasLayout(docstring const & n) const
 
 bool TextClass::hasInsetLayout(docstring const & n) const
 {
-       if (n.empty()) 
+       if (n.empty())
                return false;
        InsetLayouts::const_iterator it = insetlayoutlist_.begin();
        InsetLayouts::const_iterator en = insetlayoutlist_.end();
@@ -1117,7 +1151,7 @@ Layout const & TextClass::operator[](docstring const & name) const
 {
        LASSERT(!name.empty(), /**/);
 
-       const_iterator it = 
+       const_iterator it =
                find_if(begin(), end(), LayoutNamesEqual(name));
 
        if (it == end()) {
@@ -1191,7 +1225,7 @@ bool TextClass::load(string const & path) const
                       << to_utf8(makeDisplayPath(layout_file.absFileName()))
                       << "'\n(Check `" << name_
                       << "')\nCheck your installation and "
-                         "try Options/Reconfigure..." 
+                         "try Options/Reconfigure..."
                       << endl;
        }
 
@@ -1199,14 +1233,17 @@ bool TextClass::load(string const & path) const
 }
 
 
-void DocumentClass::addLayoutIfNeeded(docstring const & n) const
+bool DocumentClass::addLayoutIfNeeded(docstring const & n) const
 {
-       if (!hasLayout(n))
-               layoutlist_.push_back(createBasicLayout(n, true));
+       if (hasLayout(n))
+               return false;
+
+       layoutlist_.push_back(createBasicLayout(n, true));
+       return true;
 }
 
 
-InsetLayout const & DocumentClass::insetLayout(docstring const & name) const 
+InsetLayout const & DocumentClass::insetLayout(docstring const & name) const
 {
        // FIXME The fix for the InsetLayout part of 4812 would be here:
        // Add the InsetLayout to the document class if it is not found.
@@ -1237,13 +1274,13 @@ Layout const & TextClass::defaultLayout() const
 }
 
 
-bool TextClass::isDefaultLayout(Layout const & layout) const 
+bool TextClass::isDefaultLayout(Layout const & layout) const
 {
        return layout.name() == defaultLayoutName();
 }
 
 
-bool TextClass::isPlainLayout(Layout const & layout) const 
+bool TextClass::isPlainLayout(Layout const & layout) const
 {
        return layout.name() == plainLayoutName();
 }
@@ -1304,8 +1341,8 @@ DocumentClass & DocumentClassBundle::newClass(LayoutFile const & baseClass)
 
 DocumentClassBundle & DocumentClassBundle::get()
 {
-       static DocumentClassBundle singleton; 
-       return singleton; 
+       static DocumentClassBundle singleton;
+       return singleton;
 }
 
 
@@ -1413,7 +1450,7 @@ Layout const & DocumentClass::htmlTOCLayout() const
 string const & DocumentClass::getCiteFormat(string const & entry_type) const
 {
        static string default_format = "{%author%[[%author%, ]][[{%editor%[[%editor%, ed., ]]}]]}\"%title%\"{%journal%[[, {!<i>!}%journal%{!</i>!}]][[{%publisher%[[, %publisher%]][[{%institution%[[, %institution%]]}]]}]]}{%year%[[ (%year%)]]}{%pages%[[, %pages%]]}.";
-       
+
        map<string, string>::const_iterator it = cite_formats_.find(entry_type);
        if (it != cite_formats_.end())
                return it->second;