blob: 89aceccd7a749549d8a6965de68483080e7dbec9 [file] [log] [blame]
function codeWrap(){
"use strict";
var DEFAULT_TYPE = 'promise';
var $codes = $('[data-code-id]').get();
var codeIds =
$codes
.map(function(div){
return div.attributes["data-code-id"].value
})
.filter(function(item, index, inputArray){
// Each code block has multiple versions so let's only grab one.
return inputArray.indexOf(item) == index;
});
wrap();
setAll();
$('[data-code-tablist] [href]').on('click', function(e){
var href = $(this).attr('href');
setAll(href.replace('#', ''));
setEqualHeights();
e.preventDefault();
});
function wrap(){
var codeTpl = '' +
'<ul class="nav nav-tabs nav-code" data-code-tablist="{{codeId}}">' +
'<li>' +
'<a href="#async">Async functions</a>' +
'</li>' +
'<li class="active">' +
'<a href="#promise">Promises</a>' +
'</li>' +
'<li>' +
'<a href="#callback">Callbacks</a>' +
'</li>' +
'</ul>' +
'<div class="tab-content">{{tapPanes}}</div>';
codeIds
.forEach(function(id){
var $code = $("[data-code-id='" + id + "']");
var paneHtml = $code.get().map(function(div){
return div.outerHTML;
}).join('');
var codeHtml = codeTpl
.replace(/{{tapPanes}}/g, paneHtml)
.replace(/{{codeId}}/g, id);
$code
.first()
.replaceWith(codeHtml);
$code.remove();
});
// Remove items that are only useful for non-JS users.
$('[data-code-hide]').addClass('hide');
}
function setAll(type){
// We default to callback so no need to do anything the first time.
var firstTime = !localStorage.getItem('codeStyle');
if(firstTime){
localStorage.setItem('codeStyle', DEFAULT_TYPE);
}
type = type || localStorage.getItem('codeStyle');
if(typeof type === "undefined" || type === null) {
return;
}
var $tablist = $('[data-code-tablist] [href="#' + type + '"]').parent();
$('[data-code-tablist] li').removeClass('active');
$tablist.addClass('active');
$('.tab-pane').removeClass('active');
$('.tab-pane[id="' + type + '"]').addClass('active');
localStorage.setItem('codeStyle', type);
}
var setHeights = [];
function setEqualHeights(){
if(setHeights.length > 0){
return;
}
codeIds
.forEach(function(id){
var $code = $("[data-code-id='" + id + "']");
var paneHeight = 0;
$code.get().forEach(function(div){
var originalDisplay = div.style.display;
div.style.display = 'block';
var clientHeight = div.clientHeight;
div.style.display = originalDisplay;
if(clientHeight > paneHeight){
paneHeight = clientHeight;
}
});
$code.find('pre').css('height', paneHeight);
setHeights.push(id);
});
}
}
codeWrap();