+ 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 = translateIfPossible(from_ascii("elsewhere"),
+ op.local_font->language()->lang());
+ else if (cmd == "eqref")
+ display_string = '(' + value + ')';
+ else if (cmd == "formatted")
+ display_string = il->prettyCounter();
+ else if (cmd == "nameref")
+ // FIXME We don't really have the ability to handle these
+ // properly in XHTML output yet (bug #8599).
+ // It might not be that hard to do. We have the InsetLabel,
+ // and we can presumably find its paragraph using the TOC.
+ // But the label might be referencing a section, yet not be
+ // in that section. So this is not trivial.
+ 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();