blob: 017b3a143fa294a5b02464c0a653fbd7a9c63b03 [file]
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">{{tabPanes}}</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(/{{tabPanes}}/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();
function addCodeCopyButtons() {
if (!navigator.clipboard.writeText) {return;}
function copyCodeFor(codeElement) {
return () => {
const clone = codeElement.cloneNode(true);
clone.querySelectorAll('.btnCopyCode').forEach(btn => btn.remove());
navigator.clipboard.writeText(clone.textContent);
const success = addButton('✅', codeElement);
success.disabled = true;
success.style.transition = 'opacity 1.5s ease';
setTimeout(() => {
success.style.opacity = 0;
setTimeout(() => codeElement.removeChild(success), 1500);
}, 500);
};
}
function addButton(txt, parent) {
const btn = document.createElement('button');
btn.style.position = 'absolute';
btn.style.top = '6px';
btn.style.right = '6px';
btn.style.borderRadius = '5px';
btn.style.padding = '4px 10px 3px';
btn.textContent = txt;
btn.classList.add('btnCopyCode');
parent.appendChild(btn);
return btn;
}
document
.querySelectorAll('pre[class^=language]')
.forEach(codeElement => {
codeElement.style.position = 'relative';
const btn = addButton('📎', codeElement);
btn.onclick = copyCodeFor(codeElement);
});
}
addCodeCopyButtons();