+ if (encoding_switched){
+ // Switch back
+ switchEncoding(os.os(), buffer().params(), runparams, *save_enc, true);
+ runparams.encoding = save_enc;
+ }
+
+ if (!uncodable.empty() && !runparams.silent) {
+ // issue a warning about omitted characters
+ // FIXME: should be passed to the error dialog
+ if (!multibyte_possible && !runparams.encoding->hasFixedWidth())
+ frontend::Alert::warning(_("Uncodable characters in listings inset"),
+ bformat(_("The following characters in one of the program listings are\n"
+ "not representable in the current encoding and have been omitted:\n%1$s.\n"
+ "This is due to a restriction of the listings package, which does\n"
+ "not support your encoding '%2$s'.\n"
+ "Toggling 'Use non-TeX fonts' in Document > Settings...\n"
+ "might help."),
+ uncodable, _(runparams.encoding->guiName())));
+ else
+ frontend::Alert::warning(_("Uncodable characters in listings inset"),
+ bformat(_("The following characters in one of the program listings are\n"
+ "not representable in the current encoding and have been omitted:\n%1$s."),
+ uncodable));
+ }
+}
+
+
+docstring InsetListings::xhtml(XHTMLStream & os, OutputParams const & rp) const
+{
+ odocstringstream ods;
+ XHTMLStream out(ods);
+
+ bool const isInline = params().isInline();
+ if (isInline)
+ out << html::CompTag("br");
+ else {
+ out << html::StartTag("div", "class='float-listings'");
+ docstring caption = getCaptionHTML(rp);
+ if (!caption.empty())
+ out << html::StartTag("div", "class='listings-caption'")
+ << XHTMLStream::ESCAPE_NONE
+ << caption << html::EndTag("div");
+ }
+
+ InsetLayout const & il = getLayout();
+ string const & tag = il.htmltag();
+ string attr = "class ='listings";
+ string const lang = params().getParamValue("language");
+ if (!lang.empty())
+ attr += " " + lang;
+ attr += "'";
+ out << html::StartTag(tag, attr);
+ OutputParams newrp = rp;
+ newrp.html_disable_captions = true;
+ // We don't want to convert dashes here. That's the only conversion we
+ // do for XHTML, so this is safe.
+ newrp.pass_thru = true;
+ docstring def = InsetText::insetAsXHTML(out, newrp, InsetText::JustText);
+ out << html::EndTag(tag);
+
+ if (isInline) {
+ out << html::CompTag("br");
+ // escaping will already have been done
+ os << XHTMLStream::ESCAPE_NONE << ods.str();
+ } else {
+ out << html::EndTag("div");
+ // In this case, this needs to be deferred, but we'll put it
+ // before anything the text itself deferred.
+ def = ods.str() + '\n' + def;
+ }
+ return def;
+}
+
+
+string InsetListings::contextMenuName() const
+{
+ return "context-listings";