mirror of
				https://github.com/Jermolene/TiddlyWiki5
				synced 2025-10-31 15:42:59 +00:00 
			
		
		
		
	 587fe9d10e
			
		
	
	587fe9d10e
	
	
	
		
			
			By almost entirely eliminating text subsitution, we can avoid the situations where special characters in tags or titles gets the macro confused. These are quite intricate changes, and so I'd appreciate any help reviewing and testing, many thanks. Fixes #3427
		
			
				
	
	
		
			206 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			206 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| title: $:/core/macros/toc
 | |
| tags: $:/tags/Macro
 | |
| 
 | |
| \define toc-caption()
 | |
| <$set name="tv-wikilinks" value="no">
 | |
|   <$transclude field="caption">
 | |
|     <$view field="title"/>
 | |
|   </$transclude>
 | |
| </$set>
 | |
| \end
 | |
| 
 | |
| \define toc-body(tag,sort:"",itemClassFilter,exclude,path)
 | |
| <ol class="tc-toc">
 | |
|   <$list filter="""[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] $exclude$""">
 | |
|     <$vars item=<<currentTiddler>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}} excluded="""$exclude$ -[<__tag__>]""">
 | |
|       <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item" value="toc-item-selected">
 | |
|         <li class=<<toc-item-class>>>
 | |
|           <$list filter="[all[current]toc-link[no]]" emptyMessage="<$link><$view field='caption'><$view field='title'/></$view></$link>">
 | |
|             <<toc-caption>>
 | |
|           </$list>
 | |
|           <$macrocall $name="toc-body" tag=<<item>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<excluded>> path=<<path>>/>
 | |
|         </li>
 | |
|       </$set>
 | |
|     </$vars>
 | |
|   </$list>
 | |
| </ol>
 | |
| \end
 | |
| 
 | |
| \define toc(tag,sort:"",itemClassFilter:" ")
 | |
| <$macrocall $name="toc-body"  tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> />
 | |
| \end
 | |
| 
 | |
| \define toc-linked-expandable-body(tag,sort:"",itemClassFilter,exclude,path)
 | |
| <!-- helper function -->
 | |
| <$wikify name="toc-state" text="""
 | |
|   <$macrocall $name="qualify" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}} />
 | |
| """>
 | |
|   <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item" value="toc-item-selected">
 | |
|     <li class=<<toc-item-class>>>
 | |
|     <$link>
 | |
|       <$reveal type="nomatch" state=<<toc-state>> text="open">
 | |
|         <$button set=<<toc-state>> setTo="open" class="tc-btn-invisible tc-popup-keep">
 | |
|           {{$:/core/images/right-arrow}}
 | |
|         </$button>
 | |
|       </$reveal>
 | |
|       <$reveal type="match" state=<<toc-state>> text="open">
 | |
|         <$button set=<<toc-state>> setTo="close" class="tc-btn-invisible tc-popup-keep">
 | |
|           {{$:/core/images/down-arrow}}
 | |
|         </$button>
 | |
|       </$reveal>
 | |
|       <<toc-caption>>
 | |
|     </$link>
 | |
|     <$reveal type="match" state=<<toc-state>> text="open">
 | |
|       <$macrocall $name="toc-expandable" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>
 | |
|     </$reveal>
 | |
|     </li>
 | |
|   </$set>
 | |
| </$wikify>
 | |
| \end
 | |
| 
 | |
| \define toc-unlinked-expandable-body(tag,sort:"",itemClassFilter:" ",exclude,path)
 | |
| <!-- helper function -->
 | |
| <$wikify name="toc-state" text="""
 | |
|   <$macrocall $name="qualify" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}} />
 | |
| """>
 | |
|   <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item" value="toc-item-selected">
 | |
|     <li class=<<toc-item-class>>>
 | |
|       <$reveal type="nomatch" state=<<toc-state>> text="open">
 | |
|         <$button set=<<toc-state>> setTo="open" class="tc-btn-invisible tc-popup-keep">
 | |
|           {{$:/core/images/right-arrow}}
 | |
