@@ -5,15 +5,23 @@ import type { MarkdownHeaderJsx } from "vite-plugin-vue-xecades-note";
55import type { Ref } from "vue" ;
66
77/** Header type used for ref rendering */
8- export type HeaderRef = MarkdownHeaderJsx & {
9- readonly width : string ;
10- readonly indent : string ;
11- readonly opacity : string ;
8+ export type SerialHeader = MarkdownHeaderJsx & {
9+ width : string ;
10+ indent : string ;
11+ opacity : string ;
12+ index : number ;
1213} ;
14+ export type CascadeHeader = SerialHeader & { children : SerialHeader [ ] } ;
1315
1416const width_preset : string [ ] = [ "50px" , "40px" , "30px" , "20px" , "13px" ] ;
15- const indent_preset : string [ ] = [ "0rem" , "1rem" , "1.7rem" , "2.3rem" , "2.8rem" ] ;
16- const opacity_preset : string [ ] = [ "1" , "0.7" , "0.7" , "0.7" , "0.7" ] ;
17+ const indent_preset : string [ ] = [
18+ "0rem" ,
19+ "1.3rem" ,
20+ "1.7rem" ,
21+ "2.3rem" ,
22+ "2.8rem" ,
23+ ] ;
24+ const opacity_preset : string [ ] = [ "1" , "0.8" , "0.7" , "0.7" , "0.7" ] ;
1725
1826/**
1927 * Determine rightbar status (i.e. whether to display or not).
@@ -32,20 +40,41 @@ export const get_rightbar_status = (): RIGHTBAR_STATUS =>
3240 * @param toc - Raw TOC data imported from json
3341 * @returns Normalized TOC data
3442 */
35- export const normalize_toc = ( toc : MarkdownHeaderJsx [ ] ) : HeaderRef [ ] => {
36- const levels : number [ ] = toc . map ( ( item ) => item . level ) ;
43+ export const serial_toc = ( toc : MarkdownHeaderJsx [ ] ) : SerialHeader [ ] => {
44+ const levels = toc . map ( ( item ) => item . level ) ;
45+ const minLevel = Math . min ( ...levels ) ;
46+ const maxLevel = Math . max ( ...levels ) ;
3747
38- const maxLevel : number = Math . max ( ...levels ) ;
39- const minLevel : number = Math . min ( ...levels ) ;
40-
41- return toc . map ( ( item ) => ( {
48+ return toc . map ( ( item , i ) => ( {
4249 ...item ,
4350 width : width_preset [ 4 + item . level - maxLevel ] ,
4451 indent : indent_preset [ item . level - minLevel ] ,
4552 opacity : opacity_preset [ item . level - minLevel ] ,
53+ level : item . level - minLevel ,
54+ index : i ,
4655 } ) ) ;
4756} ;
4857
58+ export const cascade_toc = ( s_toc : SerialHeader [ ] ) : CascadeHeader [ ] => {
59+ let res : CascadeHeader [ ] = [ ] ;
60+ let prev_root = 0 ;
61+
62+ for ( let i = 1 ; i < s_toc . length ; i ++ ) {
63+ if ( s_toc [ i ] . level === s_toc [ prev_root ] . level ) {
64+ const children = s_toc . slice ( prev_root + 1 , i ) ;
65+ res . push ( { ...s_toc [ prev_root ] , children } ) ;
66+ prev_root = i ;
67+ }
68+ }
69+
70+ if ( prev_root < s_toc . length ) {
71+ const children = s_toc . slice ( prev_root + 1 ) ;
72+ res . push ( { ...s_toc [ prev_root ] , children } ) ;
73+ }
74+
75+ return res ;
76+ } ;
77+
4978/**
5079 * Scroll listener class for rightbar.
5180 */
0 commit comments