44< head >
55 < meta charset ="UTF-8 ">
66 < meta name ="viewport " content ="width=device-width, initial-scale=1.0 ">
7-
87 < title > Typikon Book</ title >
98 < meta name ="description " content ="Typikon name derived from Typikon Book, the a static website rendering tool similar to mdbook and hugo, but it focuses only on rendering markdown into an online book, and is easier to use than the other tools.
10- " / >
11- < meta name ="keywords " content ="typikon,book,website,generator,static,html,css,js,theme,rust " / >
12- < meta name ="generator " content ="typikon " / >
13- < meta name ="template " content ="typikon-theme " / >
9+ ">
10+ < meta name ="keywords " content ="typikon,book,website,generator,static,html,css,js,theme,rust ">
11+ < meta name ="generator " content ="typikon ">
12+ < meta name ="template " content ="typikon-theme ">
1413
1514
1615 < link rel ="stylesheet " href ="/assets/css/bootstrap.min.css ">
2322 < link rel ="stylesheet " href ="/assets/dark-theme.css " id ="dark-theme " disabled >
2423
2524 < link rel ="icon " href ="/assets/icon.png " type ="image/png ">
26-
2725</ head >
2826
2927< body >
3533 class ="d-flex align-items-center justify-content-center pb-3 mb-3 link-body-emphasis text-decoration-none border-bottom ">
3634 < span class ="fs-4 fw-semibold "> Typikon Book</ span >
3735 </ a >
38- < ul class ="list-unstyled ps-0 ">
36+ < div class ="input-group mb-3 pb-3 border-bottom ">
37+ < span class ="input-group-text " id ="basic-addon1 ">
38+ < svg xmlns ="http://www.w3.org/2000/svg " width ="16 " height ="16 " fill ="currentColor "
39+ class ="bi bi-search " viewBox ="0 0 16 16 ">
40+ < path
41+ d ="M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001q.044.06.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1 1 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0 ">
42+ </ path >
43+ </ svg >
44+ </ span >
45+ < input type ="text " class ="form-control " id ="search-text " placeholder ="Full text search... "
46+ aria-describedby ="basic-addon1 ">
47+ </ div >
48+ < ul class ="list-unstyled ps-0 " id ="chapterList ">
3949
4050 < li class ="mb-1 ">
4151 < a class ="btn d-inline-flex align-items-center rounded border-0 "
@@ -123,7 +133,7 @@ <h2>Typikon</h2>
123133</ div >
124134< hr />
125135< h3 > 介 绍</ h3 >
126- < p > < img src ="https://img.ibyte .me/w3uchi.png " alt ="Typikon Image "
136+ < p > < img src ="https://img.leonding .me/w3uchi.png " alt ="Typikon Image "
127137 style ="float: left; margin: 0px 20px 10px 10px;height: 100px; " /> </ p >
128138< p > Typikon 的名字源自 < a href ="https://en.wikipedia.org/wiki/Typikon "> Typikon</ a > 书籍,它是一个类似于 mdbook 和 gitbook 的静态网站渲染工具,但它专注于将 Markdown 渲染成在线书籍,比其他工具更易于使用。</ p >
129139< hr />
@@ -145,102 +155,130 @@ <h3>特 点</h3>
145155 </ div >
146156
147157 < script src ="/assets/highlight/highlight.min.js "> </ script >
148- < script src ="/assets/highlight/languages/shell.min.js "> </ script >
149- < script src ="/assets/highlight/languages/sql.min.js "> </ script >
158+
159+
160+ < script src ="/assets/highlight/languages/c.min.js "> </ script >
161+
150162 < script src ="/assets/highlight/languages/java.min.js "> </ script >
163+
151164 < script src ="/assets/highlight/languages/rust.min.js "> </ script >
152- < script src ="/assets/highlight/languages/javascript.min.js "> </ script >
153- < script src ="/assets/highlight/languages/c.min.js "> </ script >
165+
154166 < script src ="/assets/highlight/languages/cpp.min.js "> </ script >
167+
155168 < script src ="/assets/highlight/languages/kotlin.min.js "> </ script >
156- < script src =" /assets/highlight/languages/rust.min.js " > </ script >
169+
157170 < script src ="/assets/highlight/languages/python.min.js "> </ script >
171+
158172 < script src ="/assets/highlight/languages/csharp.min.js "> </ script >
173+
159174 < script src ="/assets/highlight/languages/css.min.js "> </ script >
175+
160176 < script src ="/assets/highlight/languages/swift.min.js "> </ script >
161- < script src ="/assets/highlight/languages/xml.min.js "> </ script >
162- < script src ="/assets/highlight/languages/yaml.min.js "> </ script >
163- < script src ="/assets/highlight/languages/ruby.min.js "> </ script >
164- < script src ="/assets/highlight/languages/php.min.js "> </ script >
165- < script src ="/assets/highlight/languages/go.min.js "> </ script >
166- < script src ="/assets/highlight/languages/dart.min.js "> </ script >
177+
167178 < script src ="/assets/highlight/languages/bash.min.js "> </ script >
168- < script src ="/assets/highlight/languages/dockerfile.min.js "> </ script >
179+
180+ < script src ="/assets/highlight/languages/javascript.min.js "> </ script >
181+
169182
170183
171184 < script src ="/assets/js/bootstrap.min.js "> </ script >
172185
173186 < script src ="/assets/js/bootstrap.bundle.js "> </ script >
174187
188+ < script src ="/assets/js/fuse.min.js "> </ script >
189+
175190
176191 < script >
177- document . addEventListener ( 'DOMContentLoaded' , ( event ) => {
192+ document . addEventListener ( 'DOMContentLoaded' , function ( ) {
193+ initTheme ( ) ;
194+ initializeSearch ( ) ;
195+ } ) ;
178196
197+ function initTheme ( ) {
179198 const darkThemeMediaQuery = window . matchMedia ( '(prefers-color-scheme: dark)' ) ;
180199 const lightThemeLink = document . getElementById ( 'light-theme' ) ;
181200 const darkThemeLink = document . getElementById ( 'dark-theme' ) ;
182201
183- changeTheme = ( mediaQuery ) => {
202+ const changeTheme = ( mediaQuery ) => {
184203 if ( mediaQuery . matches ) {
185- // Dark mode
186204 lightThemeLink . setAttribute ( 'disabled' , true ) ;
187205 darkThemeLink . removeAttribute ( 'disabled' ) ;
188206 } else {
189- // Light mode
190207 darkThemeLink . setAttribute ( 'disabled' , true ) ;
191208 lightThemeLink . removeAttribute ( 'disabled' ) ;
192209 }
193210 } ;
194211
195- // Initial check
196212 changeTheme ( darkThemeMediaQuery ) ;
197-
198- // Listen for changes in OS theme
199213 darkThemeMediaQuery . addListener ( changeTheme ) ;
200214
201-
202- // 初始化 highlight.js
203215 document . querySelectorAll ( 'pre code' ) . forEach ( ( block ) => {
204216 hljs . highlightElement ( block ) ;
205217 } ) ;
206218
207- // 添加自定义 md-p 样式
208219 var markdownContent = document . getElementById ( 'markdown-content' ) ;
209220 if ( markdownContent ) {
210221 var paragraphs = markdownContent . querySelectorAll ( 'p' ) ;
211- paragraphs . forEach ( function ( paragraph ) {
222+ paragraphs . forEach ( ( paragraph ) => {
212223 paragraph . classList . add ( 'md-p' ) ;
213224 } ) ;
214225 }
226+ }
215227
216- } ) ;
228+ function initializeSearch ( ) {
229+ fetch ( '/data.json' )
230+ . then ( response => response . json ( ) )
231+ . then ( data => {
232+ const options = {
233+ keys : [ 'title' , "content" ] ,
234+ includeScore : true ,
235+ tokenize : true ,
236+ threshold : 0.3 ,
237+ tokenSeparator : / [ , | , | 。 ] /
238+ } ;
217239
218- // 监听系统主题切换操作
219- window . onload = ( ) => {
220- const darkThemeMediaQuery = window . matchMedia ( '(prefers-color-scheme: dark)' ) ;
221- const lightThemeLink = document . getElementById ( 'light-theme' ) ;
222- const darkThemeLink = document . getElementById ( 'dark-theme' ) ;
240+ const fuse = new Fuse ( data , options ) ;
241+ const chapterList = document . getElementById ( 'chapterList' ) ;
242+ // 复制一份复原使用
243+ let innerHTML = chapterList . innerHTML ;
244+ function performSearch ( ) {
245+ const query = document . getElementById ( 'search-text' ) . value . trim ( ) ;
246+ const results = fuse . search ( query ) ;
223247
224- changeTheme = ( mediaQuery ) => {
225- if ( mediaQuery . matches ) {
226- // Dark mode
227- lightThemeLink . setAttribute ( 'disabled' , true ) ;
228- darkThemeLink . removeAttribute ( 'disabled' ) ;
229- } else {
230- // Light mode
231- darkThemeLink . setAttribute ( 'disabled' , true ) ;
232- lightThemeLink . removeAttribute ( 'disabled' ) ;
233- }
234- } ;
248+ // 设置显示菜单和搜索结果,如果没有搜索结果就显示菜单,有则反之
249+ chapterList . innerHTML = results . length <= 0 ? chapterList . innerHTML = innerHTML : '' ;
235250
236- // Initial check
237- changeTheme ( darkThemeMediaQuery ) ;
251+ // 遍历搜索结果并生成对应的 HTML
252+ results . forEach ( result => {
253+ const sub_chapter = result . item ; // 假设每个搜索结果是 sub_chapter 对象
238254
239- // Listen for changes in OS theme
240- darkThemeMediaQuery . addListener ( changeTheme ) ;
241- } ;
242- </ script >
255+ // 构建章节和子章节的列表项 HTML
256+ const listItem = `
257+ <li class="mb-1">
258+ <div class="collapse show" id="collapse1">
259+ <ul class="btn-toggle-nav list-unstyled fw-normal pb-1 small">
260+ <li>
261+ <a href="${ sub_chapter . url } "
262+ class="link-body-emphasis d-inline-flex text-decoration-none rounded">
263+ ${ sub_chapter . title }
264+ </a>
265+ </li>
266+ </ul>
267+ </div>
268+ </li>
269+ ` ;
243270
271+ // 将拼接好的章节列表项添加到章节列表容器
272+ chapterList . innerHTML += listItem ;
273+ } ) ;
274+ }
275+
276+ const searchInput = document . getElementById ( 'search-text' ) ;
277+ searchInput . addEventListener ( 'input' , performSearch ) ;
278+ } )
279+ . catch ( error => console . error ( 'Error fetching data:' , error ) ) ;
280+ }
281+ </ script >
244282</ body >
245283
246284</ html >
0 commit comments