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.renderContent(el, data); } }); 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, add dependencies, and bind Shiny // inputs/outputs. `content` can be null, a string, or an object with // properties 'html' and 'deps'. exports.renderContent = function(el, content) { exports.unbindAll(el); var html; var dependencies = []; if (content === null) { html = ''; } else if (typeof(content) === 'string') { html = content; } else if (typeof(content) === 'object') { html = content.html; dependencies = content.deps || []; } exports.renderHtml(html, el, dependencies); exports.initializeInputs(el); exports.bindAll(el); }; // 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 $("