<?php
/**
 * Plugin Flickr: Embedding Flickr image
 *
 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
 * @author     Norbert CsĂ­k <norbert.csik@gmail.com>
 * @version    0.2.0
 */

if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/');
if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
require_once(DOKU_PLUGIN.'syntax.php');

/**
 * All DokuWiki plugins to extend the parser/rendering mechanism
 * need to inherit from this class
 */
class syntax_plugin_flickr extends DokuWiki_Syntax_Plugin {

    /**
     * return some info
     */
    function getInfo(){
        return array(
            'author' => 'Norbert CsĂ­k',
            'email'  => 'norbert.csik@gmail.com',
            'date'   => '2006-06-06',
            'name'   => 'Flickr Plugin',
            'desc'   => 'Embedding Flickr image',
            'url'    => 'http://www.csik.net/project:flickr',
        );
    }

    /**
     * What kind of syntax are we?
     */
    function getType(){
        return 'substition';
    }

    /**
     * What kind of syntax do we allow (optional)
     */
//    function getAllowedTypes() {
//        return array();
//    }

    /**
     * What about paragraphs? (optional)
     */
//    function getPType(){
//        return 'normal';
//    }

    /**
     * Where to sort in?
     */
    function getSort(){
        return 299;
    }


    /**
     * Connect pattern to lexer
     */
    function connectTo($mode) {
      $this->Lexer->addSpecialPattern('\{\{flickr>.*?\}\}',$mode,'plugin_flickr');
    }

    /**
     * Handle the match
     */
    function handle($match, $state, $pos, &$handler){
        switch ($state) {
          case DOKU_LEXER_ENTER :
            break;
          case DOKU_LEXER_MATCHED :
            break;
          case DOKU_LEXER_UNMATCHED :
            break;
          case DOKU_LEXER_EXIT :
            break;
          case DOKU_LEXER_SPECIAL :
            return $match;
            break;
        }
        return array();
    }

    /**
     * Create output
     */
    function render($mode, &$renderer, $data) {
        if($mode == 'xhtml'){
        	global $conf;
        
			// strip flickr> from start
			$data = "{{".substr($data,9,-2)."}}"; 

			// get flickr image id
			$start = strrpos($data, "/")+1;
			$end = strpos($data, "_", $start);
			$imageid = substr($data, $start, $end-$start);
    		
    		// parse the media az an external media
    		$p = Doku_Handler_Parse_Media($data);

			// render the media as a flickr external media
			$link = array();
			$link['class']  = 'media';
			$link['style']  = '';
			$link['pre']    = '';
			$link['suf']    = '';
			$link['more']   = '';
			$link['target'] = $conf['target']['media'];

			$link['title']  = $p['title'];
			$link['url']    = "http://www.flickr.com/".$conf['plugin']['flickr']['accounturl']."/".$imageid."/";
			$link['name']   = $renderer->_media ($p['src'], $p['title'], $p['align'], $p['width'], $p['height'], $p['cache']);
			
			list($ext,$mime) = mimetype($p['src']);
			if(substr($mime,0,5) == 'image'){
				// link only jpeg images
				// if ($ext != 'jpg' && $ext != 'jpeg') $noLink = TRUE;
			}elseif($mime == 'application/x-shockwave-flash'){
				// don't link flash movies
				$noLink = TRUE;
			}else{
				// add file icons
				$link['class'] .= ' mediafile mf_'.$ext;
			}

			//output formatted
			$renderer->doc .= $renderer->_formatLink($link);
			
            return true;
        }
        return false;
    }
}