Skip to content
This repository was archived by the owner on Aug 3, 2020. It is now read-only.

Commit fa61ff5

Browse files
author
Danny Lin
committed
Moved procedures to syntax.php so we can get rid of renderer.php if $sectionedits is no more private. Also added odt support.
1 parent 8eccd9b commit fa61ff5

File tree

2 files changed

+74
-49
lines changed

2 files changed

+74
-49
lines changed

renderer.php

Lines changed: 7 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -17,51 +17,17 @@ function canRender($format) {
1717
return ($format=='xhtml');
1818
}
1919

20-
// revision of parser/xhtml.php header()
21-
function header($text, $level, $pos, $realtext=null) {
22-
global $conf;
23-
24-
if(!$text) return; //skip empty headlines
25-
26-
if (is_null($realtext)) $realtext = $text;
27-
$hid = $this->_headerToLink($text,true);
28-
29-
//only add items within configured levels
30-
$this->toc_additem($hid, $text, $level);
31-
32-
// adjust $node to reflect hierarchy of levels
33-
$this->node[$level-1]++;
34-
if ($level < $this->lastlevel) {
35-
for ($i = 0; $i < $this->lastlevel-$level; $i++) {
36-
$this->node[$this->lastlevel-$i-1] = 0;
37-
}
38-
}
39-
$this->lastlevel = $level;
40-
41-
if ($level <= $conf['maxseclevel'] &&
42-
count($this->sectionedits) > 0 &&
43-
$this->sectionedits[count($this->sectionedits) - 1][2] === 'section') {
44-
$this->finishSectionEdit($pos - 1);
45-
}
46-
47-
// write the header
48-
$this->doc .= DOKU_LF.'<h'.$level;
49-
if ($level <= $conf['maxseclevel']) {
50-
$this->doc .= ' class="' . $this->startSectionEdit($pos, 'section', $text) . '"';
51-
}
52-
$this->doc .= '><a name="'.$hid.'" id="'.$hid.'">';
53-
$this->doc .= $realtext;
54-
$this->doc .= "</a></h$level>".DOKU_LF;
55-
}
56-
5720
/**
58-
* Copied from xhtml.php, no change
59-
*
60-
* $sectionedits is private and cannot be accessed by plugin,
21+
* $sectionedits is private and cannot be accessed by plugins,
6122
* so this dirty hack is required
23+
*
24+
* Get rid of this renderer if it's fixed...
6225
*/
6326
public $sectionedits = array(); // A stack of section edit data
64-
27+
28+
/**
29+
* Copied from xhtml.php, no change
30+
*/
6531
public function startSectionEdit($start, $type, $title = null) {
6632
static $lastsecid = 0;
6733
$this->sectionedits[] = array(++$lastsecid, $start, $type, $title);

syntax.php

Lines changed: 67 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)