Dotclear

source: plugins/multiToc/trunk/_public.php @ 2808

Revision 2808, 16.3 KB checked in by Tomtom33, 13 years ago (diff)

multiToc 1.5:

  • Dotclear 2.2 compatibility
  • fixed notices issue, closes #517
  • fixed smilies issue, closes #407
  • added numbering TOC in entries, closes #365
  • Property svn:executable set to *
Line 
1<?php
2# -- BEGIN LICENSE BLOCK ----------------------------------
3# This file is part of multiToc, a plugin for Dotclear.
4#
5# Copyright (c) 2009-2010 Tomtom and contributors
6# http://blog.zenstyle.fr/
7#
8# Licensed under the GPL version 2.0 license.
9# A copy of this license is available in LICENSE file or at
10# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11# -- END LICENSE BLOCK ------------------------------------
12
13$core->addBehavior('publicBeforeDocument',array('multiTocBehaviors','addTplPath'));
14$core->addBehavior('coreBlogGetPosts',array('multiTocBehaviors','coreBlogGetPosts'));
15
16$core->tpl->addValue('MultiTocUrl', array('multiTocTpl','multiTocUrl'));
17$core->tpl->addValue('MultiTocCss', array('multiTocTpl','multiTocCss'));
18$core->tpl->addValue('MultiTocGroupTitle', array('multiTocTpl','multiTocGroupTitle'));
19$core->tpl->addValue('MultiTocGroupDesc', array('multiTocTpl','multiTocGroupDesc'));
20$core->tpl->addValue('MultiTocGroupCount', array('multiTocTpl','multiTocGroupCount'));
21$core->tpl->addValue('MultiTocItemUrl', array('multiTocTpl','multiTocItemUrl'));
22$core->tpl->addValue('MultiTocItemTitle', array('multiTocTpl','multiTocItemTitle'));
23$core->tpl->addValue('MultiTocItemDate', array('multiTocTpl','multiTocItemDate'));
24$core->tpl->addValue('MultiTocItemCategory', array('multiTocTpl','multiTocItemCategory'));
25$core->tpl->addValue('MultiTocItemAuthor', array('multiTocTpl','multiTocItemAuthor'));
26$core->tpl->addValue('MultiTocItemNbComments', array('multiTocTpl','multiTocItemNbComments'));
27$core->tpl->addValue('MultiTocItemNbTrackbacks', array('multiTocTpl','multiTocItemNbTrackbacks'));
28$core->tpl->addValue('MultiTocPageTitle', array('multiTocTpl','multiTocPageTitle'));
29
30$core->tpl->addBlock('MultiTocGroup', array('multiTocTpl','multiTocGroup'));
31$core->tpl->addBlock('MultiTocItem', array('multiTocTpl','multiTocItem'));
32$core->tpl->addBlock('MultiTocIf',array('multiTocTpl','multiTocIf'));
33$core->tpl->addBlock('MultiTocMetaData',array('multiTocTpl','multiTocMetaData'));
34
35class rsMultiTocPost extends rsExtPostPublic
36{
37     public static function getExcerpt($rs,$absolute_urls=false)
38     {
39          $c = parent::getExcerpt($rs,$absolute_urls);
40         
41          if ($rs->hasToc()) {
42               $toc = new multiTocPost($rs);
43               $c = $toc->process($c);
44               unset($toc);
45          }
46         
47          return $c;
48     }
49     
50     public static function getContent($rs,$absolute_urls=false)
51     {
52          $c = parent::getContent($rs,$absolute_urls);
53         
54          if ($rs->hasToc()) {
55               $toc = new multiTocPost($rs);
56               $c = $toc->process($c);
57               unset($toc);
58          }
59         
60          return $c;
61     }
62     
63     public static function hasToc($rs)
64     {
65          if (preg_match('/<p>::TOC::<\/p>/',$rs->post_excerpt_xhtml.$rs->post_content_xhtml)) {
66               return true;
67          }
68          else {
69               return false;
70          }
71     }
72}
73
74class multiTocUrl extends dcUrlHandlers
75{
76     public static function multiToc($args)
77     {
78          global $core,$_ctx;
79         
80          $settings = unserialize($core->blog->settings->multiToc->multitoc_settings);
81         
82          if ($settings['cat']['enable']) {
83               $types[] = 'cat';
84          }
85          if ($settings['tag']['enable']) {
86               $types[] = 'tag';
87          }
88          if ($settings['alpha']['enable']) {
89               $types[] = 'alpha';
90          }
91         
92          if (count($args) == 0) {
93               $type = 'cat';
94          }
95          elseif (count($args) == 1) {
96               $type = in_array($args,$types) ? $args : null;
97               unset($types);
98          }
99          else {
100               $type = null;
101          }
102         
103          $_ctx->multitoc_type = $type;
104         
105          if ($type === null) {
106               self::p404();
107          }
108          else {
109               self::serveDocument('multitoc.html');
110          }
111         
112          exit;
113     }
114}
115
116class multiTocTpl
117{
118
119     public static function multiTocUrl($attr)
120     {
121          $f = $GLOBALS['core']->tpl->getFilters($attr);
122          return '<?php echo '.sprintf($f,'$core->blog->url.$core->url->getBase("multitoc")').'; ?>';
123     }
124     
125     public static function multiTocCss()
126     {
127          global $core;
128         
129          $plop =
130               $core->blog->themes_path.'/'.
131               $core->blog->settings->system->theme.'/styles/multitoc.css';
132               
133          $tagada = $core->blog->themes_path.'/default/multitoc.css';
134         
135          if (file_exists($plop)) {
136               $css =
137                    $core->blog->settings->system->themes_url.'/'.
138                    $core->blog->settings->system->theme.'/styles/multitoc.css';
139          } elseif (file_exists($tagada)) {
140               $css =
141                    $core->blog->settings->system->themes_url.'/default/multitoc.min.css';
142          } else {
143               $css =
144                    $core->blog->url.
145                    (($core->blog->settings->system->url_scan == 'path_info')?'?':'').
146                    'pf=multiToc/css/multitoc.css';
147          }
148          $res =
149               "\n<?php \n".
150               "echo '<style type=\"text/css\" media=\"screen\">@import url(".$css.");</style>';\n".
151               "?>\n";
152               
153          return $res;
154     }
155     
156     public static function multiTocGroup($attr,$content)
157     {
158          $p = "\$_ctx->multitoc_settings = unserialize(\$core->blog->settings->multiToc->multitoc_settings);\n";
159          $p .= "\$params = array();\n";
160          $p .= "if (\$_ctx->multitoc_type == 'cat') :\n";
161               $p .= "\$_ctx->multitoc_group = \$core->blog->getCategories();\n";
162          $p .= "elseif (\$_ctx->multitoc_type == 'tag') :\n";
163               $p .= "\$meta = new dcMeta(\$core);\n";
164               $p .= "\$_ctx->multitoc_group = \$meta->getMeta('tag');\n";
165               $p .= "\$_ctx->multitoc_group->sort('meta_id_lower',\$_ctx->multitoc_settings['tag']['order_group']);\n";
166          $p .= "elseif (\$_ctx->multitoc_type == 'alpha') :\n";
167               $p .= "if (\$core->con->driver() == 'pgsql') :\n";
168                    $p .= "\$_ctx->multitoc_group = ".
169                    "multiTocPublic::multiTocGroupPGSQL(\$core,".
170                    "\$_ctx->multitoc_settings['alpha']['order_group']);\n";
171               $p .= "else :\n";
172                    $p .= "\$params['columns'] = array('UPPER(SUBSTRING(post_title,1,1)) AS post_letter','COUNT(*) as count');\n";
173                    $p .= "\$params['sql'] = 'GROUP BY post_letter';\n";
174                    $p .= "\$params['no_content'] = true;\n";
175                    $p .= "\$params['order'] = \$_ctx->multitoc_settings['alpha']['order_group'];\n";
176                    $p .= "\$_ctx->multitoc_group = \$core->blog->getPosts(\$params);\n";
177               $p .= "endif;\n";
178          $p .= "endif;\n";
179         
180          $res = "<?php\n";
181          $res .= $p;
182          $res .= "unset(\$params);\n";
183          $res .= "?>\n";
184         
185          $res .=
186          '<?php while ($_ctx->multitoc_group->fetch()) : ?>'.$content.'<?php endwhile; $_ctx->multitoc_group = null; $_ctx->multitoc_settings = null; ?>';
187         
188          return $res;
189     }
190     
191     public static function multiTocGroupTitle($attr)
192     {
193          $f = $GLOBALS['core']->tpl->getFilters($attr);
194         
195          $res = "<?php if (\$_ctx->multitoc_type == 'cat') :\n";
196               $res .= "echo ".sprintf($f,'$_ctx->multitoc_group->cat_title').";\n";
197          $res .= "elseif (\$_ctx->multitoc_type == 'tag') :\n";
198               $res .= "echo ".sprintf($f,'$_ctx->multitoc_group->meta_id').";\n";
199          $res .= "elseif (\$_ctx->multitoc_type == 'alpha') :\n";
200               $res .= "echo ".sprintf($f,'$_ctx->multitoc_group->post_letter').";\n";
201          $res .= "endif; ?>\n";
202         
203          return $res;
204     }
205     
206     public static function multiTocGroupDesc($attr)
207     {
208          $f = $GLOBALS['core']->tpl->getFilters($attr);
209         
210          $res = "<?php if (\$_ctx->multitoc_type == 'cat') :\n";
211               $res .= "echo ".sprintf($f,'$_ctx->multitoc_group->cat_desc').";\n";
212          $res .= "endif; ?>\n";
213         
214          return $res;
215     }
216     
217     public static function multiTocGroupCount($attr)
218     {
219          $f = $GLOBALS['core']->tpl->getFilters($attr);
220         
221          $res = "<?php\n";
222          $res .= "\$mask = '<span class=\"toc-group-count\">%s</span>';\n";
223          $res .= "if (\$_ctx->multitoc_type == 'cat' && \$_ctx->multitoc_settings['cat']['display_nb_entry']) :\n";
224               $res .= "echo sprintf(\$mask,'('.".sprintf($f,'$_ctx->multitoc_group->nb_post').".')');\n";
225          $res .= "elseif (\$_ctx->multitoc_type == 'tag' && \$_ctx->multitoc_settings['tag']['display_nb_entry']) :\n";
226               $res .= "echo sprintf(\$mask,'('.".sprintf($f,'$_ctx->multitoc_group->count').".')');\n";
227          $res .= "elseif (\$_ctx->multitoc_type == 'alpha' && \$_ctx->multitoc_settings['alpha']['display_nb_entry']) :\n";
228               $res .= "echo sprintf(\$mask,'('.".sprintf($f,'$_ctx->multitoc_group->count').".')');\n";
229          $res .= "endif;\n";
230          $res .= "?>\n";
231         
232          return $res;
233     }
234     
235     public static function multiTocItem($attr,$content)
236     {
237     
238          $p = "\$params = array();\n";
239          $p .= "\$params['no_content'] = true;\n";
240         
241          $p .= "if (\$_ctx->multitoc_type == 'cat') :\n";
242               $p .= "\$params['order'] = \$_ctx->multitoc_settings['cat']['order_entry'];\n";
243               $p .= "\$params['cat_id'] = \$_ctx->multitoc_group->cat_id;\n";
244               $p .= "\$_ctx->multitoc_items = \$core->blog->getPosts(\$params);\n";
245          $p .= "elseif (\$_ctx->multitoc_type == 'tag') :\n";
246               $p .= "\$params['meta_id'] = \$_ctx->multitoc_group->meta_id;\n";
247               $p .= "\$params['meta_type'] = 'tag';\n";
248               $p .= "\$params['post_type'] = '';\n";
249               $p .= "\$params['order'] = \$_ctx->multitoc_settings['tag']['order_entry'];\n";
250               $p .= "\$_ctx->multitoc_items = \$meta->getPostsByMeta(\$params);\n";
251          $p .= "elseif (\$_ctx->multitoc_type == 'alpha') :\n";
252               $p .= "\$params['order'] = \$_ctx->multitoc_settings['alpha']['order_entry'];\n";
253               $p .= "\$params['sql'] = ' AND UPPER(SUBSTRING(post_title,1,1)) = \''.\$_ctx->multitoc_group->post_letter.'\'';\n";
254               $p .= "\$_ctx->multitoc_items = \$core->blog->getPosts(\$params);\n";
255          $p .= "endif;\n";
256         
257          $res = "<?php\n";
258          $res .= $p;
259          $res .= 'unset($params);'."\n";
260          $res .= "?>\n";
261         
262          $res .=
263          '<?php while ($_ctx->multitoc_items->fetch()) : ?>'.$content.'<?php endwhile; $_ctx->multitoc_items = null; ?>';
264         
265          return $res;
266     }
267     
268     public static function multiTocItemUrl($attr)
269     {
270          $f = $GLOBALS['core']->tpl->getFilters($attr);
271          return '<?php echo '.sprintf($f,'$_ctx->multitoc_items->getURL()').'; ?>';
272     }
273     
274     public static function multiTocItemTitle($attr)
275     {
276          $f = $GLOBALS['core']->tpl->getFilters($attr);
277          return '<?php echo '.sprintf($f,'$_ctx->multitoc_items->post_title').'; ?>';
278     }
279     
280     public static function multiTocItemDate($attr)
281     {
282          $f = $GLOBALS['core']->tpl->getFilters($attr);
283         
284          $mask = isset($attr['mask']) ? sprintf($f,'"'.$attr['mask'].'"') : '\'<span class="toc-item-date">%s</span> - \'';
285         
286          $res = "<?php\n";
287          $res .= "\$mask = ".$mask.";\n";
288          $res .= "if ((\$_ctx->multitoc_type == 'cat' && \$_ctx->multitoc_settings['cat']['display_date'])\n";
289          $res .= "|| (\$_ctx->multitoc_type == 'tag' && \$_ctx->multitoc_settings['tag']['display_date'])\n";
290          $res .= "|| (\$_ctx->multitoc_type == 'alpha' && \$_ctx->multitoc_settings['alpha']['display_date'])\n";
291          $res .= ") :\n";
292               $res .= "echo sprintf(\$mask,\$_ctx->multitoc_items->getDate(\$_ctx->multitoc_settings[\$_ctx->multitoc_type]['format_date']));\n";
293          $res .= "endif;\n";
294          $res .= "?>\n";
295         
296          return $res;
297     }
298     
299     public static function multiTocItemAuthor($attr)
300     {
301          $f = $GLOBALS['core']->tpl->getFilters($attr);
302         
303          $mask = isset($attr['mask']) ? sprintf($f,'"'.$attr['mask'].'"') : '\' - <span class="toc-item-author">%s</span>\'';
304         
305          $res = "<?php\n";
306          $res .= "\$mask = ".$mask.";\n";
307          $res .= "if ((\$_ctx->multitoc_type == 'cat' && \$_ctx->multitoc_settings['cat']['display_author'])\n";
308          $res .= "|| (\$_ctx->multitoc_type == 'tag' && \$_ctx->multitoc_settings['tag']['display_author'])\n";
309          $res .= "|| (\$_ctx->multitoc_type == 'alpha' && \$_ctx->multitoc_settings['alpha']['display_author'])\n";
310          $res .= ") :\n";
311               $res .= "echo sprintf(\$mask,\$_ctx->multitoc_items->getAuthorLink());\n";
312          $res .= "endif;\n";
313          $res .= "?>\n";
314         
315          return $res;
316     }
317
318     public static function multiTocItemCategory($attr)
319     {
320          $f = $GLOBALS['core']->tpl->getFilters($attr);
321         
322          $mask = isset($attr['mask']) ? sprintf($f,'"'.$attr['mask'].'"') : '\' - <span class="toc-item-cat">%s</span>\'';
323         
324          $res = "<?php\n";
325          $res .= "\$mask = ".$mask.";\n";
326          $res .= "if (((\$_ctx->multitoc_type == 'cat' && \$_ctx->multitoc_settings['cat']['display_cat'])\n";
327          $res .= "|| (\$_ctx->multitoc_type == 'tag' && \$_ctx->multitoc_settings['tag']['display_cat'])\n";
328          $res .= "|| (\$_ctx->multitoc_type == 'alpha' && \$_ctx->multitoc_settings['alpha']['display_cat']))\n";
329          $res .= "&& \$_ctx->multitoc_items->cat_title !== null\n";
330          $res .= ") :\n";
331               $res .= 
332               "\$link = sprintf('<a href=\"%1\$s\">%2\$s</a>',".
333               sprintf($f,'$core->blog->url.$core->url->getBase("category")."/".$_ctx->multitoc_items->cat_url').",".
334               sprintf($f,'$_ctx->multitoc_items->cat_title').");\n".
335               "echo sprintf(\$mask,\$link);\n";
336          $res .= "endif;\n";
337          $res .= "?>\n";
338         
339          return $res;
340     }
341
342     public static function multiTocItemNbComments($attr)
343     {
344          $f = $GLOBALS['core']->tpl->getFilters($attr);
345         
346          $mask = isset($attr['mask']) ? sprintf($f,'"'.$attr['mask'].'"') : '\' - <span class="toc-item-com">%s</span>\'';
347         
348          $res = "<?php\n";
349          $res .= "\$mask = ".$mask.";\n";
350          $res .= "if ((\$_ctx->multitoc_type == 'cat' && \$_ctx->multitoc_settings['cat']['display_nb_com'])\n";
351          $res .= "|| (\$_ctx->multitoc_type == 'tag' && \$_ctx->multitoc_settings['tag']['display_nb_com'])\n";
352          $res .= "|| (\$_ctx->multitoc_type == 'alpha' && \$_ctx->multitoc_settings['alpha']['display_nb_com'])\n";
353          $res .= ") :\n";
354               $res .= "echo sprintf(\$mask,\$_ctx->multitoc_items->nb_comment);\n";
355          $res .= "endif;\n";
356          $res .= "?>\n";
357         
358          return $res;
359     }
360
361     public static function multiTocItemNbTrackbacks($attr)
362     {
363          $f = $GLOBALS['core']->tpl->getFilters($attr);
364         
365          $mask = isset($attr['mask']) ? sprintf($f,'"'.$attr['mask'].'"') : '\' - <span class="toc-item-tb">%s</span>\'';
366         
367          $res = "<?php\n";
368          $res .= "\$mask = ".$mask.";\n";
369          $res .= "if ((\$_ctx->multitoc_type == 'cat' && \$_ctx->multitoc_settings['cat']['display_nb_tb'])\n";
370          $res .= "|| (\$_ctx->multitoc_type == 'tag' && \$_ctx->multitoc_settings['tag']['display_nb_tb'])\n";
371          $res .= "|| (\$_ctx->multitoc_type == 'alpha' && \$_ctx->multitoc_settings['alpha']['display_nb_tb'])\n";
372          $res .= ") :\n";
373               $res .= "echo sprintf(\$mask,\$_ctx->multitoc_items->nb_trackback);\n";
374          $res .= "endif;\n";
375          $res .= "?>\n";
376         
377          return $res;
378     }
379     
380     public static function multiTocPageTitle()
381     {
382          $res = "<?php\n";
383          $res .= "echo __('Table of content');\n";
384         
385          $res .= "if (\$_ctx->multitoc_type == 'cat') :\n";
386               $res .= "echo ' - '.__('By category');\n";
387          $res .= "elseif (\$_ctx->multitoc_type == 'tag') :\n";
388               $res .= "echo ' - '.__('By tag');\n";
389          $res .= "elseif (\$_ctx->multitoc_type == 'alpha') :\n";
390               $res .= "echo ' - '.__('By alpha order');\n";
391          $res .= "endif;\n";
392          $res .= "?>\n";
393         
394          return $res;
395     }
396
397     public static function multiTocIf($attr,$content)
398     {
399          $if = array();
400         
401          $operator = isset($attr['operator']) ? $this->getOperator($attr['operator']) : '&&';
402         
403          if (isset($attr['type'])) {
404               $if[] = "\$_ctx->multitoc_type == '".addslashes($attr['type'])."'";
405          }
406         
407          if (!empty($if)) {
408               return '<?php if('.implode(' '.$operator.' ',$if).') : ?>'.$content.'<?php endif; ?>';
409          } else {
410               return $content;
411          }
412     }
413     
414     public static function multiTocMetaData($attr,$content)
415     {
416          $type = isset($attr['type']) ? addslashes($attr['type']) : 'tag';
417         
418          $sortby = 'meta_id_lower';
419          if (isset($attr['sortby']) && $attr['sortby'] == 'count') {
420               $sortby = 'count';
421          }
422         
423          $order = 'asc';
424          if (isset($attr['order']) && $attr['order'] == 'desc') {
425               $order = 'desc';
426          }
427         
428          $res =
429          "<?php\n".
430          '$objMeta = new dcMeta($core); '.
431          "\$_ctx->meta = \$objMeta->getMetaRecordset(\$_ctx->multitoc_items->post_meta,'".$type."'); ".
432          "\$_ctx->meta->sort('".$sortby."','".$order."'); ".
433          '?>';
434         
435          $res .= "<?php if (\$_ctx->multitoc_settings[\$_ctx->multitoc_type]['display_tag']) : ?>\n";
436          $res .= 
437          '<?php while ($_ctx->meta->fetch()) : ?>'.$content.'<?php endwhile; '.
438          '$_ctx->meta = null; unset($objMeta); ?>';
439          $res .= "<?php endif; ?>\n";
440         
441          return $res;
442     }
443}
444
445class multiTocPublic
446{
447     public static function multiTocGroupPGSQL($core,$order_group)
448     {
449          $params = array();
450          $params['columns'] = array(
451               'UPPER(SUBSTRING(post_title,1,1)) AS post_letter'
452          );
453          $params['no_content'] = true;
454          $params['order'] = $order_group;
455         
456          $rs = $core->blog->getPosts($params);
457         
458          $array = array();
459         
460          # the "post_letter" of the previous post in the list
461          $previous_letter = '';
462         
463          # read the "post_letter" field of the posts
464          # and count occurences of each letter
465          while ($rs->fetch())
466          {
467               # this letter
468               $letter = $rs->post_letter;
469               
470               # the letter has changed
471               if ($letter != $previous_letter)
472               {
473                    # the letter has changed but the previous letter was
474                    # the empty string, ignore this case
475                    if (!empty($previous_letter))
476                    {
477                         # store the previous letter,
478                         # which counter has been incremented
479                         $array[] = array(
480                              'post_letter' => $previous_letter,
481                              'count' => $letter_count
482                         );
483                    }
484                   
485                    # initialize the counter
486                    $letter_count = 1;
487                    # remember this letter to count it
488                    $previous_letter = $letter;
489               }
490               else
491               {
492                    # the letter has not changed, increment the counter
493                    $letter_count++;
494               }
495          }
496         
497          # don't forget the last letter
498          $array[] = array(
499               'post_letter' => $letter,
500               'count' => $letter_count
501          );
502         
503          return(staticRecord::newFromArray($array));
504     }
505}
506
507?>
Note: See TracBrowser for help on using the repository browser.

Sites map