<?php | |||||
namespace Modules; | |||||
class CEimage | |||||
{ | |||||
public $r; | |||||
public $b; | |||||
public $structs; | |||||
public $content; | |||||
function __construct($request,$body=[],$structs=false,$content=false) { | |||||
$this->r = $request; | |||||
$this->b = $body; | |||||
$this->structs = &$structs; | |||||
$this->content = &$content; | |||||
} | |||||
function is_width($string) { | |||||
$pattern="/^[0-9]+%$/"; | |||||
if (preg_match($pattern,$string)) { | |||||
return true; | |||||
} else { | |||||
return false; | |||||
} | |||||
} | |||||
function index() { | |||||
$md = new \freaParsedown(); | |||||
$request = $this->r; | |||||
$body = $this->b; | |||||
$key=$request[1]; | |||||
$image=""; | |||||
$new=""; | |||||
// see if we can find image | |||||
if ( is_file($request[1])) { | |||||
$image= $request[1]; | |||||
} else if ($this->structs) { | |||||
foreach($this->structs as $domain=>$destination) { | |||||
if(array_key_exists($key, $this->structs[$domain]['pic'])) { | |||||
$image = $this->structs[$domain]['pic'][$key]; | |||||
unset($this->structs[$domain]['pic'][$key]); | |||||
unset($this->content[$this->domains[$domain]][$key]); | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
if ($image) { | |||||
// image positioning | |||||
if( in_array($request[2],array('left','right','full','auto'))) { | |||||
$class = $request[2]; | |||||
} else { | |||||
$class = 'full'; | |||||
} | |||||
if (isset($request[3])) { | |||||
$width=self::is_width($request[3]) ? $request[3] : false; | |||||
} | |||||
$gallery = "gallery"; | |||||
// image orientation? | |||||
$img = new \Image($image); | |||||
// $ratio = "landscape"; | |||||
$ratio = ($img->width() >= $img->height()) | |||||
? "landscape" | |||||
: "portrait" | |||||
; | |||||
unset($img); | |||||
$cached = new CachedImage($image); | |||||
// identify if caption contains a copyright note | |||||
// if so, indicate with a class | |||||
foreach ($body as $k=>$line) { | |||||
if (strpos($line,"©") !== FALSE | |||||
|| strpos($line,"©") !== FALSE) { | |||||
$body[$k] = sprintf("<span class=\"copyright\">%s</span>",$line); | |||||
} | |||||
} | |||||
$new=sprintf("<div class='content_element_image %s'>" | |||||
."<div class=\"media %s\" %s><a href=\"%s\" class=\"$gallery\"><img src=\"%s\" alt=\"user supplied image\" /></a></div>" | |||||
."<img src=\"%s\" style=\"display:none;\" alt=\"user supplied image\" />" | |||||
."<div class=\"caption\">%s</div>" | |||||
."</div>", | |||||
$class, | |||||
$ratio, | |||||
($width ? "style=\"flex-basis:$width;\"" : ''), | |||||
$cached->get_src(1600), | |||||
$cached->get_src(1600), | |||||
$cached->get_src(1600), | |||||
$md->text(implode("\n",$body)) | |||||
); | |||||
unset($cached); | |||||
} else { | |||||
// image not found | |||||
$new=sprintf("<div class='content_element_image %s'>\n" | |||||
."<div class=\"media %s\">\n" | |||||
."<div class=\"caption\">\n%s\n</div>\n" | |||||
."</div>\n", | |||||
$class, | |||||
$ratio, | |||||
$md->text(implode("\n",$body)) | |||||
); | |||||
} | |||||
return $new; | |||||
} | |||||
} | |||||
<?php | |||||
namespace Modules; | |||||
class ElementDispatcher { | |||||
private $folder = ""; | |||||
private $config = []; | |||||
function __construct($folder = "",$config = []) { | |||||
if (is_string($folder)) { | |||||
$this->folder = $folder; | |||||
} | |||||
if (is_array($config)) { | |||||
$this->config = $config; | |||||
} | |||||
} | |||||
function content_element($request = [], $body = null) { | |||||
$f3 = \Base::instance(); | |||||
$md = new \freaParsedown(); | |||||
$md->deactivate_ol(); | |||||
$new = ""; | |||||
switch($request[0]) { | |||||
case 'test': | |||||
$new="seems to work"; | |||||
break; | |||||
case ';': | |||||
$new=""; | |||||
break; | |||||
case 'path': | |||||
$new="/".$this->folder; | |||||
break; | |||||
case 'space': | |||||
$new=sprintf("<div style=\"height:%s;\"></div>", | |||||
$request[1] | |||||
); | |||||
break; | |||||
case 'span': | |||||
$new=sprintf("<span class=\"%s\">%s</span>", | |||||
$request[1], | |||||
$request[2] ? : implode("\n",$body) | |||||
); | |||||
break; | |||||
case 'small-text': | |||||
if(count($body)) { | |||||
$new=sprintf("<div class=\"smalltext\">%s</div>", | |||||
$md->text(implode("\n",$body)) | |||||
); | |||||
} else { | |||||
$new=sprintf("<span class=\"smalltext\">%s</span>", | |||||
$request[1] | |||||
); | |||||
} | |||||
break; | |||||
case 'CE': | |||||
switch($request[1]) { | |||||
case 'publication': | |||||
$CE = new \Modules\CPublication($this->config,['path'=>$this->folder]); | |||||
if(count($request)>2) { | |||||
$CE->set_layout($request[2]); | |||||
} | |||||
$new = $CE; | |||||
break; | |||||
} | |||||
break; | |||||
case 'TOC': | |||||
// throw away TOC part of request, we don't need it | |||||
array_shift($request); | |||||
$toc = new \Modules\TOC($request,$this->folder,$body); | |||||
$toc->dispatch(); | |||||
$new=sprintf("<div class=\"TOC %s\">%s</div>", | |||||
array_shift($request), | |||||
$toc); | |||||
break; | |||||
case 'sql': | |||||
//array_shift($request); | |||||
switch ($request[1]) { | |||||
case 'sqlite': | |||||
$array = []; | |||||
$db = new \DB\SQL('sqlite:' . $this->folder . $request[2]); | |||||
$sql = implode(" ", $body); | |||||
if ( strpos($sql,'insert')===false && | |||||
strpos($sql,'update')===false && | |||||
strpos($sql,'drop')===false) { | |||||
$rows = $db->exec($sql); | |||||
foreach ($rows as $res) { | |||||
switch (count($res)) { | |||||
case 1: | |||||
$keys=array_keys($res); | |||||
$array[] = $res[$keys[0]]; | |||||
break; | |||||
case 2: | |||||
$keys=array_keys($res); | |||||
$array[$res[$keys[0]]] = $res[$keys[1]]; | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
$new = sprintf("<ul><li>%s</li></ul>", | |||||
implode("</li><li>",$array)); | |||||
unset($array); | |||||
break; | |||||
} | |||||
break; | |||||
case 'form': | |||||
$token_db = $f3->get('TEMP') . "CEform/"; | |||||
$form_config_file = sprintf("%s%s.cfg", | |||||
ROOT.$this->folder, | |||||
$request[1]); | |||||
$db = new \DB\Jig($token_db,\DB\Jig::FORMAT_JSON); | |||||
$formcall = new \DB\Jig\Mapper($db,'form_calls'); | |||||
$timestamp = time(); | |||||
$token = md5($timestamp . $form_config_file . rand(100,999)); | |||||
$f3->config($form_config_file); | |||||
$fields = $f3->get('fields'); | |||||
foreach ($fields as $k => $v) { | |||||
if ($v['type'] == 'custom') { | |||||
$fields[$k]['template'] = sprintf( | |||||
"%s%s", | |||||
substr($this->folder,strlen($f3->get('CONTENT_BASE'))), | |||||
$v['template'] | |||||
); | |||||
} | |||||
if (array_key_exists('db',$v)) { | |||||
switch ($v['db']['type']) { | |||||
case 'sqlite': | |||||
$array = []; | |||||
$db = new \DB\SQL('sqlite:' . $this->folder . $v['db']['file']); | |||||
$sql = $v['db']['sql']; | |||||
if ( strpos($sql,'insert')===false && | |||||
strpos($sql,'update')===false && | |||||
strpos($sql,'drop')===false) { | |||||
$rows = $db->exec($sql); | |||||
foreach ($rows as $res) { | |||||
switch (count($res)) { | |||||
case 2: | |||||
$keys=array_keys($res); | |||||
$array[$res[$keys[0]]] = $res[$keys[1]]; | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
$fields[$k]['el'] = $array; | |||||
unset($array); | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
$f3->set('fields', | |||||
array_merge( | |||||
$fields, | |||||
['xss-token'=>[ | |||||
'type'=>'hidden', | |||||
'value'=>$token, | |||||
'length'=>strlen($token) | |||||
]] | |||||
)); | |||||
$formcall->token = $token; | |||||
$formcall->timestamp = $timestamp; | |||||
$formcall->form = $form_config_file; | |||||
$formcall->path = ROOT.$this->folder; | |||||
$formcall->save(); | |||||
$form_view = new \Template; | |||||
$new=$form_view->render('form.htm'); | |||||
break; | |||||
case 'box': | |||||
array_shift($request); //get rid of identifier | |||||
$type = array_shift($request); | |||||
$pics = explode(":",array_shift($body)); | |||||
$pic = $pics[0]; | |||||
$pic_hover = count($pics) > 1 ? $pics[1] : $pic; | |||||
if (count($body) >= 3) { | |||||
$caption = ['normal'=>['cap1' => array_shift($body), | |||||
'cap2' => array_shift($body)], | |||||
'hover'=> ['cap1' => array_shift($body), | |||||
'cap2' => array_shift($body)]]; | |||||
$caption_html=[]; | |||||
foreach ($caption as $state => $set) { | |||||
if(!$set['cap2']) { | |||||
$caption_html[$state] = [ | |||||
sprintf('<span class="first"> </span>'), | |||||
sprintf('<span class="first">%s</span>',$set['cap1']) | |||||
]; | |||||
} else if (!$set['cap1'] && $set['cap2']) { | |||||
$caption_html[$state] = [ | |||||
sprintf('<span class="second">%s</span>',$set['cap2']) | |||||
]; | |||||
} else { | |||||
$caption_html[$state] = [ | |||||
sprintf('<span class="first">%s</span>',$set['cap1']?:" "), | |||||
sprintf('<span class="second">%s</span>',$set['cap2']) | |||||
]; | |||||
} | |||||
} | |||||
$has_caption = TRUE; | |||||
} else { | |||||
$has_caption = FALSE; | |||||
} | |||||
if (file_exists($this->folder.$pic)) { | |||||
$pic = $this->folder.$pic; | |||||
} else { | |||||
$pic = $f3->get('RESOURCES')."img/default_img.png"; | |||||
} | |||||
if (file_exists($this->folder.$pic_hover)) { | |||||
$pic_hover = $this->folder.$pic_hover; | |||||
} else { | |||||
$pic_hover = $pic; | |||||
} | |||||
if(0) { | |||||
$PIC = new \Image($pic); | |||||
$orientation = $PIC->width() > $PIC->height() | |||||
? 'landscape' | |||||
: 'portrait' | |||||
; | |||||
unset($PIC); | |||||
} else { | |||||
list($wwidth, $hheight) = getimagesize($pic); | |||||
$orientation = $wwidth > $hheight ? 'landscape' : 'portrait'; | |||||
} | |||||
$pic = new CachedImage($pic); | |||||
$pic_hover = new CachedImage($pic_hover); | |||||
$class=""; | |||||
$add=""; | |||||
switch($type) { | |||||
case 'plain': | |||||
$link=false; | |||||
break; | |||||
case 'download': | |||||
$file = "/".$this->folder.implode(":",$request); | |||||
$link='href="'.$file.'" download '; | |||||
break; | |||||
case 'lightbox': | |||||
$body = implode("\n",$body); | |||||
if (count($request) % 2) { | |||||
$class = array_pop($request); | |||||
} | |||||
if (count($request) >= 2) { | |||||
$body=str_replace([$request[0],$request[1]],["{|","|}"],$body); | |||||
$body=$this->content_element_dispatcher($body); | |||||
} | |||||
$hash=md5($body); | |||||
$add=sprintf("<div id=\"%s\" class=\"content_elment_box_body\">\n%s\n</div>", | |||||
$hash, | |||||
$md->text($body)); | |||||
$link='href="#" data-featherlight="#'.$hash.'" '; | |||||
break; | |||||
case 'internal': | |||||
$dest=implode(":",$request); | |||||
$data = []; | |||||
$base = substr($dest,0,strpos($dest,'?') ? : strlen($dest)); | |||||
parse_str(parse_url($dest,PHP_URL_QUERY),$data); | |||||
$fragment = parse_url($dest,PHP_URL_FRAGMENT); | |||||
if ($f3->get('LANG') != $f3->get('default_lang')) { | |||||
if (!array_key_exists('lang',$data)) { | |||||
$data['lang'] = $f3->get('LANG'); | |||||
} | |||||
} | |||||
$new_dest = $base; | |||||
if (count($data) > 0) { | |||||
$new_dest .= "?" . http_build_query($data); | |||||
} | |||||
if ($fragment) { | |||||
$new_dest .= "#" . $fragment; | |||||
} | |||||
//if ($f3->get('LANG') != $f3->get('default_lang')) { | |||||
// $dest .= "?lang=".$f3->get('LANG'); | |||||
//} | |||||
$link=sprintf('href="%s" ',$f3->get('SITE_URL')."/".$new_dest); | |||||
break; | |||||
case 'external': | |||||
$dest=implode(":",$request); | |||||
$target = $f3->get('external_links_open_in_new_window') | |||||
? 'target="_blank"' | |||||
: '' | |||||
; | |||||
$link=sprintf('href="%s" %s',$dest, $target); | |||||
break; | |||||
default: | |||||
$link='href="#"'; | |||||
break; | |||||
} | |||||
$new=sprintf("<div class=\"brick %s\">\n<a class=\"content_element_box\" %s>\n<div class=\"content_element_box\"> | |||||
<div class=\"image\"> | |||||
<img class=\"standard\" src=\"%s\" /><img class=\"hover\" src=\"%s\" /> | |||||
</div> | |||||
%s | |||||
%s | |||||
\n</div>\n</a>\n%s\n</div>", | |||||
implode(" ",[$orientation,$class,$type]), | |||||
$link, | |||||
$pic->get_src(1600), | |||||
$pic_hover->get_src(1600), | |||||
($has_caption ? "<div class=\"caption standard\">".implode("<br>",$caption_html['normal'])."</div>": " "), | |||||
($has_caption ? "<div class=\"caption hover\">".implode("<br>",$caption_html['hover'])."</div>" : " " ), | |||||
$add | |||||
); | |||||
break; | |||||
case 'brick': | |||||
array_shift($request); | |||||
$class = array_shift($request); | |||||
$new = sprintf("<div class=\"content_element brick %s\">\n%s\n</div>", | |||||
$class, | |||||
$md->text(implode("\n",$body)) | |||||
); | |||||
break; | |||||
case 'calendar': | |||||
array_shift($request); | |||||
$conf = array('path', $this->folder); | |||||
$v = $this->read_config(); | |||||
$cal = new \Modules\CCalendar($v,$conf); | |||||
$new=sprintf("<div class=\"calendar\">\n%s\n</div>", | |||||
$cal); | |||||
break; | |||||
case 'header': | |||||
array_shift($request); | |||||
$conf = array('path', $this->folder); | |||||
$v = $this->read_config(); | |||||
switch (array_shift($request)) { | |||||
case 'event': | |||||
$el = new CEvent($v,$conf); | |||||
$el->set_layout('archive'); | |||||
$new = $el; | |||||
break; | |||||
case 'concert': | |||||
$el = new CConcert($v,$conf); | |||||
$el->set_layout('header'); | |||||
$new = $el; | |||||
break; | |||||
} | |||||
break; | |||||
case 'data': | |||||
$method = strtoupper($request[1]); | |||||
//$keys = []; | |||||
if (in_array($method,['POST','GET','SESSION'])) { | |||||
foreach ($body as $line) { | |||||
$key = explode("=",$line); | |||||
$raw = $f3->get($method.'.'.$key[0]); | |||||
if (count($key) >= 2) { | |||||
$type=$key[1]; | |||||
} else { | |||||
$type = false; | |||||
} | |||||
switch ($type) { | |||||
case 'base64': | |||||
$new = urlsafe_b64decode($raw); | |||||
break; | |||||
default: | |||||
$new = $raw; | |||||
} | |||||
} | |||||
//var_dump($new); | |||||
} | |||||
break; | |||||
case 'buy': | |||||
$new = ''; | |||||
if(count($request)>=2) { | |||||
$name=$request[1]; | |||||
} else { | |||||
$name ="item"; | |||||
} | |||||
if(count($request)>=3) { | |||||
$price=$request[2]; | |||||
} else { | |||||
$price=1.0; | |||||
} | |||||
$fields = [ | |||||
'caller' => $f3->get('page'), | |||||
'name'=>$name, | |||||
'price'=>$price, | |||||
'amount'=>1 | |||||
]; | |||||
$hidden_inputs = []; | |||||
foreach ($fields as $k=>$v) { | |||||
$hidden_inputs[] = sprintf('<input type="hidden" name="%s" value="%s" />',$k,$v); | |||||
} | |||||
$new = sprintf('<form method="post" action="%s">%s<button action="submit" >BUY</button><span class="price"> %s</span></form>', | |||||
'/api/cart/add', | |||||
implode("\n",$hidden_inputs), | |||||
$price ."€" | |||||
); | |||||
break; | |||||
case 'checkout': | |||||
//first argument, if present, is a path to folder containing order database | |||||
$path = ''; | |||||
if (count($request) > 1) { | |||||
$add_path = $request[1]; | |||||
if (strncmp($add_path,"/",1)) { | |||||
$path = $this->folder.$add_path; | |||||
} else { | |||||
$path = $add_path; | |||||
} | |||||
} else { | |||||
$path = $this->folder; | |||||
} | |||||
$checkout = new \Controller\Checkout($path); | |||||
$new = $checkout->index(); | |||||
break; | |||||
case 'only_cart': | |||||
$checkout = new \Controller\Checkout($this->folder); | |||||
$new = $checkout->html_cart(); | |||||
break; | |||||
case 'image': | |||||
$module = new CEimage($request, $body, $this->structs, $this->content); | |||||
$new = $module->index(); | |||||
unset($module); | |||||
break; | |||||
case 'devide': | |||||
$contents = explode($request[1],implode("\n",$body)); | |||||
$c=count($contents); | |||||
$str=""; | |||||
for ($iiii=0;$iiii<$c;$iiii++) { | |||||
$str .= sprintf(" %f%%",100/$c); | |||||
} | |||||
$template = sprintf('grid-template-columns:%s;', | |||||
$str); | |||||
$counter=0; | |||||
$new = sprintf('<div class="content_element_devided" style="%s">',$template); | |||||
foreach($contents as $part) { | |||||
$counter++; | |||||
if (count($request) >= 4) { | |||||
$part=str_replace([$request[2],$request[3]],["{|","|}"],$part); | |||||
$part=$this->content_element_dispatcher($part); | |||||
} | |||||
$new .= sprintf("<div>\n%s\n</div>", | |||||
$md->text($part) | |||||
); | |||||
} | |||||
$new.="</div>"; | |||||
break; | |||||
case 'page': | |||||
array_shift($request); | |||||
$target = array_shift($request); | |||||
$class = array_shift($request); | |||||
$folder = $this->folder.$target."/"; | |||||
$anchor_name=array_pop(explode("/",$target)); | |||||
$fff = new \Modules\FilesInFolders( | |||||
$folder, | |||||
['content'=>[ | |||||
'secondary'=>'secondary', | |||||
'zzz'=>'hidden', | |||||
'unpublish'=>'hidden'], | |||||
'keyfiles'=>[ | |||||
'banner'=>[ | |||||
'until'=>$folder, | |||||
'type'=>'pic']]] | |||||
); | |||||
$fff->prepare_files(); | |||||
foreach ($body as $line) { | |||||
$ccc = explode(":",$line); | |||||
if (count($ccc) == 2) { | |||||
if ($ccc[1] == 'false') { | |||||
$ccc[1] = false; | |||||
} | |||||
$fff->config[$ccc[0]] = $ccc[1]; | |||||
} | |||||
} | |||||
$fff->fill_content(); | |||||
//var_dump($fff->config); | |||||
$banner = ""; | |||||
if ($fff->extras['banner']) { | |||||
$banner=sprintf("<img class=\"banner\" src=\"%s\" alt=\"section banner\"/>", | |||||
$fff->extras['banner']); | |||||
} | |||||
$new = sprintf("<div class=\"content_element_page %s\">" | |||||
."<a name=\"%s\">%s</a>\n%s\n</div>", | |||||
$class, | |||||
$anchor_name, | |||||
$banner, | |||||
implode("\n",$fff->content['default'])); | |||||
break; | |||||
case 'youtube': | |||||
$vid=array_shift($request); | |||||
$pos= array_shift($request); | |||||
if( in_array($pos,array('left','right','full'))) { | |||||
$class = $pos; | |||||
} else { | |||||
$class = 'left'; | |||||
} | |||||
$video=sprintf("<iframe width=\"700\" height=\"394\" class=\"ytvideo\" " | |||||
."src=\"https://www.youtube.com/embed/%s\"></iframe>", | |||||
$vid); | |||||
$thumbnail = sprintf("<div class=\"video-thumbnail\"><a href=\"%s\" data-featherlight=\"#%s\">" | |||||
."<img class=\"thumbnail\" src=\"https://img.youtube.com/vi/%s/mqdefault.jpg\" alt=\"video-preview\"/>" | |||||
."<img class=\"play-button\" src=\"%s\" alt=\"play-button\" />" | |||||
."</a></div><div class=\"lightbox\" id=\"%s\" >%s</div>", | |||||
"https://www.youtube.com/watch?v=".$vid, | |||||
$vid, | |||||
$vid, | |||||
"/rsc/img/play-button.png", | |||||
$vid, | |||||
$video | |||||
); | |||||
foreach ($body as $k=>$line) { | |||||
if (strpos($line,"©") !== FALSE | |||||
|| strpos($line,"©") !== FALSE) { | |||||
$body[$k] = sprintf("<span class=\"copyright\">%s</span>",$line); | |||||
} | |||||
} | |||||
$new=sprintf("<div class='video-container %s'>" | |||||
."<div class=\"media\">%s</div>" | |||||
."<div class=\"caption\">%s</div>" | |||||
."</div>", | |||||
$class, | |||||
$thumbnail, | |||||
$md->text(implode("\n",$body))); | |||||
break; | |||||
default: | |||||
$new=self::warn("Content Module \"".$request[0]."\" unknown"); | |||||
break; | |||||
} | |||||
return $new; | |||||
} | |||||
} |
} | } | ||||
function content_element_dispatcher($string) { | function content_element_dispatcher($string) { | ||||
$f3 = \Base::instance(); | $f3 = \Base::instance(); | ||||
$md = new \freaParsedown(); | |||||
$md->deactivate_ol(); | |||||
$f0 = 0; | |||||
$ED = new ElementDispatcher($this->folder,$this->config); | |||||
// find occorances of {| keyword |} | // find occorances of {| keyword |} | ||||
$pattern = "/\{\|(.+?)\|\}/s"; | $pattern = "/\{\|(.+?)\|\}/s"; | ||||
$f = preg_match_all($pattern, $string,$matches,PREG_PATTERN_ORDER); | $f = preg_match_all($pattern, $string,$matches,PREG_PATTERN_ORDER); | ||||
for ($i=0;$i<$f;$i++) { | for ($i=0;$i<$f;$i++) { | ||||
$body = preg_split("/\R/",trim($matches[1][$i])); | $body = preg_split("/\R/",trim($matches[1][$i])); | ||||
$request = explode(":", trim(array_shift($body))); | $request = explode(":", trim(array_shift($body))); | ||||
$new=""; | |||||
switch($request[0]) { | |||||
case 'test': | |||||
$new="seems to work"; | |||||
break; | |||||
case ';': | |||||
$new=""; | |||||
break; | |||||
case 'path': | |||||
$new="/".$this->folder; | |||||
break; | |||||
case 'space': | |||||
$new=sprintf("<div style=\"height:%s;\"></div>", | |||||
$request[1] | |||||
); | |||||
break; | |||||
case 'span': | |||||
$new=sprintf("<span class=\"%s\">%s</span>", | |||||
$request[1], | |||||
$request[2] ? : implode("\n",$body) | |||||
); | |||||
break; | |||||
case 'small-text': | |||||
if(count($body)) { | |||||
$new=sprintf("<div class=\"smalltext\">%s</div>", | |||||
$md->text(implode("\n",$body)) | |||||
); | |||||
} else { | |||||
$new=sprintf("<span class=\"smalltext\">%s</span>", | |||||
$request[1] | |||||
); | |||||
} | |||||
break; | |||||
case 'CE': | |||||
switch($request[1]) { | |||||
case 'publication': | |||||
$CE = new \Modules\CPublication($this->config,['path'=>$this->folder]); | |||||
if(count($request)>2) { | |||||
$CE->set_layout($request[2]); | |||||
} | |||||
$new = $CE; | |||||
break; | |||||
} | |||||
break; | |||||
case 'TOC': | |||||
// throw away TOC part of request, we don't need it | |||||
array_shift($request); | |||||
$toc = new \Modules\TOC($request,$this->folder,$body); | |||||
$toc->dispatch(); | |||||
$new=sprintf("<div class=\"TOC %s\">%s</div>", | |||||
array_shift($request), | |||||
$toc); | |||||
break; | |||||
case 'sql': | |||||
//array_shift($request); | |||||
switch ($request[1]) { | |||||
case 'sqlite': | |||||
$array = []; | |||||
$db = new \DB\SQL('sqlite:' . $this->folder . $request[2]); | |||||
$sql = implode(" ", $body); | |||||
if ( strpos($sql,'insert')===false && | |||||
strpos($sql,'update')===false && | |||||
strpos($sql,'drop')===false) { | |||||
$rows = $db->exec($sql); | |||||
foreach ($rows as $res) { | |||||
switch (count($res)) { | |||||
case 1: | |||||
$keys=array_keys($res); | |||||
$array[] = $res[$keys[0]]; | |||||
break; | |||||
case 2: | |||||
$keys=array_keys($res); | |||||
$array[$res[$keys[0]]] = $res[$keys[1]]; | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
$new = sprintf("<ul><li>%s</li></ul>", | |||||
implode("</li><li>",$array)); | |||||
unset($array); | |||||
break; | |||||
} | |||||
break; | |||||
case 'form': | |||||
$token_db = $f3->get('TEMP') . "CEform/"; | |||||
$form_config_file = sprintf("%s%s.cfg", | |||||
ROOT.$this->folder, | |||||
$request[1]); | |||||
$db = new \DB\Jig($token_db,\DB\Jig::FORMAT_JSON); | |||||
$formcall = new \DB\Jig\Mapper($db,'form_calls'); | |||||
$timestamp = time(); | |||||
$token = md5($timestamp . $form_config_file . rand(100,999)); | |||||
$f3->config($form_config_file); | |||||
$fields = $f3->get('fields'); | |||||
foreach ($fields as $k => $v) { | |||||
if ($v['type'] == 'custom') { | |||||
$fields[$k]['template'] = sprintf( | |||||
"%s%s", | |||||
substr($this->folder,strlen($f3->get('CONTENT_BASE'))), | |||||
$v['template'] | |||||
); | |||||
} | |||||
if (array_key_exists('db',$v)) { | |||||
switch ($v['db']['type']) { | |||||
case 'sqlite': | |||||
$array = []; | |||||
$db = new \DB\SQL('sqlite:' . $this->folder . $v['db']['file']); | |||||
$sql = $v['db']['sql']; | |||||
if ( strpos($sql,'insert')===false && | |||||
strpos($sql,'update')===false && | |||||
strpos($sql,'drop')===false) { | |||||
$rows = $db->exec($sql); | |||||
foreach ($rows as $res) { | |||||
switch (count($res)) { | |||||
case 2: | |||||
$keys=array_keys($res); | |||||
$array[$res[$keys[0]]] = $res[$keys[1]]; | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
$fields[$k]['el'] = $array; | |||||
unset($array); | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
$f3->set('fields', | |||||
array_merge( | |||||
$fields, | |||||
['xss-token'=>[ | |||||
'type'=>'hidden', | |||||
'value'=>$token, | |||||
'length'=>strlen($token) | |||||
]] | |||||
)); | |||||
$formcall->token = $token; | |||||
$formcall->timestamp = $timestamp; | |||||
$formcall->form = $form_config_file; | |||||
$formcall->path = ROOT.$this->folder; | |||||
$formcall->save(); | |||||
$form_view = new \Template; | |||||
$new=$form_view->render('form.htm'); | |||||
break; | |||||
case 'box': | |||||
array_shift($request); //get rid of identifier | |||||
$type = array_shift($request); | |||||
$pics = explode(":",array_shift($body)); | |||||
$pic = $pics[0]; | |||||
$pic_hover = count($pics) > 1 ? $pics[1] : $pic; | |||||
if (count($body) >= 3) { | |||||
$caption = ['normal'=>['cap1' => array_shift($body), | |||||
'cap2' => array_shift($body)], | |||||
'hover'=> ['cap1' => array_shift($body), | |||||
'cap2' => array_shift($body)]]; | |||||
$caption_html=[]; | |||||
foreach ($caption as $state => $set) { | |||||
if(!$set['cap2']) { | |||||
$caption_html[$state] = [ | |||||
sprintf('<span class="first"> </span>'), | |||||
sprintf('<span class="first">%s</span>',$set['cap1']) | |||||
]; | |||||
} else if (!$set['cap1'] && $set['cap2']) { | |||||
$caption_html[$state] = [ | |||||
sprintf('<span class="second">%s</span>',$set['cap2']) | |||||
]; | |||||
} else { | |||||
$caption_html[$state] = [ | |||||
sprintf('<span class="first">%s</span>',$set['cap1']?:" "), | |||||
sprintf('<span class="second">%s</span>',$set['cap2']) | |||||
]; | |||||
} | |||||
} | |||||
$has_caption = TRUE; | |||||
} else { | |||||
$has_caption = FALSE; | |||||
} | |||||
if (file_exists($this->folder.$pic)) { | |||||
$pic = $this->folder.$pic; | |||||
} else { | |||||
$pic = $f3->get('RESOURCES')."img/default_img.png"; | |||||
} | |||||
if (file_exists($this->folder.$pic_hover)) { | |||||
$pic_hover = $this->folder.$pic_hover; | |||||
} else { | |||||
$pic_hover = $pic; | |||||
} | |||||
if(0) { | |||||
$PIC = new \Image($pic); | |||||
$orientation = $PIC->width() > $PIC->height() | |||||
? 'landscape' | |||||
: 'portrait' | |||||
; | |||||
unset($PIC); | |||||
} else { | |||||
list($wwidth, $hheight) = getimagesize($pic); | |||||
$orientation = $wwidth > $hheight ? 'landscape' : 'portrait'; | |||||
} | |||||
$pic = new CachedImage($pic); | |||||
$pic_hover = new CachedImage($pic_hover); | |||||
$class=""; | |||||
$add=""; | |||||
switch($type) { | |||||
case 'plain': | |||||
$link=false; | |||||
break; | |||||
case 'download': | |||||
$file = "/".$this->folder.implode(":",$request); | |||||
$link='href="'.$file.'" download '; | |||||
break; | |||||
case 'lightbox': | |||||
$body = implode("\n",$body); | |||||
if (count($request) % 2) { | |||||
$class = array_pop($request); | |||||
} | |||||
if (count($request) >= 2) { | |||||
$body=str_replace([$request[0],$request[1]],["{|","|}"],$body); | |||||
$body=$this->content_element_dispatcher($body); | |||||
} | |||||
$hash=md5($body); | |||||
$add=sprintf("<div id=\"%s\" class=\"content_elment_box_body\">\n%s\n</div>", | |||||
$hash, | |||||
$md->text($body)); | |||||
$link='href="#" data-featherlight="#'.$hash.'" '; | |||||
break; | |||||
case 'internal': | |||||
$dest=implode(":",$request); | |||||
$data = []; | |||||
$base = substr($dest,0,strpos($dest,'?') ? : strlen($dest)); | |||||
parse_str(parse_url($dest,PHP_URL_QUERY),$data); | |||||
$fragment = parse_url($dest,PHP_URL_FRAGMENT); | |||||
if ($f3->get('LANG') != $f3->get('default_lang')) { | |||||
if (!array_key_exists('lang',$data)) { | |||||
$data['lang'] = $f3->get('LANG'); | |||||
} | |||||
} | |||||
$new_dest = $base; | |||||
if (count($data) > 0) { | |||||
$new_dest .= "?" . http_build_query($data); | |||||
} | |||||
if ($fragment) { | |||||
$new_dest .= "#" . $fragment; | |||||
} | |||||
//if ($f3->get('LANG') != $f3->get('default_lang')) { | |||||
// $dest .= "?lang=".$f3->get('LANG'); | |||||
//} | |||||
$link=sprintf('href="%s" ',$f3->get('SITE_URL')."/".$new_dest); | |||||
break; | |||||
case 'external': | |||||
$dest=implode(":",$request); | |||||
$target = $f3->get('external_links_open_in_new_window') | |||||
? 'target="_blank"' | |||||
: '' | |||||
; | |||||
$link=sprintf('href="%s" %s',$dest, $target); | |||||
break; | |||||
default: | |||||
$link='href="#"'; | |||||
break; | |||||
} | |||||
$new=sprintf("<div class=\"brick %s\">\n<a class=\"content_element_box\" %s>\n<div class=\"content_element_box\"> | |||||
<div class=\"image\"> | |||||
<img class=\"standard\" src=\"%s\" /><img class=\"hover\" src=\"%s\" /> | |||||
</div> | |||||
%s | |||||
%s | |||||
\n</div>\n</a>\n%s\n</div>", | |||||
implode(" ",[$orientation,$class,$type]), | |||||
$link, | |||||
$pic->get_src(1600), | |||||
$pic_hover->get_src(1600), | |||||
($has_caption ? "<div class=\"caption standard\">".implode("<br>",$caption_html['normal'])."</div>": " "), | |||||
($has_caption ? "<div class=\"caption hover\">".implode("<br>",$caption_html['hover'])."</div>" : " " ), | |||||
$add | |||||
); | |||||
break; | |||||
case 'brick': | |||||
array_shift($request); | |||||
$class = array_shift($request); | |||||
$new = sprintf("<div class=\"content_element brick %s\">\n%s\n</div>", | |||||
$class, | |||||
$md->text(implode("\n",$body)) | |||||
); | |||||
break; | |||||
case 'calendar': | |||||
array_shift($request); | |||||
$conf = array('path', $this->folder); | |||||
$v = $this->read_config(); | |||||
$cal = new \Modules\CCalendar($v,$conf); | |||||
$new=sprintf("<div class=\"calendar\">\n%s\n</div>", | |||||
$cal); | |||||
break; | |||||
case 'header': | |||||
array_shift($request); | |||||
$conf = array('path', $this->folder); | |||||
$v = $this->read_config(); | |||||
switch (array_shift($request)) { | |||||
case 'event': | |||||
$el = new CEvent($v,$conf); | |||||
$el->set_layout('archive'); | |||||
$new = $el; | |||||
break; | |||||
case 'concert': | |||||
$el = new CConcert($v,$conf); | |||||
$el->set_layout('header'); | |||||
$new = $el; | |||||
break; | |||||
} | |||||
break; | |||||
case 'data': | |||||
$method = strtoupper($request[1]); | |||||
//$keys = []; | |||||
if (in_array($method,['POST','GET','SESSION'])) { | |||||
foreach ($body as $line) { | |||||
$key = explode("=",$line); | |||||
$raw = $f3->get($method.'.'.$key[0]); | |||||
if (count($key) >= 2) { | |||||
$type=$key[1]; | |||||
} else { | |||||
$type = false; | |||||
} | |||||
switch ($type) { | |||||
case 'base64': | |||||
$new = urlsafe_b64decode($raw); | |||||
break; | |||||
default: | |||||
$new = $raw; | |||||
} | |||||
} | |||||
//var_dump($new); | |||||
} | |||||
break; | |||||
case 'buy': | |||||
$new = ''; | |||||
if(count($request)>=2) { | |||||
$name=$request[1]; | |||||
} else { | |||||
$name ="item"; | |||||
} | |||||
if(count($request)>=3) { | |||||
$price=$request[2]; | |||||
} else { | |||||
$price=1.0; | |||||
} | |||||
$fields = [ | |||||
'caller' => $f3->get('page'), | |||||
'name'=>$name, | |||||
'price'=>$price, | |||||
'amount'=>1 | |||||
]; | |||||
$hidden_inputs = []; | |||||
foreach ($fields as $k=>$v) { | |||||
$hidden_inputs[] = sprintf('<input type="hidden" name="%s" value="%s" />',$k,$v); | |||||
} | |||||
$new = sprintf('<form method="post" action="%s">%s<button action="submit" >BUY</button><span class="price"> %s</span></form>', | |||||
'/api/cart/add', | |||||
implode("\n",$hidden_inputs), | |||||
$price ."€" | |||||
); | |||||
break; | |||||
case 'checkout': | |||||
//first argument, if present, is a path to folder containing order database | |||||
$path = ''; | |||||
if (count($request) > 1) { | |||||
$add_path = $request[1]; | |||||
if (strncmp($add_path,"/",1)) { | |||||
$path = $this->folder.$add_path; | |||||
} else { | |||||
$path = $add_path; | |||||
} | |||||
} else { | |||||
$path = $this->folder; | |||||
} | |||||
$checkout = new \Controller\Checkout($path); | |||||
$new = $checkout->index(); | |||||
break; | |||||
case 'only_cart': | |||||
$checkout = new \Controller\Checkout($this->folder); | |||||
$new = $checkout->html_cart(); | |||||
break; | |||||
case 'image': | |||||
$module = new CEimage($request, $body, $this->structs, $this->content); | |||||
$new = $module->index(); | |||||
unset($module); | |||||
break; | |||||
case 'devide': | |||||
$contents = explode($request[1],implode("\n",$body)); | |||||
$c=count($contents); | |||||
$str=""; | |||||
for ($iiii=0;$iiii<$c;$iiii++) { | |||||
$str .= sprintf(" %f%%",100/$c); | |||||
} | |||||
$template = sprintf('grid-template-columns:%s;', | |||||
$str); | |||||
$counter=0; | |||||
$new = sprintf('<div class="content_element_devided" style="%s">',$template); | |||||
foreach($contents as $part) { | |||||
$counter++; | |||||
if (count($request) >= 4) { | |||||
$part=str_replace([$request[2],$request[3]],["{|","|}"],$part); | |||||
$part=$this->content_element_dispatcher($part); | |||||
} | |||||
$new .= sprintf("<div>\n%s\n</div>", | |||||
$md->text($part) | |||||
); | |||||
} | |||||
$new.="</div>"; | |||||
break; | |||||
case 'page': | |||||
array_shift($request); | |||||
$target = array_shift($request); | |||||
$class = array_shift($request); | |||||
$folder = $this->folder.$target."/"; | |||||
$anchor_name=array_pop(explode("/",$target)); | |||||
$fff = new \Modules\FilesInFolders( | |||||
$folder, | |||||
['content'=>[ | |||||
'secondary'=>'secondary', | |||||
'zzz'=>'hidden', | |||||
'unpublish'=>'hidden'], | |||||
'keyfiles'=>[ | |||||
'banner'=>[ | |||||
'until'=>$folder, | |||||
'type'=>'pic']]] | |||||
); | |||||
$fff->prepare_files(); | |||||
foreach ($body as $line) { | |||||
$ccc = explode(":",$line); | |||||
if (count($ccc) == 2) { | |||||
if ($ccc[1] == 'false') { | |||||
$ccc[1] = false; | |||||
} | |||||
$fff->config[$ccc[0]] = $ccc[1]; | |||||
} | |||||
} | |||||
$fff->fill_content(); | |||||
//var_dump($fff->config); | |||||
$banner = ""; | |||||
if ($fff->extras['banner']) { | |||||
$banner=sprintf("<img class=\"banner\" src=\"%s\" alt=\"section banner\"/>", | |||||
$fff->extras['banner']); | |||||
} | |||||
$new = sprintf("<div class=\"content_element_page %s\">" | |||||
."<a name=\"%s\">%s</a>\n%s\n</div>", | |||||
$class, | |||||
$anchor_name, | |||||
$banner, | |||||
implode("\n",$fff->content['default'])); | |||||
break; | |||||
case 'youtube': | |||||
$vid=array_shift($request); | |||||
$pos= array_shift($request); | |||||
if( in_array($pos,array('left','right','full'))) { | |||||
$class = $pos; | |||||
} else { | |||||
$class = 'left'; | |||||
} | |||||
$video=sprintf("<iframe width=\"700\" height=\"394\" class=\"ytvideo\" " | |||||
."src=\"https://www.youtube.com/embed/%s\"></iframe>", | |||||
$vid); | |||||
$thumbnail = sprintf("<div class=\"video-thumbnail\"><a href=\"%s\" data-featherlight=\"#%s\">" | |||||
."<img class=\"thumbnail\" src=\"https://img.youtube.com/vi/%s/mqdefault.jpg\" alt=\"video-preview\"/>" | |||||
."<img class=\"play-button\" src=\"%s\" alt=\"play-button\" />" | |||||
."</a></div><div class=\"lightbox\" id=\"%s\" >%s</div>", | |||||
"https://www.youtube.com/watch?v=".$vid, | |||||
$vid, | |||||
$vid, | |||||
"/rsc/img/play-button.png", | |||||
$vid, | |||||
$video | |||||
); | |||||
foreach ($body as $k=>$line) { | |||||
if (strpos($line,"©") !== FALSE | |||||
|| strpos($line,"©") !== FALSE) { | |||||
$body[$k] = sprintf("<span class=\"copyright\">%s</span>",$line); | |||||
} | |||||
} | |||||
$new=sprintf("<div class='video-container %s'>" | |||||
."<div class=\"media\">%s</div>" | |||||
."<div class=\"caption\">%s</div>" | |||||
."</div>", | |||||
$class, | |||||
$thumbnail, | |||||
$md->text(implode("\n",$body))); | |||||
break; | |||||
default: | |||||
$new=self::warn("Content Module \"".$request[0]."\" unknown"); | |||||
break; | |||||
} | |||||
$new = $ED->content_element($request,$body); | |||||
$string = str_replace($matches[0][$i],$new,$string); | $string = str_replace($matches[0][$i],$new,$string); | ||||
} | } | ||||
return $string; | return $string; | ||||
return sprintf("<div class=\"warning\">%s</div>",$message); | return sprintf("<div class=\"warning\">%s</div>",$message); | ||||
} | } | ||||
} | } | ||||
class CEimage | |||||
{ | |||||
var $r; | |||||
var $b; | |||||
var $structs; | |||||
var $content; | |||||
function __construct($request,$body=[],$structs=false,$content=false) { | |||||
$this->r = $request; | |||||
$this->b = $body; | |||||
$this->structs = &$structs; | |||||
$this->content = &$content; | |||||
} | |||||
function is_width($string) { | |||||
$pattern="/^[0-9]+%$/"; | |||||
if (preg_match($pattern,$string)) { | |||||
return true; | |||||
} else { | |||||
return false; | |||||
} | |||||
} | |||||
function index() { | |||||
$md = new \freaParsedown(); | |||||
$request = $this->r; | |||||
$body = $this->b; | |||||
$key=$request[1]; | |||||
$image=""; | |||||
$new=""; | |||||
// see if we can find image | |||||
if ( is_file($request[1])) { | |||||
$image= $request[1]; | |||||
} else if ($this->structs) { | |||||
foreach($this->structs as $domain=>$destination) { | |||||
if(array_key_exists($key, $this->structs[$domain]['pic'])) { | |||||
$image = $this->structs[$domain]['pic'][$key]; | |||||
unset($this->structs[$domain]['pic'][$key]); | |||||
unset($this->content[$this->domains[$domain]][$key]); | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
if ($image) { | |||||
// image positioning | |||||
if( in_array($request[2],array('left','right','full','auto'))) { | |||||
$class = $request[2]; | |||||
} else { | |||||
$class = 'full'; | |||||
} | |||||
if (isset($request[3])) { | |||||
$width=self::is_width($request[3]) ? $request[3] : false; | |||||
} | |||||
$gallery = "gallery"; | |||||
// image orientation? | |||||
$img = new \Image($image); | |||||
// $ratio = "landscape"; | |||||
$ratio = ($img->width() >= $img->height()) | |||||
? "landscape" | |||||
: "portrait" | |||||
; | |||||
unset($img); | |||||
$cached = new CachedImage($image); | |||||
// identify if caption contains a copyright note | |||||
// if so, indicate with a class | |||||
foreach ($body as $k=>$line) { | |||||
if (strpos($line,"©") !== FALSE | |||||
|| strpos($line,"©") !== FALSE) { | |||||
$body[$k] = sprintf("<span class=\"copyright\">%s</span>",$line); | |||||
} | |||||
} | |||||
$new=sprintf("<div class='content_element_image %s'>" | |||||
."<div class=\"media %s\" %s><a href=\"%s\" class=\"$gallery\"><img src=\"%s\" alt=\"user supplied image\" /></a></div>" | |||||
."<img src=\"%s\" style=\"display:none;\" alt=\"user supplied image\" />" | |||||
."<div class=\"caption\">%s</div>" | |||||
."</div>", | |||||
$class, | |||||
$ratio, | |||||
($width ? "style=\"flex-basis:$width;\"" : ''), | |||||
$cached->get_src(1600), | |||||
$cached->get_src(1600), | |||||
$cached->get_src(1600), | |||||
$md->text(implode("\n",$body)) | |||||
); | |||||
unset($cached); | |||||
} else { | |||||
// image not found | |||||
$new=sprintf("<div class='content_element_image %s'>\n" | |||||
."<div class=\"media %s\">\n" | |||||
."<div class=\"caption\">\n%s\n</div>\n" | |||||
."</div>\n", | |||||
$class, | |||||
$ratio, | |||||
$md->text(implode("\n",$body)) | |||||
); | |||||
} | |||||
return $new; | |||||
} | |||||
} |