|           <<toc-caption>>
 | |
|         </$button>
 | |
|       </$reveal>
 | |
|       <$reveal type="match" state=<<toc-state>> text="open">
 | |
|         <$button set=<<toc-state>> setTo="close" class="tc-btn-invisible tc-popup-keep">
 | |
|           {{$:/core/images/down-arrow}}
 | |
|           <<toc-caption>>
 | |
|         </$button>
 | |
|       </$reveal>
 | |
|       <$reveal type="match" state=<<toc-state>> text="open">
 | |
|         <$macrocall $name="toc-expandable" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>
 | |
|       </$reveal>
 | |
|     </li>
 | |
|   </$set>
 | |
| </$wikify>
 | |
| \end
 | |
| 
 | |
| \define toc-expandable-empty-message()
 | |
| <$macrocall $name="toc-linked-expandable-body" tag=<<tag>> sort=<<sort>> itemClassFilter=<<itemClassFilter>> exclude=<<excluded>> path=<<path>>/>
 | |
| \end
 | |
| 
 | |
| \define toc-expandable(tag,sort:"",itemClassFilter:" ",exclude,path)
 | |
| <$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> excluded="""$exclude$ -[<__tag__>]""" path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>
 | |
|   <ol class="tc-toc toc-expandable">
 | |
|     <$list filter="""[all[shadows+tiddlers]tag[$tag$]!has[draft.of]$sort$] -[<__tag__>] $exclude$""">
 | |
|       <$list filter="[all[current]toc-link[no]]" emptyMessage=<<toc-expandable-empty-message>> >
 | |
|         <$macrocall $name="toc-unlinked-expandable-body" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter="""itemClassFilter""" exclude=<<excluded>> path=<<path>> />
 | |
|       </$list>
 | |
|     </$list>
 | |
|   </ol>
 | |
| </$vars>
 | |
| \end
 | |
| 
 | |
| \define toc-linked-selective-expandable-body(tag,sort:"",itemClassFilter:" ",exclude,path)
 | |
| <$wikify name="toc-state" text="""
 | |
|   <$macrocall $name="qualify" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}} />
 | |
| """>
 | |
|   <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item" value="toc-item-selected" >
 | |
|     <li class=<<toc-item-class>>>
 | |
|       <$link>
 | |
|           <$list filter="[all[current]tagging[]limit[1]]" variable="ignore" emptyMessage="<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>">
 | |
|           <$reveal type="nomatch" state=<<toc-state>> text="open">
 | |
|             <$button set=<<toc-state>> setTo="open" class="tc-btn-invisible tc-popup-keep">
 | |
|               {{$:/core/images/right-arrow}}
 | |
|             </$button>
 | |
|           </$reveal>
 | |
|           <$reveal type="match" state=<<toc-state>> text="open">
 | |
|             <$button set=<<toc-state>> setTo="close" class="tc-btn-invisible tc-popup-keep">
 | |
|               {{$:/core/images/down-arrow}}
 | |
|             </$button>
 | |
|           </$reveal>
 | |
|         </$list>
 | |
|         <<toc-caption>>
 | |
|       </$link>
 | |
|       <$reveal type="match" state=<<toc-state>> text="open">
 | |
|         <$macrocall $name="toc-selective-expandable" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>
 | |
|       </$reveal>
 | |
|     </li>
 | |
|   </$set>
 | |
| </$wikify>
 | |
| \end
 | |
| 
 | |
| \define toc-unlinked-selective-expandable-body(tag,sort:"",itemClassFilter:" ",exclude,path)
 | |
| <$wikify name="toc-state" text="""
 | |
|   <$macrocall $name="qualify" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}} />
 | |
| """>
 | |
|   <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item" value="toc-item-selected">
 | |
|     <li class=<<toc-item-class>>>
 | |
|       <$list filter="[all[current]tagging[]limit[1]]" variable="ignore" emptyMessage="<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button> <$view field='caption'><$view field='title'/></$view>">
 | |
|         <$reveal type="nomatch" state=<<toc-state>> text="open">
 | |
