Somewhat preparatory to a patch converting us from prettyref to refstyle, this patch introduces RefPrefix tags for Layouts, InsetLayouts, and Floats, that tell us what prefix to use when making labels. This gets rid of lots of ugly hard-coding in Text::getPossibleLabel(), which will only get worse with refstyle.
Comments welcome, of course, but the main question is for Pavel: Can this go now, or do you want me to wait?
Richard
Index: src/Floating.cpp =================================================================== --- src/Floating.cpp (revision 33726) +++ src/Floating.cpp (working copy) @@ -31,12 +31,13 @@ string const & ext, string const & within, string const & style, string const & name, string const & listName, std::string const & listCmd, + string const & refPrefix, string const & htmlTag, string const & htmlAttrib, string const & htmlStyle, bool needsfloat) : floattype_(type), placement_(placement), ext_(ext), within_(within), style_(style), name_(name), listname_(listName), listcommand_(listCmd), - needsfloatpkg_(needsfloat), html_tag_(htmlTag), html_attrib_(htmlAttrib), - html_style_(htmlStyle) + refprefix_(refPrefix), needsfloatpkg_(needsfloat), html_tag_(htmlTag), + html_attrib_(htmlAttrib), html_style_(htmlStyle) {} Index: src/Floating.h =================================================================== --- src/Floating.h (revision 33726) +++ src/Floating.h (working copy) @@ -32,6 +32,7 @@ std::string const & ext, std::string const & within, std::string const & style, std::string const & name, std::string const & listName, std::string const & listCmd, + std::string const & refPrefix, std::string const & htmlType, std::string const & htmlClass, std::string const & htmlStyle, bool builtin = false); /// @@ -52,6 +53,8 @@ /// if needsFloatPkg() is false. note that this should not contain /// the leading "\". std::string const & listCommand() const { return listcommand_; } + /// prefix to use for formatted references to such floats + std::string const & refPrefix() const { return refprefix_; } /// bool needsFloatPkg() const { return needsfloatpkg_; } /// style information, for preamble @@ -80,6 +83,8 @@ /// std::string listcommand_; /// + std::string refprefix_; + /// bool needsfloatpkg_; /// mutable std::string html_tag_; Index: src/insets/InsetLayout.cpp =================================================================== --- src/insets/InsetLayout.cpp (revision 33726) +++ src/insets/InsetLayout.cpp (working copy) @@ -106,6 +106,7 @@ IL_PREAMBLE, IL_REQUIRES, IL_SPELLCHECK, + IL_REFPREFIX, IL_END }; @@ -143,6 +144,7 @@ { "needprotect", IL_NEEDPROTECT }, { "passthru", IL_PASSTHRU }, { "preamble", IL_PREAMBLE }, + { "refprefix", IL_REFPREFIX }, { "requires", IL_REQUIRES }, { "spellcheck", IL_SPELLCHECK } }; @@ -290,6 +292,9 @@ case IL_PREAMBLE: preamble_ = from_utf8(lex.getLongString("EndPreamble")); break; + case IL_REFPREFIX: + lex >> refprefix_; + break; case IL_HTMLTAG: lex >> htmltag_; break; Index: src/insets/InsetLayout.h =================================================================== --- src/insets/InsetLayout.h (revision 33726) +++ src/insets/InsetLayout.h (working copy) @@ -84,6 +84,8 @@ docstring preamble() const { return preamble_; } /// docstring counter() const { return counter_; } + /// + docstring refprefix() const { return refprefix_; } /// The tag enclosing all the material in this inset. Default is "span". std::string const & htmltag() const; /// Additional attributes for inclusion with the start tag. Default (if @@ -176,6 +178,8 @@ /// docstring preamble_; /// + docstring refprefix_; + /// mutable std::string htmltag_; /// mutable std::string htmlattr_; Index: src/Layout.cpp =================================================================== --- src/Layout.cpp (revision 33726) +++ src/Layout.cpp (working copy) @@ -105,6 +105,7 @@ LT_INPREAMBLE, LT_HTMLTITLE, LT_SPELLCHECK, + LT_REFPREFIX, LT_INTITLE // keep this last! }; @@ -212,6 +213,7 @@ { "parskip", LT_PARSKIP }, { "passthru", LT_PASS_THRU }, { "preamble", LT_PREAMBLE }, + { "refprefix", LT_REFPREFIX }, { "requires", LT_REQUIRES }, { "rightmargin", LT_RIGHTMARGIN }, { "spacing", LT_SPACING }, @@ -497,6 +499,10 @@ requires_.insert(req.begin(), req.end()); break; } + + case LT_REFPREFIX: + lex >> refprefix; + break; case LT_HTMLTAG: lex >> htmltag_; Index: src/Layout.h =================================================================== --- src/Layout.h (revision 33726) +++ src/Layout.h (working copy) @@ -245,6 +245,8 @@ int optionalargs; /// Which counter to step docstring counter; + /// Prefix to use when creating labels + docstring refprefix; /// Depth of XML command int commanddepth; Index: src/TextClass.cpp =================================================================== --- src/TextClass.cpp (revision 33726) +++ src/TextClass.cpp (working copy) @@ -66,7 +66,7 @@ }; // Keep the changes documented in the Customization manual. -int const FORMAT = 24; +int const FORMAT = 25; bool layout2layout(FileName const & filename, FileName const & tempfile) @@ -861,6 +861,7 @@ FT_HTMLATTR, FT_HTMLTAG, FT_LISTCOMMAND, + FT_REFPREFIX, FT_END }; @@ -876,6 +877,7 @@ { "needsfloatpkg", FT_NEEDSFLOAT }, { "numberwithin", FT_WITHIN }, { "placement", FT_PLACEMENT }, + { "refprefix", FT_REFPREFIX }, { "style", FT_STYLE }, { "type", FT_TYPE } }; @@ -886,10 +888,11 @@ string htmlattr; string htmlstyle; string htmltag; - string listName; - string listCommand; + string listname; + string listcommand; string name; string placement; + string refprefix; string style; string type; string within; @@ -915,9 +918,10 @@ within = fl.within(); style = fl.style(); name = fl.name(); - listName = fl.listName(); + listname = fl.listName(); needsfloat = fl.needsFloatPkg(); - listCommand = fl.listCommand(); + listcommand = fl.listCommand(); + refprefix = fl.refPrefix(); } break; case FT_NAME: @@ -944,11 +948,15 @@ break; case FT_LISTCOMMAND: lexrc.next(); - listCommand = lexrc.getString(); + listcommand = lexrc.getString(); break; + case FT_REFPREFIX: + lexrc.next(); + refprefix = lexrc.getString(); + break; case FT_LISTNAME: lexrc.next(); - listName = lexrc.getString(); + listname = lexrc.getString(); break; case FT_NEEDSFLOAT: lexrc.next(); @@ -974,13 +982,13 @@ // Here we have a full float if getout == true if (getout) { - if (!needsfloat && listCommand.empty()) + if (!needsfloat && listcommand.empty()) LYXERR0("The layout does not provide a list command " << "for the builtin float `" << type << "'. LyX will " << "not be able to produce a float list."); Floating fl(type, placement, ext, within, style, name, - listName, listCommand, htmltag, htmlattr, htmlstyle, - needsfloat); + listname, listcommand, refprefix, + htmltag, htmlattr, htmlstyle, needsfloat); floatlist_.newFloat(fl); // each float has its own counter counters_.newCounter(from_ascii(type), from_ascii(within), Index: src/Text.cpp =================================================================== --- src/Text.cpp (revision 33726) +++ src/Text.cpp (working copy) @@ -1864,40 +1864,32 @@ } } if (layout->latextype != LATEX_PARAGRAPH) - name = from_ascii(layout->latexname()); + name = layout->refprefix; // for captions, we just take the caption type Inset * caption_inset = cur.innerInsetOfType(CAPTION_CODE); - if (caption_inset) - name = from_ascii(static_cast<InsetCaption *>(caption_inset)->type()); + if (caption_inset) { + string const & ftype = static_cast<InsetCaption *>(caption_inset)->type(); + FloatList const & fl = cur.buffer()->params().documentClass().floats(); + if (fl.typeExist(ftype)) { + Floating const & flt = fl.getType(ftype); + name = from_utf8(flt.refPrefix()); + } + if (name.empty()) + name = from_utf8(ftype.substr(0,3)); + } - // If none of the above worked, we'll see if we're inside various - // types of insets and take our abbreviation from them. + // If none of the above worked, see if the inset knows. if (name.empty()) { - InsetCode const codes[] = { - FLOAT_CODE, - WRAP_CODE, - FOOT_CODE - }; - for (unsigned int i = 0; i < (sizeof codes / sizeof codes[0]); ++i) { - Inset * float_inset = cur.innerInsetOfType(codes[i]); - if (float_inset) { - name = float_inset->name(); - break; - } - } + InsetLayout const & il = cur.inset().getLayout(); + name = il.refprefix(); } - // Create a correct prefix for prettyref - if (name == "theorem") - name = from_ascii("thm"); - else if (name == "Foot") - name = from_ascii("fn"); - else if (name == "listing") - name = from_ascii("lst"); - if (!name.empty()) - text = name.substr(0, 3) + ':' + text; + // FIXME + // we should allow customization of the separator or else change it + // once we have refstyle + text = name + ':' + text; return text; } Index: lib/layouts/stdfloats.inc =================================================================== --- lib/layouts/stdfloats.inc (revision 33726) +++ lib/layouts/stdfloats.inc (working copy) @@ -16,6 +16,7 @@ ListName "List of Tables" NeedsFloatPkg false ListCommand listoftables + RefPrefix tab End @@ -29,6 +30,7 @@ ListName "List of Figures" NeedsFloatPkg false ListCommand listoffigures + RefPrefix fig End @@ -41,4 +43,5 @@ Style ruled ListName "List of Algorithms" NeedsFloatPkg true + RefPrefix alg End Index: lib/layouts/stdinsets.inc =================================================================== --- lib/layouts/stdinsets.inc (revision 33726) +++ lib/layouts/stdinsets.inc (working copy) @@ -97,6 +97,7 @@ Size Small EndFont MultiPar true + RefPrefix fn HTMLLabel \arabic{footnote} HTMLInnerTag div HTMLStyle @@ -223,6 +224,7 @@ KeepEmpty true FreeSpacing true ForceLTR true + RefPrefix lst End InsetLayout Branch @@ -292,6 +294,7 @@ Size Small EndFont MultiPar true + RefPrefix wrap HTMLStyle div.wrap { float: right; Index: lib/layouts/stdsections.inc =================================================================== --- lib/layouts/stdsections.inc (revision 33726) +++ lib/layouts/stdsections.inc (working copy) @@ -26,6 +26,7 @@ BottomSep 4 ParSep 0.8 Align Center + RefPrefix part Alignpossible Center Font Series Bold @@ -53,6 +54,7 @@ ParSep 0.8 Align Block OptionalArgs 1 + RefPrefix cha Font Series Bold Size Huge @@ -78,6 +80,7 @@ ParSep 0.7 Align Block OptionalArgs 1 + RefPrefix sec Font Series Bold Size Larger @@ -98,6 +101,7 @@ Series Bold Size Large EndFont + RefPrefix sub HTMLTag h3 End @@ -113,6 +117,7 @@ Series Bold Size Normal EndFont + RefPrefix sub HTMLTag h4 End @@ -124,6 +129,7 @@ LatexName paragraph TopSep 0.4 BottomSep 0 + RefPrefix par End @@ -134,6 +140,7 @@ LatexName subparagraph NextNoIndent 0 LeftMargin MM + RefPrefix subp End Input numarticle.inc Index: lib/scripts/layout2layout.py =================================================================== --- lib/scripts/layout2layout.py (revision 33726) +++ lib/scripts/layout2layout.py (working copy) @@ -88,6 +88,9 @@ # Changed LaTeXBuiltin tag to NeedsFloatPkg and # added new tag ListCommand. +# Incremented to format 25, 12 March 2010 by rgh +# Added RefPrefix tag for layouts and floats. + # Do not forget to document format change in Customization # Manual (section "Declaring a new text class"). @@ -95,7 +98,7 @@ # development/tools/updatelayouts.sh script to update all # layout files to the new format. -currentFormat = 24 +currentFormat = 25 def usage(prog_name): @@ -266,6 +269,11 @@ while i < len(lines) and not re_EndBabelPreamble.match(lines[i]): i += 1 continue + + # Only new features + if format == 24: + i += 1 + continue if format == 23: match = re_Float.match(lines[i])