From 587fe9d10eaa1e837da02f3d8c5f885acef9da10 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Mon, 10 Sep 2018 12:56:38 +0100 Subject: [PATCH] Fix TOC macro with titles ending with double quotes 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 --- core/wiki/macros/toc.tid | 86 +++++++++++++++++++++------------------- 1 file changed, 45 insertions(+), 41 deletions(-) diff --git a/core/wiki/macros/toc.tid b/core/wiki/macros/toc.tid index 23d55b5f5..5e8324a94 100644 --- a/core/wiki/macros/toc.tid +++ b/core/wiki/macros/toc.tid @@ -11,14 +11,14 @@ tags: $:/tags/Macro \define toc-body(tag,sort:"",itemClassFilter,exclude,path)
    - <$list filter="""[all[shadows+tiddlers]tag[$tag$]!has[draft.of]$sort$] -[[$tag$]] $exclude$"""> - <$vars item=<> path="""$path$/$tag$""" excluded="""$exclude$ -[[$tag$]]"""> - <$set name="toc-item-class" filter="""$itemClassFilter$""" emptyValue="toc-item" value="toc-item-selected"> + <$list filter="""[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] $exclude$"""> + <$vars item=<> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}} excluded="""$exclude$ -[<__tag__>]"""> + <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item" value="toc-item-selected">
  1. >> <$list filter="[all[current]toc-link[no]]" emptyMessage="<$link><$view field='caption'><$view field='title'/>"> <> - <$macrocall $name="toc-body" tag=<> sort="""$sort$""" itemClassFilter="""$itemClassFilter$""" exclude=<> path=<>/> + <$macrocall $name="toc-body" tag=<> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<> path=<>/>
  2. @@ -27,13 +27,15 @@ tags: $:/tags/Macro \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) -<$set name="toc-state" value=<>> - <$set name="toc-item-class" filter="""$itemClassFilter$""" emptyValue="toc-item" value="toc-item-selected"> +<$wikify name="toc-state" text=""" + <$macrocall $name="qualify" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix] }}} /> +"""> + <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item" value="toc-item-selected">
  3. >> <$link> <$reveal type="nomatch" state=<> text="open"> @@ -49,17 +51,19 @@ tags: $:/tags/Macro <> <$reveal type="match" state=<> text="open"> - <$macrocall $name="toc-expandable" tag=<> sort="""$sort$""" itemClassFilter="""$itemClassFilter$""" exclude="""$exclude$""" path="""$path$"""/> + <$macrocall $name="toc-expandable" tag=<> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>
  4. - + \end \define toc-unlinked-expandable-body(tag,sort:"",itemClassFilter:" ",exclude,path) -<$set name="toc-state" value=<>> - <$set name="toc-item-class" filter="""$itemClassFilter$""" emptyValue="toc-item" value="toc-item-selected"> +<$wikify name="toc-state" text=""" + <$macrocall $name="qualify" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix] }}} /> +"""> + <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item" value="toc-item-selected">
  5. >> <$reveal type="nomatch" state=<> text="open"> <$button set=<> setTo="open" class="tc-btn-invisible tc-popup-keep"> @@ -74,23 +78,23 @@ tags: $:/tags/Macro <$reveal type="match" state=<> text="open"> - <$macrocall $name="toc-expandable" tag=<> sort="""$sort$""" itemClassFilter="""$itemClassFilter$""" exclude="""$exclude$""" path="""$path$"""/> + <$macrocall $name="toc-expandable" tag=<> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>
  6. - + \end \define toc-expandable-empty-message() -<> +<$macrocall $name="toc-linked-expandable-body" tag=<> sort=<> itemClassFilter=<> exclude=<> path=<>/> \end \define toc-expandable(tag,sort:"",itemClassFilter:" ",exclude,path) -<$vars tag="""$tag$""" sort="""$sort$""" itemClassFilter="""$itemClassFilter$""" excluded="""$exclude$ -[[$tag$]]""" path="""$path$/$tag$"""> +<$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> excluded="""$exclude$ -[<__tag__>]""" path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>
      - <$list filter="""[all[shadows+tiddlers]tag[$tag$]!has[draft.of]$sort$] -[[$tag$]] $exclude$"""> + <$list filter="""[all[shadows+tiddlers]tag[$tag$]!has[draft.of]$sort$] -[<__tag__>] $exclude$"""> <$list filter="[all[current]toc-link[no]]" emptyMessage=<> > - <$macrocall $name="toc-unlinked-expandable-body" tag="""$tag$""" sort="""$sort$""" itemClassFilter="""itemClassFilter""" exclude=<> path=<> /> + <$macrocall $name="toc-unlinked-expandable-body" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter="""itemClassFilter""" exclude=<> path=<> />
    @@ -98,8 +102,10 @@ tags: $:/tags/Macro \end \define toc-linked-selective-expandable-body(tag,sort:"",itemClassFilter:" ",exclude,path) -<$set name="toc-state" value=<>> - <$set name="toc-item-class" filter="""$itemClassFilter$""" emptyValue="toc-item" value="toc-item-selected" > +<$wikify name="toc-state" text=""" + <$macrocall $name="qualify" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix] }}} /> +"""> + <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item" value="toc-item-selected" >
  7. >> <$link> <$list filter="[all[current]tagging[]limit[1]]" variable="ignore" emptyMessage="<$button class='tc-btn-invisible'>{{$:/core/images/blank}}"> @@ -117,16 +123,18 @@ tags: $:/tags/Macro <> <$reveal type="match" state=<> text="open"> - <$macrocall $name="toc-selective-expandable" tag=<> sort="""$sort$""" itemClassFilter="""$itemClassFilter$""" exclude="""$exclude$""" path="""$path$"""/> + <$macrocall $name="toc-selective-expandable" tag=<> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>
  8. - + \end \define toc-unlinked-selective-expandable-body(tag,sort:"",itemClassFilter:" ",exclude,path) -<$set name="toc-state" value=<>> - <$set name="toc-item-class" filter="""$itemClassFilter$""" emptyValue="toc-item" value="toc-item-selected"> +<$wikify name="toc-state" text=""" + <$macrocall $name="qualify" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix] }}} /> +"""> + <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item" value="toc-item-selected">
  9. >> <$list filter="[all[current]tagging[]limit[1]]" variable="ignore" emptyMessage="<$button class='tc-btn-invisible'>{{$:/core/images/blank}} <$view field='caption'><$view field='title'/>"> <$reveal type="nomatch" state=<> text="open"> @@ -143,49 +151,45 @@ tags: $:/tags/Macro <$reveal type="match" state=<> text="open"> - <$macrocall $name="""toc-selective-expandable""" tag=<> sort="""$sort$""" itemClassFilter="""$itemClassFilter$""" exclude="""$exclude$""" path="""$path$"""/> + <$macrocall $name="toc-selective-expandable" tag=<> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>
  10. - + \end \define toc-selective-expandable-empty-message() -<> +<$macrocall $name="toc-linked-selective-expandable-body" tag=<> sort=<> itemClassFilter=<> exclude=<> path=<>/> \end \define toc-selective-expandable(tag,sort:"",itemClassFilter,exclude,path) -<$vars tag="""$tag$""" sort="""$sort$""" itemClassFilter="""$itemClassFilter$""" excluded="""$exclude$ -[[$tag$]]""" path="""$path$/$tag$"""> +<$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> excluded="""$exclude$ -[<__tag__>]""" path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>
      - <$list filter="""[all[shadows+tiddlers]tag[$tag$]!has[draft.of]$sort$] -[[$tag$]] $exclude$"""> + <$list filter="""[all[shadows+tiddlers]tag[$tag$]!has[draft.of]$sort$] -[<__tag__>] $exclude$"""> <$list filter="[all[current]toc-link[no]]" variable="ignore" emptyMessage=<> > - <$macrocall $name=toc-unlinked-selective-expandable-body tag="""$tag$""" sort="""$sort$""" itemClassFilter="""$itemClassFilter$""" exclude=<> path=<> > + <$macrocall $name=toc-unlinked-selective-expandable-body tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<> path=<> >
    \end -\define toc-tabbed-selected-item-filter(selectedTiddler) -[all[current]field:title{$selectedTiddler$}] -\end - \define toc-tabbed-external-nav(tag,sort:"",selectedTiddler:"$:/temp/toc/selectedTiddler",unselectedText,missingText,template:"") -<$tiddler tiddler={{$selectedTiddler$}}> +<$tiddler tiddler={{{ [<__selectedTiddler__>get[text]] }}}>
    - <$linkcatcher to="$selectedTiddler$"> + <$linkcatcher to=<<__selectedTiddler__>>>
    - <$macrocall $name="toc-selective-expandable" tag="""$tag$""" sort="""$sort$""" itemClassFilter=<>/> + <$macrocall $name="toc-selective-expandable" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter="[all[current]field:title<__selectedTiddler__>]"/>
    - <$reveal state="""$selectedTiddler$""" type="nomatch" text=""> - <$transclude mode="block" tiddler="$template$"> + <$reveal state=<<__selectedTiddler__>> type="nomatch" text=""> + <$transclude mode="block" tiddler=<<__template__>>>

    <>

    <$transclude mode="block">$missingText$ - <$reveal state="""$selectedTiddler$""" type="match" text=""> + <$reveal state=<<__selectedTiddler__>> type="match" text=""> $unselectedText$
    @@ -194,8 +198,8 @@ tags: $:/tags/Macro \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 to=<<__selectedTiddler__>>> + <$macrocall $name="toc-tabbed-external-nav" tag=<<__tag__>> sort=<<__sort__>> selectedTiddler=<<__selectedTiddler__>> unselectedText=<<__unselectedText__>> missingText=<<__missingText__>> template=<<__template__>>/> \end