summaryrefslogtreecommitdiff
path: root/platform/www/lib/plugins/blog/syntax/blog.php
diff options
context:
space:
mode:
Diffstat (limited to 'platform/www/lib/plugins/blog/syntax/blog.php')
-rw-r--r--platform/www/lib/plugins/blog/syntax/blog.php213
1 files changed, 213 insertions, 0 deletions
diff --git a/platform/www/lib/plugins/blog/syntax/blog.php b/platform/www/lib/plugins/blog/syntax/blog.php
new file mode 100644
index 0000000..2ca56d8
--- /dev/null
+++ b/platform/www/lib/plugins/blog/syntax/blog.php
@@ -0,0 +1,213 @@
+<?php
+/**
+ * Blog Plugin: displays a number of recent entries from the blog subnamespace
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Esther Brunner <wikidesign@gmail.com>
+ * @author Robert Rackl <wiki@doogie.de>
+ */
+
+class syntax_plugin_blog_blog extends DokuWiki_Syntax_Plugin {
+ private $included_pages = array();
+
+ function getType() { return 'substition'; }
+ function getPType() { return 'block'; }
+ function getSort() { return 307; }
+
+ function connectTo($mode) {
+ $this->Lexer->addSpecialPattern('\{\{blog>.*?\}\}',$mode,'plugin_blog_blog');
+ }
+
+ function handle($match, $state, $pos, Doku_Handler $handler) {
+ global $ID;
+
+ $match = substr($match, 7, -2); // strip {{blog> from start and }} from end
+ list($match, $flags) = explode('&', $match, 2);
+ $flags = explode('&', $flags);
+ array_unshift($flags, 'link'); // always make the first header of a blog entry a permalink (unless nolink is set)
+ list($match, $refine) = explode(' ', $match, 2);
+ list($ns, $num) = explode('?', $match, 2);
+
+ if (!is_numeric($num)) {
+ if (is_numeric($ns)) {
+ $num = $ns;
+ $ns = '';
+ } else {
+ $num = 5;
+ }
+ }
+
+ if ($ns == '') $ns = cleanID($this->getConf('namespace'));
+ elseif (($ns == '*') || ($ns == ':')) $ns = '';
+ elseif ($ns == '.') $ns = getNS($ID);
+ else $ns = cleanID($ns);
+
+ return array($ns, $num, $flags, $refine);
+ }
+
+ function render($mode, Doku_Renderer $renderer, $data) {
+ list($ns, $num, $flags, $refine) = $data;
+
+ $first = $_REQUEST['first'];
+ if (!is_numeric($first)) $first = 0;
+
+ // get the blog entries for our namespace
+ /** @var helper_plugin_blog $my */
+ if ($my = plugin_load('helper', 'blog')) $entries = $my->getBlog($ns);
+ else return false;
+
+ // use tag refinements?
+ if ($refine) {
+ /** @var helper_plugin_tag $tag */
+ if (plugin_isdisabled('tag') || (!$tag = plugin_load('helper', 'tag'))) {
+ msg($this->getLang('missing_tagplugin'), -1);
+ } else {
+ $entries = $tag->tagRefine($entries, $refine);
+ }
+ }
+
+ // Normalise flags
+ $blog_flags = $my->getFlags($flags);
+ $formpos = $blog_flags['formpos'];
+ $newentrytitle = $blog_flags['newentrytitle'];
+ $pagingcontrols = $blog_flags['pagingcontrols'];
+
+ if ($mode == 'xhtml') {
+ // prevent caching to ensure the included pages are always fresh
+ $renderer->nocache();
+ }
+
+ if (!$entries) {
+ if ((auth_quickaclcheck($ns.':*') >= AUTH_CREATE) && ($mode == 'xhtml')) {
+ if($formpos != 'none') $renderer->doc .= $this->_newEntryForm($ns, $newentrytitle);
+ }
+ return true; // nothing to display
+ }
+
+ // slice the needed chunk of pages
+ $isMore = count($entries) > ($first + $num);
+ $entries = array_slice($entries, $first, $num);
+
+ // load the include helper plugin
+ /** @var helper_plugin_include $include */
+ if (plugin_isdisabled('include') || (!$include = plugin_load('helper', 'include'))) {
+ msg($this->getLang('missing_includeplugin'), -1);
+ return false;
+ }
+
+ // current section level
+ $clevel = 0;
+
+ $perm_create = (auth_quickaclcheck($ns.':*') >= AUTH_CREATE);
+ $include_flags = $include->get_flags($flags);
+
+ if ($mode == 'xhtml') {
+ // show new entry form
+ if ($perm_create && $formpos == 'top') {
+ $renderer->doc .= $this->_newEntryForm($ns, $newentrytitle);
+ }
+
+ // get current section level
+ preg_match_all('|<div class="level(\d)">|i', $renderer->doc, $matches, PREG_SET_ORDER);
+ $n = count($matches)-1;
+ if ($n > -1) $clevel = $matches[$n][1];
+
+ // close current section
+ if ($clevel && !$include_flags['inline']) $renderer->doc .= '</div>'.DOKU_LF;
+ $renderer->doc .= '<div class="hfeed">'.DOKU_LF;
+ }
+
+
+ // now include the blog entries
+ foreach ($entries as $entry) {
+ if ($mode == 'xhtml' || $mode == 'code') {
+ if(auth_quickaclcheck($entry['id']) >= AUTH_READ) {
+ // prevent blog include loops
+ if(!$this->included_pages[$entry['id']]) {
+ $this->included_pages[$entry['id']] = true;
+ $renderer->nest($include->_get_instructions($entry['id'], '', 'page', $clevel, $include_flags));
+ $this->included_pages[$entry['id']] = false;
+ }
+ }
+ } elseif ($mode == 'metadata') {
+ /** @var Doku_Renderer_metadata $renderer */
+ $renderer->meta['relation']['haspart'][$entry['id']] = true;
+ }
+ }
+
+ if ($mode == 'xhtml') {
+ // resume the section
+ $renderer->doc .= '</div>'.DOKU_LF;
+ if ($clevel && !$include_flags['inline']) $renderer->doc .= '<div class="level'.$clevel.'">'.DOKU_LF;
+
+ // show older / newer entries links
+ if ($pagingcontrols) $renderer->doc .= $this->_browseEntriesLinks($isMore, $first, $num);
+
+ // show new entry form
+ if ($perm_create && $formpos == 'bottom') {
+ $renderer->doc .= $this->_newEntryForm($ns, $newentrytitle);
+ }
+ }
+
+ return in_array($mode, array('xhtml', 'metadata', 'code'));
+ }
+
+ /* ---------- (X)HTML Output Functions ---------- */
+
+ /**
+ * Displays links to older newer entries of the blog namespace
+ *
+ * @param $more
+ * @param $first
+ * @param $num
+ * @return string
+ */
+ function _browseEntriesLinks($more, $first, $num) {
+ global $ID;
+
+ $ret = '';
+ $last = $first+$num;
+ if ($first > 0) {
+ $first -= $num;
+ if ($first < 0) $first = 0;
+ $ret .= '<p class="centeralign">'.DOKU_LF.'<a href="'.wl($ID, 'first='.$first).'"'.
+ ' class="wikilink1">&lt;&lt; '.$this->getLang('newer').'</a>';
+ if ($more) $ret .= ' | ';
+ else $ret .= '</p>';
+ } else if ($more) {
+ $ret .= '<p class="centeralign">'.DOKU_LF;
+ }
+ if ($more) {
+ $ret .= '<a href="'.wl($ID, 'first='.$last).'" class="wikilink1">'.
+ $this->getLang('older').' &gt;&gt;</a>'.DOKU_LF.'</p>'.DOKU_LF;
+ }
+ return $ret;
+ }
+
+ /**
+ * Displays a form to enter the title of a new entry in the blog namespace
+ * and then open that page in the edit mode
+ *
+ * @param $ns
+ * @param $newentrytitle
+ * @return string
+ */
+ function _newEntryForm($ns, $newentrytitle) {
+ global $lang;
+ global $ID;
+
+ return '<div class="newentry_form">'.DOKU_LF.
+ '<form id="blog__newentry_form" method="post" action="'.script().'" accept-charset="'.$lang['encoding'].'">'.DOKU_LF.
+ DOKU_TAB.'<fieldset>'.DOKU_LF.
+ DOKU_TAB.DOKU_TAB.'<legend>'.hsc($newentrytitle).'</legend>'.DOKU_LF.
+ DOKU_TAB.DOKU_TAB.'<input type="hidden" name="id" value="'.$ID.'" />'.DOKU_LF.
+ DOKU_TAB.DOKU_TAB.'<input type="hidden" name="do" value="newentry" />'.DOKU_LF.
+ DOKU_TAB.DOKU_TAB.'<input type="hidden" name="ns" value="'.$ns.'" />'.DOKU_LF.
+ DOKU_TAB.DOKU_TAB.'<input class="edit" type="text" name="title" id="blog__newentry_title" size="40" tabindex="1" />'.DOKU_LF.
+ DOKU_TAB.DOKU_TAB.'<input class="button" type="submit" value="'.$lang['btn_create'].'" tabindex="2" />'.DOKU_LF.
+ DOKU_TAB.'</fieldset>'.DOKU_LF.
+ '</form>'.DOKU_LF.
+ '</div>'.DOKU_LF;
+ }
+}
+// vim:ts=4:sw=4:et:enc=utf-8: