-
Notifications
You must be signed in to change notification settings - Fork 22
/
syntax.php
140 lines (122 loc) · 4.37 KB
/
syntax.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
<?php
/**
* Pagelist Plugin: lists pages
*
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Esther Brunner <[email protected]>
*/
class syntax_plugin_pagelist extends DokuWiki_Syntax_Plugin
{
public function getType()
{
return 'substition';
}
public function getPType()
{
return 'block';
}
public function getSort()
{
return 168;
}
/**
* Connect pattern to lexer
*
* @param string $mode
*/
public function connectTo($mode)
{
$this->Lexer->addSpecialPattern('<pagelist.+?</pagelist>', $mode, 'plugin_pagelist');
}
/**
* Handle the match
*
* @param string $match The text matched by the patterns
* @param int $state The lexer state for the match
* @param int $pos The character position of the matched text
* @param Doku_Handler $handler The Doku_Handler object
* @return array Return an array with all data you want to use in render
*/
public function handle($match, $state, $pos, Doku_Handler $handler)
{
global $ID;
$match = substr($match, 9, -11); // strip markup
list($flags, $match) = array_pad(explode('>', $match, 2), 2, null);
$flags = explode('&', substr($flags, 1));
$items = explode('*', $match);
$pages = [];
$count = count($items);
for ($i = 0; $i < $count; $i++) {
if (!preg_match('/\[\[(.+?)]]/', $items[$i], $match)) continue;
list($id, $title, $description) = array_pad(explode('|', $match[1], 3), 3, null);
list($id, $section) = array_pad(explode('#', $id, 2), 2, null);
if (!$id) $id = $ID;
// Igor and later
if (class_exists('dokuwiki\File\PageResolver')) {
$resolver = new dokuwiki\File\PageResolver($ID);
$id = $resolver->resolveId($id);
$exists = page_exists($id);
} else {
// Compatibility with older releases
resolve_pageid(getNS($ID), $id, $exists);
}
// page has an image title
if (($title) && (preg_match('/\{\{(.+?)}}/', $title, $match))) {
list($image, $title) = array_pad(explode('|', $match[1], 2), 2, null);
list(, $mime) = mimetype($image);
if (!substr($mime, 0, 5) == 'image') $image = '';
$pages[] = [
'id' => $id,
'section' => cleanID($section),
'title' => trim($title),
'titleimage' => trim($image),
'description' => trim($description), // Holds the added parameter for own descriptions
];
} else {
// text title (if any)
$pages[] = [
'id' => $id,
'section' => cleanID($section),
'title' => trim($title),
'description' => trim($description), // Holds the added parameter for own descriptions
];
}
}
return [$flags, $pages];
}
/**
* Create output
*
* @param string $format output format being rendered
* @param Doku_Renderer $renderer the current renderer object
* @param array $data data created by handler()
* @return boolean rendered correctly?
*/
public function render($format, Doku_Renderer $renderer, $data)
{
list($flags, $pages) = $data;
foreach ($pages as $i => $page) {
$pages[$i]['exists'] = page_exists($page['id']);
}
// for XHTML output
if ($format == 'xhtml') {
/** @var helper_plugin_pagelist $pagelist */
if (!$pagelist = plugin_load('helper', 'pagelist')) return false;
$pagelist->setFlags($flags);
$pagelist->startList();
foreach ($pages as $page) {
$pagelist->addPage($page);
}
$renderer->doc .= $pagelist->finishList();
return true;
// for metadata renderer
} elseif ($format == 'metadata') {
/** @var Doku_Renderer_metadata $renderer */
foreach ($pages as $page) {
$renderer->meta['relation']['references'][$page['id']] = $page['exists'];
}
return true;
}
return false;
}
}