|           <$button set=<<toc-state>> setTo="open" class="tc-btn-invisible tc-popup-keep">
 | |
|             {{$:/core/images/right-arrow}}
 | |
|             <<toc-caption>>
 | |
|           </$button>
 | |
|         </$reveal>
 | |
|         <$reveal type="match" state=<<toc-state>> text="open">
 | |
|           <$button set=<<toc-state>> setTo="close" class="tc-btn-invisible tc-popup-keep">
 | |
|             {{$:/core/images/down-arrow}}
 | |
|             <<toc-caption>>
 | |
|           </$button>
 | |
|         </$reveal>
 | |
|       </$list>
 | |
|       <$reveal type="match" state=<<toc-state>> text="open">
 | |
|         <$macrocall $name="toc-selective-expandable" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>
 | |
|       </$reveal>
 | |
|     </li>
 | |
|   </$set>
 | |
| </$wikify>
 | |
| \end
 | |
| 
 | |
| \define toc-selective-expandable-empty-message()
 | |
| <$macrocall $name="toc-linked-selective-expandable-body" tag=<<tag>> sort=<<sort>> itemClassFilter=<<itemClassFilter>> exclude=<<excluded>> path=<<path>>/>
 | |
| \end
 | |
| 
 | |
| \define toc-selective-expandable(tag,sort:"",itemClassFilter,exclude,path)
 | |
| <$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> excluded="""$exclude$ -[<__tag__>]""" path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>
 | |
|   <ol class="tc-toc toc-selective-expandable">
 | |
|     <$list filter="""[all[shadows+tiddlers]tag[$tag$]!has[draft.of]$sort$] -[<__tag__>] $exclude$""">
 | |
|       <$list filter="[all[current]toc-link[no]]" variable="ignore" emptyMessage=<<toc-selective-expandable-empty-message>> >
 | |
|         <$macrocall $name=toc-unlinked-selective-expandable-body tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<excluded>> path=<<path>> >
 | |
|       </$list>
 | |
|     </$list>
 | |
|   </ol>
 | |
| </$vars>
 | |
| \end
 | |
| 
 | |
| \define toc-tabbed-external-nav(tag,sort:"",selectedTiddler:"$:/temp/toc/selectedTiddler",unselectedText,missingText,template:"")
 | |
| <$tiddler tiddler={{{ [<__selectedTiddler__>get[text]] }}}>
 | |
|   <div class="tc-tabbed-table-of-contents">
 | |
|     <$linkcatcher to=<<__selectedTiddler__>>>
 | |
|       <div class="tc-table-of-contents">
 | |
|         <$macrocall $name="toc-selective-expandable" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter="[all[current]field:title<__selectedTiddler__>]"/>
 | |
|       </div>
 | |
|     </$linkcatcher>
 | |
|     <div class="tc-tabbed-table-of-contents-content">
 | |
|       <$reveal state=<<__selectedTiddler__>> type="nomatch" text="">
 | |
|         <$transclude mode="block" tiddler=<<__template__>>>
 | |
|           <h1><<toc-caption>></h1>
 | |
|           <$transclude mode="block">$missingText$</$transclude>
 | |
|         </$transclude>
 | |
|       </$reveal>
 | |
|       <$reveal state=<<__selectedTiddler__>> type="match" text="">
 | |
|         $unselectedText$
 | |
|       </$reveal>
 | |
|     </div>
 | |
|   </div>
 | |
| </$tiddler>
 | |
| \end
 | |
| 
 | |
| \define toc-tabbed-internal-nav(tag,sort:"",selectedTiddler:"$:/temp/toc/selectedTiddler",unselectedText,missingText,template:"")
 | |
| <$linkcatcher to=<<__selectedTiddler__>>>
 | |
|   <$macrocall $name="toc-tabbed-external-nav" tag=<<__tag__>> sort=<<__sort__>> selectedTiddler=<<__selectedTiddler__>> unselectedText=<<__unselectedText__>> missingText=<<__missingText__>> template=<<__template__>>/>
 | |
| </$linkcatcher>
 | |
| \end
 | |
| 
 |