diff options
Diffstat (limited to 'theme/javascript')
-rw-r--r-- | theme/javascript/dropdown.js | 25 | ||||
-rw-r--r-- | theme/javascript/events.js | 4 | ||||
-rwxr-xr-x | theme/javascript/index.js | 84 | ||||
-rw-r--r-- | theme/javascript/keyboard.js | 36 | ||||
-rw-r--r-- | theme/javascript/loading.js | 14 | ||||
-rw-r--r-- | theme/javascript/navigation.js | 165 | ||||
-rw-r--r-- | theme/javascript/platform.js | 5 | ||||
-rw-r--r-- | theme/javascript/sidebar.js | 56 | ||||
-rw-r--r-- | theme/javascript/state.js | 38 | ||||
-rw-r--r-- | theme/javascript/storage.js | 37 | ||||
-rw-r--r-- | theme/javascript/toolbar.js | 181 |
11 files changed, 0 insertions, 645 deletions
diff --git a/theme/javascript/dropdown.js b/theme/javascript/dropdown.js deleted file mode 100644 index d6fc548..0000000 --- a/theme/javascript/dropdown.js +++ /dev/null @@ -1,25 +0,0 @@ -var $ = require('jquery'); - -function toggleDropdown(e) { - var $dropdown = $(e.currentTarget).parent().find('.dropdown-menu'); - - $dropdown.toggleClass('open'); - e.stopPropagation(); - e.preventDefault(); -} - -function closeDropdown(e) { - $('.dropdown-menu').removeClass('open'); -} - -// Bind all dropdown -function init() { - $(document).on('click', '.toggle-dropdown', toggleDropdown); - $(document).on('click', '.dropdown-menu', function(e){ e.stopPropagation(); }); - $(document).on('click', closeDropdown); -} - -module.exports = { - init: init -}; - diff --git a/theme/javascript/events.js b/theme/javascript/events.js deleted file mode 100644 index 9b9a730..0000000 --- a/theme/javascript/events.js +++ /dev/null @@ -1,4 +0,0 @@ -var $ = require('jquery'); - -module.exports = $({}); - diff --git a/theme/javascript/index.js b/theme/javascript/index.js deleted file mode 100755 index b22f810..0000000 --- a/theme/javascript/index.js +++ /dev/null @@ -1,84 +0,0 @@ -var $ = require('jquery'); -var _ = require('lodash'); - -var storage = require('./storage'); -var dropdown = require('./dropdown'); -var events = require('./events'); -var state = require('./state'); -var keyboard = require('./keyboard'); -var navigation = require('./navigation'); -var sidebar = require('./sidebar'); -var toolbar = require('./toolbar'); - - -function start(config) { - // Init sidebar - sidebar.init(); - - // Init keyboard - keyboard.init(); - - // Bind dropdown - dropdown.init(); - - // Init navigation - navigation.init(); - - - // Add action to toggle sidebar - toolbar.createButton({ - index: 0, - icon: 'fa fa-align-justify', - onClick: function(e) { - e.preventDefault(); - sidebar.toggle(); - } - }); - - events.trigger('start', config); - navigation.notify(); -} - -// Export APIs for plugins -var gitbook = { - start: start, - events: events, - state: state, - - // UI sections - toolbar: toolbar, - sidebar: sidebar, - - // Read/Write the localstorage - storage: storage, - - // Create keyboard shortcuts - keyboard: keyboard -}; - - -// Modules mapping for plugins -var MODULES = { - 'gitbook': gitbook, - 'jquery': $, - 'lodash': _ -}; - -window.gitbook = gitbook; -window.$ = $; -window.jQuery = $; -window.require = function(mods, fn) { - mods = _.map(mods, function(mod) { - mod = mod.toLowerCase(); - if (!MODULES[mod]) { - throw new Error('GitBook module '+mod+' doesn\'t exist'); - } - - return MODULES[mod]; - }); - - fn.apply(null, mods); -}; - -module.exports = {}; - diff --git a/theme/javascript/keyboard.js b/theme/javascript/keyboard.js deleted file mode 100644 index ab0cef6..0000000 --- a/theme/javascript/keyboard.js +++ /dev/null @@ -1,36 +0,0 @@ -var Mousetrap = require('mousetrap'); - -var navigation = require('./navigation'); -var sidebar = require('./sidebar'); - -// Bind a keyboard shortcuts -function bindShortcut(keys, fn) { - Mousetrap.bind(keys, function(e) { - fn(); - return false; - }); -} - - -// Bind keyboard shortcuts -function init() { - // Next - bindShortcut(['right'], function(e) { - navigation.goNext(); - }); - - // Prev - bindShortcut(['left'], function(e) { - navigation.goPrev(); - }); - - // Toggle Summary - bindShortcut(['s'], function(e) { - sidebar.toggle(); - }); -} - -module.exports = { - init: init, - bind: bindShortcut -}; diff --git a/theme/javascript/loading.js b/theme/javascript/loading.js deleted file mode 100644 index 797b487..0000000 --- a/theme/javascript/loading.js +++ /dev/null @@ -1,14 +0,0 @@ -var state = require('./state'); - -function showLoading(p) { - state.$book.addClass('is-loading'); - p.always(function() { - state.$book.removeClass('is-loading'); - }); - - return p; -} - -module.exports = { - show: showLoading -}; diff --git a/theme/javascript/navigation.js b/theme/javascript/navigation.js deleted file mode 100644 index dd3bf2e..0000000 --- a/theme/javascript/navigation.js +++ /dev/null @@ -1,165 +0,0 @@ -var $ = require('jquery'); -var url = require('url'); - -var events = require('./events'); -var state = require('./state'); -var loading = require('./loading'); - - -var usePushState = (typeof history.pushState !== 'undefined'); - -function handleNavigation(relativeUrl, push) { - var uri = url.resolve(window.location.pathname, relativeUrl); - - if (!usePushState) { - // Refresh the page to the new URL if pushState not supported - location.href = relativeUrl; - return; - } - - return loading.show($.get(uri) - .done(function (html) { - // Push url to history - if (push) history.pushState({ path: uri }, null, uri); - - // Replace html content - html = html.replace( /<(\/?)(html|head|body)([^>]*)>/ig, function(a,b,c,d){ - return '<' + b + 'div' + ( b ? '' : ' data-element="' + c + '"' ) + d + '>'; - }); - - var $page = $(html); - var $pageHead = $page.find('[data-element=head]'); - var $pageBody = $page.find('.book'); - - // Merge heads - // !! Warning !!: we only update necessary portions to avoid strange behavior (page flickering etc ...) - - // Update title - document.title = $pageHead.find('title').text(); - - // Reference to $('head'); - var $head = $('head'); - - // Update next & prev <link> tags - // Remove old - $head.find('link[rel=prev]').remove(); - $head.find('link[rel=next]').remove(); - - // Add new next * prev <link> tags - $head.append($pageHead.find('link[rel=prev]')); - $head.append($pageHead.find('link[rel=next]')); - - // Merge body - var bodyClass = $('.book').attr('class'); - var scrollPosition = $('.book-summary .summary').scrollTop(); - $pageBody.toggleClass('with-summary', $('.book').hasClass('with-summary')); - - $('.book').replaceWith($pageBody); - $('.book').attr('class', bodyClass); - $('.book-summary .summary').scrollTop(scrollPosition); - - // Update state - state.update($('html')); - preparePage(); - }) - .fail(function (e) { - location.href = relativeUrl; - })); -} - -function updateNavigationPosition() { - var bodyInnerWidth, pageWrapperWidth; - - bodyInnerWidth = parseInt($('.body-inner').css('width'), 10); - pageWrapperWidth = parseInt($('.page-wrapper').css('width'), 10); - $('.navigation-next').css('margin-right', (bodyInnerWidth - pageWrapperWidth) + 'px'); -} - -function notifyPageChange() { - events.trigger('page.change'); -} - -function preparePage(notify) { - var $bookBody = $('.book-body'); - var $bookInner = $bookBody.find('.body-inner'); - var $pageWrapper = $bookInner.find('.page-wrapper'); - - // Update navigation position - updateNavigationPosition(); - - // Focus on content - $pageWrapper.focus(); - - // Reset scroll - $bookInner.scrollTop(0); - $bookBody.scrollTop(0); - - // Notify - if (notify !== false) notifyPageChange(); -} - -function isLeftClickEvent(e) { - return e.button === 0; -} - -function isModifiedEvent(e) { - return !!(e.metaKey || e.altKey || e.ctrlKey || e.shiftKey); -} - -function handlePagination(e) { - if (isModifiedEvent(e) || !isLeftClickEvent(e)) { - return; - } - - e.stopPropagation(); - e.preventDefault(); - - var url = $(this).attr('href'); - if (url) handleNavigation(url, true); -} - -function goNext() { - var url = $('.navigation-next').attr('href'); - if (url) handleNavigation(url, true); -} - -function goPrev() { - var url = $('.navigation-prev').attr('href'); - if (url) handleNavigation(url, true); -} - - -function init() { - // Prevent cache so that using the back button works - // See: http://stackoverflow.com/a/15805399/983070 - $.ajaxSetup({ - cache: false - }); - - // Recreate first page when the page loads. - history.replaceState({ path: window.location.href }, ''); - - // Back Button Hijacking :( - window.onpopstate = function (event) { - if (event.state === null) { - return; - } - return handleNavigation(event.state.path, false); - }; - - $(document).on('click', '.navigation-prev', handlePagination); - $(document).on('click', '.navigation-next', handlePagination); - $(document).on('click', '.summary [data-path] a', handlePagination); - - $(window).resize(updateNavigationPosition); - - // Prepare current page - preparePage(false); -} - -module.exports = { - init: init, - goNext: goNext, - goPrev: goPrev, - notify: notifyPageChange -}; diff --git a/theme/javascript/platform.js b/theme/javascript/platform.js deleted file mode 100644 index b6fb453..0000000 --- a/theme/javascript/platform.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - isMobile: function() { - return (document.width <= 600); - } -}; diff --git a/theme/javascript/sidebar.js b/theme/javascript/sidebar.js deleted file mode 100644 index 9fc1e8e..0000000 --- a/theme/javascript/sidebar.js +++ /dev/null @@ -1,56 +0,0 @@ -var $ = require('jquery'); -var _ = require('lodash'); - -var storage = require('./storage'); -var platform = require('./platform'); -var state = require('./state'); - - -// Toggle sidebar with or withour animation -function toggleSidebar(_state, animation) { - if (state != null && isOpen() == _state) return; - if (animation == null) animation = true; - - state.$book.toggleClass('without-animation', !animation); - state.$book.toggleClass('with-summary', _state); - - storage.set('sidebar', isOpen()); -} - -// Return true if sidebar is open -function isOpen() { - return state.$book.hasClass('with-summary'); -} - -// Prepare sidebar: state and toggle button -function init() { - // Init last state if not mobile - if (!platform.isMobile()) { - toggleSidebar(storage.get('sidebar', true), false); - } - - // Close sidebar after clicking a link on mobile - $(document).on('click', '.book-summary li.chapter a', function(e) { - if (platform.isMobile()) toggleSidebar(false, false); - }); -} - -// Filter summary with a list of path -function filterSummary(paths) { - var $summary = $('.book-summary'); - - $summary.find('li').each(function() { - var path = $(this).data('path'); - var st = paths == null || _.contains(paths, path); - - $(this).toggle(st); - if (st) $(this).parents('li').show(); - }); -} - -module.exports = { - init: init, - isOpen: isOpen, - toggle: toggleSidebar, - filter: filterSummary -}; diff --git a/theme/javascript/state.js b/theme/javascript/state.js deleted file mode 100644 index ef1eb04..0000000 --- a/theme/javascript/state.js +++ /dev/null @@ -1,38 +0,0 @@ -var $ = require('jquery'); -var url = require('url'); -var path = require('path'); - -var state = {}; - -state.update = function(dom) { - var $book = $(dom.find('.book')); - - state.$book = $book; - state.level = $book.data('level'); - state.basePath = $book.data('basepath'); - - // If book is multilingual, language of this book - state.innerLanguage = $book.data('innerlanguage'); - - // Date of build - state.revision = $book.data('revision'); - - // Original path of the file - state.filepath = $book.data('filepath'); - - // Title of the chapter - state.chapterTitle = $book.data('chapter-title'); - - // Absolute url to the root of the book (inner book) - state.root = url.resolve( - location.protocol+'//'+location.host, - path.dirname(path.resolve(location.pathname.replace(/\/$/, '/index.html'), state.basePath)) - ).replace(/\/?$/, '/'); - - // Absolute root to the language (for multilingual book) - state.bookRoot = state.innerLanguage? url.resolve(state.root, '..') : state.root; -}; - -state.update($); - -module.exports = state; diff --git a/theme/javascript/storage.js b/theme/javascript/storage.js deleted file mode 100644 index 7a7643c..0000000 --- a/theme/javascript/storage.js +++ /dev/null @@ -1,37 +0,0 @@ -var baseKey = ''; - -/* - * Simple module for storing data in the browser's local storage - */ -module.exports = { - setBaseKey: function(key) { - baseKey = key; - }, - - // Write something in localstorage - set: function(key, value) { - key = baseKey+':'+key; - - try { - localStorage[key] = JSON.stringify(value); - } catch(e) {} - }, - - // Read a value from localstorage - get: function(key, def) { - key = baseKey+':'+key; - if (localStorage[key] === undefined) return def; - try { - var v = JSON.parse(localStorage[key]); - return v == null ? def : v;; - } catch(err) { - return localStorage[key] || def; - } - }, - - // Remove a key from localstorage - remove: function(key) { - key = baseKey+':'+key; - localStorage.removeItem(key); - } -}; diff --git a/theme/javascript/toolbar.js b/theme/javascript/toolbar.js deleted file mode 100644 index 647578f..0000000 --- a/theme/javascript/toolbar.js +++ /dev/null @@ -1,181 +0,0 @@ -var $ = require('jquery'); -var _ = require('lodash'); - -var events = require('./events'); - -// List of created buttons -var buttons = []; - -// Insert a jquery element at a specific position -function insertAt(parent, selector, index, element) { - var lastIndex = parent.children(selector).size(); - if (index < 0) { - index = Math.max(0, lastIndex + 1 + index); - } - parent.append(element); - - if (index < lastIndex) { - parent.children(selector).eq(index).before(parent.children(selector).last()); - } -} - -// Default click handler -function defaultOnClick(e) { - e.preventDefault(); -} - -// Create a dropdown menu -function createDropdownMenu(dropdown) { - var $menu = $('<div>', { - 'class': 'dropdown-menu', - 'html': '<div class="dropdown-caret"><span class="caret-outer"></span><span class="caret-inner"></span></div>' - }); - - if (_.isString(dropdown)) { - $menu.append(dropdown); - } else { - var groups = _.map(dropdown, function(group) { - if (_.isArray(group)) return group; - else return [group]; - }); - - // Create buttons groups - _.each(groups, function(group) { - var $group = $('<div>', { - 'class': 'buttons' - }); - var sizeClass = 'size-'+group.length; - - // Append buttons - _.each(group, function(btn) { - btn = _.defaults(btn || {}, { - text: '', - className: '', - onClick: defaultOnClick - }); - - var $btn = $('<button>', { - 'class': 'button '+sizeClass+' '+btn.className, - 'text': btn.text - }); - $btn.click(btn.onClick); - - $group.append($btn); - }); - - - $menu.append($group); - }); - - } - - - return $menu; -} - -// Create a new button in the toolbar -function createButton(opts) { - opts = _.defaults(opts || {}, { - // Aria label for the button - label: '', - - // Icon to show - icon: '', - - // Inner text - text: '', - - // Right or left position - position: 'left', - - // Other class name to add to the button - className: '', - - // Triggered when user click on the button - onClick: defaultOnClick, - - // Button is a dropdown - dropdown: null, - - // Position in the toolbar - index: null - }); - - buttons.push(opts); - updateButton(opts); -} - -// Update a button -function updateButton(opts) { - var $result; - var $toolbar = $('.book-header'); - var $title = $toolbar.find('h1'); - - // Build class name - var positionClass = 'pull-'+opts.position; - - // Create button - var $btn = $('<a>', { - 'class': 'btn', - 'text': opts.text? ' ' + opts.text : '', - 'aria-label': opts.label, - 'href': '#' - }); - - // Bind click - $btn.click(opts.onClick); - - // Prepend icon - if (opts.icon) { - $('<i>', { - 'class': opts.icon - }).prependTo($btn); - } - - // Prepare dropdown - if (opts.dropdown) { - var $container = $('<div>', { - 'class': 'dropdown '+positionClass+' '+opts.className - }); - - // Add button to container - $btn.addClass('toggle-dropdown'); - $container.append($btn); - - // Create inner menu - var $menu = createDropdownMenu(opts.dropdown); - - // Menu position - $menu.addClass('dropdown-'+(opts.position == 'right'? 'left' : 'right')); - - $container.append($menu); - $result = $container; - } else { - $btn.addClass(positionClass); - $btn.addClass(opts.className); - $result = $btn; - } - - $result.addClass('js-toolbar-action'); - - if (_.isNumber(opts.index) && opts.index >= 0) { - insertAt($toolbar, '.btn, .dropdown, h1', opts.index, $result); - } else { - $result.insertBefore($title); - } -} - -// Update all buttons -function updateAllButtons() { - $('.js-toolbar-action').remove(); - _.each(buttons, updateButton); -} - -// When page changed, reset buttons -events.bind('page.change', function() { - updateAllButtons(); -}); - -module.exports = { - createButton: createButton -}; |