X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FTextClass.cpp;h=f6ec875167bec63b1b0186cbcdce79f05d840301;hb=26ba2a65838731ce639a09539f617cb0f0be3b22;hp=a58ae6dacd628f02509c633e473fb4164f5b68a5;hpb=59acb375d1f44f59726b50343c6bdf96f54206b3;p=lyx.git diff --git a/src/TextClass.cpp b/src/TextClass.cpp index a58ae6dacd..f6ec875167 100644 --- a/src/TextClass.cpp +++ b/src/TextClass.cpp @@ -59,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 = 88; // tcuvelier: add DocBookNotInPara +int const LAYOUT_FORMAT = 104; // rkh: RefFormat for counters // Layout format for the current lyx file format. Controls which format is @@ -165,11 +165,14 @@ enum TextClassTags { TC_OUTPUTTYPE = 1, TC_OUTPUTFORMAT, TC_INPUT, + TC_INPUT_GLOBAL, TC_STYLE, TC_MODIFYSTYLE, TC_PROVIDESTYLE, TC_DEFAULTSTYLE, TC_INSETLAYOUT, + TC_MODIFYINSETLAYOUT, + TC_PROVIDEINSETLAYOUT, TC_NOINSETLAYOUT, TC_NOSTYLE, TC_COLUMNS, @@ -249,9 +252,11 @@ LexerKeyword textClassTags[] = { { "htmltocsection", TC_HTMLTOCSECTION }, { "ifcounter", TC_IFCOUNTER }, { "input", TC_INPUT }, + { "inputglobal", TC_INPUT_GLOBAL }, { "insetlayout", TC_INSETLAYOUT }, { "leftmargin", TC_LEFTMARGIN }, { "maxcitenames", TC_MAXCITENAMES }, + { "modifyinsetlayout", TC_MODIFYINSETLAYOUT }, { "modifystyle", TC_MODIFYSTYLE }, { "nocounter", TC_NOCOUNTER }, { "nofloat", TC_NOFLOAT }, @@ -264,6 +269,7 @@ LexerKeyword textClassTags[] = { { "pagesize", TC_PAGESIZE }, { "pagestyle", TC_PAGESTYLE }, { "preamble", TC_PREAMBLE }, + { "provideinsetlayout", TC_PROVIDEINSETLAYOUT }, { "provides", TC_PROVIDES }, { "providesmodule", TC_PROVIDESMODULE }, { "providestyle", TC_PROVIDESTYLE }, @@ -429,9 +435,10 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) } // used below to track whether we are in an IfStyle or IfCounter tag. - bool modifystyle = false; - bool providestyle = false; + bool modify = false; + bool provide = false; bool ifcounter = false; + bool only_global = false; switch (static_cast(le)) { @@ -459,6 +466,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; @@ -466,9 +476,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); @@ -489,13 +503,13 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) break; case TC_MODIFYSTYLE: - modifystyle = true; + modify = true; // fall through case TC_PROVIDESTYLE: // if modifystyle is true, then we got here by falling through // so we are not in an ProvideStyle block - if (!modifystyle) - providestyle = true; + if (!modify) + provide = true; // fall through case TC_STYLE: { if (!lexrc.next()) { @@ -521,13 +535,13 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) // If the layout already exists, then we want to add it to // the existing layout, as long as we are not in an ProvideStyle // block. - if (have_layout && !providestyle) { + if (have_layout && !provide) { Layout & lay = operator[](name); 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) { + else if (!have_layout && !modify) { Layout layout; layout.setName(name); error = !readStyle(lexrc, layout, rt); @@ -677,7 +691,7 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) case TC_PKGOPTS : { lexrc.next(); string const pkg = lexrc.getString(); - lexrc.next(); + lexrc.eatLine(); string const options = lexrc.getString(); package_options_[pkg] = options; break; @@ -722,6 +736,15 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) rightmargin_ = lexrc.getDocString(); break; + case TC_MODIFYINSETLAYOUT: + modify = true; + // fall through + case TC_PROVIDEINSETLAYOUT: + // if modifyinsetlayout is true, then we got here by falling through + // so we are not in an ProvideInsetLayout block + if (!modify) + provide = true; + // fall through case TC_INSETLAYOUT: { if (!lexrc.next()) { lexrc.printError("No name given for InsetLayout: `$$Token'."); @@ -730,6 +753,7 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) } docstring const name = subst(lexrc.getDocString(), '_', ' '); bool const validating = (rt == VALIDATION); + bool const have_layout = name.empty() ? false : hasInsetLayout(name); if (name.empty()) { string s = "Could not read name for InsetLayout: `$$Token' " + lexrc.getString() + " is probably not valid UTF-8!"; @@ -742,15 +766,19 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) // in which case we want to report the error if (validating) error = true; - } else if (hasInsetLayout(name)) { + } else if (have_layout && !provide) { InsetLayout & il = insetlayoutlist_[name]; error = !il.read(lexrc, *this, validating); - } else { + } else if (!modify && !have_layout) { InsetLayout il; il.setName(name); error = !il.read(lexrc, *this, validating); if (!error) insetlayoutlist_[name] = il; + } else { + InsetLayout il; + // We just scan the rest of the style and discard it. + il.read(lexrc, *this); } break; } @@ -866,7 +894,7 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) error = !readOutlinerName(lexrc); break; - case TC_TABLESTYLE: + case TC_TABLESTYLE: lexrc.next(); tablestyle_ = rtrim(lexrc.getString()); break; @@ -1374,14 +1402,17 @@ bool TextClass::readFloat(Lexer & lexrc) FT_HTMLATTR, FT_HTMLTAG, FT_DOCBOOKATTR, + FT_DOCBOOKFLOATTYPE, FT_DOCBOOKTAG, FT_DOCBOOKTAGTYPE, + FT_DOCBOOKCAPTION, FT_LISTCOMMAND, FT_REFPREFIX, FT_ALLOWED_PLACEMENT, FT_ALLOWS_SIDEWAYS, FT_ALLOWS_WIDE, FT_REQUIRES, + FT_PRETTYFORMAT, FT_END }; @@ -1390,6 +1421,8 @@ bool TextClass::readFloat(Lexer & lexrc) { "allowssideways", FT_ALLOWS_SIDEWAYS }, { "allowswide", FT_ALLOWS_WIDE }, { "docbookattr", FT_DOCBOOKATTR }, + { "docbookcaption", FT_DOCBOOKCAPTION }, + { "docbookfloattype", FT_DOCBOOKFLOATTYPE }, { "docbooktag", FT_DOCBOOKTAG }, { "docbooktagtype", FT_DOCBOOKTAGTYPE }, { "end", FT_END }, @@ -1403,6 +1436,7 @@ bool TextClass::readFloat(Lexer & lexrc) { "listname", FT_LISTNAME }, { "numberwithin", FT_WITHIN }, { "placement", FT_PLACEMENT }, + { "prettyformat", FT_PRETTYFORMAT }, { "refprefix", FT_REFPREFIX }, { "requires", FT_REQUIRES }, { "style", FT_STYLE }, @@ -1417,8 +1451,10 @@ bool TextClass::readFloat(Lexer & lexrc) docstring htmlstyle; string htmltag; string docbookattr; + string docbookcaption; string docbooktag; string docbooktagtype; + string docbookfloattype; string listname; string listcommand; string name; @@ -1429,6 +1465,7 @@ bool TextClass::readFloat(Lexer & lexrc) string type; string within; string required; + docstring prettyformat; bool usesfloat = true; bool ispredefined = false; bool allowswide = true; @@ -1532,10 +1569,18 @@ bool TextClass::readFloat(Lexer & lexrc) lexrc.next(); htmltag = lexrc.getString(); break; + case FT_PRETTYFORMAT: + lexrc.next(); + prettyformat = lexrc.getDocString(); + break; case FT_DOCBOOKATTR: lexrc.next(); docbookattr = lexrc.getString(); break; + case FT_DOCBOOKCAPTION: + lexrc.next(); + docbookcaption = lexrc.getString(); + break; case FT_DOCBOOKTAG: lexrc.next(); docbooktag = lexrc.getString(); @@ -1544,9 +1589,16 @@ bool TextClass::readFloat(Lexer & lexrc) lexrc.next(); docbooktagtype = lexrc.getString(); break; + case FT_DOCBOOKFLOATTYPE: + lexrc.next(); + docbookfloattype = lexrc.getString(); + break; case FT_END: getout = true; break; + default: + LYXERR0("Unhandled value " << le << " in TextClass::readFloat."); + break; } } @@ -1571,19 +1623,22 @@ bool TextClass::readFloat(Lexer & lexrc) } Floating fl(type, placement, ext, within, style, name, listname, listcommand, refprefix, allowed_placement, - htmltag, htmlattr, htmlstyle, docbookattr, - docbooktagtype, required, usesfloat, ispredefined, + htmltag, htmlattr, htmlstyle, docbooktag, docbookattr, + docbooktagtype, docbookfloattype, docbookcaption, + required, usesfloat, ispredefined, allowswide, allowssideways); floatlist_.newFloat(fl); // each float has its own counter counters_.newCounter(from_ascii(type), from_ascii(within), docstring(), docstring(), + prettyformat.empty() ? bformat(_("%1$s ##"), _(name)) : prettyformat, bformat(_("%1$s (Float)"), _(name))); // also define sub-float counters docstring const subtype = "sub-" + from_ascii(type); counters_.newCounter(subtype, from_ascii(type), "\\alph{" + subtype + "}", docstring(), - bformat(_("Sub-%1$s (Float)"), _(name))); + prettyformat.empty() ? bformat(_("Sub-%1$s ##"), _(name)) : prettyformat, + bformat(_("Sub-%1$s (Float)"), _(name))); } return getout; } @@ -1721,7 +1776,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 Tools/Reconfigure..." << endl; } @@ -1868,25 +1923,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" @@ -1901,7 +1957,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); } } @@ -1911,14 +1967,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" @@ -1933,7 +1990,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); } }