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])

Reply via email to