X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FTextClass.cpp;h=80cb6f8e2a314b71a51c22f1457bf7b0a2d03b16;hb=5366666c831b6ad726e848a60d738b57ec8b0501;hp=4cc5eba0edf59d7832585af6733fcaeae7ae58b6;hpb=fb7b7e5223bc0a03e5b4a89b15f1be0bc0d05385;p=lyx.git diff --git a/src/TextClass.cpp b/src/TextClass.cpp index 4cc5eba0ed..80cb6f8e2a 100644 --- a/src/TextClass.cpp +++ b/src/TextClass.cpp @@ -16,22 +16,19 @@ #include "TextClass.h" -#include "LayoutFile.h" #include "CiteEnginesList.h" -#include "Color.h" #include "Counters.h" #include "Floating.h" #include "FloatList.h" #include "Layout.h" +#include "LayoutFile.h" #include "Lexer.h" -#include "Font.h" #include "ModuleList.h" #include "frontends/alert.h" #include "support/lassert.h" #include "support/debug.h" -#include "support/ExceptionMessage.h" #include "support/FileName.h" #include "support/filetools.h" #include "support/gettext.h" @@ -62,7 +59,7 @@ namespace lyx { // You should also run the development/tools/updatelayouts.py script, // to update the format of all of our layout files. // -int const LAYOUT_FORMAT = 82; // dourouc05: DocBook additions. +int const LAYOUT_FORMAT = 91; // spitz: InputGlobal method // Layout format for the current lyx file format. Controls which format is @@ -148,10 +145,10 @@ TextClass::TextClass() } -bool TextClass::readStyle(Lexer & lexrc, Layout & lay) const +bool TextClass::readStyle(Lexer & lexrc, Layout & lay, ReadType rt) const { LYXERR(Debug::TCLASS, "Reading style " << to_utf8(lay.name())); - if (!lay.read(lexrc, *this)) { + if (!lay.read(lexrc, *this, rt == VALIDATION)) { LYXERR0("Error parsing style `" << to_utf8(lay.name()) << '\''); return false; } @@ -168,6 +165,7 @@ enum TextClassTags { TC_OUTPUTTYPE = 1, TC_OUTPUTFORMAT, TC_INPUT, + TC_INPUT_GLOBAL, TC_STYLE, TC_MODIFYSTYLE, TC_PROVIDESTYLE, @@ -252,6 +250,7 @@ LexerKeyword textClassTags[] = { { "htmltocsection", TC_HTMLTOCSECTION }, { "ifcounter", TC_IFCOUNTER }, { "input", TC_INPUT }, + { "inputglobal", TC_INPUT_GLOBAL }, { "insetlayout", TC_INSETLAYOUT }, { "leftmargin", TC_LEFTMARGIN }, { "maxcitenames", TC_MAXCITENAMES }, @@ -435,6 +434,7 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) bool modifystyle = false; bool providestyle = false; bool ifcounter = false; + bool only_global = false; switch (static_cast(le)) { @@ -462,6 +462,9 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) } break; + case TC_INPUT_GLOBAL: + only_global = true; + // fall through case TC_INPUT: // Include file if (lexrc.next()) { FileName tmp; @@ -469,9 +472,13 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) if (!path().empty() && (prefixIs(inc, "./") || prefixIs(inc, "../"))) tmp = fileSearch(path(), inc, "layout"); - else + else { + // InputGlobal only searches in the system and + // build directories. This allows to reuse and + // modify files in the user directory. tmp = libFileSearch("layouts", inc, - "layout"); + "layout", must_exist, only_global); + } if (tmp.empty()) { lexrc.printError("Could not find input file: " + inc); @@ -515,7 +522,7 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) Layout lay; // Since we couldn't read the name, we just scan the rest // of the style and discard it. - error = !readStyle(lexrc, lay); + error = !readStyle(lexrc, lay, rt); break; } @@ -526,14 +533,14 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) // block. if (have_layout && !providestyle) { Layout & lay = operator[](name); - error = !readStyle(lexrc, lay); + error = !readStyle(lexrc, lay, rt); } // If the layout does not exist, then we want to create a new // one, but not if we are in a ModifyStyle block. else if (!have_layout && !modifystyle) { Layout layout; layout.setName(name); - error = !readStyle(lexrc, layout); + error = !readStyle(lexrc, layout, rt); if (!error) layoutlist_.push_back(layout); @@ -551,7 +558,7 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) else { Layout lay; // signal to coverity that we do not care about the result - (void)readStyle(lexrc, lay); + (void)readStyle(lexrc, lay, rt); } break; } @@ -1378,6 +1385,7 @@ bool TextClass::readFloat(Lexer & lexrc) FT_HTMLTAG, FT_DOCBOOKATTR, FT_DOCBOOKTAG, + FT_DOCBOOKTAGTYPE, FT_LISTCOMMAND, FT_REFPREFIX, FT_ALLOWED_PLACEMENT, @@ -1393,6 +1401,7 @@ bool TextClass::readFloat(Lexer & lexrc) { "allowswide", FT_ALLOWS_WIDE }, { "docbookattr", FT_DOCBOOKATTR }, { "docbooktag", FT_DOCBOOKTAG }, + { "docbooktagtype", FT_DOCBOOKTAGTYPE }, { "end", FT_END }, { "extension", FT_EXT }, { "guiname", FT_NAME }, @@ -1419,6 +1428,7 @@ bool TextClass::readFloat(Lexer & lexrc) string htmltag; string docbookattr; string docbooktag; + string docbooktagtype; string listname; string listcommand; string name; @@ -1540,6 +1550,10 @@ bool TextClass::readFloat(Lexer & lexrc) lexrc.next(); docbooktag = lexrc.getString(); break; + case FT_DOCBOOKTAGTYPE: + lexrc.next(); + docbooktagtype = lexrc.getString(); + break; case FT_END: getout = true; break; @@ -1567,9 +1581,9 @@ bool TextClass::readFloat(Lexer & lexrc) } Floating fl(type, placement, ext, within, style, name, listname, listcommand, refprefix, allowed_placement, - htmltag, htmlattr, htmlstyle, docbooktag, docbookattr, - required, usesfloat, ispredefined, allowswide, - allowssideways); + htmltag, htmlattr, htmlstyle, docbookattr, + docbooktagtype, required, usesfloat, ispredefined, + allowswide, allowssideways); floatlist_.newFloat(fl); // each float has its own counter counters_.newCounter(from_ascii(type), from_ascii(within), @@ -1855,7 +1869,7 @@ Layout TextClass::createBasicLayout(docstring const & name, bool unknown) const defaultLayout = new Layout; defaultLayout->setUnknown(unknown); defaultLayout->setName(name); - if (!readStyle(lex, *defaultLayout)) { + if (!readStyle(lex, *defaultLayout, BASECLASS)) { // The only way this happens is because the hardcoded layout above // is wrong. LATTEST(false); @@ -1864,25 +1878,26 @@ Layout TextClass::createBasicLayout(docstring const & name, bool unknown) const } -DocumentClassPtr getDocumentClass( - LayoutFile const & baseClass, LayoutModuleList const & modlist, - string const & cengine, bool const clone) +DocumentClassPtr getDocumentClass(LayoutFile const & baseClass, LayoutModuleList const & modlist, + string const & cengine, bool clone, bool internal) { + bool const show_warnings = !clone && !internal; DocumentClassPtr doc_class = DocumentClassPtr(new DocumentClass(baseClass)); for (auto const & mod : modlist) { LyXModule * lm = theModuleList[mod]; if (!lm) { - docstring const msg = - bformat(_("The module %1$s has been requested by\n" - "this document but has not been found in the list of\n" - "available modules. If you recently installed it, you\n" - "probably need to reconfigure LyX.\n"), from_utf8(mod)); - if (!clone) + if (show_warnings) { + docstring const msg = + bformat(_("The module %1$s has been requested by\n" + "this document but has not been found in the list of\n" + "available modules. If you recently installed it, you\n" + "probably need to reconfigure LyX.\n"), from_utf8(mod)); frontend::Alert::warning(_("Module not available"), msg); + } continue; } - if (!lm->isAvailable() && !clone) { + if (!lm->isAvailable() && show_warnings) { docstring const prereqs = from_utf8(getStringFromVector(lm->prerequisites(), "\n\t")); docstring const msg = bformat(_("The module %1$s requires a package that is not\n" @@ -1897,7 +1912,7 @@ DocumentClassPtr getDocumentClass( FileName layout_file = libFileSearch("layouts", lm->getFilename()); if (!doc_class->read(layout_file, TextClass::MODULE)) { docstring const msg = - bformat(_("Error reading module %1$s\n"), from_utf8(mod)); + bformat(_("Error reading module %1$s\n"), from_utf8(mod)); frontend::Alert::warning(_("Read Error"), msg); } } @@ -1907,14 +1922,15 @@ DocumentClassPtr getDocumentClass( LyXCiteEngine * ce = theCiteEnginesList[cengine]; if (!ce) { - docstring const msg = - bformat(_("The cite engine %1$s has been requested by\n" - "this document but has not been found in the list of\n" - "available engines. If you recently installed it, you\n" - "probably need to reconfigure LyX.\n"), from_utf8(cengine)); - if (!clone) + if (show_warnings) { + docstring const msg = + bformat(_("The cite engine %1$s has been requested by\n" + "this document but has not been found in the list of\n" + "available engines. If you recently installed it, you\n" + "probably need to reconfigure LyX.\n"), from_utf8(cengine)); frontend::Alert::warning(_("Cite Engine not available"), msg); - } else if (!ce->isAvailable() && !clone) { + } + } else if (!ce->isAvailable() && show_warnings) { docstring const prereqs = from_utf8(getStringFromVector(ce->prerequisites(), "\n\t")); docstring const msg = bformat(_("The cite engine %1$s requires a package that is not\n" @@ -1929,7 +1945,7 @@ DocumentClassPtr getDocumentClass( FileName layout_file = libFileSearch("citeengines", ce->getFilename()); if (!doc_class->read(layout_file, TextClass::CITE_ENGINE)) { docstring const msg = - bformat(_("Error reading cite engine %1$s\n"), from_utf8(cengine)); + bformat(_("Error reading cite engine %1$s\n"), from_utf8(cengine)); frontend::Alert::warning(_("Read Error"), msg); } } @@ -2041,6 +2057,7 @@ vector const DocumentClass::citeCommands( { vector const styles = citeStyles(type); vector cmds; + cmds.reserve(styles.size()); for (auto const & cs : styles) cmds.push_back(cs.name);