angular.module('examples', []) .directive('sourceEdit', function(getEmbeddedTemplate) { return { template: '
' + '' + ' Edit' + '' + '' + '
', scope: true, controller: function($scope, $attrs, openJsFiddle, openPlunkr) { var sources = { module: $attrs.sourceEdit, deps: read($attrs.sourceEditDeps), html: read($attrs.sourceEditHtml), css: read($attrs.sourceEditCss), js: read($attrs.sourceEditJs), json: read($attrs.sourceEditJson), unit: read($attrs.sourceEditUnit), scenario: read($attrs.sourceEditScenario) }; $scope.fiddle = function(e) { e.stopPropagation(); openJsFiddle(sources); }; $scope.plunkr = function(e) { e.stopPropagation(); openPlunkr(sources); }; } }; function read(text) { var files = []; angular.forEach(text ? text.split(' ') : [], function(refId) { // refId is index.html-343, so we need to strip the unique ID when exporting the name files.push({name: refId.replace(/-\d+$/, ''), content: getEmbeddedTemplate(refId)}); }); return files; } }) .factory('angularUrls', function($document) { var urls = {}; angular.forEach($document.find('script'), function(script) { var match = script.src.match(/^.*\/(angular[^\/]*\.js)$/); if (match) { urls[match[1].replace(/(\-\d.*)?(\.min)?\.js$/, '.js')] = match[0]; } }); return urls; }) .factory('formPostData', function($document) { return function(url, fields) { var form = angular.element('
'); angular.forEach(fields, function(value, name) { var input = angular.element(''); input.attr('value', value); form.append(input); }); $document.find('body').append(form); form[0].submit(); form.remove(); }; }) .factory('prepareDefaultAppModule', function() { return function(content) { var deps = []; angular.forEach(content.deps, function(file) { if(file.name == 'angular-animate.js') { deps.push('ngAnimate'); } }); var moduleName = 'App'; return { module : moduleName, script : "angular.module('" + moduleName + "', [" + (deps.length ? "'" + deps.join("','") + "'" : "") + "]);\n\n" }; }; }) .factory('prepareEditorAssetTags', function(angularUrls) { return function(content, options) { options = options || {}; var includeLocalFiles = options.includeLocalFiles; var html = makeScriptTag(angularUrls['angular.js']); var allFiles = [].concat(content.js, content.css, content.html, content.json); angular.forEach(content.deps, function(file) { if (file.name !== 'angular.js') { var isLocal = false; for(var i=0;i\n'; } function makeCssLinkTag(src) { return '\n'; } }; }) .factory('openPlunkr', function(templateMerge, formPostData, prepareEditorAssetTags, prepareDefaultAppModule) { return function(content) { var hasRouting = false; angular.forEach(content.deps, function(file) { hasRouting = hasRouting || file.name == 'angular-route.js'; }); var indexHtmlContent = '\n' + '\n' + ' \n' + '{{scriptDeps}}'; if(hasRouting) { indexHtmlContent += '\n'; } indexHtmlContent += '\n' + ' \n\n' + '{{indexContents}}\n\n' + ' \n' + '\n'; indexProp = { module: content.module, scriptDeps: prepareEditorAssetTags(content, { includeLocalFiles : true }), indexContents: content.html[0].content }; var allFiles = [].concat(content.js, content.css, content.html, content.json); if(!content.module) { var moduleData = prepareDefaultAppModule(content); indexProp.module = moduleData.module; var found = false; angular.forEach(content.js, function(file) { if(file.name == 'script.js') { file.content = moduleData.script + file.content; found = true; } }); if(!found) { indexProp.scriptDeps += '\n'; allFiles.push({ name : 'script.js', content : moduleData.script }); } } var postData = {}; angular.forEach(allFiles, function(file, index) { if (file.content && file.name != 'index.html') { postData['files[' + file.name + ']'] = file.content; } }); postData['files[index.html]'] = templateMerge(indexHtmlContent, indexProp); postData['tags[]'] = "angularjs"; postData.private = true; postData.description = 'AngularJS Example Plunkr'; formPostData('http://plnkr.co/edit/?p=preview', postData); }; }) .factory('openJsFiddle', function(templateMerge, formPostData, prepareEditorAssetTags, prepareDefaultAppModule) { var HTML = '
\n{{html:2}}
', CSS = ' \n' + '{{head:0}}