var htmlOutputBinding = new OutputBinding(); $.extend(htmlOutputBinding, { find: function(scope) { return $(scope).find('.shiny-html-output'); }, onValueError: function(el, err) { exports.unbindAll(el); this.renderError(el, err); }, renderValue: function(el, data) { exports.unbindAll(el); var html; var dependencies = []; if (data === null) { html = ''; } else if (typeof(data) === 'string') { html = data; } else if (typeof(data) === 'object') { html = data.html; dependencies = data.deps; } exports.renderHtml(html, el, dependencies); exports.initializeInputs(el); exports.bindAll(el); } }); outputBindings.register(htmlOutputBinding, 'shiny.htmlOutput'); var renderDependencies = exports.renderDependencies = function(dependencies) { if (dependencies) { $.each(dependencies, function(i, dep) { renderDependency(dep); }); } }; // Render HTML in a DOM element, inserting singletons into head as needed exports.renderHtml = function(html, el, dependencies) { renderDependencies(dependencies); return singletons.renderHtml(html, el); }; var htmlDependencies = {}; function registerDependency(name, version) { htmlDependencies[name] = version; } // Client-side dependency resolution and rendering function renderDependency(dep) { if (htmlDependencies.hasOwnProperty(dep.name)) return false; registerDependency(dep.name, dep.version); var href = dep.src.href; var $head = $("head").first(); if (dep.meta) { var metas = $.map(asArray(dep.meta), function(content, name) { return $("").attr("name", name).attr("content", content); }); $head.append(metas); } if (dep.stylesheet) { var stylesheets = $.map(asArray(dep.stylesheet), function(stylesheet) { return $("") .attr("href", href + "/" + encodeURI(stylesheet)); }); $head.append(stylesheets); } if (dep.script) { var scripts = $.map(asArray(dep.script), function(scriptName) { return $("