diff options
| author | Peter Bacon Darwin | 2014-02-12 22:47:42 +0000 |
|---|---|---|
| committer | Peter Bacon Darwin | 2014-02-16 19:03:41 +0000 |
| commit | 389d4879da4aa620ee95d789b19ff9be44eb730a (patch) | |
| tree | 93352ddc8738a975904a1774d51b93d585ca1075 /docs/app/src/examples.js | |
| parent | a564160511bf1bbed5a4fe5d2981fae1bb664eca (diff) | |
| download | angular.js-389d4879da4aa620ee95d789b19ff9be44eb730a.tar.bz2 | |
chore(doc-gen): new docs
chore(doc-gen): implement dgeni
Diffstat (limited to 'docs/app/src/examples.js')
| -rw-r--r-- | docs/app/src/examples.js | 266 |
1 files changed, 266 insertions, 0 deletions
diff --git a/docs/app/src/examples.js b/docs/app/src/examples.js new file mode 100644 index 00000000..44dd98f1 --- /dev/null +++ b/docs/app/src/examples.js @@ -0,0 +1,266 @@ +angular.module('examples', []) + +.directive('sourceEdit', function(getEmbeddedTemplate) { + return { + template: '<div class="btn-group pull-right">' + + '<a class="btn dropdown-toggle btn-primary" data-toggle="dropdown" href>' + + ' <i class="icon-pencil icon-white"></i> Edit<span class="caret"></span>' + + '</a>' + + '<ul class="dropdown-menu">' + + ' <li><a ng-click="plunkr($event)" href="">In Plunkr</a></li>' + + ' <li><a ng-click="fiddle($event)" href="">In JsFiddle</a></li>' + + '</ul>' + + '</div>', + 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('<form style="display: none;" method="post" action="' + url + '" target="_blank"></form>'); + angular.forEach(fields, function(value, name) { + var input = angular.element('<input type="hidden" name="' + name + '">'); + 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<allFiles.length;i++) { + if(allFiles[i].name == file.name) { + isLocal = true; + break; + } + } + if(!(isLocal && !includeLocalFiles)) { + var assetUrl = angularUrls[file.name] || file.name; + html += makeScriptTag(assetUrl); + } + } + }); + + if(includeLocalFiles) { + angular.forEach(content.css, function(file, index) { + html += makeCssLinkTag(file.name); + }); + } + + return html; + + + function makeScriptTag(src) { + return '<script type="text/javascript" src="' + src + '"></script>\n'; + } + + function makeCssLinkTag(src) { + return '<link rel="stylesheet" type="text/css" href="' + src + '" />\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 = '<!doctype html>\n' + + '<html ng-app="{{module}}">\n' + + ' <head>\n' + + '{{scriptDeps}}'; + + if(hasRouting) { + indexHtmlContent += '<script type="text/javascript">\n' + + '//this is here to make plunkr work with AngularJS routing\n' + + 'angular.element(document.getElementsByTagName(\'head\')).append(' + + 'angular.element(\'<base href="\' + window.location.pathname + \'" />\')' + + ');\n' + + '</script>\n'; + } + + indexHtmlContent += '</head>\n' + + ' <body>\n\n' + + '{{indexContents}}\n\n' + + ' </body>\n' + + '</html>\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 += '<script type="text/javascript" src="script.js"></script>\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 = '<div ng-app=\"{{module}}\">\n{{html:2}}</div>', + CSS = '</style> <!-- Ugly Hack to make remote files preload in jsFiddle --> \n' + + '{{head:0}}<style>{{css}}', + SCRIPT = '{{script}}', + SCRIPT_CACHE = '\n\n<!-- {{name}} -->\n<script type="text/ng-template" id="{{name}}">\n{{content:2}}</script>', + BASE_HREF_TAG = '<!-- Ugly Hack to make AngularJS routing work inside of jsFiddle -->\n' + + '<base href="/" />\n\n'; + + return function(content) { + var prop = { + module: content.module, + html: '', + css: '', + script: '' + }; + if(!prop.module) { + var moduleData = prepareDefaultAppModule(content); + prop.script = moduleData.script; + prop.module = moduleData.module; + } + + angular.forEach(content.html, function(file, index) { + if (index) { + prop.html += templateMerge(SCRIPT_CACHE, file); + } else { + prop.html += file.content; + } + }); + + prop.head = prepareEditorAssetTags(content, { includeLocalFiles : false }); + + angular.forEach(content.js, function(file, index) { + prop.script += file.content; + }); + + angular.forEach(content.css, function(file, index) { + prop.css += file.content; + }); + + var hasRouting = false; + angular.forEach(content.deps, function(file) { + hasRouting = hasRouting || file.name == 'angular-route.js'; + }); + + var compiledHTML = templateMerge(HTML, prop); + if(hasRouting) { + compiledHTML = BASE_HREF_TAG + compiledHTML; + } + formPostData("http://jsfiddle.net/api/post/library/pure/", { + title: 'AngularJS Example', + html: compiledHTML, + js: templateMerge(SCRIPT, prop), + css: templateMerge(CSS, prop) + }); + }; +});
\ No newline at end of file |
