+docstring InsetRef::xhtml(XHTMLStream & xs, OutputParams const &) const
+{
+ docstring const & ref = getParam("reference");
+ InsetLabel const * il = buffer().insetLabel(ref);
+ string const & cmd = params().getCmdName();
+ docstring display_string;
+
+ if (il && !il->counterValue().empty()) {
+ // Try to construct a label from the InsetLabel we reference.
+ docstring const & value = il->counterValue();
+ if (cmd == "ref")
+ display_string = value;
+ else if (cmd == "vref")
+ // normally, would be "ref on page #", but we have no pages
+ display_string = value;
+ else if (cmd == "pageref" || cmd == "vpageref")
+ // normally would be "on page #", but we have no pages
+ display_string = _("elsewhere");
+ else if (cmd == "eqref")
+ display_string = bformat(from_ascii("equation (%1$s)"), value);
+ else if (cmd == "formatted"
+ // we don't really have the ability to handle these
+ // properly in XHTML output
+ || cmd == "nameref")
+ display_string = il->prettyCounter();
+ } else
+ display_string = ref;
+
+ // FIXME What we'd really like to do is to be able to output some
+ // appropriate sort of text here. But to do that, we need to associate
+ // some sort of counter with the label, and we don't have that yet.
+ string const attr = "href=\"#" + html::cleanAttr(to_utf8(ref)) + "\"";
+ xs << html::StartTag("a", attr);
+ xs << display_string;
+ xs << html::EndTag("a");
+ return docstring();
+}
+
+
+void InsetRef::toString(odocstream & os) const
+{
+ plaintext(os, OutputParams(0));
+}
+
+
+void InsetRef::forToc(docstring & os, size_t) const
+{
+ // There's no need for details in the TOC, and a long label
+ // will just get in the way.
+ os += '#';
+}
+
+
+void InsetRef::updateBuffer(ParIterator const & it, UpdateType)
+{
+ docstring const & ref = getParam("reference");
+ // register this inset into the buffer reference cache.
+ buffer().references(ref).push_back(make_pair(this, it));
+
+ docstring label;
+ for (int i = 0; !types[i].latex_name.empty(); ++i) {
+ if (getCmdName() == types[i].latex_name) {
+ label = _(types[i].short_gui_name);
+ break;
+ }
+ }
+ label += ref;
+
+ if (!buffer().params().isLatex() && !getParam("name").empty()) {
+ label += "||";
+ label += getParam("name");
+ }
+
+ screen_label_ = label;
+ bool shortened = false;
+ unsigned int const maxLabelChars = 24;
+ if (screen_label_.size() > maxLabelChars) {
+ screen_label_.erase(maxLabelChars - 3);
+ screen_label_ += "...";
+ shortened = true;
+ }
+ if (shortened)
+ tooltip_ = label;
+ else
+ tooltip_ = from_ascii("");
+}
+
+
+void InsetRef::addToToc(DocIterator const & cpit) const