Commit e5dbc9bf authored by Stephen Sawchuk's avatar Stephen Sawchuk

updated todomvc-common; now using _ templates.

parent c7d40203
(function () { (function () {
'use strict'; 'use strict';
// Underscore's Template Module
// Courtesy of underscorejs.org
var _ = (function (_) {
_.defaults = function (object) {
if (!object) {
return object;
}
for (var argsIndex = 1, argsLength = arguments.length; argsIndex < argsLength; argsIndex++) {
var iterable = arguments[argsIndex];
if (iterable) {
for (var key in iterable) {
if (object[key] == null) {
object[key] = iterable[key];
}
}
}
}
return object;
}
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;
// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
"'": "'",
'\\': '\\',
'\r': 'r',
'\n': 'n',
'\t': 't',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
_.template = function(text, data, settings) {
var render;
settings = _.defaults({}, settings, _.templateSettings);
// Combine delimiters into one regular expression via alternation.
var matcher = new RegExp([
(settings.escape || noMatch).source,
(settings.interpolate || noMatch).source,
(settings.evaluate || noMatch).source
].join('|') + '|$', 'g');
// Compile the template source, escaping string literals appropriately.
var index = 0;
var source = "__p+='";
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
source += text.slice(index, offset)
.replace(escaper, function(match) { return '\\' + escapes[match]; });
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
}
if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
}
if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
index = offset + match.length;
return match;
});
source += "';\n";
// If a variable is not specified, place data values in local scope.
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + "return __p;\n";
try {
render = new Function(settings.variable || 'obj', '_', source);
} catch (e) {
e.source = source;
throw e;
}
if (data) return render(data, _);
var template = function(data) {
return render.call(this, data, _);
};
// Provide the compiled function source as a convenience for precompilation.
template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
return template;
};
return _;
})({});
if (location.hostname === 'todomvc.com') { if (location.hostname === 'todomvc.com') {
window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script')); window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script'));
} }
...@@ -88,6 +198,7 @@ ...@@ -88,6 +198,7 @@
framework = document.querySelector('[data-framework]').getAttribute('data-framework'); framework = document.querySelector('[data-framework]').getAttribute('data-framework');
} }
if (template && learnJSON[framework]) { if (template && learnJSON[framework]) {
this.frameworkJSON = learnJSON[framework]; this.frameworkJSON = learnJSON[framework];
this.template = template; this.template = template;
...@@ -96,84 +207,19 @@ ...@@ -96,84 +207,19 @@
} }
} }
Learn.prototype._prepareTemplate = function () { Learn.prototype.append = function () {
var aside = document.createElement('aside');
aside.innerHTML = this.template;
var header = aside.cloneNode(true);
header.removeChild(header.querySelector('ul'));
header.removeChild(header.querySelectorAll('footer')[1]);
return {
header: header,
links: aside.cloneNode(true).querySelector('ul a'),
footer: aside.cloneNode(true).querySelectorAll('footer')[1]
};
};
Learn.prototype._parseTemplate = function () {
if (!this.template) {
return;
}
var frameworkJSON = this.frameworkJSON;
var template = this._prepareTemplate();
var aside = document.createElement('aside'); var aside = document.createElement('aside');
var linksTemplate = template.links.outerHTML; aside.innerHTML = _.template(this.template, this.frameworkJSON);
var parser = /\{\{([^}]*)\}\}/g; aside.className = 'learn';
var header, examples, links;
header = template.header.innerHTML.replace(parser, function (match, key) { // Localize demo links
return frameworkJSON[key]; var demoLinks = aside.querySelectorAll('.demo-link');
Array.prototype.forEach.call(demoLinks, function (demoLink) {
demoLink.setAttribute('href', findRoot() + demoLink.getAttribute('href'));
}); });
aside.innerHTML = header;
if (frameworkJSON.examples) {
examples = frameworkJSON.examples.map(function (example) {
return ''
+ '<h5>' + example.name + '</h5>'
+ '<p>'
+ (location.href.match(example.url + '/') ? '' : ' <a href="' + findRoot() + example.url + '">Demo</a>, ')
+ ' <a href="https://github.com/tastejs/todomvc/tree/gh-pages/' + (example.source_url || example.url) + '">Source</a>'
+ '</p>';
}).join('');
aside.querySelector('.source-links').innerHTML = examples;
}
if (frameworkJSON.link_groups) {
links = frameworkJSON.link_groups.map(function (linkGroup) {
return ''
+ '<h4>' + linkGroup.heading + '</h4>'
+ '<ul>'
+ linkGroup.links.map(function (link) {
return ''
+ '<li>'
+ linksTemplate.replace(parser, function (match, key) {
return link[key];
})
+ '</li>';
}).join('')
+ '</ul>';
}).join('');
aside.innerHTML += links;
aside.innerHTML += template.footer.outerHTML;
}
return aside;
};
Learn.prototype.append = function () {
var aside = this._parseTemplate();
aside.className = 'learn';
document.body.className = (document.body.className + ' learn-bar').trim(); document.body.className = (document.body.className + ' learn-bar').trim();
document.body.insertAdjacentHTML('afterBegin', aside.outerHTML); document.body.insertAdjacentHTML('afterBegin', aside.outerHTML);
}; };
appendSourceLink(); appendSourceLink();
......
(function () { (function () {
'use strict'; 'use strict';
// Underscore's Template Module
// Courtesy of underscorejs.org
var _ = (function (_) {
_.defaults = function (object) {
if (!object) {
return object;
}
for (var argsIndex = 1, argsLength = arguments.length; argsIndex < argsLength; argsIndex++) {
var iterable = arguments[argsIndex];
if (iterable) {
for (var key in iterable) {
if (object[key] == null) {
object[key] = iterable[key];
}
}
}
}
return object;
}
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;
// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
"'": "'",
'\\': '\\',
'\r': 'r',
'\n': 'n',
'\t': 't',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
_.template = function(text, data, settings) {
var render;
settings = _.defaults({}, settings, _.templateSettings);
// Combine delimiters into one regular expression via alternation.
var matcher = new RegExp([
(settings.escape || noMatch).source,
(settings.interpolate || noMatch).source,
(settings.evaluate || noMatch).source
].join('|') + '|$', 'g');
// Compile the template source, escaping string literals appropriately.
var index = 0;
var source = "__p+='";
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
source += text.slice(index, offset)
.replace(escaper, function(match) { return '\\' + escapes[match]; });
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
}
if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
}
if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
index = offset + match.length;
return match;
});
source += "';\n";
// If a variable is not specified, place data values in local scope.
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + "return __p;\n";
try {
render = new Function(settings.variable || 'obj', '_', source);
} catch (e) {
e.source = source;
throw e;
}
if (data) return render(data, _);
var template = function(data) {
return render.call(this, data, _);
};
// Provide the compiled function source as a convenience for precompilation.
template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
return template;
};
return _;
})({});
if (location.hostname === 'todomvc.com') { if (location.hostname === 'todomvc.com') {
window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script')); window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script'));
} }
...@@ -88,6 +198,7 @@ ...@@ -88,6 +198,7 @@
framework = document.querySelector('[data-framework]').getAttribute('data-framework'); framework = document.querySelector('[data-framework]').getAttribute('data-framework');
} }
if (template && learnJSON[framework]) { if (template && learnJSON[framework]) {
this.frameworkJSON = learnJSON[framework]; this.frameworkJSON = learnJSON[framework];
this.template = template; this.template = template;
...@@ -96,84 +207,19 @@ ...@@ -96,84 +207,19 @@
} }
} }
Learn.prototype._prepareTemplate = function () { Learn.prototype.append = function () {
var aside = document.createElement('aside');
aside.innerHTML = this.template;
var header = aside.cloneNode(true);
header.removeChild(header.querySelector('ul'));
header.removeChild(header.querySelectorAll('footer')[1]);
return {
header: header,
links: aside.cloneNode(true).querySelector('ul a'),
footer: aside.cloneNode(true).querySelectorAll('footer')[1]
};
};
Learn.prototype._parseTemplate = function () {
if (!this.template) {
return;
}
var frameworkJSON = this.frameworkJSON;
var template = this._prepareTemplate();
var aside = document.createElement('aside'); var aside = document.createElement('aside');
var linksTemplate = template.links.outerHTML; aside.innerHTML = _.template(this.template, this.frameworkJSON);
var parser = /\{\{([^}]*)\}\}/g; aside.className = 'learn';
var header, examples, links;
header = template.header.innerHTML.replace(parser, function (match, key) { // Localize demo links
return frameworkJSON[key]; var demoLinks = aside.querySelectorAll('.demo-link');
Array.prototype.forEach.call(demoLinks, function (demoLink) {
demoLink.setAttribute('href', findRoot() + demoLink.getAttribute('href'));
}); });
aside.innerHTML = header;
if (frameworkJSON.examples) {
examples = frameworkJSON.examples.map(function (example) {
return ''
+ '<h5>' + example.name + '</h5>'
+ '<p>'
+ (location.href.match(example.url + '/') ? '' : ' <a href="' + findRoot() + example.url + '">Demo</a>, ')
+ ' <a href="https://github.com/tastejs/todomvc/tree/gh-pages/' + (example.source_url || example.url) + '">Source</a>'
+ '</p>';
}).join('');
aside.querySelector('.source-links').innerHTML = examples;
}
if (frameworkJSON.link_groups) {
links = frameworkJSON.link_groups.map(function (linkGroup) {
return ''
+ '<h4>' + linkGroup.heading + '</h4>'
+ '<ul>'
+ linkGroup.links.map(function (link) {
return ''
+ '<li>'
+ linksTemplate.replace(parser, function (match, key) {
return link[key];
})
+ '</li>';
}).join('')
+ '</ul>';
}).join('');
aside.innerHTML += links;
aside.innerHTML += template.footer.outerHTML;
}
return aside;
};
Learn.prototype.append = function () {
var aside = this._parseTemplate();
aside.className = 'learn';
document.body.className = (document.body.className + ' learn-bar').trim(); document.body.className = (document.body.className + ' learn-bar').trim();
document.body.insertAdjacentHTML('afterBegin', aside.outerHTML); document.body.insertAdjacentHTML('afterBegin', aside.outerHTML);
}; };
appendSourceLink(); appendSourceLink();
......
(function () { (function () {
'use strict'; 'use strict';
// Underscore's Template Module
// Courtesy of underscorejs.org
var _ = (function (_) {
_.defaults = function (object) {
if (!object) {
return object;
}
for (var argsIndex = 1, argsLength = arguments.length; argsIndex < argsLength; argsIndex++) {
var iterable = arguments[argsIndex];
if (iterable) {
for (var key in iterable) {
if (object[key] == null) {
object[key] = iterable[key];
}
}
}
}
return object;
}
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;
// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
"'": "'",
'\\': '\\',
'\r': 'r',
'\n': 'n',
'\t': 't',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
_.template = function(text, data, settings) {
var render;
settings = _.defaults({}, settings, _.templateSettings);
// Combine delimiters into one regular expression via alternation.
var matcher = new RegExp([
(settings.escape || noMatch).source,
(settings.interpolate || noMatch).source,
(settings.evaluate || noMatch).source
].join('|') + '|$', 'g');
// Compile the template source, escaping string literals appropriately.
var index = 0;
var source = "__p+='";
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
source += text.slice(index, offset)
.replace(escaper, function(match) { return '\\' + escapes[match]; });
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
}
if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
}
if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
index = offset + match.length;
return match;
});
source += "';\n";
// If a variable is not specified, place data values in local scope.
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + "return __p;\n";
try {
render = new Function(settings.variable || 'obj', '_', source);
} catch (e) {
e.source = source;
throw e;
}
if (data) return render(data, _);
var template = function(data) {
return render.call(this, data, _);
};
// Provide the compiled function source as a convenience for precompilation.
template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
return template;
};
return _;
})({});
if (location.hostname === 'todomvc.com') { if (location.hostname === 'todomvc.com') {
window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script')); window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script'));
} }
...@@ -88,6 +198,7 @@ ...@@ -88,6 +198,7 @@
framework = document.querySelector('[data-framework]').getAttribute('data-framework'); framework = document.querySelector('[data-framework]').getAttribute('data-framework');
} }
if (template && learnJSON[framework]) { if (template && learnJSON[framework]) {
this.frameworkJSON = learnJSON[framework]; this.frameworkJSON = learnJSON[framework];
this.template = template; this.template = template;
...@@ -96,84 +207,19 @@ ...@@ -96,84 +207,19 @@
} }
} }
Learn.prototype._prepareTemplate = function () { Learn.prototype.append = function () {
var aside = document.createElement('aside');
aside.innerHTML = this.template;
var header = aside.cloneNode(true);
header.removeChild(header.querySelector('ul'));
header.removeChild(header.querySelectorAll('footer')[1]);
return {
header: header,
links: aside.cloneNode(true).querySelector('ul a'),
footer: aside.cloneNode(true).querySelectorAll('footer')[1]
};
};
Learn.prototype._parseTemplate = function () {
if (!this.template) {
return;
}
var frameworkJSON = this.frameworkJSON;
var template = this._prepareTemplate();
var aside = document.createElement('aside'); var aside = document.createElement('aside');
var linksTemplate = template.links.outerHTML; aside.innerHTML = _.template(this.template, this.frameworkJSON);
var parser = /\{\{([^}]*)\}\}/g; aside.className = 'learn';
var header, examples, links;
header = template.header.innerHTML.replace(parser, function (match, key) { // Localize demo links
return frameworkJSON[key]; var demoLinks = aside.querySelectorAll('.demo-link');
Array.prototype.forEach.call(demoLinks, function (demoLink) {
demoLink.setAttribute('href', findRoot() + demoLink.getAttribute('href'));
}); });
aside.innerHTML = header;
if (frameworkJSON.examples) {
examples = frameworkJSON.examples.map(function (example) {
return ''
+ '<h5>' + example.name + '</h5>'
+ '<p>'
+ (location.href.match(example.url + '/') ? '' : ' <a href="' + findRoot() + example.url + '">Demo</a>, ')
+ ' <a href="https://github.com/tastejs/todomvc/tree/gh-pages/' + (example.source_url || example.url) + '">Source</a>'
+ '</p>';
}).join('');
aside.querySelector('.source-links').innerHTML = examples;
}
if (frameworkJSON.link_groups) {
links = frameworkJSON.link_groups.map(function (linkGroup) {
return ''
+ '<h4>' + linkGroup.heading + '</h4>'
+ '<ul>'
+ linkGroup.links.map(function (link) {
return ''
+ '<li>'
+ linksTemplate.replace(parser, function (match, key) {
return link[key];
})
+ '</li>';
}).join('')
+ '</ul>';
}).join('');
aside.innerHTML += links;
aside.innerHTML += template.footer.outerHTML;
}
return aside;
};
Learn.prototype.append = function () {
var aside = this._parseTemplate();
aside.className = 'learn';
document.body.className = (document.body.className + ' learn-bar').trim(); document.body.className = (document.body.className + ' learn-bar').trim();
document.body.insertAdjacentHTML('afterBegin', aside.outerHTML); document.body.insertAdjacentHTML('afterBegin', aside.outerHTML);
}; };
appendSourceLink(); appendSourceLink();
......
(function () { (function () {
'use strict'; 'use strict';
// Underscore's Template Module
// Courtesy of underscorejs.org
var _ = (function (_) {
_.defaults = function (object) {
if (!object) {
return object;
}
for (var argsIndex = 1, argsLength = arguments.length; argsIndex < argsLength; argsIndex++) {
var iterable = arguments[argsIndex];
if (iterable) {
for (var key in iterable) {
if (object[key] == null) {
object[key] = iterable[key];
}
}
}
}
return object;
}
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;
// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
"'": "'",
'\\': '\\',
'\r': 'r',
'\n': 'n',
'\t': 't',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
_.template = function(text, data, settings) {
var render;
settings = _.defaults({}, settings, _.templateSettings);
// Combine delimiters into one regular expression via alternation.
var matcher = new RegExp([
(settings.escape || noMatch).source,
(settings.interpolate || noMatch).source,
(settings.evaluate || noMatch).source
].join('|') + '|$', 'g');
// Compile the template source, escaping string literals appropriately.
var index = 0;
var source = "__p+='";
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
source += text.slice(index, offset)
.replace(escaper, function(match) { return '\\' + escapes[match]; });
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
}
if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
}
if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
index = offset + match.length;
return match;
});
source += "';\n";
// If a variable is not specified, place data values in local scope.
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + "return __p;\n";
try {
render = new Function(settings.variable || 'obj', '_', source);
} catch (e) {
e.source = source;
throw e;
}
if (data) return render(data, _);
var template = function(data) {
return render.call(this, data, _);
};
// Provide the compiled function source as a convenience for precompilation.
template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
return template;
};
return _;
})({});
if (location.hostname === 'todomvc.com') { if (location.hostname === 'todomvc.com') {
window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script')); window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script'));
} }
...@@ -88,6 +198,7 @@ ...@@ -88,6 +198,7 @@
framework = document.querySelector('[data-framework]').getAttribute('data-framework'); framework = document.querySelector('[data-framework]').getAttribute('data-framework');
} }
if (template && learnJSON[framework]) { if (template && learnJSON[framework]) {
this.frameworkJSON = learnJSON[framework]; this.frameworkJSON = learnJSON[framework];
this.template = template; this.template = template;
...@@ -96,84 +207,19 @@ ...@@ -96,84 +207,19 @@
} }
} }
Learn.prototype._prepareTemplate = function () { Learn.prototype.append = function () {
var aside = document.createElement('aside');
aside.innerHTML = this.template;
var header = aside.cloneNode(true);
header.removeChild(header.querySelector('ul'));
header.removeChild(header.querySelectorAll('footer')[1]);
return {
header: header,
links: aside.cloneNode(true).querySelector('ul a'),
footer: aside.cloneNode(true).querySelectorAll('footer')[1]
};
};
Learn.prototype._parseTemplate = function () {
if (!this.template) {
return;
}
var frameworkJSON = this.frameworkJSON;
var template = this._prepareTemplate();
var aside = document.createElement('aside'); var aside = document.createElement('aside');
var linksTemplate = template.links.outerHTML; aside.innerHTML = _.template(this.template, this.frameworkJSON);
var parser = /\{\{([^}]*)\}\}/g; aside.className = 'learn';
var header, examples, links;
header = template.header.innerHTML.replace(parser, function (match, key) { // Localize demo links
return frameworkJSON[key]; var demoLinks = aside.querySelectorAll('.demo-link');
Array.prototype.forEach.call(demoLinks, function (demoLink) {
demoLink.setAttribute('href', findRoot() + demoLink.getAttribute('href'));
}); });
aside.innerHTML = header;
if (frameworkJSON.examples) {
examples = frameworkJSON.examples.map(function (example) {
return ''
+ '<h5>' + example.name + '</h5>'
+ '<p>'
+ (location.href.match(example.url + '/') ? '' : ' <a href="' + findRoot() + example.url + '">Demo</a>, ')
+ ' <a href="https://github.com/tastejs/todomvc/tree/gh-pages/' + (example.source_url || example.url) + '">Source</a>'
+ '</p>';
}).join('');
aside.querySelector('.source-links').innerHTML = examples;
}
if (frameworkJSON.link_groups) {
links = frameworkJSON.link_groups.map(function (linkGroup) {
return ''
+ '<h4>' + linkGroup.heading + '</h4>'
+ '<ul>'
+ linkGroup.links.map(function (link) {
return ''
+ '<li>'
+ linksTemplate.replace(parser, function (match, key) {
return link[key];
})
+ '</li>';
}).join('')
+ '</ul>';
}).join('');
aside.innerHTML += links;
aside.innerHTML += template.footer.outerHTML;
}
return aside;
};
Learn.prototype.append = function () {
var aside = this._parseTemplate();
aside.className = 'learn';
document.body.className = (document.body.className + ' learn-bar').trim(); document.body.className = (document.body.className + ' learn-bar').trim();
document.body.insertAdjacentHTML('afterBegin', aside.outerHTML); document.body.insertAdjacentHTML('afterBegin', aside.outerHTML);
}; };
appendSourceLink(); appendSourceLink();
......
(function () { (function () {
'use strict'; 'use strict';
// Underscore's Template Module
// Courtesy of underscorejs.org
var _ = (function (_) {
_.defaults = function (object) {
if (!object) {
return object;
}
for (var argsIndex = 1, argsLength = arguments.length; argsIndex < argsLength; argsIndex++) {
var iterable = arguments[argsIndex];
if (iterable) {
for (var key in iterable) {
if (object[key] == null) {
object[key] = iterable[key];
}
}
}
}
return object;
}
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;
// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
"'": "'",
'\\': '\\',
'\r': 'r',
'\n': 'n',
'\t': 't',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
_.template = function(text, data, settings) {
var render;
settings = _.defaults({}, settings, _.templateSettings);
// Combine delimiters into one regular expression via alternation.
var matcher = new RegExp([
(settings.escape || noMatch).source,
(settings.interpolate || noMatch).source,
(settings.evaluate || noMatch).source
].join('|') + '|$', 'g');
// Compile the template source, escaping string literals appropriately.
var index = 0;
var source = "__p+='";
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
source += text.slice(index, offset)
.replace(escaper, function(match) { return '\\' + escapes[match]; });
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
}
if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
}
if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
index = offset + match.length;
return match;
});
source += "';\n";
// If a variable is not specified, place data values in local scope.
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + "return __p;\n";
try {
render = new Function(settings.variable || 'obj', '_', source);
} catch (e) {
e.source = source;
throw e;
}
if (data) return render(data, _);
var template = function(data) {
return render.call(this, data, _);
};
// Provide the compiled function source as a convenience for precompilation.
template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
return template;
};
return _;
})({});
if (location.hostname === 'todomvc.com') { if (location.hostname === 'todomvc.com') {
window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script')); window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script'));
} }
...@@ -88,6 +198,7 @@ ...@@ -88,6 +198,7 @@
framework = document.querySelector('[data-framework]').getAttribute('data-framework'); framework = document.querySelector('[data-framework]').getAttribute('data-framework');
} }
if (template && learnJSON[framework]) { if (template && learnJSON[framework]) {
this.frameworkJSON = learnJSON[framework]; this.frameworkJSON = learnJSON[framework];
this.template = template; this.template = template;
...@@ -96,84 +207,19 @@ ...@@ -96,84 +207,19 @@
} }
} }
Learn.prototype._prepareTemplate = function () { Learn.prototype.append = function () {
var aside = document.createElement('aside');
aside.innerHTML = this.template;
var header = aside.cloneNode(true);
header.removeChild(header.querySelector('ul'));
header.removeChild(header.querySelectorAll('footer')[1]);
return {
header: header,
links: aside.cloneNode(true).querySelector('ul a'),
footer: aside.cloneNode(true).querySelectorAll('footer')[1]
};
};
Learn.prototype._parseTemplate = function () {
if (!this.template) {
return;
}
var frameworkJSON = this.frameworkJSON;
var template = this._prepareTemplate();
var aside = document.createElement('aside'); var aside = document.createElement('aside');
var linksTemplate = template.links.outerHTML; aside.innerHTML = _.template(this.template, this.frameworkJSON);
var parser = /\{\{([^}]*)\}\}/g; aside.className = 'learn';
var header, examples, links;
header = template.header.innerHTML.replace(parser, function (match, key) { // Localize demo links
return frameworkJSON[key]; var demoLinks = aside.querySelectorAll('.demo-link');
Array.prototype.forEach.call(demoLinks, function (demoLink) {
demoLink.setAttribute('href', findRoot() + demoLink.getAttribute('href'));
}); });
aside.innerHTML = header;
if (frameworkJSON.examples) {
examples = frameworkJSON.examples.map(function (example) {
return ''
+ '<h5>' + example.name + '</h5>'
+ '<p>'
+ (location.href.match(example.url + '/') ? '' : ' <a href="' + findRoot() + example.url + '">Demo</a>, ')
+ ' <a href="https://github.com/tastejs/todomvc/tree/gh-pages/' + (example.source_url || example.url) + '">Source</a>'
+ '</p>';
}).join('');
aside.querySelector('.source-links').innerHTML = examples;
}
if (frameworkJSON.link_groups) {
links = frameworkJSON.link_groups.map(function (linkGroup) {
return ''
+ '<h4>' + linkGroup.heading + '</h4>'
+ '<ul>'
+ linkGroup.links.map(function (link) {
return ''
+ '<li>'
+ linksTemplate.replace(parser, function (match, key) {
return link[key];
})
+ '</li>';
}).join('')
+ '</ul>';
}).join('');
aside.innerHTML += links;
aside.innerHTML += template.footer.outerHTML;
}
return aside;
};
Learn.prototype.append = function () {
var aside = this._parseTemplate();
aside.className = 'learn';
document.body.className = (document.body.className + ' learn-bar').trim(); document.body.className = (document.body.className + ' learn-bar').trim();
document.body.insertAdjacentHTML('afterBegin', aside.outerHTML); document.body.insertAdjacentHTML('afterBegin', aside.outerHTML);
}; };
appendSourceLink(); appendSourceLink();
......
(function () { (function () {
'use strict'; 'use strict';
// Underscore's Template Module
// Courtesy of underscorejs.org
var _ = (function (_) {
_.defaults = function (object) {
if (!object) {
return object;
}
for (var argsIndex = 1, argsLength = arguments.length; argsIndex < argsLength; argsIndex++) {
var iterable = arguments[argsIndex];
if (iterable) {
for (var key in iterable) {
if (object[key] == null) {
object[key] = iterable[key];
}
}
}
}
return object;
}
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;
// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
"'": "'",
'\\': '\\',
'\r': 'r',
'\n': 'n',
'\t': 't',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
_.template = function(text, data, settings) {
var render;
settings = _.defaults({}, settings, _.templateSettings);
// Combine delimiters into one regular expression via alternation.
var matcher = new RegExp([
(settings.escape || noMatch).source,
(settings.interpolate || noMatch).source,
(settings.evaluate || noMatch).source
].join('|') + '|$', 'g');
// Compile the template source, escaping string literals appropriately.
var index = 0;
var source = "__p+='";
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
source += text.slice(index, offset)
.replace(escaper, function(match) { return '\\' + escapes[match]; });
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
}
if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
}
if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
index = offset + match.length;
return match;
});
source += "';\n";
// If a variable is not specified, place data values in local scope.
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + "return __p;\n";
try {
render = new Function(settings.variable || 'obj', '_', source);
} catch (e) {
e.source = source;
throw e;
}
if (data) return render(data, _);
var template = function(data) {
return render.call(this, data, _);
};
// Provide the compiled function source as a convenience for precompilation.
template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
return template;
};
return _;
})({});
if (location.hostname === 'todomvc.com') { if (location.hostname === 'todomvc.com') {
window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script')); window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script'));
} }
...@@ -88,6 +198,7 @@ ...@@ -88,6 +198,7 @@
framework = document.querySelector('[data-framework]').getAttribute('data-framework'); framework = document.querySelector('[data-framework]').getAttribute('data-framework');
} }
if (template && learnJSON[framework]) { if (template && learnJSON[framework]) {
this.frameworkJSON = learnJSON[framework]; this.frameworkJSON = learnJSON[framework];
this.template = template; this.template = template;
...@@ -96,84 +207,19 @@ ...@@ -96,84 +207,19 @@
} }
} }
Learn.prototype._prepareTemplate = function () { Learn.prototype.append = function () {
var aside = document.createElement('aside');
aside.innerHTML = this.template;
var header = aside.cloneNode(true);
header.removeChild(header.querySelector('ul'));
header.removeChild(header.querySelectorAll('footer')[1]);
return {
header: header,
links: aside.cloneNode(true).querySelector('ul a'),
footer: aside.cloneNode(true).querySelectorAll('footer')[1]
};
};
Learn.prototype._parseTemplate = function () {
if (!this.template) {
return;
}
var frameworkJSON = this.frameworkJSON;
var template = this._prepareTemplate();
var aside = document.createElement('aside'); var aside = document.createElement('aside');
var linksTemplate = template.links.outerHTML; aside.innerHTML = _.template(this.template, this.frameworkJSON);
var parser = /\{\{([^}]*)\}\}/g; aside.className = 'learn';
var header, examples, links;
header = template.header.innerHTML.replace(parser, function (match, key) { // Localize demo links
return frameworkJSON[key]; var demoLinks = aside.querySelectorAll('.demo-link');
Array.prototype.forEach.call(demoLinks, function (demoLink) {
demoLink.setAttribute('href', findRoot() + demoLink.getAttribute('href'));
}); });
aside.innerHTML = header;
if (frameworkJSON.examples) {
examples = frameworkJSON.examples.map(function (example) {
return ''
+ '<h5>' + example.name + '</h5>'
+ '<p>'
+ (location.href.match(example.url + '/') ? '' : ' <a href="' + findRoot() + example.url + '">Demo</a>, ')
+ ' <a href="https://github.com/tastejs/todomvc/tree/gh-pages/' + (example.source_url || example.url) + '">Source</a>'
+ '</p>';
}).join('');
aside.querySelector('.source-links').innerHTML = examples;
}
if (frameworkJSON.link_groups) {
links = frameworkJSON.link_groups.map(function (linkGroup) {
return ''
+ '<h4>' + linkGroup.heading + '</h4>'
+ '<ul>'
+ linkGroup.links.map(function (link) {
return ''
+ '<li>'
+ linksTemplate.replace(parser, function (match, key) {
return link[key];
})
+ '</li>';
}).join('')
+ '</ul>';
}).join('');
aside.innerHTML += links;
aside.innerHTML += template.footer.outerHTML;
}
return aside;
};
Learn.prototype.append = function () {
var aside = this._parseTemplate();
aside.className = 'learn';
document.body.className = (document.body.className + ' learn-bar').trim(); document.body.className = (document.body.className + ' learn-bar').trim();
document.body.insertAdjacentHTML('afterBegin', aside.outerHTML); document.body.insertAdjacentHTML('afterBegin', aside.outerHTML);
}; };
appendSourceLink(); appendSourceLink();
......
(function () { (function () {
'use strict'; 'use strict';
// Underscore's Template Module
// Courtesy of underscorejs.org
var _ = (function (_) {
_.defaults = function (object) {
if (!object) {
return object;
}
for (var argsIndex = 1, argsLength = arguments.length; argsIndex < argsLength; argsIndex++) {
var iterable = arguments[argsIndex];
if (iterable) {
for (var key in iterable) {
if (object[key] == null) {
object[key] = iterable[key];
}
}
}
}
return object;
}
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;
// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
"'": "'",
'\\': '\\',
'\r': 'r',
'\n': 'n',
'\t': 't',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
_.template = function(text, data, settings) {
var render;
settings = _.defaults({}, settings, _.templateSettings);
// Combine delimiters into one regular expression via alternation.
var matcher = new RegExp([
(settings.escape || noMatch).source,
(settings.interpolate || noMatch).source,
(settings.evaluate || noMatch).source
].join('|') + '|$', 'g');
// Compile the template source, escaping string literals appropriately.
var index = 0;
var source = "__p+='";
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
source += text.slice(index, offset)
.replace(escaper, function(match) { return '\\' + escapes[match]; });
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
}
if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
}
if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
index = offset + match.length;
return match;
});
source += "';\n";
// If a variable is not specified, place data values in local scope.
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + "return __p;\n";
try {
render = new Function(settings.variable || 'obj', '_', source);
} catch (e) {
e.source = source;
throw e;
}
if (data) return render(data, _);
var template = function(data) {
return render.call(this, data, _);
};
// Provide the compiled function source as a convenience for precompilation.
template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
return template;
};
return _;
})({});
if (location.hostname === 'todomvc.com') { if (location.hostname === 'todomvc.com') {
window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script')); window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script'));
} }
...@@ -88,6 +198,7 @@ ...@@ -88,6 +198,7 @@
framework = document.querySelector('[data-framework]').getAttribute('data-framework'); framework = document.querySelector('[data-framework]').getAttribute('data-framework');
} }
if (template && learnJSON[framework]) { if (template && learnJSON[framework]) {
this.frameworkJSON = learnJSON[framework]; this.frameworkJSON = learnJSON[framework];
this.template = template; this.template = template;
...@@ -96,84 +207,19 @@ ...@@ -96,84 +207,19 @@
} }
} }
Learn.prototype._prepareTemplate = function () { Learn.prototype.append = function () {
var aside = document.createElement('aside');
aside.innerHTML = this.template;
var header = aside.cloneNode(true);
header.removeChild(header.querySelector('ul'));
header.removeChild(header.querySelectorAll('footer')[1]);
return {
header: header,
links: aside.cloneNode(true).querySelector('ul a'),
footer: aside.cloneNode(true).querySelectorAll('footer')[1]
};
};
Learn.prototype._parseTemplate = function () {
if (!this.template) {
return;
}
var frameworkJSON = this.frameworkJSON;
var template = this._prepareTemplate();
var aside = document.createElement('aside'); var aside = document.createElement('aside');
var linksTemplate = template.links.outerHTML; aside.innerHTML = _.template(this.template, this.frameworkJSON);
var parser = /\{\{([^}]*)\}\}/g; aside.className = 'learn';
var header, examples, links;
header = template.header.innerHTML.replace(parser, function (match, key) { // Localize demo links
return frameworkJSON[key]; var demoLinks = aside.querySelectorAll('.demo-link');
Array.prototype.forEach.call(demoLinks, function (demoLink) {
demoLink.setAttribute('href', findRoot() + demoLink.getAttribute('href'));
}); });
aside.innerHTML = header;
if (frameworkJSON.examples) {
examples = frameworkJSON.examples.map(function (example) {
return ''
+ '<h5>' + example.name + '</h5>'
+ '<p>'
+ (location.href.match(example.url + '/') ? '' : ' <a href="' + findRoot() + example.url + '">Demo</a>, ')
+ ' <a href="https://github.com/tastejs/todomvc/tree/gh-pages/' + (example.source_url || example.url) + '">Source</a>'
+ '</p>';
}).join('');
aside.querySelector('.source-links').innerHTML = examples;
}
if (frameworkJSON.link_groups) {
links = frameworkJSON.link_groups.map(function (linkGroup) {
return ''
+ '<h4>' + linkGroup.heading + '</h4>'
+ '<ul>'
+ linkGroup.links.map(function (link) {
return ''
+ '<li>'
+ linksTemplate.replace(parser, function (match, key) {
return link[key];
})
+ '</li>';
}).join('')
+ '</ul>';
}).join('');
aside.innerHTML += links;
aside.innerHTML += template.footer.outerHTML;
}
return aside;
};
Learn.prototype.append = function () {
var aside = this._parseTemplate();
aside.className = 'learn';
document.body.className = (document.body.className + ' learn-bar').trim(); document.body.className = (document.body.className + ' learn-bar').trim();
document.body.insertAdjacentHTML('afterBegin', aside.outerHTML); document.body.insertAdjacentHTML('afterBegin', aside.outerHTML);
}; };
appendSourceLink(); appendSourceLink();
......
(function () { (function () {
'use strict'; 'use strict';
// Underscore's Template Module
// Courtesy of underscorejs.org
var _ = (function (_) {
_.defaults = function (object) {
if (!object) {
return object;
}
for (var argsIndex = 1, argsLength = arguments.length; argsIndex < argsLength; argsIndex++) {
var iterable = arguments[argsIndex];
if (iterable) {
for (var key in iterable) {
if (object[key] == null) {
object[key] = iterable[key];
}
}
}
}
return object;
}
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;
// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
"'": "'",
'\\': '\\',
'\r': 'r',
'\n': 'n',
'\t': 't',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
_.template = function(text, data, settings) {
var render;
settings = _.defaults({}, settings, _.templateSettings);
// Combine delimiters into one regular expression via alternation.
var matcher = new RegExp([
(settings.escape || noMatch).source,
(settings.interpolate || noMatch).source,
(settings.evaluate || noMatch).source
].join('|') + '|$', 'g');
// Compile the template source, escaping string literals appropriately.
var index = 0;
var source = "__p+='";
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
source += text.slice(index, offset)
.replace(escaper, function(match) { return '\\' + escapes[match]; });
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
}
if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
}
if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
index = offset + match.length;
return match;
});
source += "';\n";
// If a variable is not specified, place data values in local scope.
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + "return __p;\n";
try {
render = new Function(settings.variable || 'obj', '_', source);
} catch (e) {
e.source = source;
throw e;
}
if (data) return render(data, _);
var template = function(data) {
return render.call(this, data, _);
};
// Provide the compiled function source as a convenience for precompilation.
template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
return template;
};
return _;
})({});
if (location.hostname === 'todomvc.com') { if (location.hostname === 'todomvc.com') {
window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script')); window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script'));
} }
...@@ -88,6 +198,7 @@ ...@@ -88,6 +198,7 @@
framework = document.querySelector('[data-framework]').getAttribute('data-framework'); framework = document.querySelector('[data-framework]').getAttribute('data-framework');
} }
if (template && learnJSON[framework]) { if (template && learnJSON[framework]) {
this.frameworkJSON = learnJSON[framework]; this.frameworkJSON = learnJSON[framework];
this.template = template; this.template = template;
...@@ -96,84 +207,19 @@ ...@@ -96,84 +207,19 @@
} }
} }
Learn.prototype._prepareTemplate = function () { Learn.prototype.append = function () {
var aside = document.createElement('aside');
aside.innerHTML = this.template;
var header = aside.cloneNode(true);
header.removeChild(header.querySelector('ul'));
header.removeChild(header.querySelectorAll('footer')[1]);
return {
header: header,
links: aside.cloneNode(true).querySelector('ul a'),
footer: aside.cloneNode(true).querySelectorAll('footer')[1]
};
};
Learn.prototype._parseTemplate = function () {
if (!this.template) {
return;
}
var frameworkJSON = this.frameworkJSON;
var template = this._prepareTemplate();
var aside = document.createElement('aside'); var aside = document.createElement('aside');
var linksTemplate = template.links.outerHTML; aside.innerHTML = _.template(this.template, this.frameworkJSON);
var parser = /\{\{([^}]*)\}\}/g; aside.className = 'learn';
var header, examples, links;
header = template.header.innerHTML.replace(parser, function (match, key) { // Localize demo links
return frameworkJSON[key]; var demoLinks = aside.querySelectorAll('.demo-link');
Array.prototype.forEach.call(demoLinks, function (demoLink) {
demoLink.setAttribute('href', findRoot() + demoLink.getAttribute('href'));
}); });
aside.innerHTML = header;
if (frameworkJSON.examples) {
examples = frameworkJSON.examples.map(function (example) {
return ''
+ '<h5>' + example.name + '</h5>'
+ '<p>'
+ (location.href.match(example.url + '/') ? '' : ' <a href="' + findRoot() + example.url + '">Demo</a>, ')
+ ' <a href="https://github.com/tastejs/todomvc/tree/gh-pages/' + (example.source_url || example.url) + '">Source</a>'
+ '</p>';
}).join('');
aside.querySelector('.source-links').innerHTML = examples;
}
if (frameworkJSON.link_groups) {
links = frameworkJSON.link_groups.map(function (linkGroup) {
return ''
+ '<h4>' + linkGroup.heading + '</h4>'
+ '<ul>'
+ linkGroup.links.map(function (link) {
return ''
+ '<li>'
+ linksTemplate.replace(parser, function (match, key) {
return link[key];
})
+ '</li>';
}).join('')
+ '</ul>';
}).join('');
aside.innerHTML += links;
aside.innerHTML += template.footer.outerHTML;
}
return aside;
};
Learn.prototype.append = function () {
var aside = this._parseTemplate();
aside.className = 'learn';
document.body.className = (document.body.className + ' learn-bar').trim(); document.body.className = (document.body.className + ' learn-bar').trim();
document.body.insertAdjacentHTML('afterBegin', aside.outerHTML); document.body.insertAdjacentHTML('afterBegin', aside.outerHTML);
}; };
appendSourceLink(); appendSourceLink();
......
(function () { (function () {
'use strict'; 'use strict';
// Underscore's Template Module
// Courtesy of underscorejs.org
var _ = (function (_) {
_.defaults = function (object) {
if (!object) {
return object;
}
for (var argsIndex = 1, argsLength = arguments.length; argsIndex < argsLength; argsIndex++) {
var iterable = arguments[argsIndex];
if (iterable) {
for (var key in iterable) {
if (object[key] == null) {
object[key] = iterable[key];
}
}
}
}
return object;
}
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;
// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
"'": "'",
'\\': '\\',
'\r': 'r',
'\n': 'n',
'\t': 't',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
_.template = function(text, data, settings) {
var render;
settings = _.defaults({}, settings, _.templateSettings);
// Combine delimiters into one regular expression via alternation.
var matcher = new RegExp([
(settings.escape || noMatch).source,
(settings.interpolate || noMatch).source,
(settings.evaluate || noMatch).source
].join('|') + '|$', 'g');
// Compile the template source, escaping string literals appropriately.
var index = 0;
var source = "__p+='";
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
source += text.slice(index, offset)
.replace(escaper, function(match) { return '\\' + escapes[match]; });
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
}
if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
}
if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
index = offset + match.length;
return match;
});
source += "';\n";
// If a variable is not specified, place data values in local scope.
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + "return __p;\n";
try {
render = new Function(settings.variable || 'obj', '_', source);
} catch (e) {
e.source = source;
throw e;
}
if (data) return render(data, _);
var template = function(data) {
return render.call(this, data, _);
};
// Provide the compiled function source as a convenience for precompilation.
template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
return template;
};
return _;
})({});
if (location.hostname === 'todomvc.com') { if (location.hostname === 'todomvc.com') {
window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script')); window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script'));
} }
...@@ -88,6 +198,7 @@ ...@@ -88,6 +198,7 @@
framework = document.querySelector('[data-framework]').getAttribute('data-framework'); framework = document.querySelector('[data-framework]').getAttribute('data-framework');
} }
if (template && learnJSON[framework]) { if (template && learnJSON[framework]) {
this.frameworkJSON = learnJSON[framework]; this.frameworkJSON = learnJSON[framework];
this.template = template; this.template = template;
...@@ -96,84 +207,19 @@ ...@@ -96,84 +207,19 @@
} }
} }
Learn.prototype._prepareTemplate = function () { Learn.prototype.append = function () {
var aside = document.createElement('aside');
aside.innerHTML = this.template;
var header = aside.cloneNode(true);
header.removeChild(header.querySelector('ul'));
header.removeChild(header.querySelectorAll('footer')[1]);
return {
header: header,
links: aside.cloneNode(true).querySelector('ul a'),
footer: aside.cloneNode(true).querySelectorAll('footer')[1]
};
};
Learn.prototype._parseTemplate = function () {
if (!this.template) {
return;
}
var frameworkJSON = this.frameworkJSON;
var template = this._prepareTemplate();
var aside = document.createElement('aside'); var aside = document.createElement('aside');
var linksTemplate = template.links.outerHTML; aside.innerHTML = _.template(this.template, this.frameworkJSON);
var parser = /\{\{([^}]*)\}\}/g; aside.className = 'learn';
var header, examples, links;
header = template.header.innerHTML.replace(parser, function (match, key) { // Localize demo links
return frameworkJSON[key]; var demoLinks = aside.querySelectorAll('.demo-link');
Array.prototype.forEach.call(demoLinks, function (demoLink) {
demoLink.setAttribute('href', findRoot() + demoLink.getAttribute('href'));
}); });
aside.innerHTML = header;
if (frameworkJSON.examples) {
examples = frameworkJSON.examples.map(function (example) {
return ''
+ '<h5>' + example.name + '</h5>'
+ '<p>'
+ (location.href.match(example.url + '/') ? '' : ' <a href="' + findRoot() + example.url + '">Demo</a>, ')
+ ' <a href="https://github.com/tastejs/todomvc/tree/gh-pages/' + (example.source_url || example.url) + '">Source</a>'
+ '</p>';
}).join('');
aside.querySelector('.source-links').innerHTML = examples;
}
if (frameworkJSON.link_groups) {
links = frameworkJSON.link_groups.map(function (linkGroup) {
return ''
+ '<h4>' + linkGroup.heading + '</h4>'
+ '<ul>'
+ linkGroup.links.map(function (link) {
return ''
+ '<li>'
+ linksTemplate.replace(parser, function (match, key) {
return link[key];
})
+ '</li>';
}).join('')
+ '</ul>';
}).join('');
aside.innerHTML += links;
aside.innerHTML += template.footer.outerHTML;
}
return aside;
};
Learn.prototype.append = function () {
var aside = this._parseTemplate();
aside.className = 'learn';
document.body.className = (document.body.className + ' learn-bar').trim(); document.body.className = (document.body.className + ' learn-bar').trim();
document.body.insertAdjacentHTML('afterBegin', aside.outerHTML); document.body.insertAdjacentHTML('afterBegin', aside.outerHTML);
}; };
appendSourceLink(); appendSourceLink();
......
(function () { (function () {
'use strict'; 'use strict';
// Underscore's Template Module
// Courtesy of underscorejs.org
var _ = (function (_) {
_.defaults = function (object) {
if (!object) {
return object;
}
for (var argsIndex = 1, argsLength = arguments.length; argsIndex < argsLength; argsIndex++) {
var iterable = arguments[argsIndex];
if (iterable) {
for (var key in iterable) {
if (object[key] == null) {
object[key] = iterable[key];
}
}
}
}
return object;
}
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;
// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
"'": "'",
'\\': '\\',
'\r': 'r',
'\n': 'n',
'\t': 't',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
_.template = function(text, data, settings) {
var render;
settings = _.defaults({}, settings, _.templateSettings);
// Combine delimiters into one regular expression via alternation.
var matcher = new RegExp([
(settings.escape || noMatch).source,
(settings.interpolate || noMatch).source,
(settings.evaluate || noMatch).source
].join('|') + '|$', 'g');
// Compile the template source, escaping string literals appropriately.
var index = 0;
var source = "__p+='";
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
source += text.slice(index, offset)
.replace(escaper, function(match) { return '\\' + escapes[match]; });
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
}
if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
}
if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
index = offset + match.length;
return match;
});
source += "';\n";
// If a variable is not specified, place data values in local scope.
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + "return __p;\n";
try {
render = new Function(settings.variable || 'obj', '_', source);
} catch (e) {
e.source = source;
throw e;
}
if (data) return render(data, _);
var template = function(data) {
return render.call(this, data, _);
};
// Provide the compiled function source as a convenience for precompilation.
template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
return template;
};
return _;
})({});
if (location.hostname === 'todomvc.com') { if (location.hostname === 'todomvc.com') {
window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script')); window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script'));
} }
...@@ -88,6 +198,7 @@ ...@@ -88,6 +198,7 @@
framework = document.querySelector('[data-framework]').getAttribute('data-framework'); framework = document.querySelector('[data-framework]').getAttribute('data-framework');
} }
if (template && learnJSON[framework]) { if (template && learnJSON[framework]) {
this.frameworkJSON = learnJSON[framework]; this.frameworkJSON = learnJSON[framework];
this.template = template; this.template = template;
...@@ -96,84 +207,19 @@ ...@@ -96,84 +207,19 @@
} }
} }
Learn.prototype._prepareTemplate = function () { Learn.prototype.append = function () {
var aside = document.createElement('aside');
aside.innerHTML = this.template;
var header = aside.cloneNode(true);
header.removeChild(header.querySelector('ul'));
header.removeChild(header.querySelectorAll('footer')[1]);
return {
header: header,
links: aside.cloneNode(true).querySelector('ul a'),
footer: aside.cloneNode(true).querySelectorAll('footer')[1]
};
};
Learn.prototype._parseTemplate = function () {
if (!this.template) {
return;
}
var frameworkJSON = this.frameworkJSON;
var template = this._prepareTemplate();
var aside = document.createElement('aside'); var aside = document.createElement('aside');
var linksTemplate = template.links.outerHTML; aside.innerHTML = _.template(this.template, this.frameworkJSON);
var parser = /\{\{([^}]*)\}\}/g; aside.className = 'learn';
var header, examples, links;
header = template.header.innerHTML.replace(parser, function (match, key) { // Localize demo links
return frameworkJSON[key]; var demoLinks = aside.querySelectorAll('.demo-link');
Array.prototype.forEach.call(demoLinks, function (demoLink) {
demoLink.setAttribute('href', findRoot() + demoLink.getAttribute('href'));
}); });
aside.innerHTML = header;
if (frameworkJSON.examples) {
examples = frameworkJSON.examples.map(function (example) {
return ''
+ '<h5>' + example.name + '</h5>'
+ '<p>'
+ (location.href.match(example.url + '/') ? '' : ' <a href="' + findRoot() + example.url + '">Demo</a>, ')
+ ' <a href="https://github.com/tastejs/todomvc/tree/gh-pages/' + (example.source_url || example.url) + '">Source</a>'
+ '</p>';
}).join('');
aside.querySelector('.source-links').innerHTML = examples;
}
if (frameworkJSON.link_groups) {
links = frameworkJSON.link_groups.map(function (linkGroup) {
return ''
+ '<h4>' + linkGroup.heading + '</h4>'
+ '<ul>'
+ linkGroup.links.map(function (link) {
return ''
+ '<li>'
+ linksTemplate.replace(parser, function (match, key) {
return link[key];
})
+ '</li>';
}).join('')
+ '</ul>';
}).join('');
aside.innerHTML += links;
aside.innerHTML += template.footer.outerHTML;
}
return aside;
};
Learn.prototype.append = function () {
var aside = this._parseTemplate();
aside.className = 'learn';
document.body.className = (document.body.className + ' learn-bar').trim(); document.body.className = (document.body.className + ' learn-bar').trim();
document.body.insertAdjacentHTML('afterBegin', aside.outerHTML); document.body.insertAdjacentHTML('afterBegin', aside.outerHTML);
}; };
appendSourceLink(); appendSourceLink();
......
(function () { (function () {
'use strict'; 'use strict';
// Underscore's Template Module
// Courtesy of underscorejs.org
var _ = (function (_) {
_.defaults = function (object) {
if (!object) {
return object;
}
for (var argsIndex = 1, argsLength = arguments.length; argsIndex < argsLength; argsIndex++) {
var iterable = arguments[argsIndex];
if (iterable) {
for (var key in iterable) {
if (object[key] == null) {
object[key] = iterable[key];
}
}
}
}
return object;
}
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;
// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
"'": "'",
'\\': '\\',
'\r': 'r',
'\n': 'n',
'\t': 't',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
_.template = function(text, data, settings) {
var render;
settings = _.defaults({}, settings, _.templateSettings);
// Combine delimiters into one regular expression via alternation.
var matcher = new RegExp([
(settings.escape || noMatch).source,
(settings.interpolate || noMatch).source,
(settings.evaluate || noMatch).source
].join('|') + '|$', 'g');
// Compile the template source, escaping string literals appropriately.
var index = 0;
var source = "__p+='";
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
source += text.slice(index, offset)
.replace(escaper, function(match) { return '\\' + escapes[match]; });
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
}
if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
}
if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
index = offset + match.length;
return match;
});
source += "';\n";
// If a variable is not specified, place data values in local scope.
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + "return __p;\n";
try {
render = new Function(settings.variable || 'obj', '_', source);
} catch (e) {
e.source = source;
throw e;
}
if (data) return render(data, _);
var template = function(data) {
return render.call(this, data, _);
};
// Provide the compiled function source as a convenience for precompilation.
template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
return template;
};
return _;
})({});
if (location.hostname === 'todomvc.com') { if (location.hostname === 'todomvc.com') {
window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script')); window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script'));
} }
...@@ -88,6 +198,7 @@ ...@@ -88,6 +198,7 @@
framework = document.querySelector('[data-framework]').getAttribute('data-framework'); framework = document.querySelector('[data-framework]').getAttribute('data-framework');
} }
if (template && learnJSON[framework]) { if (template && learnJSON[framework]) {
this.frameworkJSON = learnJSON[framework]; this.frameworkJSON = learnJSON[framework];
this.template = template; this.template = template;
...@@ -96,84 +207,19 @@ ...@@ -96,84 +207,19 @@
} }
} }
Learn.prototype._prepareTemplate = function () { Learn.prototype.append = function () {
var aside = document.createElement('aside');
aside.innerHTML = this.template;
var header = aside.cloneNode(true);
header.removeChild(header.querySelector('ul'));
header.removeChild(header.querySelectorAll('footer')[1]);
return {
header: header,
links: aside.cloneNode(true).querySelector('ul a'),
footer: aside.cloneNode(true).querySelectorAll('footer')[1]
};
};
Learn.prototype._parseTemplate = function () {
if (!this.template) {
return;
}
var frameworkJSON = this.frameworkJSON;
var template = this._prepareTemplate();
var aside = document.createElement('aside'); var aside = document.createElement('aside');
var linksTemplate = template.links.outerHTML; aside.innerHTML = _.template(this.template, this.frameworkJSON);
var parser = /\{\{([^}]*)\}\}/g; aside.className = 'learn';
var header, examples, links;
header = template.header.innerHTML.replace(parser, function (match, key) { // Localize demo links
return frameworkJSON[key]; var demoLinks = aside.querySelectorAll('.demo-link');
Array.prototype.forEach.call(demoLinks, function (demoLink) {
demoLink.setAttribute('href', findRoot() + demoLink.getAttribute('href'));
}); });
aside.innerHTML = header;
if (frameworkJSON.examples) {
examples = frameworkJSON.examples.map(function (example) {
return ''
+ '<h5>' + example.name + '</h5>'
+ '<p>'
+ (location.href.match(example.url + '/') ? '' : ' <a href="' + findRoot() + example.url + '">Demo</a>, ')
+ ' <a href="https://github.com/tastejs/todomvc/tree/gh-pages/' + (example.source_url || example.url) + '">Source</a>'
+ '</p>';
}).join('');
aside.querySelector('.source-links').innerHTML = examples;
}
if (frameworkJSON.link_groups) {
links = frameworkJSON.link_groups.map(function (linkGroup) {
return ''
+ '<h4>' + linkGroup.heading + '</h4>'
+ '<ul>'
+ linkGroup.links.map(function (link) {
return ''
+ '<li>'
+ linksTemplate.replace(parser, function (match, key) {
return link[key];
})
+ '</li>';
}).join('')
+ '</ul>';
}).join('');
aside.innerHTML += links;
aside.innerHTML += template.footer.outerHTML;
}
return aside;
};
Learn.prototype.append = function () {
var aside = this._parseTemplate();
aside.className = 'learn';
document.body.className = (document.body.className + ' learn-bar').trim(); document.body.className = (document.body.className + ' learn-bar').trim();
document.body.insertAdjacentHTML('afterBegin', aside.outerHTML); document.body.insertAdjacentHTML('afterBegin', aside.outerHTML);
}; };
appendSourceLink(); appendSourceLink();
......
(function () { (function () {
'use strict'; 'use strict';
// Underscore's Template Module
// Courtesy of underscorejs.org
var _ = (function (_) {
_.defaults = function (object) {
if (!object) {
return object;
}
for (var argsIndex = 1, argsLength = arguments.length; argsIndex < argsLength; argsIndex++) {
var iterable = arguments[argsIndex];
if (iterable) {
for (var key in iterable) {
if (object[key] == null) {
object[key] = iterable[key];
}
}
}
}
return object;
}
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;
// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
"'": "'",
'\\': '\\',
'\r': 'r',
'\n': 'n',
'\t': 't',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
_.template = function(text, data, settings) {
var render;
settings = _.defaults({}, settings, _.templateSettings);
// Combine delimiters into one regular expression via alternation.
var matcher = new RegExp([
(settings.escape || noMatch).source,
(settings.interpolate || noMatch).source,
(settings.evaluate || noMatch).source
].join('|') + '|$', 'g');
// Compile the template source, escaping string literals appropriately.
var index = 0;
var source = "__p+='";
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
source += text.slice(index, offset)
.replace(escaper, function(match) { return '\\' + escapes[match]; });
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
}
if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
}
if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
index = offset + match.length;
return match;
});
source += "';\n";
// If a variable is not specified, place data values in local scope.
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + "return __p;\n";
try {
render = new Function(settings.variable || 'obj', '_', source);
} catch (e) {
e.source = source;
throw e;
}
if (data) return render(data, _);
var template = function(data) {
return render.call(this, data, _);
};
// Provide the compiled function source as a convenience for precompilation.
template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
return template;
};
return _;
})({});
if (location.hostname === 'todomvc.com') { if (location.hostname === 'todomvc.com') {
window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script')); window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script'));
} }
...@@ -88,6 +198,7 @@ ...@@ -88,6 +198,7 @@
framework = document.querySelector('[data-framework]').getAttribute('data-framework'); framework = document.querySelector('[data-framework]').getAttribute('data-framework');
} }
if (template && learnJSON[framework]) { if (template && learnJSON[framework]) {
this.frameworkJSON = learnJSON[framework]; this.frameworkJSON = learnJSON[framework];
this.template = template; this.template = template;
...@@ -96,84 +207,19 @@ ...@@ -96,84 +207,19 @@
} }
} }
Learn.prototype._prepareTemplate = function () { Learn.prototype.append = function () {
var aside = document.createElement('aside');
aside.innerHTML = this.template;
var header = aside.cloneNode(true);
header.removeChild(header.querySelector('ul'));
header.removeChild(header.querySelectorAll('footer')[1]);
return {
header: header,
links: aside.cloneNode(true).querySelector('ul a'),
footer: aside.cloneNode(true).querySelectorAll('footer')[1]
};
};
Learn.prototype._parseTemplate = function () {
if (!this.template) {
return;
}
var frameworkJSON = this.frameworkJSON;
var template = this._prepareTemplate();
var aside = document.createElement('aside'); var aside = document.createElement('aside');
var linksTemplate = template.links.outerHTML; aside.innerHTML = _.template(this.template, this.frameworkJSON);
var parser = /\{\{([^}]*)\}\}/g; aside.className = 'learn';
var header, examples, links;
header = template.header.innerHTML.replace(parser, function (match, key) { // Localize demo links
return frameworkJSON[key]; var demoLinks = aside.querySelectorAll('.demo-link');
Array.prototype.forEach.call(demoLinks, function (demoLink) {
demoLink.setAttribute('href', findRoot() + demoLink.getAttribute('href'));
}); });
aside.innerHTML = header;
if (frameworkJSON.examples) {
examples = frameworkJSON.examples.map(function (example) {
return ''
+ '<h5>' + example.name + '</h5>'
+ '<p>'
+ (location.href.match(example.url + '/') ? '' : ' <a href="' + findRoot() + example.url + '">Demo</a>, ')
+ ' <a href="https://github.com/tastejs/todomvc/tree/gh-pages/' + (example.source_url || example.url) + '">Source</a>'
+ '</p>';
}).join('');
aside.querySelector('.source-links').innerHTML = examples;
}
if (frameworkJSON.link_groups) {
links = frameworkJSON.link_groups.map(function (linkGroup) {
return ''
+ '<h4>' + linkGroup.heading + '</h4>'
+ '<ul>'
+ linkGroup.links.map(function (link) {
return ''
+ '<li>'
+ linksTemplate.replace(parser, function (match, key) {
return link[key];
})
+ '</li>';
}).join('')
+ '</ul>';
}).join('');
aside.innerHTML += links;
aside.innerHTML += template.footer.outerHTML;
}
return aside;
};
Learn.prototype.append = function () {
var aside = this._parseTemplate();
aside.className = 'learn';
document.body.className = (document.body.className + ' learn-bar').trim(); document.body.className = (document.body.className + ' learn-bar').trim();
document.body.insertAdjacentHTML('afterBegin', aside.outerHTML); document.body.insertAdjacentHTML('afterBegin', aside.outerHTML);
}; };
appendSourceLink(); appendSourceLink();
......
(function () { (function () {
'use strict'; 'use strict';
// Underscore's Template Module
// Courtesy of underscorejs.org
var _ = (function (_) {
_.defaults = function (object) {
if (!object) {
return object;
}
for (var argsIndex = 1, argsLength = arguments.length; argsIndex < argsLength; argsIndex++) {
var iterable = arguments[argsIndex];
if (iterable) {
for (var key in iterable) {
if (object[key] == null) {
object[key] = iterable[key];
}
}
}
}
return object;
}
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;
// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
"'": "'",
'\\': '\\',
'\r': 'r',
'\n': 'n',
'\t': 't',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
_.template = function(text, data, settings) {
var render;
settings = _.defaults({}, settings, _.templateSettings);
// Combine delimiters into one regular expression via alternation.
var matcher = new RegExp([
(settings.escape || noMatch).source,
(settings.interpolate || noMatch).source,
(settings.evaluate || noMatch).source
].join('|') + '|$', 'g');
// Compile the template source, escaping string literals appropriately.
var index = 0;
var source = "__p+='";
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
source += text.slice(index, offset)
.replace(escaper, function(match) { return '\\' + escapes[match]; });
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
}
if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
}
if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
index = offset + match.length;
return match;
});
source += "';\n";
// If a variable is not specified, place data values in local scope.
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + "return __p;\n";
try {
render = new Function(settings.variable || 'obj', '_', source);
} catch (e) {
e.source = source;
throw e;
}
if (data) return render(data, _);
var template = function(data) {
return render.call(this, data, _);
};
// Provide the compiled function source as a convenience for precompilation.
template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
return template;
};
return _;
})({});
if (location.hostname === 'todomvc.com') { if (location.hostname === 'todomvc.com') {
window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script')); window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script'));
} }
...@@ -88,6 +198,7 @@ ...@@ -88,6 +198,7 @@
framework = document.querySelector('[data-framework]').getAttribute('data-framework'); framework = document.querySelector('[data-framework]').getAttribute('data-framework');
} }
if (template && learnJSON[framework]) { if (template && learnJSON[framework]) {
this.frameworkJSON = learnJSON[framework]; this.frameworkJSON = learnJSON[framework];
this.template = template; this.template = template;
...@@ -96,84 +207,19 @@ ...@@ -96,84 +207,19 @@
} }
} }
Learn.prototype._prepareTemplate = function () { Learn.prototype.append = function () {
var aside = document.createElement('aside');
aside.innerHTML = this.template;
var header = aside.cloneNode(true);
header.removeChild(header.querySelector('ul'));
header.removeChild(header.querySelectorAll('footer')[1]);
return {
header: header,
links: aside.cloneNode(true).querySelector('ul a'),
footer: aside.cloneNode(true).querySelectorAll('footer')[1]
};
};
Learn.prototype._parseTemplate = function () {
if (!this.template) {
return;
}
var frameworkJSON = this.frameworkJSON;
var template = this._prepareTemplate();
var aside = document.createElement('aside'); var aside = document.createElement('aside');
var linksTemplate = template.links.outerHTML; aside.innerHTML = _.template(this.template, this.frameworkJSON);
var parser = /\{\{([^}]*)\}\}/g; aside.className = 'learn';
var header, examples, links;
header = template.header.innerHTML.replace(parser, function (match, key) { // Localize demo links
return frameworkJSON[key]; var demoLinks = aside.querySelectorAll('.demo-link');
Array.prototype.forEach.call(demoLinks, function (demoLink) {
demoLink.setAttribute('href', findRoot() + demoLink.getAttribute('href'));
}); });
aside.innerHTML = header;
if (frameworkJSON.examples) {
examples = frameworkJSON.examples.map(function (example) {
return ''
+ '<h5>' + example.name + '</h5>'
+ '<p>'
+ (location.href.match(example.url + '/') ? '' : ' <a href="' + findRoot() + example.url + '">Demo</a>, ')
+ ' <a href="https://github.com/tastejs/todomvc/tree/gh-pages/' + (example.source_url || example.url) + '">Source</a>'
+ '</p>';
}).join('');
aside.querySelector('.source-links').innerHTML = examples;
}
if (frameworkJSON.link_groups) {
links = frameworkJSON.link_groups.map(function (linkGroup) {
return ''
+ '<h4>' + linkGroup.heading + '</h4>'
+ '<ul>'
+ linkGroup.links.map(function (link) {
return ''
+ '<li>'
+ linksTemplate.replace(parser, function (match, key) {
return link[key];
})
+ '</li>';
}).join('')
+ '</ul>';
}).join('');
aside.innerHTML += links;
aside.innerHTML += template.footer.outerHTML;
}
return aside;
};
Learn.prototype.append = function () {
var aside = this._parseTemplate();
aside.className = 'learn';
document.body.className = (document.body.className + ' learn-bar').trim(); document.body.className = (document.body.className + ' learn-bar').trim();
document.body.insertAdjacentHTML('afterBegin', aside.outerHTML); document.body.insertAdjacentHTML('afterBegin', aside.outerHTML);
}; };
appendSourceLink(); appendSourceLink();
......
(function () { (function () {
'use strict'; 'use strict';
// Underscore's Template Module
// Courtesy of underscorejs.org
var _ = (function (_) {
_.defaults = function (object) {
if (!object) {
return object;
}
for (var argsIndex = 1, argsLength = arguments.length; argsIndex < argsLength; argsIndex++) {
var iterable = arguments[argsIndex];
if (iterable) {
for (var key in iterable) {
if (object[key] == null) {
object[key] = iterable[key];
}
}
}
}
return object;
}
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;
// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
"'": "'",
'\\': '\\',
'\r': 'r',
'\n': 'n',
'\t': 't',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
_.template = function(text, data, settings) {
var render;
settings = _.defaults({}, settings, _.templateSettings);
// Combine delimiters into one regular expression via alternation.
var matcher = new RegExp([
(settings.escape || noMatch).source,
(settings.interpolate || noMatch).source,
(settings.evaluate || noMatch).source
].join('|') + '|$', 'g');
// Compile the template source, escaping string literals appropriately.
var index = 0;
var source = "__p+='";
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
source += text.slice(index, offset)
.replace(escaper, function(match) { return '\\' + escapes[match]; });
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
}
if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
}
if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
index = offset + match.length;
return match;
});
source += "';\n";
// If a variable is not specified, place data values in local scope.
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + "return __p;\n";
try {
render = new Function(settings.variable || 'obj', '_', source);
} catch (e) {
e.source = source;
throw e;
}
if (data) return render(data, _);
var template = function(data) {
return render.call(this, data, _);
};
// Provide the compiled function source as a convenience for precompilation.
template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
return template;
};
return _;
})({});
if (location.hostname === 'todomvc.com') { if (location.hostname === 'todomvc.com') {
window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script')); window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script'));
} }
...@@ -88,6 +198,7 @@ ...@@ -88,6 +198,7 @@
framework = document.querySelector('[data-framework]').getAttribute('data-framework'); framework = document.querySelector('[data-framework]').getAttribute('data-framework');
} }
if (template && learnJSON[framework]) { if (template && learnJSON[framework]) {
this.frameworkJSON = learnJSON[framework]; this.frameworkJSON = learnJSON[framework];
this.template = template; this.template = template;
...@@ -96,84 +207,19 @@ ...@@ -96,84 +207,19 @@
} }
} }
Learn.prototype._prepareTemplate = function () { Learn.prototype.append = function () {
var aside = document.createElement('aside');
aside.innerHTML = this.template;
var header = aside.cloneNode(true);
header.removeChild(header.querySelector('ul'));
header.removeChild(header.querySelectorAll('footer')[1]);
return {
header: header,
links: aside.cloneNode(true).querySelector('ul a'),
footer: aside.cloneNode(true).querySelectorAll('footer')[1]
};
};
Learn.prototype._parseTemplate = function () {
if (!this.template) {
return;
}
var frameworkJSON = this.frameworkJSON;
var template = this._prepareTemplate();
var aside = document.createElement('aside'); var aside = document.createElement('aside');
var linksTemplate = template.links.outerHTML; aside.innerHTML = _.template(this.template, this.frameworkJSON);
var parser = /\{\{([^}]*)\}\}/g; aside.className = 'learn';
var header, examples, links;
header = template.header.innerHTML.replace(parser, function (match, key) { // Localize demo links
return frameworkJSON[key]; var demoLinks = aside.querySelectorAll('.demo-link');
Array.prototype.forEach.call(demoLinks, function (demoLink) {
demoLink.setAttribute('href', findRoot() + demoLink.getAttribute('href'));
}); });
aside.innerHTML = header;
if (frameworkJSON.examples) {
examples = frameworkJSON.examples.map(function (example) {
return ''
+ '<h5>' + example.name + '</h5>'
+ '<p>'
+ (location.href.match(example.url + '/') ? '' : ' <a href="' + findRoot() + example.url + '">Demo</a>, ')
+ ' <a href="https://github.com/tastejs/todomvc/tree/gh-pages/' + (example.source_url || example.url) + '">Source</a>'
+ '</p>';
}).join('');
aside.querySelector('.source-links').innerHTML = examples;
}
if (frameworkJSON.link_groups) {
links = frameworkJSON.link_groups.map(function (linkGroup) {
return ''
+ '<h4>' + linkGroup.heading + '</h4>'
+ '<ul>'
+ linkGroup.links.map(function (link) {
return ''
+ '<li>'
+ linksTemplate.replace(parser, function (match, key) {
return link[key];
})
+ '</li>';
}).join('')
+ '</ul>';
}).join('');
aside.innerHTML += links;
aside.innerHTML += template.footer.outerHTML;
}
return aside;
};
Learn.prototype.append = function () {
var aside = this._parseTemplate();
aside.className = 'learn';
document.body.className = (document.body.className + ' learn-bar').trim(); document.body.className = (document.body.className + ' learn-bar').trim();
document.body.insertAdjacentHTML('afterBegin', aside.outerHTML); document.body.insertAdjacentHTML('afterBegin', aside.outerHTML);
}; };
appendSourceLink(); appendSourceLink();
......
(function () { (function () {
'use strict'; 'use strict';
// Underscore's Template Module
// Courtesy of underscorejs.org
var _ = (function (_) {
_.defaults = function (object) {
if (!object) {
return object;
}
for (var argsIndex = 1, argsLength = arguments.length; argsIndex < argsLength; argsIndex++) {
var iterable = arguments[argsIndex];
if (iterable) {
for (var key in iterable) {
if (object[key] == null) {
object[key] = iterable[key];
}
}
}
}
return object;
}
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;
// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
"'": "'",
'\\': '\\',
'\r': 'r',
'\n': 'n',
'\t': 't',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
_.template = function(text, data, settings) {
var render;
settings = _.defaults({}, settings, _.templateSettings);
// Combine delimiters into one regular expression via alternation.
var matcher = new RegExp([
(settings.escape || noMatch).source,
(settings.interpolate || noMatch).source,
(settings.evaluate || noMatch).source
].join('|') + '|$', 'g');
// Compile the template source, escaping string literals appropriately.
var index = 0;
var source = "__p+='";
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
source += text.slice(index, offset)
.replace(escaper, function(match) { return '\\' + escapes[match]; });
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
}
if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
}
if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
index = offset + match.length;
return match;
});
source += "';\n";
// If a variable is not specified, place data values in local scope.
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + "return __p;\n";
try {
render = new Function(settings.variable || 'obj', '_', source);
} catch (e) {
e.source = source;
throw e;
}
if (data) return render(data, _);
var template = function(data) {
return render.call(this, data, _);
};
// Provide the compiled function source as a convenience for precompilation.
template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
return template;
};
return _;
})({});
if (location.hostname === 'todomvc.com') { if (location.hostname === 'todomvc.com') {
window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script')); window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script'));
} }
...@@ -88,6 +198,7 @@ ...@@ -88,6 +198,7 @@
framework = document.querySelector('[data-framework]').getAttribute('data-framework'); framework = document.querySelector('[data-framework]').getAttribute('data-framework');
} }
if (template && learnJSON[framework]) { if (template && learnJSON[framework]) {
this.frameworkJSON = learnJSON[framework]; this.frameworkJSON = learnJSON[framework];
this.template = template; this.template = template;
...@@ -96,84 +207,19 @@ ...@@ -96,84 +207,19 @@
} }
} }
Learn.prototype._prepareTemplate = function () { Learn.prototype.append = function () {
var aside = document.createElement('aside');
aside.innerHTML = this.template;
var header = aside.cloneNode(true);
header.removeChild(header.querySelector('ul'));
header.removeChild(header.querySelectorAll('footer')[1]);
return {
header: header,
links: aside.cloneNode(true).querySelector('ul a'),
footer: aside.cloneNode(true).querySelectorAll('footer')[1]
};
};
Learn.prototype._parseTemplate = function () {
if (!this.template) {
return;
}
var frameworkJSON = this.frameworkJSON;
var template = this._prepareTemplate();
var aside = document.createElement('aside'); var aside = document.createElement('aside');
var linksTemplate = template.links.outerHTML; aside.innerHTML = _.template(this.template, this.frameworkJSON);
var parser = /\{\{([^}]*)\}\}/g; aside.className = 'learn';
var header, examples, links;
header = template.header.innerHTML.replace(parser, function (match, key) { // Localize demo links
return frameworkJSON[key]; var demoLinks = aside.querySelectorAll('.demo-link');
Array.prototype.forEach.call(demoLinks, function (demoLink) {
demoLink.setAttribute('href', findRoot() + demoLink.getAttribute('href'));
}); });
aside.innerHTML = header;
if (frameworkJSON.examples) {
examples = frameworkJSON.examples.map(function (example) {
return ''
+ '<h5>' + example.name + '</h5>'
+ '<p>'
+ (location.href.match(example.url + '/') ? '' : ' <a href="' + findRoot() + example.url + '">Demo</a>, ')
+ ' <a href="https://github.com/tastejs/todomvc/tree/gh-pages/' + (example.source_url || example.url) + '">Source</a>'
+ '</p>';
}).join('');
aside.querySelector('.source-links').innerHTML = examples;
}
if (frameworkJSON.link_groups) {
links = frameworkJSON.link_groups.map(function (linkGroup) {
return ''
+ '<h4>' + linkGroup.heading + '</h4>'
+ '<ul>'
+ linkGroup.links.map(function (link) {
return ''
+ '<li>'
+ linksTemplate.replace(parser, function (match, key) {
return link[key];
})
+ '</li>';
}).join('')
+ '</ul>';
}).join('');
aside.innerHTML += links;
aside.innerHTML += template.footer.outerHTML;
}
return aside;
};
Learn.prototype.append = function () {
var aside = this._parseTemplate();
aside.className = 'learn';
document.body.className = (document.body.className + ' learn-bar').trim(); document.body.className = (document.body.className + ' learn-bar').trim();
document.body.insertAdjacentHTML('afterBegin', aside.outerHTML); document.body.insertAdjacentHTML('afterBegin', aside.outerHTML);
}; };
appendSourceLink(); appendSourceLink();
......
(function () { (function () {
'use strict'; 'use strict';
// Underscore's Template Module
// Courtesy of underscorejs.org
var _ = (function (_) {
_.defaults = function (object) {
if (!object) {
return object;
}
for (var argsIndex = 1, argsLength = arguments.length; argsIndex < argsLength; argsIndex++) {
var iterable = arguments[argsIndex];
if (iterable) {
for (var key in iterable) {
if (object[key] == null) {
object[key] = iterable[key];
}
}
}
}
return object;
}
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;
// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
"'": "'",
'\\': '\\',
'\r': 'r',
'\n': 'n',
'\t': 't',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
_.template = function(text, data, settings) {
var render;
settings = _.defaults({}, settings, _.templateSettings);
// Combine delimiters into one regular expression via alternation.
var matcher = new RegExp([
(settings.escape || noMatch).source,
(settings.interpolate || noMatch).source,
(settings.evaluate || noMatch).source
].join('|') + '|$', 'g');
// Compile the template source, escaping string literals appropriately.
var index = 0;
var source = "__p+='";
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
source += text.slice(index, offset)
.replace(escaper, function(match) { return '\\' + escapes[match]; });
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
}
if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
}
if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
index = offset + match.length;
return match;
});
source += "';\n";
// If a variable is not specified, place data values in local scope.
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + "return __p;\n";
try {
render = new Function(settings.variable || 'obj', '_', source);
} catch (e) {
e.source = source;
throw e;
}
if (data) return render(data, _);
var template = function(data) {
return render.call(this, data, _);
};
// Provide the compiled function source as a convenience for precompilation.
template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
return template;
};
return _;
})({});
if (location.hostname === 'todomvc.com') { if (location.hostname === 'todomvc.com') {
window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script')); window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script'));
} }
...@@ -88,6 +198,7 @@ ...@@ -88,6 +198,7 @@
framework = document.querySelector('[data-framework]').getAttribute('data-framework'); framework = document.querySelector('[data-framework]').getAttribute('data-framework');
} }
if (template && learnJSON[framework]) { if (template && learnJSON[framework]) {
this.frameworkJSON = learnJSON[framework]; this.frameworkJSON = learnJSON[framework];
this.template = template; this.template = template;
...@@ -96,84 +207,19 @@ ...@@ -96,84 +207,19 @@
} }
} }
Learn.prototype._prepareTemplate = function () { Learn.prototype.append = function () {
var aside = document.createElement('aside');
aside.innerHTML = this.template;
var header = aside.cloneNode(true);
header.removeChild(header.querySelector('ul'));
header.removeChild(header.querySelectorAll('footer')[1]);
return {
header: header,
links: aside.cloneNode(true).querySelector('ul a'),
footer: aside.cloneNode(true).querySelectorAll('footer')[1]
};
};
Learn.prototype._parseTemplate = function () {
if (!this.template) {
return;
}
var frameworkJSON = this.frameworkJSON;
var template = this._prepareTemplate();
var aside = document.createElement('aside'); var aside = document.createElement('aside');
var linksTemplate = template.links.outerHTML; aside.innerHTML = _.template(this.template, this.frameworkJSON);
var parser = /\{\{([^}]*)\}\}/g; aside.className = 'learn';
var header, examples, links;
header = template.header.innerHTML.replace(parser, function (match, key) { // Localize demo links
return frameworkJSON[key]; var demoLinks = aside.querySelectorAll('.demo-link');
Array.prototype.forEach.call(demoLinks, function (demoLink) {
demoLink.setAttribute('href', findRoot() + demoLink.getAttribute('href'));
}); });
aside.innerHTML = header;
if (frameworkJSON.examples) {
examples = frameworkJSON.examples.map(function (example) {
return ''
+ '<h5>' + example.name + '</h5>'
+ '<p>'
+ (location.href.match(example.url + '/') ? '' : ' <a href="' + findRoot() + example.url + '">Demo</a>, ')
+ ' <a href="https://github.com/tastejs/todomvc/tree/gh-pages/' + (example.source_url || example.url) + '">Source</a>'
+ '</p>';
}).join('');
aside.querySelector('.source-links').innerHTML = examples;
}
if (frameworkJSON.link_groups) {
links = frameworkJSON.link_groups.map(function (linkGroup) {
return ''
+ '<h4>' + linkGroup.heading + '</h4>'
+ '<ul>'
+ linkGroup.links.map(function (link) {
return ''
+ '<li>'
+ linksTemplate.replace(parser, function (match, key) {
return link[key];
})
+ '</li>';
}).join('')
+ '</ul>';
}).join('');
aside.innerHTML += links;
aside.innerHTML += template.footer.outerHTML;
}
return aside;
};
Learn.prototype.append = function () {
var aside = this._parseTemplate();
aside.className = 'learn';
document.body.className = (document.body.className + ' learn-bar').trim(); document.body.className = (document.body.className + ' learn-bar').trim();
document.body.insertAdjacentHTML('afterBegin', aside.outerHTML); document.body.insertAdjacentHTML('afterBegin', aside.outerHTML);
}; };
appendSourceLink(); appendSourceLink();
......
(function () { (function () {
'use strict'; 'use strict';
// Underscore's Template Module
// Courtesy of underscorejs.org
var _ = (function (_) {
_.defaults = function (object) {
if (!object) {
return object;
}
for (var argsIndex = 1, argsLength = arguments.length; argsIndex < argsLength; argsIndex++) {
var iterable = arguments[argsIndex];
if (iterable) {
for (var key in iterable) {
if (object[key] == null) {
object[key] = iterable[key];
}
}
}
}
return object;
}
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;
// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
"'": "'",
'\\': '\\',
'\r': 'r',
'\n': 'n',
'\t': 't',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
_.template = function(text, data, settings) {
var render;
settings = _.defaults({}, settings, _.templateSettings);
// Combine delimiters into one regular expression via alternation.
var matcher = new RegExp([
(settings.escape || noMatch).source,
(settings.interpolate || noMatch).source,
(settings.evaluate || noMatch).source
].join('|') + '|$', 'g');
// Compile the template source, escaping string literals appropriately.
var index = 0;
var source = "__p+='";
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
source += text.slice(index, offset)
.replace(escaper, function(match) { return '\\' + escapes[match]; });
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
}
if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
}
if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
index = offset + match.length;
return match;
});
source += "';\n";
// If a variable is not specified, place data values in local scope.
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + "return __p;\n";
try {
render = new Function(settings.variable || 'obj', '_', source);
} catch (e) {
e.source = source;
throw e;
}
if (data) return render(data, _);
var template = function(data) {
return render.call(this, data, _);
};
// Provide the compiled function source as a convenience for precompilation.
template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
return template;
};
return _;
})({});
if (location.hostname === 'todomvc.com') { if (location.hostname === 'todomvc.com') {
window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script')); window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script'));
} }
...@@ -88,6 +198,7 @@ ...@@ -88,6 +198,7 @@
framework = document.querySelector('[data-framework]').getAttribute('data-framework'); framework = document.querySelector('[data-framework]').getAttribute('data-framework');
} }
if (template && learnJSON[framework]) { if (template && learnJSON[framework]) {
this.frameworkJSON = learnJSON[framework]; this.frameworkJSON = learnJSON[framework];
this.template = template; this.template = template;
...@@ -96,84 +207,19 @@ ...@@ -96,84 +207,19 @@
} }
} }
Learn.prototype._prepareTemplate = function () { Learn.prototype.append = function () {
var aside = document.createElement('aside');
aside.innerHTML = this.template;
var header = aside.cloneNode(true);
header.removeChild(header.querySelector('ul'));
header.removeChild(header.querySelectorAll('footer')[1]);
return {
header: header,
links: aside.cloneNode(true).querySelector('ul a'),
footer: aside.cloneNode(true).querySelectorAll('footer')[1]
};
};
Learn.prototype._parseTemplate = function () {
if (!this.template) {
return;
}
var frameworkJSON = this.frameworkJSON;
var template = this._prepareTemplate();
var aside = document.createElement('aside'); var aside = document.createElement('aside');
var linksTemplate = template.links.outerHTML; aside.innerHTML = _.template(this.template, this.frameworkJSON);
var parser = /\{\{([^}]*)\}\}/g; aside.className = 'learn';
var header, examples, links;
header = template.header.innerHTML.replace(parser, function (match, key) { // Localize demo links
return frameworkJSON[key]; var demoLinks = aside.querySelectorAll('.demo-link');
Array.prototype.forEach.call(demoLinks, function (demoLink) {
demoLink.setAttribute('href', findRoot() + demoLink.getAttribute('href'));
}); });
aside.innerHTML = header;
if (frameworkJSON.examples) {
examples = frameworkJSON.examples.map(function (example) {
return ''
+ '<h5>' + example.name + '</h5>'
+ '<p>'
+ (location.href.match(example.url + '/') ? '' : ' <a href="' + findRoot() + example.url + '">Demo</a>, ')
+ ' <a href="https://github.com/tastejs/todomvc/tree/gh-pages/' + (example.source_url || example.url) + '">Source</a>'
+ '</p>';
}).join('');
aside.querySelector('.source-links').innerHTML = examples;
}
if (frameworkJSON.link_groups) {
links = frameworkJSON.link_groups.map(function (linkGroup) {
return ''
+ '<h4>' + linkGroup.heading + '</h4>'
+ '<ul>'
+ linkGroup.links.map(function (link) {
return ''
+ '<li>'
+ linksTemplate.replace(parser, function (match, key) {
return link[key];
})
+ '</li>';
}).join('')
+ '</ul>';
}).join('');
aside.innerHTML += links;
aside.innerHTML += template.footer.outerHTML;
}
return aside;
};
Learn.prototype.append = function () {
var aside = this._parseTemplate();
aside.className = 'learn';
document.body.className = (document.body.className + ' learn-bar').trim(); document.body.className = (document.body.className + ' learn-bar').trim();
document.body.insertAdjacentHTML('afterBegin', aside.outerHTML); document.body.insertAdjacentHTML('afterBegin', aside.outerHTML);
}; };
appendSourceLink(); appendSourceLink();
......
(function () { (function () {
'use strict'; 'use strict';
// Underscore's Template Module
// Courtesy of underscorejs.org
var _ = (function (_) {
_.defaults = function (object) {
if (!object) {
return object;
}
for (var argsIndex = 1, argsLength = arguments.length; argsIndex < argsLength; argsIndex++) {
var iterable = arguments[argsIndex];
if (iterable) {
for (var key in iterable) {
if (object[key] == null) {
object[key] = iterable[key];
}
}
}
}
return object;
}
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;
// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
"'": "'",
'\\': '\\',
'\r': 'r',
'\n': 'n',
'\t': 't',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
_.template = function(text, data, settings) {
var render;
settings = _.defaults({}, settings, _.templateSettings);
// Combine delimiters into one regular expression via alternation.
var matcher = new RegExp([
(settings.escape || noMatch).source,
(settings.interpolate || noMatch).source,
(settings.evaluate || noMatch).source
].join('|') + '|$', 'g');
// Compile the template source, escaping string literals appropriately.
var index = 0;
var source = "__p+='";
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
source += text.slice(index, offset)
.replace(escaper, function(match) { return '\\' + escapes[match]; });
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
}
if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
}
if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
index = offset + match.length;
return match;
});
source += "';\n";
// If a variable is not specified, place data values in local scope.
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + "return __p;\n";
try {
render = new Function(settings.variable || 'obj', '_', source);
} catch (e) {
e.source = source;
throw e;
}
if (data) return render(data, _);
var template = function(data) {
return render.call(this, data, _);
};
// Provide the compiled function source as a convenience for precompilation.
template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
return template;
};
return _;
})({});
if (location.hostname === 'todomvc.com') { if (location.hostname === 'todomvc.com') {
window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script')); window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script'));
} }
...@@ -88,6 +198,7 @@ ...@@ -88,6 +198,7 @@
framework = document.querySelector('[data-framework]').getAttribute('data-framework'); framework = document.querySelector('[data-framework]').getAttribute('data-framework');
} }
if (template && learnJSON[framework]) { if (template && learnJSON[framework]) {
this.frameworkJSON = learnJSON[framework]; this.frameworkJSON = learnJSON[framework];
this.template = template; this.template = template;
...@@ -96,84 +207,19 @@ ...@@ -96,84 +207,19 @@
} }
} }
Learn.prototype._prepareTemplate = function () { Learn.prototype.append = function () {
var aside = document.createElement('aside');
aside.innerHTML = this.template;
var header = aside.cloneNode(true);
header.removeChild(header.querySelector('ul'));
header.removeChild(header.querySelectorAll('footer')[1]);
return {
header: header,
links: aside.cloneNode(true).querySelector('ul a'),
footer: aside.cloneNode(true).querySelectorAll('footer')[1]
};
};
Learn.prototype._parseTemplate = function () {
if (!this.template) {
return;
}
var frameworkJSON = this.frameworkJSON;
var template = this._prepareTemplate();
var aside = document.createElement('aside'); var aside = document.createElement('aside');
var linksTemplate = template.links.outerHTML; aside.innerHTML = _.template(this.template, this.frameworkJSON);
var parser = /\{\{([^}]*)\}\}/g; aside.className = 'learn';
var header, examples, links;
header = template.header.innerHTML.replace(parser, function (match, key) { // Localize demo links
return frameworkJSON[key]; var demoLinks = aside.querySelectorAll('.demo-link');
Array.prototype.forEach.call(demoLinks, function (demoLink) {
demoLink.setAttribute('href', findRoot() + demoLink.getAttribute('href'));
}); });
aside.innerHTML = header;
if (frameworkJSON.examples) {
examples = frameworkJSON.examples.map(function (example) {
return ''
+ '<h5>' + example.name + '</h5>'
+ '<p>'
+ (location.href.match(example.url + '/') ? '' : ' <a href="' + findRoot() + example.url + '">Demo</a>, ')
+ ' <a href="https://github.com/tastejs/todomvc/tree/gh-pages/' + (example.source_url || example.url) + '">Source</a>'
+ '</p>';
}).join('');
aside.querySelector('.source-links').innerHTML = examples;
}
if (frameworkJSON.link_groups) {
links = frameworkJSON.link_groups.map(function (linkGroup) {
return ''
+ '<h4>' + linkGroup.heading + '</h4>'
+ '<ul>'
+ linkGroup.links.map(function (link) {
return ''
+ '<li>'
+ linksTemplate.replace(parser, function (match, key) {
return link[key];
})
+ '</li>';
}).join('')
+ '</ul>';
}).join('');
aside.innerHTML += links;
aside.innerHTML += template.footer.outerHTML;
}
return aside;
};
Learn.prototype.append = function () {
var aside = this._parseTemplate();
aside.className = 'learn';
document.body.className = (document.body.className + ' learn-bar').trim(); document.body.className = (document.body.className + ' learn-bar').trim();
document.body.insertAdjacentHTML('afterBegin', aside.outerHTML); document.body.insertAdjacentHTML('afterBegin', aside.outerHTML);
}; };
appendSourceLink(); appendSourceLink();
......
(function () { (function () {
'use strict'; 'use strict';
// Underscore's Template Module
// Courtesy of underscorejs.org
var _ = (function (_) {
_.defaults = function (object) {
if (!object) {
return object;
}
for (var argsIndex = 1, argsLength = arguments.length; argsIndex < argsLength; argsIndex++) {
var iterable = arguments[argsIndex];
if (iterable) {
for (var key in iterable) {
if (object[key] == null) {
object[key] = iterable[key];
}
}
}
}
return object;
}
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;
// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
"'": "'",
'\\': '\\',
'\r': 'r',
'\n': 'n',
'\t': 't',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
_.template = function(text, data, settings) {
var render;
settings = _.defaults({}, settings, _.templateSettings);
// Combine delimiters into one regular expression via alternation.
var matcher = new RegExp([
(settings.escape || noMatch).source,
(settings.interpolate || noMatch).source,
(settings.evaluate || noMatch).source
].join('|') + '|$', 'g');
// Compile the template source, escaping string literals appropriately.
var index = 0;
var source = "__p+='";
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
source += text.slice(index, offset)
.replace(escaper, function(match) { return '\\' + escapes[match]; });
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
}
if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
}
if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
index = offset + match.length;
return match;
});
source += "';\n";
// If a variable is not specified, place data values in local scope.
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + "return __p;\n";
try {
render = new Function(settings.variable || 'obj', '_', source);
} catch (e) {
e.source = source;
throw e;
}
if (data) return render(data, _);
var template = function(data) {
return render.call(this, data, _);
};
// Provide the compiled function source as a convenience for precompilation.
template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
return template;
};
return _;
})({});
if (location.hostname === 'todomvc.com') { if (location.hostname === 'todomvc.com') {
window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script')); window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script'));
} }
...@@ -88,6 +198,7 @@ ...@@ -88,6 +198,7 @@
framework = document.querySelector('[data-framework]').getAttribute('data-framework'); framework = document.querySelector('[data-framework]').getAttribute('data-framework');
} }
if (template && learnJSON[framework]) { if (template && learnJSON[framework]) {
this.frameworkJSON = learnJSON[framework]; this.frameworkJSON = learnJSON[framework];
this.template = template; this.template = template;
...@@ -96,84 +207,19 @@ ...@@ -96,84 +207,19 @@
} }
} }
Learn.prototype._prepareTemplate = function () { Learn.prototype.append = function () {
var aside = document.createElement('aside');
aside.innerHTML = this.template;
var header = aside.cloneNode(true);
header.removeChild(header.querySelector('ul'));
header.removeChild(header.querySelectorAll('footer')[1]);
return {
header: header,
links: aside.cloneNode(true).querySelector('ul a'),
footer: aside.cloneNode(true).querySelectorAll('footer')[1]
};
};
Learn.prototype._parseTemplate = function () {
if (!this.template) {
return;
}
var frameworkJSON = this.frameworkJSON;
var template = this._prepareTemplate();
var aside = document.createElement('aside'); var aside = document.createElement('aside');
var linksTemplate = template.links.outerHTML; aside.innerHTML = _.template(this.template, this.frameworkJSON);
var parser = /\{\{([^}]*)\}\}/g; aside.className = 'learn';
var header, examples, links;
header = template.header.innerHTML.replace(parser, function (match, key) { // Localize demo links
return frameworkJSON[key]; var demoLinks = aside.querySelectorAll('.demo-link');
Array.prototype.forEach.call(demoLinks, function (demoLink) {
demoLink.setAttribute('href', findRoot() + demoLink.getAttribute('href'));
}); });
aside.innerHTML = header;
if (frameworkJSON.examples) {
examples = frameworkJSON.examples.map(function (example) {
return ''
+ '<h5>' + example.name + '</h5>'
+ '<p>'
+ (location.href.match(example.url + '/') ? '' : ' <a href="' + findRoot() + example.url + '">Demo</a>, ')
+ ' <a href="https://github.com/tastejs/todomvc/tree/gh-pages/' + (example.source_url || example.url) + '">Source</a>'
+ '</p>';
}).join('');
aside.querySelector('.source-links').innerHTML = examples;
}
if (frameworkJSON.link_groups) {
links = frameworkJSON.link_groups.map(function (linkGroup) {
return ''
+ '<h4>' + linkGroup.heading + '</h4>'
+ '<ul>'
+ linkGroup.links.map(function (link) {
return ''
+ '<li>'
+ linksTemplate.replace(parser, function (match, key) {
return link[key];
})
+ '</li>';
}).join('')
+ '</ul>';
}).join('');
aside.innerHTML += links;
aside.innerHTML += template.footer.outerHTML;
}
return aside;
};
Learn.prototype.append = function () {
var aside = this._parseTemplate();
aside.className = 'learn';
document.body.className = (document.body.className + ' learn-bar').trim(); document.body.className = (document.body.className + ' learn-bar').trim();
document.body.insertAdjacentHTML('afterBegin', aside.outerHTML); document.body.insertAdjacentHTML('afterBegin', aside.outerHTML);
}; };
appendSourceLink(); appendSourceLink();
......
(function () { (function () {
'use strict'; 'use strict';
// Underscore's Template Module
// Courtesy of underscorejs.org
var _ = (function (_) {
_.defaults = function (object) {
if (!object) {
return object;
}
for (var argsIndex = 1, argsLength = arguments.length; argsIndex < argsLength; argsIndex++) {
var iterable = arguments[argsIndex];
if (iterable) {
for (var key in iterable) {
if (object[key] == null) {
object[key] = iterable[key];
}
}
}
}
return object;
}
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;
// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
"'": "'",
'\\': '\\',
'\r': 'r',
'\n': 'n',
'\t': 't',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
_.template = function(text, data, settings) {
var render;
settings = _.defaults({}, settings, _.templateSettings);
// Combine delimiters into one regular expression via alternation.
var matcher = new RegExp([
(settings.escape || noMatch).source,
(settings.interpolate || noMatch).source,
(settings.evaluate || noMatch).source
].join('|') + '|$', 'g');
// Compile the template source, escaping string literals appropriately.
var index = 0;
var source = "__p+='";
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
source += text.slice(index, offset)
.replace(escaper, function(match) { return '\\' + escapes[match]; });
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
}
if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
}
if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
index = offset + match.length;
return match;
});
source += "';\n";
// If a variable is not specified, place data values in local scope.
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + "return __p;\n";
try {
render = new Function(settings.variable || 'obj', '_', source);
} catch (e) {
e.source = source;
throw e;
}
if (data) return render(data, _);
var template = function(data) {
return render.call(this, data, _);
};
// Provide the compiled function source as a convenience for precompilation.
template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
return template;
};
return _;
})({});
if (location.hostname === 'todomvc.com') { if (location.hostname === 'todomvc.com') {
window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script')); window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script'));
} }
...@@ -88,6 +198,7 @@ ...@@ -88,6 +198,7 @@
framework = document.querySelector('[data-framework]').getAttribute('data-framework'); framework = document.querySelector('[data-framework]').getAttribute('data-framework');
} }
if (template && learnJSON[framework]) { if (template && learnJSON[framework]) {
this.frameworkJSON = learnJSON[framework]; this.frameworkJSON = learnJSON[framework];
this.template = template; this.template = template;
...@@ -96,84 +207,19 @@ ...@@ -96,84 +207,19 @@
} }
} }
Learn.prototype._prepareTemplate = function () { Learn.prototype.append = function () {
var aside = document.createElement('aside');
aside.innerHTML = this.template;
var header = aside.cloneNode(true);
header.removeChild(header.querySelector('ul'));
header.removeChild(header.querySelectorAll('footer')[1]);
return {
header: header,
links: aside.cloneNode(true).querySelector('ul a'),
footer: aside.cloneNode(true).querySelectorAll('footer')[1]
};
};
Learn.prototype._parseTemplate = function () {
if (!this.template) {
return;
}
var frameworkJSON = this.frameworkJSON;
var template = this._prepareTemplate();
var aside = document.createElement('aside'); var aside = document.createElement('aside');
var linksTemplate = template.links.outerHTML; aside.innerHTML = _.template(this.template, this.frameworkJSON);
var parser = /\{\{([^}]*)\}\}/g; aside.className = 'learn';
var header, examples, links;
header = template.header.innerHTML.replace(parser, function (match, key) { // Localize demo links
return frameworkJSON[key]; var demoLinks = aside.querySelectorAll('.demo-link');
Array.prototype.forEach.call(demoLinks, function (demoLink) {
demoLink.setAttribute('href', findRoot() + demoLink.getAttribute('href'));
}); });
aside.innerHTML = header;
if (frameworkJSON.examples) {
examples = frameworkJSON.examples.map(function (example) {
return ''
+ '<h5>' + example.name + '</h5>'
+ '<p>'
+ (location.href.match(example.url + '/') ? '' : ' <a href="' + findRoot() + example.url + '">Demo</a>, ')
+ ' <a href="https://github.com/tastejs/todomvc/tree/gh-pages/' + (example.source_url || example.url) + '">Source</a>'
+ '</p>';
}).join('');
aside.querySelector('.source-links').innerHTML = examples;
}
if (frameworkJSON.link_groups) {
links = frameworkJSON.link_groups.map(function (linkGroup) {
return ''
+ '<h4>' + linkGroup.heading + '</h4>'
+ '<ul>'
+ linkGroup.links.map(function (link) {
return ''
+ '<li>'
+ linksTemplate.replace(parser, function (match, key) {
return link[key];
})
+ '</li>';
}).join('')
+ '</ul>';
}).join('');
aside.innerHTML += links;
aside.innerHTML += template.footer.outerHTML;
}
return aside;
};
Learn.prototype.append = function () {
var aside = this._parseTemplate();
aside.className = 'learn';
document.body.className = (document.body.className + ' learn-bar').trim(); document.body.className = (document.body.className + ' learn-bar').trim();
document.body.insertAdjacentHTML('afterBegin', aside.outerHTML); document.body.insertAdjacentHTML('afterBegin', aside.outerHTML);
}; };
appendSourceLink(); appendSourceLink();
......
(function () { (function () {
'use strict'; 'use strict';
// Underscore's Template Module
// Courtesy of underscorejs.org
var _ = (function (_) {
_.defaults = function (object) {
if (!object) {
return object;
}
for (var argsIndex = 1, argsLength = arguments.length; argsIndex < argsLength; argsIndex++) {
var iterable = arguments[argsIndex];
if (iterable) {
for (var key in iterable) {
if (object[key] == null) {
object[key] = iterable[key];
}
}
}
}
return object;
}
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;
// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
"'": "'",
'\\': '\\',
'\r': 'r',
'\n': 'n',
'\t': 't',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
_.template = function(text, data, settings) {
var render;
settings = _.defaults({}, settings, _.templateSettings);
// Combine delimiters into one regular expression via alternation.
var matcher = new RegExp([
(settings.escape || noMatch).source,
(settings.interpolate || noMatch).source,
(settings.evaluate || noMatch).source
].join('|') + '|$', 'g');
// Compile the template source, escaping string literals appropriately.
var index = 0;
var source = "__p+='";
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
source += text.slice(index, offset)
.replace(escaper, function(match) { return '\\' + escapes[match]; });
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
}
if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
}
if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
index = offset + match.length;
return match;
});
source += "';\n";
// If a variable is not specified, place data values in local scope.
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + "return __p;\n";
try {
render = new Function(settings.variable || 'obj', '_', source);
} catch (e) {
e.source = source;
throw e;
}
if (data) return render(data, _);
var template = function(data) {
return render.call(this, data, _);
};
// Provide the compiled function source as a convenience for precompilation.
template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
return template;
};
return _;
})({});
if (location.hostname === 'todomvc.com') { if (location.hostname === 'todomvc.com') {
window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script')); window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script'));
} }
...@@ -88,6 +198,7 @@ ...@@ -88,6 +198,7 @@
framework = document.querySelector('[data-framework]').getAttribute('data-framework'); framework = document.querySelector('[data-framework]').getAttribute('data-framework');
} }
if (template && learnJSON[framework]) { if (template && learnJSON[framework]) {
this.frameworkJSON = learnJSON[framework]; this.frameworkJSON = learnJSON[framework];
this.template = template; this.template = template;
...@@ -96,84 +207,19 @@ ...@@ -96,84 +207,19 @@
} }
} }
Learn.prototype._prepareTemplate = function () { Learn.prototype.append = function () {
var aside = document.createElement('aside');
aside.innerHTML = this.template;
var header = aside.cloneNode(true);
header.removeChild(header.querySelector('ul'));
header.removeChild(header.querySelectorAll('footer')[1]);
return {
header: header,
links: aside.cloneNode(true).querySelector('ul a'),
footer: aside.cloneNode(true).querySelectorAll('footer')[1]
};
};
Learn.prototype._parseTemplate = function () {
if (!this.template) {
return;
}
var frameworkJSON = this.frameworkJSON;
var template = this._prepareTemplate();
var aside = document.createElement('aside'); var aside = document.createElement('aside');
var linksTemplate = template.links.outerHTML; aside.innerHTML = _.template(this.template, this.frameworkJSON);
var parser = /\{\{([^}]*)\}\}/g; aside.className = 'learn';
var header, examples, links;
header = template.header.innerHTML.replace(parser, function (match, key) { // Localize demo links
return frameworkJSON[key]; var demoLinks = aside.querySelectorAll('.demo-link');
Array.prototype.forEach.call(demoLinks, function (demoLink) {
demoLink.setAttribute('href', findRoot() + demoLink.getAttribute('href'));
}); });
aside.innerHTML = header;
if (frameworkJSON.examples) {
examples = frameworkJSON.examples.map(function (example) {
return ''
+ '<h5>' + example.name + '</h5>'
+ '<p>'
+ (location.href.match(example.url + '/') ? '' : ' <a href="' + findRoot() + example.url + '">Demo</a>, ')
+ ' <a href="https://github.com/tastejs/todomvc/tree/gh-pages/' + (example.source_url || example.url) + '">Source</a>'
+ '</p>';
}).join('');
aside.querySelector('.source-links').innerHTML = examples;
}
if (frameworkJSON.link_groups) {
links = frameworkJSON.link_groups.map(function (linkGroup) {
return ''
+ '<h4>' + linkGroup.heading + '</h4>'
+ '<ul>'
+ linkGroup.links.map(function (link) {
return ''
+ '<li>'
+ linksTemplate.replace(parser, function (match, key) {
return link[key];
})
+ '</li>';
}).join('')
+ '</ul>';
}).join('');
aside.innerHTML += links;
aside.innerHTML += template.footer.outerHTML;
}
return aside;
};
Learn.prototype.append = function () {
var aside = this._parseTemplate();
aside.className = 'learn';
document.body.className = (document.body.className + ' learn-bar').trim(); document.body.className = (document.body.className + ' learn-bar').trim();
document.body.insertAdjacentHTML('afterBegin', aside.outerHTML); document.body.insertAdjacentHTML('afterBegin', aside.outerHTML);
}; };
appendSourceLink(); appendSourceLink();
......
(function () { (function () {
'use strict'; 'use strict';
// Underscore's Template Module
// Courtesy of underscorejs.org
var _ = (function (_) {
_.defaults = function (object) {
if (!object) {
return object;
}
for (var argsIndex = 1, argsLength = arguments.length; argsIndex < argsLength; argsIndex++) {
var iterable = arguments[argsIndex];
if (iterable) {
for (var key in iterable) {
if (object[key] == null) {
object[key] = iterable[key];
}
}
}
}
return object;
}
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;
// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
"'": "'",
'\\': '\\',
'\r': 'r',
'\n': 'n',
'\t': 't',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
_.template = function(text, data, settings) {
var render;
settings = _.defaults({}, settings, _.templateSettings);
// Combine delimiters into one regular expression via alternation.
var matcher = new RegExp([
(settings.escape || noMatch).source,
(settings.interpolate || noMatch).source,
(settings.evaluate || noMatch).source
].join('|') + '|$', 'g');
// Compile the template source, escaping string literals appropriately.
var index = 0;
var source = "__p+='";
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
source += text.slice(index, offset)
.replace(escaper, function(match) { return '\\' + escapes[match]; });
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
}
if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
}
if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
index = offset + match.length;
return match;
});
source += "';\n";
// If a variable is not specified, place data values in local scope.
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + "return __p;\n";
try {
render = new Function(settings.variable || 'obj', '_', source);
} catch (e) {
e.source = source;
throw e;
}
if (data) return render(data, _);
var template = function(data) {
return render.call(this, data, _);
};
// Provide the compiled function source as a convenience for precompilation.
template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
return template;
};
return _;
})({});
if (location.hostname === 'todomvc.com') { if (location.hostname === 'todomvc.com') {
window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script')); window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script'));
} }
...@@ -88,6 +198,7 @@ ...@@ -88,6 +198,7 @@
framework = document.querySelector('[data-framework]').getAttribute('data-framework'); framework = document.querySelector('[data-framework]').getAttribute('data-framework');
} }
if (template && learnJSON[framework]) { if (template && learnJSON[framework]) {
this.frameworkJSON = learnJSON[framework]; this.frameworkJSON = learnJSON[framework];
this.template = template; this.template = template;
...@@ -96,84 +207,19 @@ ...@@ -96,84 +207,19 @@
} }
} }
Learn.prototype._prepareTemplate = function () { Learn.prototype.append = function () {
var aside = document.createElement('aside');
aside.innerHTML = this.template;
var header = aside.cloneNode(true);
header.removeChild(header.querySelector('ul'));
header.removeChild(header.querySelectorAll('footer')[1]);
return {
header: header,
links: aside.cloneNode(true).querySelector('ul a'),
footer: aside.cloneNode(true).querySelectorAll('footer')[1]
};
};
Learn.prototype._parseTemplate = function () {
if (!this.template) {
return;
}
var frameworkJSON = this.frameworkJSON;
var template = this._prepareTemplate();
var aside = document.createElement('aside'); var aside = document.createElement('aside');
var linksTemplate = template.links.outerHTML; aside.innerHTML = _.template(this.template, this.frameworkJSON);
var parser = /\{\{([^}]*)\}\}/g; aside.className = 'learn';
var header, examples, links;
header = template.header.innerHTML.replace(parser, function (match, key) { // Localize demo links
return frameworkJSON[key]; var demoLinks = aside.querySelectorAll('.demo-link');
Array.prototype.forEach.call(demoLinks, function (demoLink) {
demoLink.setAttribute('href', findRoot() + demoLink.getAttribute('href'));
}); });
aside.innerHTML = header;
if (frameworkJSON.examples) {
examples = frameworkJSON.examples.map(function (example) {
return ''
+ '<h5>' + example.name + '</h5>'
+ '<p>'
+ (location.href.match(example.url + '/') ? '' : ' <a href="' + findRoot() + example.url + '">Demo</a>, ')
+ ' <a href="https://github.com/tastejs/todomvc/tree/gh-pages/' + (example.source_url || example.url) + '">Source</a>'
+ '</p>';
}).join('');
aside.querySelector('.source-links').innerHTML = examples;
}
if (frameworkJSON.link_groups) {
links = frameworkJSON.link_groups.map(function (linkGroup) {
return ''
+ '<h4>' + linkGroup.heading + '</h4>'
+ '<ul>'
+ linkGroup.links.map(function (link) {
return ''
+ '<li>'
+ linksTemplate.replace(parser, function (match, key) {
return link[key];
})
+ '</li>';
}).join('')
+ '</ul>';
}).join('');
aside.innerHTML += links;
aside.innerHTML += template.footer.outerHTML;
}
return aside;
};
Learn.prototype.append = function () {
var aside = this._parseTemplate();
aside.className = 'learn';
document.body.className = (document.body.className + ' learn-bar').trim(); document.body.className = (document.body.className + ' learn-bar').trim();
document.body.insertAdjacentHTML('afterBegin', aside.outerHTML); document.body.insertAdjacentHTML('afterBegin', aside.outerHTML);
}; };
appendSourceLink(); appendSourceLink();
......
(function () { (function () {
'use strict'; 'use strict';
// Underscore's Template Module
// Courtesy of underscorejs.org
var _ = (function (_) {
_.defaults = function (object) {
if (!object) {
return object;
}
for (var argsIndex = 1, argsLength = arguments.length; argsIndex < argsLength; argsIndex++) {
var iterable = arguments[argsIndex];
if (iterable) {
for (var key in iterable) {
if (object[key] == null) {
object[key] = iterable[key];
}
}
}
}
return object;
}
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;
// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
"'": "'",
'\\': '\\',
'\r': 'r',
'\n': 'n',
'\t': 't',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
_.template = function(text, data, settings) {
var render;
settings = _.defaults({}, settings, _.templateSettings);
// Combine delimiters into one regular expression via alternation.
var matcher = new RegExp([
(settings.escape || noMatch).source,
(settings.interpolate || noMatch).source,
(settings.evaluate || noMatch).source
].join('|') + '|$', 'g');
// Compile the template source, escaping string literals appropriately.
var index = 0;
var source = "__p+='";
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
source += text.slice(index, offset)
.replace(escaper, function(match) { return '\\' + escapes[match]; });
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
}
if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
}
if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
index = offset + match.length;
return match;
});
source += "';\n";
// If a variable is not specified, place data values in local scope.
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + "return __p;\n";
try {
render = new Function(settings.variable || 'obj', '_', source);
} catch (e) {
e.source = source;
throw e;
}
if (data) return render(data, _);
var template = function(data) {
return render.call(this, data, _);
};
// Provide the compiled function source as a convenience for precompilation.
template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
return template;
};
return _;
})({});
if (location.hostname === 'todomvc.com') { if (location.hostname === 'todomvc.com') {
window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script')); window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script'));
} }
...@@ -88,6 +198,7 @@ ...@@ -88,6 +198,7 @@
framework = document.querySelector('[data-framework]').getAttribute('data-framework'); framework = document.querySelector('[data-framework]').getAttribute('data-framework');
} }
if (template && learnJSON[framework]) { if (template && learnJSON[framework]) {
this.frameworkJSON = learnJSON[framework]; this.frameworkJSON = learnJSON[framework];
this.template = template; this.template = template;
...@@ -96,84 +207,19 @@ ...@@ -96,84 +207,19 @@
} }
} }
Learn.prototype._prepareTemplate = function () { Learn.prototype.append = function () {
var aside = document.createElement('aside');
aside.innerHTML = this.template;
var header = aside.cloneNode(true);
header.removeChild(header.querySelector('ul'));
header.removeChild(header.querySelectorAll('footer')[1]);
return {
header: header,
links: aside.cloneNode(true).querySelector('ul a'),
footer: aside.cloneNode(true).querySelectorAll('footer')[1]
};
};
Learn.prototype._parseTemplate = function () {
if (!this.template) {
return;
}
var frameworkJSON = this.frameworkJSON;
var template = this._prepareTemplate();
var aside = document.createElement('aside'); var aside = document.createElement('aside');
var linksTemplate = template.links.outerHTML; aside.innerHTML = _.template(this.template, this.frameworkJSON);
var parser = /\{\{([^}]*)\}\}/g; aside.className = 'learn';
var header, examples, links;
header = template.header.innerHTML.replace(parser, function (match, key) { // Localize demo links
return frameworkJSON[key]; var demoLinks = aside.querySelectorAll('.demo-link');
Array.prototype.forEach.call(demoLinks, function (demoLink) {
demoLink.setAttribute('href', findRoot() + demoLink.getAttribute('href'));
}); });
aside.innerHTML = header;
if (frameworkJSON.examples) {
examples = frameworkJSON.examples.map(function (example) {
return ''
+ '<h5>' + example.name + '</h5>'
+ '<p>'
+ (location.href.match(example.url + '/') ? '' : ' <a href="' + findRoot() + example.url + '">Demo</a>, ')
+ ' <a href="https://github.com/tastejs/todomvc/tree/gh-pages/' + (example.source_url || example.url) + '">Source</a>'
+ '</p>';
}).join('');
aside.querySelector('.source-links').innerHTML = examples;
}
if (frameworkJSON.link_groups) {
links = frameworkJSON.link_groups.map(function (linkGroup) {
return ''
+ '<h4>' + linkGroup.heading + '</h4>'
+ '<ul>'
+ linkGroup.links.map(function (link) {
return ''
+ '<li>'
+ linksTemplate.replace(parser, function (match, key) {
return link[key];
})
+ '</li>';
}).join('')
+ '</ul>';
}).join('');
aside.innerHTML += links;
aside.innerHTML += template.footer.outerHTML;
}
return aside;
};
Learn.prototype.append = function () {
var aside = this._parseTemplate();
aside.className = 'learn';
document.body.className = (document.body.className + ' learn-bar').trim(); document.body.className = (document.body.className + ' learn-bar').trim();
document.body.insertAdjacentHTML('afterBegin', aside.outerHTML); document.body.insertAdjacentHTML('afterBegin', aside.outerHTML);
}; };
appendSourceLink(); appendSourceLink();
......
...@@ -1800,6 +1800,6 @@ ...@@ -1800,6 +1800,6 @@
}] }]
}, },
"templates": { "templates": {
"todomvc": "<header><h3>{{name}}</h3><span class=\"source-links\"></span></header><hr><blockquote class=\"quote speech-bubble\"><p>{{description}}</p><footer><a href=\"http://{{homepage}}\">{{name}}</a></footer></blockquote><hr><ul><li><a href=\"{{url}}\">{{name}}</a></li></ul><footer><hr><em>If you have other helpful links to share, or find any of the links above no longer work, please <a href=\"https://github.com/tastejs/todomvc/issues\">let us know</a>.</em></footer>" "todomvc": "<header> <h3><%= name %></h3> <span class=\"source-links\"> <% examples.forEach(function (example) { %> <h5><%= example.name %></h5> <% if (!location.href.match(example.url + '/')) { %> <a class=\"demo-link\" href=\"<%= example.url %>\">Demo</a>, <% } %> <a href=\"https://github.com/tastejs/todomvc/tree/gh-pages/<%= example.source_url ? example.source_url : example.url %>\">Source</a> <% }); %> </span> </header> <hr> <blockquote class=\"quote speech-bubble\"> <p><%= description %></p> <footer> <a href=\"http://<%= homepage %>\"><%= name %></a> </footer> </blockquote> <hr> <% link_groups.forEach(function (link_group) { %> <h4><%= link_group.heading %></h4> <ul> <% link_group.links.forEach(function (link) { %> <li> <a href=\"<%= link.url %>\"><%= link.name %></a> </li> <% }); %> </ul> <% }); %> <footer> <hr> <em>If you have other helpful links to share, or find any of the links above no longer work, please <a href=\"https://github.com/tastejs/todomvc/issues\">let us know</a>.</em> </footer>"
} }
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment