@@ -0,0 +1,109 @@ | |||
<?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; | |||
} | |||
} | |||
@@ -0,0 +1,559 @@ | |||
<?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; | |||
} | |||
} |
@@ -364,549 +364,16 @@ class FilesInFolders { | |||
} | |||
function content_element_dispatcher($string) { | |||
$f3 = \Base::instance(); | |||
$md = new \freaParsedown(); | |||
$md->deactivate_ol(); | |||
$f0 = 0; | |||
$ED = new ElementDispatcher($this->folder,$this->config); | |||
// find occorances of {| keyword |} | |||
$pattern = "/\{\|(.+?)\|\}/s"; | |||
$f = preg_match_all($pattern, $string,$matches,PREG_PATTERN_ORDER); | |||
for ($i=0;$i<$f;$i++) { | |||
$body = preg_split("/\R/",trim($matches[1][$i])); | |||
$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); | |||
} | |||
return $string; | |||
@@ -916,109 +383,3 @@ class FilesInFolders { | |||
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; | |||
} | |||
} |