5, 10 or 20 seats+ for your team - learn more
You can see this entire book for free. Click anywhere in the table of contents to start reading detailed TOC';
var tocServerVars = {
productId: 3500,
getTocUrl: "/ajax/getTocHtml"
}
var tocStatusResolved = false;
$(document).ready(loadTocIfVisible);
function loadTocIfVisible(){
if(tocStatusResolved) { return; }
if($('.toc-loading-container').isInViewport()){
window.removeEventListener("scroll", loadTocIfVisible);
$(window).off("scroll", loadTocIfVisible);
loadToc();
}
}
try {
window.addEventListener("scroll", loadTocIfVisible, { passive: true});
}
catch(e){
$(window).on("scroll", loadTocIfVisible);
}
function loadToc(){
tocStatusResolved = true;
window.TocProvider.getToc(function (tocHtml) {
var $tocLoadingContainer = $('.toc-loading-container');
$tocLoadingContainer.closest(".table-of-contents").prepend(titleHtml);
$tocLoadingContainer.replaceWith(tocHtml);
initializeToc();
}, function(){
$('.toc-loading-container').remove()
});
}
window.TocProvider = {
toc: "",
getToc: function(success, failure){
if(this.toc) { success && success(this.toc); return; }
$.ajax({
url: tocServerVars.getTocUrl,
data: {
id: tocServerVars.productId
}
}).done(function(data){
if(data && data.tocHtml){
this.toc = data.tocHtml;
success && success(this.toc);
}
else {
failure && failure();
}
}).fail(function(error){
failure && failure();
});
}
};
}
catch (e) {}
})();
function initializeToc(){
// Append this only when children of their sectionbody siblings exist (appendices generally aren't expandable)
$(".sectionbody *").children("*").parents(".sectionbody").siblings("h2").wrapInner("").append(controllo);
$(".toc h2 > .chap-link, .toc h1, .toc h3, .toc h4").each(function() {
$(this).html($(this).html().replace(/^(\b\w[0-9A-Z]{0,1}\b\.?)+\s/gi, "$&"));
});
$(".sectionbody").addClass("hidden-toc");
$("body").on("click", ".toc-expando", function(e) {
e.stopPropagation();
$(this).removeClass("toc-expando").addClass("toc-retracto").closest(".sect1").find(".sectionbody").removeClass("hidden-toc").addClass("shown-toc");
});
$("body").on("click", ".toc-retracto", function(e) {
e.stopPropagation();
$(this).removeClass("toc-retracto").addClass("toc-expando").closest(".sect1").find(".sectionbody").removeClass("shown-toc").addClass("hidden-toc");
});
$("body").on("click", ".available h2", function() {
$(this).find(".toc-controllo").click();
});
$("body").on("click", "#show-hide", function() {
if ($("#show-hide").hasClass("hide-full-toc")) {
$(".table-of-contents .sect2, .table-of-contents .sect3").removeClass("shown-toc").addClass("hidden-toc");
$("#show-hide").removeClass("hide-full-toc").html(" detailed TOC");
$(".table-of-contents .body").removeClass("full-toc");
$(".toc-retracto").click();
} else {
$(".table-of-contents .sect2, .table-of-contents .sect3").addClass("shown-toc").removeClass("hidden-toc");
$("#show-hide").addClass("hide-full-toc").html(" detailed TOC");
$(".table-of-contents .body").addClass("full-toc");
$(".toc-expando").click();
}
});
var wrapTocWithLink = function(tocElement, livebookUrl, chapterNumber) {
var urlParams = "?origin=product-toc";
$(tocElement).children(".chap-link").wrap("");
if (!$(tocElement).children().length) {
$(tocElement).html("" + $(tocElement).text() + "");
}
$(tocElement).parent().prepend('Read in liveBook');
$(tocElement).parent().children("div[class*='sectionbody']").each(function(j, sectionsParent) {
$(sectionsParent).children().each(function(k, sectionParent) {
$(sectionParent).children("h3").each(function(l, section) {
//wrap section in an a tag linking to livebook section k + 1
var sectionUrl = livebookUrl + "/section-" + chapterNumber + "-" + (k + 1);
$(section).wrap("");
});
$(sectionParent).children("div[class='sect3']").each(function(m, subsectionParent) {
$(subsectionParent).children("h4").each(function(n, subsection) {
//wrap section in an a tag linking to livebook subsection m + 1
var subsectionUrl = livebookUrl + "/section-" + chapterNumber + "-" + (k + 1) + "-" + (m + 1);
$(subsection).wrap("");
});
});
});
});
};
var $availableChapters = $("h2[id*='chapter_id_']").filter(function(i, chapter) {
return $(chapter).parent().hasClass('available');
});
// All elements containing an '_' filtering out those starting by chapter_id_ and not having their parent the class available.
var $availableNonChapterElements = $("h2[id*='_']").filter(function(i, element) {
return !element.id.match(/^chapter_id_/) && $(element).parent().hasClass('available');
});
$availableChapters.each(function(i, chapter) {
var chapterNumber = chapter.id.split(/_/).pop();
var livebookUrl = "https://livebook.manning.com/book/modern-angular/chapter-" + chapterNumber;
wrapTocWithLink(chapter, livebookUrl, chapterNumber);
});
var isSingleAppendix = $("h2[id*='_']").filter(function(i, element) {
return !element.id.match(/^chapter_id_/) ;
}).length === 1;
$availableNonChapterElements.each(function(i, appendix) {
var appendixGroups = appendix.textContent.match(/[aA]ppendix (\w)/); // i.e "Appendix A: Installation => ['Appendix A', 'A', index:0, input: 'Appendix A: Installation']
var section = isSingleAppendix ? 'a' : appendixGroups && appendixGroups.length === 2 && appendixGroups[1].toLowerCase();
var appendixPathName = isSingleAppendix ? 'appendix' : 'appendix-' + section;
var livebookUrl = "https://livebook.manning.com/book/modern-angular/" + appendixPathName;
wrapTocWithLink(appendix, livebookUrl, section);
});
var $availableMiscElements = $("h2[id='foreword'], h2[id='preface'], h2[id='epilogue']").filter(function(i, element) {
return $(element).parent().hasClass('available');
});
$availableMiscElements.each(function(i, miscElement){
var livebookUrl = "https://livebook.manning.com/book/modern-angular/" + $(miscElement).attr("id");
wrapTocWithLink(miscElement, livebookUrl, "");
});
$(".available h2, .available h3").attr("data-toggle", "tooltip");
$(".available h2, .available h3").attr("data-placement", "left");
$(".available h2, .available h3").attr("title", "Available");
$('[data-toggle="tooltip"]').tooltip();
}
var addToWishlistUrl = "/wishList/addItemFromPage" + "?";
var removeFromWishlistUrl = "/wishList/removeItemFromPage" + "?";
$("body").on("click", ".wishlist-login", function() {
localStorage.removeItem('dynamicloadcache');
});
$("body").on("click", ".wishlist-toggle.wishlist-add, .wishlist-toggle.wishlist-remove", function() {
var productId = $(this).data("product-id");
var url = addToWishlistUrl;
if ($(this).hasClass("wishlist-remove")) {
url = removeFromWishlistUrl;
$(".wishlist-container").removeClass("on-wishlist");
} else {
$(".wishlist-container").addClass("on-wishlist");
}
$.ajax({
type: "GET",
url: url + "id=" + productId,
timeout: 3000,
dataType: "json",
headers: {
'accept': "application/json"
}
});
});
$(document).trigger('activity-product-browse', {productId: '3500'});
})(jQuery);
}
geekle is based on a wordle clone.
how to play
examples