summaryrefslogtreecommitdiff
path: root/platform/www/lib/plugins/blog/syntax/autoarchive.php
diff options
context:
space:
mode:
Diffstat (limited to 'platform/www/lib/plugins/blog/syntax/autoarchive.php')
-rw-r--r--platform/www/lib/plugins/blog/syntax/autoarchive.php157
1 files changed, 157 insertions, 0 deletions
diff --git a/platform/www/lib/plugins/blog/syntax/autoarchive.php b/platform/www/lib/plugins/blog/syntax/autoarchive.php
new file mode 100644
index 0000000..34cb240
--- /dev/null
+++ b/platform/www/lib/plugins/blog/syntax/autoarchive.php
@@ -0,0 +1,157 @@
+<?php
+/**
+ * Dynamic Archive Plugin: dynamically displays
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Esther Brunner <wikidesign@gmail.com>
+ */
+
+/**
+ * All DokuWiki plugins to extend the parser/rendering mechanism
+ * need to inherit from this class
+ */
+class syntax_plugin_blog_autoarchive extends DokuWiki_Syntax_Plugin {
+
+ function getType() { return 'substition'; }
+ function getPType() { return 'block'; }
+ function getSort() { return 309; }
+
+ function connectTo($mode) {
+ $this->Lexer->addSpecialPattern('\{\{autoarchive>.*?\}\}', $mode, 'plugin_blog_autoarchive');
+ }
+
+ function handle($match, $state, $pos, Doku_Handler $handler) {
+ global $ID;
+
+ $match = substr($match, 14, -2); // strip {{autoarchive> from start and }} from end
+ list($match, $flags) = explode('?', $match, 2);
+ $flags = explode('&', $flags);
+ list($ns, $refine) = explode(' ', $match, 2);
+
+ if ($ns == '') $ns = cleanID($this->getConf('namespace'));
+ elseif (($ns == '*') || ($ns == ':')) $ns = '';
+ elseif ($ns == '.') $ns = getNS($ID);
+ else $ns = cleanID($ns);
+
+ return array($ns, $flags, $refine, $pos);
+ }
+
+ function render($mode, Doku_Renderer $renderer, $data) {
+ list($ns, $flags, $refine, $pos) = $data;
+ if ($mode != 'xhtml') return false;
+
+ // no caching for dynamic content
+ $renderer->nocache();
+
+ // get the blog entries for our namespace
+ if ($my = plugin_load('helper', 'blog')) $entries = $my->getBlog($ns);
+
+ // use tag refinements?
+ if ($refine) {
+ if (plugin_isdisabled('tag') || (!$tag = plugin_load('helper', 'tag'))) {
+ msg($this->getLang('missing_tagplugin'), -1);
+ } else {
+ $entries = $tag->tagRefine($entries, $refine);
+ }
+ }
+
+ if (!$entries) return true; // nothing to display
+
+ // what to display
+ if(preg_match('/^\d\d\d\d-\d\d$/',$_REQUEST['blogarchive'])){
+ $now = $_REQUEST['blogarchive'];
+ }else{
+ $now = strftime('%Y-%m'); // current month
+ }
+ list($y,$m) = explode('-',$now);
+
+ // display the archive overview
+ $cnt = $this->_buildTimeChooser($renderer, $entries, $now);
+
+ $renderer->header($this->_posts($cnt,$m,$y),2,$pos);
+ $renderer->section_open(2);
+
+ // let Pagelist Plugin do the work for us
+ if (plugin_isdisabled('pagelist')
+ || (!$pagelist = plugin_load('helper', 'pagelist'))) {
+ msg($this->getLang('missing_pagelistplugin'), -1);
+ return false;
+ }
+ $pagelist->setFlags($flags);
+ $pagelist->startList();
+ foreach ($entries as $entry) {
+ $date = strftime('%Y-%m',$entry['date']);
+ // entry in the right date range?
+ if($date < $now || $date > $now) continue;
+ $pagelist->addPage($entry);
+ }
+ $renderer->doc .= $pagelist->finishList();
+
+ $renderer->section_close();
+ return true;
+
+ }
+
+ /**
+ * Creates a list of monthly archive links
+ *
+ * @param object reference $R - the XHTML renderer
+ * @param array reference $entries - all entries metadata
+ * @param string $now - currently selected month ('YYYY-MM')
+ * @return int - number of posts for selected month
+ */
+ function _buildTimeChooser(&$R, &$entries, $now){
+ global $ID;
+
+ // get the months where posts exist
+ $months = array();
+ foreach($entries as $entry){
+ $y = date('Y',$entry['date']);
+ $m = date('m',$entry['date']);
+ if(isset($months[$y][$m])) {
+ $months[$y][$m]++;
+ }else{
+ $months[$y][$m] = 1;
+ }
+ }
+
+ $ret = 0;
+ // output
+ $R->doc .= '<div class="autoarchive_selector">';
+ foreach($months as $y => $mdata){
+ $R->listu_open();
+ $R->listitem_open(1);
+ $R->listcontent_open();
+ $R->doc .= $y.'<span>:</span>';
+ $R->listcontent_close();
+ ksort($mdata);
+ foreach($mdata as $m => $cnt){
+ $R->listu_open();
+ $R->listitem_open(2);
+ $R->listcontent_open();
+ if("$y-$m" == $now) $R->doc .= '<span class="cur">';
+ $R->doc .= '<a href="'.wl($ID,array('blogarchive'=>"$y-$m")).'" class="wikilink1" title="'.$this->_posts($cnt,$m,$y).'">';
+ $R->doc .= $this->getLang('month_'.$m);
+ $R->doc .= '</a>';
+ if("$y-$m" == $now){
+ $R->doc .= '</span>';
+ $ret = $cnt;
+ }
+ $R->listcontent_close();
+ $R->listitem_close();
+ $R->listu_close();
+ }
+ $R->listitem_close();
+ $R->listu_close();
+ }
+ $R->doc .='</div>';
+ return $ret;
+ }
+
+ function _posts($num,$month,$year){
+ return sprintf($this->getLang('autoarchive'),
+ $num, $this->getLang("month_$month"),
+ $year);
+ }
+}
+// vim:ts=4:sw=4:et:enc=utf-8: