@@ -76,23 +76,82 @@ function render($format, &$renderer, $data) {
7676 $ title = trim ($ renderer ->doc );
7777 $ renderer ->doc = $ this ->store ;
7878 $ this ->store = '' ;
79+ // restore variable
7980 if ($ format =='metadata ' ) {
8081 $ renderer ->capture = $ this ->capture ;
8182 }
8283 // create header
8384 if ($ level < 1 ) $ level = 1 ;
84- $ realtitle = $ title ;
85- // header() of metadata renderer will manage the escape later
86- // FIXME: xhtml for 'preview' toc; metadata renderer for 'show' toc, so they may dismatch
87- if ($ format == 'xhtml ' ) $ title = $ this ->_header_title_plain ($ realtitle );
88- $ renderer ->header ($ title ,$ level ,$ pos ,$ realtitle );
85+ $ method = '_ ' . $ format . '_header ' ;
86+ if (method_exists ($ this ,$ method )) {
87+ // we have special procedure for the renderer
88+ $ this ->$ method ($ title , $ level , $ pos , $ renderer );
89+ } else {
90+ // fall back to default renderer behavior
91+ $ renderer ->header ($ title ,$ level ,$ pos );
92+ }
8993 break ;
9094 }
9195 return true ;
9296 }
9397
94- // removes html tags, for toc
95- function _header_title_plain ($ text ) {
96- return htmlspecialchars_decode (preg_replace ( "#<[^>]*?># " , "" , $ text ),ENT_QUOTES );
98+ // simple function to strip all html tags
99+ function _remove_html_tags ($ text ) {
100+ return preg_replace ( "#<[^>]*?># " , "" , $ text );
101+ }
102+
103+ /**
104+ * Revised procedures for renderers
105+ *
106+ * Basically adds &$renderer argument and replaces $this to $renderer,
107+ * and our procedures of course.
108+ */
109+
110+ function _xhtml_header ($ text , $ level , $ pos , &$ renderer ) {
111+ global $ conf ;
112+
113+ $ displaytext = $ text ; // <= added
114+ $ text = htmlspecialchars_decode ($ this ->_remove_html_tags ($ text ),ENT_QUOTES ); // <= added
115+ if (!$ text ) return ; //skip empty headlines
116+
117+ $ hid = $ renderer ->_headerToLink ($ text ,true );
118+
119+ //only add items within configured levels
120+ $ renderer ->toc_additem ($ hid , $ text , $ level );
121+
122+ // adjust $node to reflect hierarchy of levels
123+ $ renderer ->node [$ level -1 ]++;
124+ if ($ level < $ renderer ->lastlevel ) {
125+ for ($ i = 0 ; $ i < $ renderer ->lastlevel -$ level ; $ i ++) {
126+ $ renderer ->node [$ renderer ->lastlevel -$ i -1 ] = 0 ;
127+ }
128+ }
129+ $ renderer ->lastlevel = $ level ;
130+
131+ if ($ level <= $ conf ['maxseclevel ' ] &&
132+ count ($ renderer ->sectionedits ) > 0 &&
133+ $ renderer ->sectionedits [count ($ renderer ->sectionedits ) - 1 ][2 ] === 'section ' ) {
134+ $ renderer ->finishSectionEdit ($ pos - 1 );
135+ }
136+
137+ // write the header
138+ $ renderer ->doc .= DOKU_LF .'<h ' .$ level ;
139+ if ($ level <= $ conf ['maxseclevel ' ]) {
140+ $ renderer ->doc .= ' class=" ' . $ renderer ->startSectionEdit ($ pos , 'section ' , $ text ) . '" ' ;
141+ }
142+ $ renderer ->doc .= '><a name=" ' .$ hid .'" id=" ' .$ hid .'"> ' ;
143+ $ renderer ->doc .= $ displaytext ; // <= revised
144+ $ renderer ->doc .= "</a></h $ level> " .DOKU_LF ;
145+ }
146+
147+ function _odt_header ($ text , $ level , $ pos , &$ renderer ){
148+ $ displaytext = $ text ; // <= added
149+ $ text = $ this ->_remove_html_tags ($ text ); // <= added
150+ $ hid = $ renderer ->_headerToLink ($ text ,true );
151+ $ renderer ->doc .= '<text:h text:style-name="Heading_20_ ' .$ level .'" text:outline-level=" ' .$ level .'"> ' ;
152+ $ renderer ->doc .= '<text:bookmark-start text:name=" ' .$ hid .'"/> ' ;
153+ $ renderer ->doc .= $ displaytext ; // <= revised
154+ $ renderer ->doc .= '<text:bookmark-end text:name=" ' .$ hid .'"/> ' ;
155+ $ renderer ->doc .= '</text:h> ' ;
97156 }
98157}
0 commit comments