├── _includes ├── above-content.html ├── below-content.html ├── footer-extra.html ├── head-extra.html ├── chapter-iterate-init.html ├── chapter-iterate-next.html ├── chapter-link.html ├── google-analytics.html ├── figure.html ├── metadata-post.json.tpl ├── gitbook-sharing.json.tpl ├── metadata-home.json.tpl ├── body.html ├── footer.html ├── gitbook-metadata.json.tpl ├── chapterbook-toc.html ├── metadata.json.tpl ├── toc-date.html ├── head.html ├── build-chapter-nav.html ├── chapter-iterate-current.html ├── chapter-vars.html └── toc.html ├── sitemap.txt ├── .gitignore ├── assets ├── gitbook │ ├── rouge │ │ ├── igor_pro.css │ │ ├── monokai_sublime.css │ │ ├── bw.css │ │ ├── base16.css │ │ ├── gruvbox.css │ │ ├── pastie.css │ │ ├── colorful.css │ │ ├── tulip.css │ │ ├── magritte.css │ │ ├── thankful_eyes.css │ │ ├── molokai.css │ │ ├── github.css │ │ └── monokai.css │ ├── images │ │ ├── favicon.ico │ │ └── apple-touch-icon-precomposed-152.png │ ├── fonts │ │ └── fontawesome │ │ │ ├── FontAwesome.otf │ │ │ ├── fontawesome-webfont.eot │ │ │ ├── fontawesome-webfont.ttf │ │ │ ├── fontawesome-webfont.woff │ │ │ └── fontawesome-webfont.woff2 │ ├── gitbook-plugin-chapter-fold │ │ ├── chapter-fold.css │ │ └── chapter-fold.js │ ├── gitbook-plugin-search │ │ ├── search.css │ │ ├── search-engine.js │ │ └── search.js │ ├── gitbook-plugin-back-to-top-button │ │ ├── plugin.js │ │ └── plugin.css │ ├── gitbook-plugin-search-pro │ │ ├── search.css │ │ ├── search.js │ │ └── jquery.mark.min.js │ ├── gitbook-plugin-lunr │ │ └── search-lunr.js │ ├── gitbook-plugin-sharing │ │ └── buttons.js │ ├── custom.css │ └── gitbook-plugin-fontsettings │ │ ├── fontsettings.js │ │ └── website.css ├── demo │ ├── jekyll-chapterbook-thumbnail.png │ └── C-maj.svg └── chapterbook │ └── chapterbook.js ├── _layouts ├── post.html ├── home.html ├── part.html ├── page.html ├── sitemap.html ├── default.html └── chapter.html ├── _chapters ├── 020-dummy-chapters │ ├── 000-index.md │ ├── 005.draft-example-draft.md │ ├── 010-lorem.md │ ├── 020-neque.md │ └── 020-dolor.md ├── 010-chapterbook-theme │ ├── 000-index.md │ ├── 010-getting-started.md │ ├── 050-wide-tables.md │ ├── 060-variables.md │ └── 020-helpers.md ├── 000-front │ ├── 020-contents.md │ ├── 030.draft-introduction.md │ └── 010-title.md └── 999-back │ └── 010-references.md ├── _pages ├── privacy.md └── draft-outline.md ├── _posts └── 2023-02-20-initial-release.md ├── Gemfile ├── 404.html ├── _config.yml └── LICENSE /_includes/above-content.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_includes/below-content.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_includes/footer-extra.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_includes/head-extra.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sitemap.txt: -------------------------------------------------------------------------------- 1 | --- 2 | layout: sitemap 3 | --- -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | _site/ 2 | _draft/ 3 | .jekyll-cache/ 4 | -------------------------------------------------------------------------------- /assets/gitbook/rouge/igor_pro.css: -------------------------------------------------------------------------------- 1 | unknown theme: igor_pro 2 | -------------------------------------------------------------------------------- /_layouts/post.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | --- 4 | 5 | {{ content }} -------------------------------------------------------------------------------- /_layouts/home.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | --- 4 | 5 | {{ content }} 6 | -------------------------------------------------------------------------------- /assets/gitbook/rouge/monokai_sublime.css: -------------------------------------------------------------------------------- 1 | unknown theme: monokai_sublime 2 | -------------------------------------------------------------------------------- /_chapters/020-dummy-chapters/000-index.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: dummies 3 | layout: part 4 | --- 5 | -------------------------------------------------------------------------------- /_chapters/010-chapterbook-theme/000-index.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: part 3 | slug: theme 4 | --- 5 | 6 | -------------------------------------------------------------------------------- /assets/gitbook/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasongrimes/jekyll-chapterbook/HEAD/assets/gitbook/images/favicon.ico -------------------------------------------------------------------------------- /assets/demo/jekyll-chapterbook-thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasongrimes/jekyll-chapterbook/HEAD/assets/demo/jekyll-chapterbook-thumbnail.png -------------------------------------------------------------------------------- /assets/gitbook/fonts/fontawesome/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasongrimes/jekyll-chapterbook/HEAD/assets/gitbook/fonts/fontawesome/FontAwesome.otf -------------------------------------------------------------------------------- /assets/gitbook/fonts/fontawesome/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasongrimes/jekyll-chapterbook/HEAD/assets/gitbook/fonts/fontawesome/fontawesome-webfont.eot -------------------------------------------------------------------------------- /assets/gitbook/fonts/fontawesome/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasongrimes/jekyll-chapterbook/HEAD/assets/gitbook/fonts/fontawesome/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /assets/gitbook/fonts/fontawesome/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasongrimes/jekyll-chapterbook/HEAD/assets/gitbook/fonts/fontawesome/fontawesome-webfont.woff -------------------------------------------------------------------------------- /assets/gitbook/fonts/fontawesome/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasongrimes/jekyll-chapterbook/HEAD/assets/gitbook/fonts/fontawesome/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /assets/gitbook/images/apple-touch-icon-precomposed-152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasongrimes/jekyll-chapterbook/HEAD/assets/gitbook/images/apple-touch-icon-precomposed-152.png -------------------------------------------------------------------------------- /_includes/chapter-iterate-init.html: -------------------------------------------------------------------------------- 1 | {% include chapter-iterate-vars.html unset="all-iterators" %} 2 | 3 | {% assign i_chapter_idx = 0 %} 4 | 5 | {% include chapter-iterate-current.html %} 6 | 7 | -------------------------------------------------------------------------------- /_includes/chapter-iterate-next.html: -------------------------------------------------------------------------------- 1 | {% include chapter-iterate-vars.html set="prev" %} 2 | 3 | {% assign i_chapter_idx = i_chapter_idx | plus: 1 %} 4 | 5 | {% include chapter-iterate-current.html %} 6 | 7 | 8 | -------------------------------------------------------------------------------- /_pages/privacy.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Privacy statement 3 | permalink: /privacy 4 | layout: page 5 | --- 6 | 7 | Example privacy page. 8 | 9 | --- 10 | ``` 11 | This file is located at: {{ page.path }} 12 | ``` 13 | --- 14 | -------------------------------------------------------------------------------- /_posts/2023-02-20-initial-release.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Initial release 3 | author: Jason Grimes 4 | date: 2023-02-20 5 | layout: post 6 | --- 7 | 8 | Initial public release of [jekyll-chapterbook](https://github.com/jasongrimes/jekyll-chapterbook). -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | source "https://rubygems.org" 4 | 5 | git_source(:github) { |repo_name| "https://github.com/#{repo_name}" } 6 | gem "jekyll" 7 | gem 'jekyll-feed' 8 | gem 'jekyll-readme-index' 9 | gem 'jemoji' 10 | gem 'webrick' 11 | 12 | # gem "rails" 13 | -------------------------------------------------------------------------------- /_includes/chapter-link.html: -------------------------------------------------------------------------------- 1 | {%- capture _linklabel -%} 2 | {% include chapter-vars.html slug=include.slug withnum="chapter" %} 3 | {%- endcapture -%}{% if chapter_num %}Chapter {{ chapter_num }}. {% endif %}{{ chapter.title | escape }} -------------------------------------------------------------------------------- /_chapters/000-front/020-contents.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Table of Contents 3 | slug: contents 4 | --- 5 | 6 | *Also see the [outline](outline) of the entire book as planned, including draft chapters that are not yet completed.* 7 | 8 | {% include chapterbook-toc.html %} 9 | 10 | --- 11 | ``` 12 | This file is located at: {{ page.path }} 13 | ``` 14 | --- 15 | -------------------------------------------------------------------------------- /_layouts/part.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: chapter 3 | --- 4 | 5 |
Page not found :(
23 |The requested page could not be found.
24 |').html(content); 65 | 66 | $link.appendTo($title); 67 | $title.appendTo($li); 68 | $content.appendTo($li); 69 | $li.appendTo($searchList); 70 | }); 71 | } 72 | 73 | function launchSearch(q) { 74 | // Add class for loading 75 | $body.addClass('with-search'); 76 | $body.addClass('search-loading'); 77 | 78 | // Launch search query 79 | throttle(gitbook.search.query(q, 0, MAX_RESULTS) 80 | .then(function(results) { 81 | displayResults(results); 82 | }) 83 | .always(function() { 84 | $body.removeClass('search-loading'); 85 | }), 1000); 86 | } 87 | 88 | function closeSearch() { 89 | $body.removeClass('with-search'); 90 | $bookSearchResults.removeClass('open'); 91 | } 92 | 93 | function launchSearchFromQueryString() { 94 | var q = getParameterByName('q'); 95 | if (q && q.length > 0) { 96 | // Update search input 97 | $searchInput.val(q); 98 | 99 | // Launch search 100 | launchSearch(q); 101 | } 102 | } 103 | 104 | function bindSearch() { 105 | // Bind DOM 106 | $searchInput = $('#book-search-input input'); 107 | $bookSearchResults = $('#book-search-results'); 108 | $searchList = $bookSearchResults.find('.search-results-list'); 109 | $searchTitle = $bookSearchResults.find('.search-results-title'); 110 | $searchResultsCount = $searchTitle.find('.search-results-count'); 111 | $searchQuery = $searchTitle.find('.search-query'); 112 | 113 | // Launch query based on input content 114 | function handleUpdate() { 115 | var q = $searchInput.val(); 116 | 117 | if (q.length == 0) { 118 | closeSearch(); 119 | } 120 | else { 121 | launchSearch(q); 122 | } 123 | } 124 | 125 | // Detect true content change in search input 126 | // Workaround for IE < 9 127 | var propertyChangeUnbound = false; 128 | $searchInput.on('propertychange', function(e) { 129 | if (e.originalEvent.propertyName == 'value') { 130 | handleUpdate(); 131 | } 132 | }); 133 | 134 | // HTML5 (IE9 & others) 135 | $searchInput.on('input', function(e) { 136 | // Unbind propertychange event for IE9+ 137 | if (!propertyChangeUnbound) { 138 | $(this).unbind('propertychange'); 139 | propertyChangeUnbound = true; 140 | } 141 | 142 | handleUpdate(); 143 | }); 144 | 145 | // Push to history on blur 146 | $searchInput.on('blur', function(e) { 147 | // Update history state 148 | if (usePushState) { 149 | var uri = updateQueryString('q', $(this).val()); 150 | history.pushState({ path: uri }, null, uri); 151 | } 152 | }); 153 | } 154 | 155 | gitbook.events.on('page.change', function() { 156 | bindSearch(); 157 | closeSearch(); 158 | 159 | // Launch search based on query parameter 160 | if (gitbook.search.isInitialized()) { 161 | launchSearchFromQueryString(); 162 | } 163 | }); 164 | 165 | gitbook.events.on('search.ready', function() { 166 | bindSearch(); 167 | 168 | // Launch search from query param at start 169 | launchSearchFromQueryString(); 170 | }); 171 | 172 | function getParameterByName(name) { 173 | var url = window.location.href; 174 | name = name.replace(/[\[\]]/g, '\\$&'); 175 | var regex = new RegExp('[?&]' + name + '(=([^]*)|&|#|$)', 'i'), 176 | results = regex.exec(url); 177 | if (!results) return null; 178 | if (!results[2]) return ''; 179 | return decodeURIComponent(results[2].replace(/\+/g, ' ')); 180 | } 181 | 182 | function updateQueryString(key, value) { 183 | value = encodeURIComponent(value); 184 | 185 | var url = window.location.href; 186 | var re = new RegExp('([?&])' + key + '=.*?(&|#|$)(.*)', 'gi'), 187 | hash; 188 | 189 | if (re.test(url)) { 190 | if (typeof value !== 'undefined' && value !== null) 191 | return url.replace(re, '$1' + key + '=' + value + '$2$3'); 192 | else { 193 | hash = url.split('#'); 194 | url = hash[0].replace(re, '$1$3').replace(/(&|\?)$/, ''); 195 | if (typeof hash[1] !== 'undefined' && hash[1] !== null) 196 | url += '#' + hash[1]; 197 | return url; 198 | } 199 | } 200 | else { 201 | if (typeof value !== 'undefined' && value !== null) { 202 | var separator = url.indexOf('?') !== -1 ? '&' : '?'; 203 | hash = url.split('#'); 204 | url = hash[0] + separator + key + '=' + value; 205 | if (typeof hash[1] !== 'undefined' && hash[1] !== null) 206 | url += '#' + hash[1]; 207 | return url; 208 | } 209 | else 210 | return url; 211 | } 212 | } 213 | }); 214 | -------------------------------------------------------------------------------- /_includes/chapter-vars.html: -------------------------------------------------------------------------------- 1 | {% assign chapter = nil %} 2 | {% assign chapter_is_draft = nil %} 3 | {% assign chapter_is_visible = nil %} 4 | {% assign chapter_sort_index = nil %} 5 | {% assign chapter_sort_index_ext = nil %} 6 | {% assign chapter_is_part_index = nil %} 7 | {% assign part_label = nil %} 8 | {% assign part_unnumbered = nil %} 9 | {% assign part_is_draft = nil %} 10 | {% assign part_folder = nil %} 11 | {% assign part_sort_index = nil %} 12 | {% assign part_sort_index_ext = nil %} 13 | {% assign part_index_chapter = nil %} 14 | 15 | {% comment %} Only set if specified via include.withnum: {% endcomment %} 16 | {% assign chapter_num = nil %} 17 | {% assign part_num = nil %} 18 | 19 | {% if include.id %} 20 | {% assign chapter = site.chapters | where: "id", include.id | first %} 21 | {% elsif include.slug %} 22 | {% assign chapter = site.chapters | where: "slug", include.slug | first %} 23 | {% elsif include.idx %} 24 | {% assign chapter = site.chapters[include.idx] %} 25 | {% endif %} 26 | 27 | {% if chapter %} 28 | {% assign chapter_is_draft = false %} 29 | {% assign chapter_is_visible = true %} 30 | {% assign chapter_basename = chapter.path | split: "/" | last %} 31 | {% assign chapter_sort_index = chapter_basename | split: "-" | first %} 32 | {% assign chapter_sort_index_ext = nil %} 33 | {% assign chapter_is_part_index = false %} 34 | 35 | {% if chapter_basename == "000-index.md" %} 36 | {% assign chapter_is_part_index = true %} 37 | {% endif %} 38 | 39 | {% unless chapter_is_part_index %} 40 | {% if chapter_sort_index contains "." %} 41 | {% assign chapter_sort_index_ext = chapter_sort_index | split: "." | last %} 42 | {% endif %} 43 | {% endunless %} 44 | 45 | {% if chapter_sort_index_ext == "draft" %} 46 | {% assign chapter_is_draft = true %} 47 | {% unless jekyll.environment == "development" and site.show_drafts_in_dev %} 48 | {% assign chapter_is_visible = false %} 49 | {% endunless %} 50 | {% endif %} 51 | 52 | {% assign part_folder = chapter.path | split: "/" | slice: -2 | first %} 53 | {% if part_folder == "_chapters" %} 54 | {% assign part_folder = nil %} 55 | {% endif %} 56 | {% if part_folder %} 57 | {% assign part_sort_index = part_folder | split: "-" | first %} 58 | {% if part_sort_index contains "." %} 59 | {% assign part_sort_index_ext = part_sort_index | split: "." | last %} 60 | {% else %} 61 | {% assign part_sort_index_ext = nil %} 62 | {% endif %} 63 | 64 | {% capture part_index_path %}_chapters/{{ part_folder}}/000-index.md{% endcapture %} 65 | {% assign part_index_chapter = site.chapters | where: "path", part_index_path | first %} 66 | 67 | {% if part_sort_index_ext == "draft" %} 68 | {% assign part_is_draft = true %} 69 | {% else %} 70 | {% assign part_is_draft = false %} 71 | {% endif %} 72 | 73 | {% if part_sort_index == "000" or part_sort_index == "999" %} 74 | {% assign part_unnumbered = true %} 75 | {% assign part_label = nil %} 76 | {% else %} 77 | {% assign part_unnumbered = false %} 78 | {% assign part_label = part_folder | split: "-" | shift | join: " " | capitalize %} 79 | {% endif %} 80 | {% endif %} 81 | 82 | {% comment %} Get part and chapter numbers {% endcomment %} 83 | {% if include.withnum %} 84 | {% unless part_unnumbered %} 85 | {% if include.withnum == "chapter" and chapter_is_draft %} 86 | {% assign chapter_num = "X" %} 87 | {% elsif include.withnum == "chapter" and chapter_is_visible != true %} 88 | {% assign chapter_num = "" %} 89 | {% elsif include.withnum == "chapter" and chapter_is_part_index %} 90 | {% assign chapter_num = "" %} 91 | {% elsif include.withnum == "part" and part_is_draft %} 92 | {% assign part_num = "X" %} 93 | {% elsif part_is_draft and chapter_is_draft %} 94 | {% assign part_num = "X" %} 95 | {% assign chapter_num = "X" %} 96 | {% else %} 97 | {% comment %} Iterate over chapters if it can't be avoided {% endcomment %} 98 | {% include chapter-iterate-init.html %} 99 | {% for i in (0..site.chapters.size) %} 100 | {% if chapter.id == i_chapter.id %} 101 | {% assign chapter_num = i_chapter_num %} 102 | {% assign part_num = i_part_num %} 103 | {% else %} 104 | {% include chapter-iterate-next.html %} 105 | {% endif %} 106 | {% endfor %} 107 | {% endif %} 108 | {% endunless %} 109 | {% endif %} 110 | {% endif %} 111 | 112 | {% if include.inspect %} 113 |
|
116 | chapter inherits from page
117 |
118 | The
119 | chapter
120 | object is identical to the
121 | built-in Jekyll
122 | page
123 |
124 | object with the same
125 | id.
126 |
127 | |
128 | |
|---|---|
| page.id | 131 |{{ page.id }} | 132 |
| chapter.id | 135 |{{ chapter.id }} | 136 |
| chapter.title 139 | | 140 |{{ chapter.title }} | 141 |
| chapter.slug 144 | | 145 |{{ chapter.slug }} | 146 |
| chapter.url 149 | | 150 |{{ chapter.url }} | 151 |
| ... | 154 |See 155 | 156 | page 157 | documentation 158 | | 159 |
| 162 | Chapter metadata 163 | | 164 ||
| chapter_is_draft | 167 |{{ chapter_is_draft }} | 168 |
| chapter_is_visible | 171 |{{ chapter_is_visible }} | 172 |
| chapter_is_part_index | 175 |{{ chapter_is_part_index }} | 176 |
| chapter_sort_index | 179 |{{ chapter_sort_index }} | 180 |
| chapter_sort_index_ext | 183 |{{ chapter_sort_index_ext }} | 184 |
| 187 | Part metadata 188 | | 189 ||
| part_label | 192 |{{ part_label }} | 193 |
| part_unnumbered | 196 |{{ part_unnumbered }} | 197 |
| part_is_draft | 200 |{{ part_is_draft }} | 201 |
| part_folder | 204 |{{ part_folder }} | 205 |
| part_sort_index | 208 |{{ part_sort_index }} | 209 |
| part_sort_index_ext | 212 |{{ part_sort_index_ext }} | 213 |
| part_index_chapter.url | 216 |{{ part_index_chapter.url }} | 217 |
| 220 | Numbering 221 | | 222 ||
| chapter_num | 225 |{{ chapter_num }} | 226 |
| part_num | 229 |{{ part_num }} | 230 |
').html(content);
76 |
77 | $link.appendTo($title);
78 | $title.appendTo($li);
79 | $content.appendTo($li);
80 | $li.appendTo($searchList);
81 | });
82 | $('.body-inner').scrollTop(0);
83 | }
84 |
85 | function escapeReg(keyword) {
86 | //escape regexp prevserve word
87 | return String(keyword).replace(/([\*\.\?\+\$\^\[\]\(\)\{\}\|\/\\])/g, '\\$1');
88 | }
89 |
90 | function query(keyword) {
91 | if (keyword == null || keyword.trim() === '') return;
92 |
93 | var results = [],
94 | index = -1;
95 | for (var page in INDEX_DATA) {
96 | if ((index = INDEX_DATA[page].body.toLowerCase().indexOf(keyword.toLowerCase())) !== -1) {
97 | results.push({
98 | url: page,
99 | title: INDEX_DATA[page].title,
100 | body: INDEX_DATA[page].body.substr(Math.max(0, index - 50), MAX_DESCRIPTION_SIZE).replace(new RegExp('(' + escapeReg(keyword) + ')', 'gi'), '$1')
101 | });
102 | }
103 | }
104 | displayResults({
105 | count: results.length,
106 | query: keyword,
107 | results: results
108 | });
109 | }
110 |
111 | function launchSearch(keyword) {
112 | // Add class for loading
113 | $body.addClass('with-search');
114 | $body.addClass('search-loading');
115 |
116 | function doSearch() {
117 | query(keyword);
118 | $body.removeClass('search-loading');
119 | }
120 |
121 | throttle(doSearch)();
122 | }
123 |
124 | function closeSearch() {
125 | $body.removeClass('with-search');
126 | $('#book-search-results').removeClass('open');
127 | }
128 |
129 | function bindSearch(target) {
130 | // Asynchronously load the index data
131 | {
132 | var url = state.basePath + "/assets/search_plus_index.json";
133 | $.getJSON(url).then(function(data) {
134 | INDEX_DATA = data;
135 | handleUpdate();
136 | });
137 | }
138 |
139 | // Bind DOM
140 | var $body = $('body');
141 |
142 | // Launch query based on input content
143 | function handleUpdate() {
144 | var $searchInput = $(target);
145 | var keyword = $searchInput.val();
146 |
147 | if (keyword === undefined || keyword.length == 0) {
148 | closeSearch();
149 | } else {
150 | launchSearch(keyword);
151 | }
152 | }
153 |
154 | $body.on('keyup', target, function(e) {
155 | if (e.keyCode === 13) {
156 | if (usePushState) {
157 | var uri = updateQueryString('q', $(this).val());
158 | history.pushState({
159 | path: uri
160 | }, null, uri);
161 | }
162 | }
163 | handleUpdate();
164 | });
165 |
166 | $body.on('click', target, function(e) {
167 | if (Object.keys(INDEX_DATA).length === 0) {
168 | var url = state.basePath + "/assets/search_plus_index.json";
169 | $.getJSON(url).then(function(data) {
170 | INDEX_DATA = data;
171 | handleUpdate();
172 | });
173 | }
174 | });
175 |
176 | // Push to history on blur
177 | $body.on('blur', target, function(e) {
178 | // Update history state
179 | if (usePushState) {
180 | var uri = updateQueryString('q', $(this).val());
181 | history.pushState({
182 | path: uri
183 | }, null, uri);
184 | }
185 | });
186 | }
187 |
188 | gitbook.events.on('start', function() {
189 | bindSearch('#book-search-input input');
190 | bindSearch('#book-search-input-inside input');
191 |
192 | showResult();
193 | closeSearch();
194 | });
195 |
196 | // 高亮文本
197 | var highLightPageInner = function(keyword) {
198 | $('.page-inner').mark(keyword, {
199 | 'ignoreJoiners': true,
200 | 'acrossElements': true,
201 | 'separateWordSearch': false
202 | });
203 |
204 | setTimeout(function() {
205 | var mark = $('mark[data-markjs="true"]');
206 | if (mark.length) {
207 | mark[0].scrollIntoView();
208 | }
209 | }, 100);
210 | };
211 |
212 | function showResult() {
213 | var keyword, type;
214 | if (/\b(q|h)=([^&]+)/.test(location.search)) {
215 | type = RegExp.$1;
216 | keyword = decodeURIComponent(RegExp.$2);
217 | if (type === 'q') {
218 | launchSearch(keyword);
219 | } else {
220 | highLightPageInner(keyword);
221 | }
222 | $('#book-search-input input').val(keyword);
223 | $('#book-search-input-inside input').val(keyword);
224 | }
225 | }
226 |
227 | gitbook.events.on('page.change', showResult);
228 |
229 | function getParameterByName(name) {
230 | var url = window.location.href;
231 | name = name.replace(/[\[\]]/g, '\\$&');
232 | var regex = new RegExp('[?&]' + name + '(=([^]*)|&|#|$)', 'i'),
233 | results = regex.exec(url);
234 | if (!results) return null;
235 | if (!results[2]) return '';
236 | return decodeURIComponent(results[2].replace(/\+/g, ' '));
237 | }
238 |
239 | function updateQueryString(key, value) {
240 | value = encodeURIComponent(value);
241 |
242 | var url = window.location.href.replace(/([?&])(?:q|h)=([^&]+)(&|$)/, function(all, pre, value, end) {
243 | if (end === '&') {
244 | return pre;
245 | }
246 | return '';
247 | });
248 | var re = new RegExp('([?&])' + key + '=.*?(&|#|$)(.*)', 'gi'),
249 | hash;
250 |
251 | if (re.test(url)) {
252 | if (typeof value !== 'undefined' && value !== null)
253 | return url.replace(re, '$1' + key + '=' + value + '$2$3');
254 | else {
255 | hash = url.split('#');
256 | url = hash[0].replace(re, '$1$3').replace(/(&|\?)$/, '');
257 | if (typeof hash[1] !== 'undefined' && hash[1] !== null)
258 | url += '#' + hash[1];
259 | return url;
260 | }
261 | } else {
262 | if (typeof value !== 'undefined' && value !== null) {
263 | var separator = url.indexOf('?') !== -1 ? '&' : '?';
264 | hash = url.split('#');
265 | url = hash[0] + separator + key + '=' + value;
266 | if (typeof hash[1] !== 'undefined' && hash[1] !== null)
267 | url += '#' + hash[1];
268 | return url;
269 | } else
270 | return url;
271 | }
272 | }
273 | window.addEventListener('click', function(e) {
274 | if (e.target.tagName === 'A' && e.target.getAttribute('data-need-reload')) {
275 | setTimeout(function() {
276 | location.reload();
277 | }, 100);
278 | }
279 | }, true);
280 | });
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "[]"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright 2019 Tao He
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------
/assets/gitbook/gitbook-plugin-search-pro/jquery.mark.min.js:
--------------------------------------------------------------------------------
1 | /*!***************************************************
2 | * mark.js v8.8.0
3 | * https://github.com/julmot/mark.js
4 | * Copyright (c) 2014–2017, Julian Motz
5 | * Released under the MIT license https://git.io/vwTVl
6 | *****************************************************/
7 | "use strict";function _classCallCheck(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}var _extends=Object.assign||function(a){for(var b=1;b