137 lines
6.3 KiB
PHP
137 lines
6.3 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* @license http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html
|
||
|
* @author Francois Merciol <dokuplugin@merciol.fr>
|
||
|
*
|
||
|
* Plugin Schedule: manage events per wiki @groups
|
||
|
*/
|
||
|
|
||
|
if (!defined ('DOKU_INC'))
|
||
|
define ('DOKU_INC', realpath (__DIR__.'/../../../').'/');
|
||
|
if (!defined ('DOKU_PLUGIN'))
|
||
|
define ('DOKU_PLUGIN', DOKU_INC.'lib/plugins/');
|
||
|
require_once(DOKU_PLUGIN.'syntax.php');
|
||
|
|
||
|
require_once (realpath (__DIR__.'/..').'/scheduleInseeCities.php');
|
||
|
|
||
|
// ============================================================
|
||
|
class syntax_plugin_schedule_display extends DokuWiki_Syntax_Plugin {
|
||
|
|
||
|
// ============================================================
|
||
|
function getInfo() {
|
||
|
return confToHash (__DIR__.'/../INFO.txt');
|
||
|
}
|
||
|
function getType () { return 'substition'; }
|
||
|
function getPType () { return 'block'; }
|
||
|
function getSort () { return 299; }
|
||
|
function connectTo ($mode) {
|
||
|
$this->Lexer->addEntryPattern ('<schedule[^>]*>', $mode, 'plugin_schedule_display');
|
||
|
}
|
||
|
function postConnect () {
|
||
|
$this->Lexer->addExitPattern ('</schedule>', 'plugin_schedule_display');
|
||
|
}
|
||
|
|
||
|
// ============================================================
|
||
|
function handle ($match, $state, $pos, Doku_Handler $handler) {
|
||
|
switch ($state) {
|
||
|
case DOKU_LEXER_ENTER:
|
||
|
return array ($state, trim (substr ($match, 8, -1))); // "<schedule" => 8 ">" => 1
|
||
|
case DOKU_LEXER_UNMATCHED:
|
||
|
return array ($state, $match);
|
||
|
case DOKU_LEXER_EXIT:
|
||
|
return array ($state, '');
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
// ============================================================
|
||
|
function render ($mode, Doku_Renderer $renderer, $indata) {
|
||
|
if (empty($indata))
|
||
|
return false;
|
||
|
if ($mode != 'xhtml')
|
||
|
return false;
|
||
|
list ($instr, $data) = $indata;
|
||
|
switch ($instr) {
|
||
|
|
||
|
case DOKU_LEXER_ENTER :
|
||
|
$args = strtolower (" ".$data." ");
|
||
|
$mapId = "scheduleMapPOI";
|
||
|
$width = "";
|
||
|
$height = "";
|
||
|
if (preg_match_all ('/("[^"]*")* id="(?<id>[0-9a-zA-Z_]+)" ("[^"]*")*/', $args, $dumy) > 0)
|
||
|
for ($i = 0; $i < count ($dumy['id']); $i++)
|
||
|
$mapId = $dumy ['id'][$i];
|
||
|
if (preg_match_all ('/.* width=(?<width>[0-9]+) .*/', $args, $dumy) > 0)
|
||
|
for ($i = 0; $i < count ($dumy['width']); $i++)
|
||
|
$width=' width="'.$dumy ['width'][$i].'"';
|
||
|
if (preg_match_all ('/.* height=(?<height>[0-9]+) .*/', $args, $dumy) > 0)
|
||
|
for ($i = 0; $i < count ($dumy['height']); $i++)
|
||
|
$height=' height="'.$dumy ['height'][$i].'"';
|
||
|
$renderer->doc .=
|
||
|
'<div class="wrap_left plugin_wrap">'.NL.
|
||
|
' <div class="schedulePOI scheduleScaledMap">'.NL;
|
||
|
if ($this->getConf ('useMap')) {
|
||
|
if (!is_dir (realpath (__DIR__.'/../../ol3')))
|
||
|
$renderer->doc .= '<p><a href="http://www.dokuwiki.org/plugin:ol3">ol3 plugin</a> not installed (see <a href="http://www.dokuwiki.org/plugin:schedule">doc</a>)</p>';
|
||
|
$renderer->doc .= ' <div id="'.$mapId.'" class="scheduleMap scheduleMapDisplay"'.$width.$height.'></div>'.NL;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case DOKU_LEXER_UNMATCHED :
|
||
|
$data = trim ($data);
|
||
|
$address ="";
|
||
|
if ($this->getConf ('useMap'))
|
||
|
$renderer->doc .= '<span class="wrap_tip wrap_center wrap_centeralign">'.$this->getLang ('reactiveMap').'</span>'.NL;
|
||
|
$renderer->doc .= ' <ul style="display:none;" class="poiLatLon">'.NL;
|
||
|
|
||
|
global $scheduleInseeCities;
|
||
|
if (! empty ($data))
|
||
|
foreach (explode ("\n", preg_replace ('%~[eE][nN][dD]~%', "\n", $data)) as $line) {
|
||
|
$line = trim (preg_replace ("/#.*$/", "", $line));
|
||
|
if (!$line)
|
||
|
continue;
|
||
|
$line = preg_replace ("#\s+\|#", "|", $line);
|
||
|
$line = preg_replace ("#\|\s+#", "|", $line);
|
||
|
$line = trim ($line,'|');
|
||
|
list ($insee, $lat, $lon, $addr, $occ) = explode ("|", $line);
|
||
|
// XXX vérif des formats (nombres, ...)
|
||
|
if (!$insee || !$lon) {
|
||
|
if ($insee && $lat)
|
||
|
$renderer->doc .= ' <li lat="'.$insee.'" lon="'.$lat.'">56000</li>'.NL; // XXX position par defaut
|
||
|
continue;
|
||
|
}
|
||
|
if ($insee && $lat && $lon) {
|
||
|
$iter=$occ?$occ:1;
|
||
|
for ($i = 1; $i <= $iter; $i++)
|
||
|
$renderer->doc .= ' <li lat="'.$lat.'" lon="'.$lon.'">'.$insee.'</li>'.NL;
|
||
|
}
|
||
|
$addrHtml =
|
||
|
($addr ?
|
||
|
preg_replace ('%\\\\\\\\%', "<br/>", preg_replace ('%~[bB][rR]~%', "<br/>", $addr)) :
|
||
|
'<span class="wrap_round wrap_todo">'.$this->lang ('toComplet').'</span><br/>').' '.
|
||
|
// XXX all insee ???
|
||
|
(isset ($scheduleInseeCities[$insee]) ? $scheduleInseeCities[$insee][0] : $insee).'<br/>'.
|
||
|
(($addr && $lat && $lon) ?
|
||
|
'<span style="font-size:50%; background-color:#DDD;">(Lat. : '.$lat.' Long. : '.$lon.')</span>' :
|
||
|
'');
|
||
|
$address .=
|
||
|
'<div class="scheduleAddresse wrap_left plugin_wrap" location="('.$lat.'|'.$lon.')">'.NL.
|
||
|
' <p onMouseOver="javascript:scheduleHighlightLocation (\'('.$lat.'|'.$lon.')\')" onMouseOut="javascript:scheduleHighlightLocation (null)">'.$addrHtml.' </p>'.NL.
|
||
|
'</div>'.NL;
|
||
|
}
|
||
|
$renderer->doc .=
|
||
|
' </ul>'.NL.
|
||
|
' </div>'.NL.
|
||
|
'</div>'.NL.
|
||
|
$address.
|
||
|
'<div class="wrap_clear plugin_wrap"></div>'.NL;
|
||
|
break;
|
||
|
case DOKU_LEXER_EXIT :
|
||
|
break;
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
// ============================================================
|
||
|
}
|