From 4cd5bcefe9e54468df2454a8f6123526adc50aa0 Mon Sep 17 00:00:00 2001 From: Richard Heck Date: Wed, 17 Mar 2010 12:23:24 +0000 Subject: [PATCH] Introduce a RefPrefix tag for Style, InsetLayout, and Float, that indicates what prefix to use when constructing formatted references. Documentation to follow. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@33784 a592a061-630c-0410-9148-cb99ea01b6c8 --- lib/layouts/stdfloats.inc | 3 +++ lib/layouts/stdinsets.inc | 3 +++ lib/layouts/stdsections.inc | 7 ++++++ lib/scripts/layout2layout.py | 10 +++++++- src/Floating.cpp | 5 ++-- src/Floating.h | 5 ++++ src/Layout.cpp | 6 +++++ src/Layout.h | 2 ++ src/Text.cpp | 44 +++++++++++++++--------------------- src/TextClass.cpp | 28 +++++++++++++++-------- src/insets/InsetLayout.cpp | 5 ++++ src/insets/InsetLayout.h | 4 ++++ 12 files changed, 83 insertions(+), 39 deletions(-) diff --git a/lib/layouts/stdfloats.inc b/lib/layouts/stdfloats.inc index 37c28fa095..30055c962f 100644 --- a/lib/layouts/stdfloats.inc +++ b/lib/layouts/stdfloats.inc @@ -16,6 +16,7 @@ Float ListName "List of Tables" NeedsFloatPkg false ListCommand listoftables + RefPrefix tab End @@ -29,6 +30,7 @@ Float ListName "List of Figures" NeedsFloatPkg false ListCommand listoffigures + RefPrefix fig End @@ -41,4 +43,5 @@ Float Style ruled ListName "List of Algorithms" NeedsFloatPkg true + RefPrefix alg End diff --git a/lib/layouts/stdinsets.inc b/lib/layouts/stdinsets.inc index 85b437975f..f5bc890946 100644 --- a/lib/layouts/stdinsets.inc +++ b/lib/layouts/stdinsets.inc @@ -97,6 +97,7 @@ InsetLayout Foot Size Small EndFont MultiPar true + RefPrefix fn HTMLLabel \arabic{footnote} HTMLInnerTag div HTMLStyle @@ -223,6 +224,7 @@ InsetLayout Listings KeepEmpty true FreeSpacing true ForceLTR true + RefPrefix lst End InsetLayout Branch @@ -292,6 +294,7 @@ InsetLayout Wrap Size Small EndFont MultiPar true + RefPrefix wrap HTMLStyle div.wrap { float: right; diff --git a/lib/layouts/stdsections.inc b/lib/layouts/stdsections.inc index fa144c0e86..1a75379e7f 100644 --- a/lib/layouts/stdsections.inc +++ b/lib/layouts/stdsections.inc @@ -26,6 +26,7 @@ Style Part BottomSep 4 ParSep 0.8 Align Center + RefPrefix part Alignpossible Center Font Series Bold @@ -53,6 +54,7 @@ Style Chapter ParSep 0.8 Align Block OptionalArgs 1 + RefPrefix cha Font Series Bold Size Huge @@ -78,6 +80,7 @@ Style Section ParSep 0.7 Align Block OptionalArgs 1 + RefPrefix sec Font Series Bold Size Larger @@ -98,6 +101,7 @@ Style Subsection Series Bold Size Large EndFont + RefPrefix sub HTMLTag h3 End @@ -113,6 +117,7 @@ Style Subsubsection Series Bold Size Normal EndFont + RefPrefix sub HTMLTag h4 End @@ -124,6 +129,7 @@ Style Paragraph LatexName paragraph TopSep 0.4 BottomSep 0 + RefPrefix par End @@ -134,6 +140,7 @@ Style Subparagraph LatexName subparagraph NextNoIndent 0 LeftMargin MM + RefPrefix subp End Input numarticle.inc diff --git a/lib/scripts/layout2layout.py b/lib/scripts/layout2layout.py index 71f0c9fc54..e93966a814 100644 --- a/lib/scripts/layout2layout.py +++ b/lib/scripts/layout2layout.py @@ -88,6 +88,9 @@ import os, re, string, sys # 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 @@ import os, re, string, sys # 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 @@ def convert(lines): 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]) diff --git a/src/Floating.cpp b/src/Floating.cpp index 8cfdf8d746..cf48630f69 100644 --- a/src/Floating.cpp +++ b/src/Floating.cpp @@ -31,12 +31,13 @@ Floating::Floating(string const & type, string const & placement, 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) {} diff --git a/src/Floating.h b/src/Floating.h index 358bedf0bd..d50fa90870 100644 --- a/src/Floating.h +++ b/src/Floating.h @@ -32,6 +32,7 @@ public: 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 @@ public: /// 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 @@ private: /// std::string listcommand_; /// + std::string refprefix_; + /// bool needsfloatpkg_; /// mutable std::string html_tag_; diff --git a/src/Layout.cpp b/src/Layout.cpp index c9abc0e04e..7a26c8cf65 100644 --- a/src/Layout.cpp +++ b/src/Layout.cpp @@ -105,6 +105,7 @@ enum LayoutTags { LT_INPREAMBLE, LT_HTMLTITLE, LT_SPELLCHECK, + LT_REFPREFIX, LT_INTITLE // keep this last! }; @@ -212,6 +213,7 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) { "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 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) requires_.insert(req.begin(), req.end()); break; } + + case LT_REFPREFIX: + lex >> refprefix; + break; case LT_HTMLTAG: lex >> htmltag_; diff --git a/src/Layout.h b/src/Layout.h index 8cea104193..73edd052fc 100644 --- a/src/Layout.h +++ b/src/Layout.h @@ -245,6 +245,8 @@ public: int optionalargs; /// Which counter to step docstring counter; + /// Prefix to use when creating labels + docstring refprefix; /// Depth of XML command int commanddepth; diff --git a/src/Text.cpp b/src/Text.cpp index 20accf5562..8035739390 100644 --- a/src/Text.cpp +++ b/src/Text.cpp @@ -1864,40 +1864,32 @@ docstring Text::getPossibleLabel(Cursor const & cur) const } } 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(caption_inset)->type()); - - // If none of the above worked, we'll see if we're inside various - // types of insets and take our abbreviation from them. - 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; - } + if (caption_inset) { + string const & ftype = static_cast(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)); } - // 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 none of the above worked, see if the inset knows. + if (name.empty()) { + InsetLayout const & il = cur.inset().getLayout(); + name = il.refprefix(); + } 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; } diff --git a/src/TextClass.cpp b/src/TextClass.cpp index ce66cf8560..7adad256be 100644 --- a/src/TextClass.cpp +++ b/src/TextClass.cpp @@ -66,7 +66,7 @@ private: }; // 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 @@ void TextClass::readFloat(Lexer & lexrc) FT_HTMLATTR, FT_HTMLTAG, FT_LISTCOMMAND, + FT_REFPREFIX, FT_END }; @@ -876,6 +877,7 @@ void TextClass::readFloat(Lexer & lexrc) { "needsfloatpkg", FT_NEEDSFLOAT }, { "numberwithin", FT_WITHIN }, { "placement", FT_PLACEMENT }, + { "refprefix", FT_REFPREFIX }, { "style", FT_STYLE }, { "type", FT_TYPE } }; @@ -886,10 +888,11 @@ void TextClass::readFloat(Lexer & lexrc) 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 @@ void TextClass::readFloat(Lexer & lexrc) 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 @@ void TextClass::readFloat(Lexer & lexrc) 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 @@ void TextClass::readFloat(Lexer & lexrc) // 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), diff --git a/src/insets/InsetLayout.cpp b/src/insets/InsetLayout.cpp index ba1bbfb3e5..3aba74eef0 100644 --- a/src/insets/InsetLayout.cpp +++ b/src/insets/InsetLayout.cpp @@ -106,6 +106,7 @@ bool InsetLayout::read(Lexer & lex, TextClass const & tclass) IL_PREAMBLE, IL_REQUIRES, IL_SPELLCHECK, + IL_REFPREFIX, IL_END }; @@ -143,6 +144,7 @@ bool InsetLayout::read(Lexer & lex, TextClass const & tclass) { "needprotect", IL_NEEDPROTECT }, { "passthru", IL_PASSTHRU }, { "preamble", IL_PREAMBLE }, + { "refprefix", IL_REFPREFIX }, { "requires", IL_REQUIRES }, { "spellcheck", IL_SPELLCHECK } }; @@ -290,6 +292,9 @@ bool InsetLayout::read(Lexer & lex, TextClass const & tclass) case IL_PREAMBLE: preamble_ = from_utf8(lex.getLongString("EndPreamble")); break; + case IL_REFPREFIX: + lex >> refprefix_; + break; case IL_HTMLTAG: lex >> htmltag_; break; diff --git a/src/insets/InsetLayout.h b/src/insets/InsetLayout.h index 0fcbad20d0..3fdc17f8ce 100644 --- a/src/insets/InsetLayout.h +++ b/src/insets/InsetLayout.h @@ -84,6 +84,8 @@ public: 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 @@ private: /// docstring preamble_; /// + docstring refprefix_; + /// mutable std::string htmltag_; /// mutable std::string htmlattr_;