'default'); private $keyfiles = array(); public $structs = array(); public $EXT=array( 'txt'=>array( 'txt', 'text', 'md' ), 'pic'=>array( 'jpg', 'jpeg', 'png', 'svg' ), 'tpl'=>array( 'html', 'htm' ), 'audio'=>array('mp3','wav','ogg'), 'csv'=>array( 'csv' ) ); public $config = array(); private $state=array(); function __construct($folder,$conf=array()) { debug("about to construct FIF: $folder"); $f3 = \Base::instance(); if(is_dir($folder)) { // are we given a valid path? $this->folder = $folder; } else { // and if not? $this->folder = $f3->get('CONTENT')."./"; } if(is_array($conf)) { foreach($conf as $key=>$value) { switch($key) { case 'content': if(is_array($value)) { foreach($value as $k=>$v) { $this->domains[$k] = $v; } } break; case 'keyfiles': if(is_array($value)) { foreach($value as $k=>$v) { $this->keyfiles[$k] = $v; } } break; } } } foreach($this->domains as $domain) { $this->content[$domain] = array(); } foreach($this->keyfiles as $keys=>$d) { $this->extras[$keys] = ""; } debug("constructed files in folder: $folder"); } ///////////////////////////// // read folder into struct // ///////////////////////////// function prepare_files() { foreach ($this->domains as $k=>$v) { foreach($this->EXT as $cat=>$endings) { $this->structs[$k][$cat]=array(); } } $ls = scandir($this->folder); foreach ($ls as $k=>$f) { if (!strncmp($f,'.',1)) continue; // ignore hidden files $ex=explode(".", $f); $ext=strtolower(end($ex)); if (array_key_exists($ex[0],$this->domains)) { $domain_key=$ex[0]; $sort_key=1; } elseif (array_key_exists($ex[0], $this->keyfiles)) { if(in_array($ext,$this->EXT[$this->keyfiles[$ex[0]]['type']])) { $this->extras[$ex[0]]=$this->folder.$f; continue; } $domain_key='default'; $sort_key=0; } else { $domain_key='default'; $sort_key=0; } foreach ($this->EXT as $cat=>$endings) { if (in_array($ext, $endings)) { $this->structs[$domain_key][$cat][$ex[$sort_key]] = $this->folder.$f; break; } } } foreach($this->keyfiles as $key=>$param) { if(!$this->extras[$key]) { $this->extras[$key] = self::search_up( $key, array($this->folder,$param['until']), $this->EXT[$param['type']] ); } if($this->extras[$key]) { if ($param['type'] == 'txt') { $this->read_textfile($this->extras[$key]); } } } } /////////////////////////////////////// // prepare content as per the struct // /////////////////////////////////////// function fill_content() { $f3 = \Base::instance(); $md = new \freaParsedown(); $md->deactivate_ol(); //var_dump($md->get_BlockTypes()); foreach($this->domains as $domain_key=>$domain) { // don't act on hidden files if ($domain == 'hidden') { continue; } $this->state['current_domain'] = $domain_key; foreach($this->structs[$domain_key]['txt'] as $key=>$file) { $str = $this->read_textfile($file); $str = self::content_element_dispatcher($str); $str = $md->text($str); //$str = sprintf("%s", $str); $this->content[$domain][$key."30text"] = sprintf( "
%s
", '', $key, $key, $str ); } $includeTemplates = array_key_exists('includeTemplates', $this->config) ? $this->config['includeTemplates'] : ($f3->get('includeTemplates') ? : FALSE) ; if ($includeTemplates) { foreach($this->structs[$domain_key]['tpl'] as $key=>$file) { $str = \Template::instance()->render(substr($file,7)); $str = self::linkify($str); $this->content[$domain][$key."00.tpl"] = sprintf( "
%s
", '', $key, $str ); } } $bulkIncludePic = array_key_exists('bulkIncludePic',$this->config) ? $this->config['bulkIncludePic'] : ($f3->get('bulkIncludePic') ? : FALSE) ; if ($bulkIncludePic) { foreach($this->structs[$domain_key]['pic'] as $key=>$file) { $image_include_version = 2; switch ($image_include_version) { case 1: $this->content[$domain][$key."10.image"] = sprintf( "" ); break; case 2: $module = new CEimage(['image',$file,$bulkIncludePic,'gallery']); $this->content[$domain][$key."10.image"] = $module->index(); unset($module); break; case 3: //$this->content[$domain][] = "asdasd"; break; } } } $bulkIncludeAudio = array_key_exists('bulkIncludeAudio',$this->config) ? $this->config['bulkIncludeAudio'] : ($f3->get('bulkIncludeAudio') ? : FALSE) ; if ($bulkIncludeAudio) { foreach ($this->structs[$domain_key]['audio'] as $key=>$file) { $this->content[$domain][$key."20.audio"] = sprintf( '%s
', $file, $key ); } } foreach($this->structs[$domain_key]['csv'] as $key=>$file) { $csv = new \Modules\Ography($file,TRUE); $str=""; foreach($csv->entries as $entry) { $tmp=""; foreach($entry as $key=>$value) { $tmp .= sprintf("", $key, $value); } $str .= sprintf("%s",$tmp); } $str.="
%s
"; $this->content[$domain][$key."30.csv"] = $str; } $content_order = 2; switch ($content_order) { case 0: // don't do any processing // content types appear together // but are not enclosed in a div break; case 1; // all content files appear in alphabetical order ksort($this->content[$domain]); break; case 2: // all content files appear in alphabetical order // groups of same content types are enclosed in a div ksort($this->content[$domain]); $prev = null; foreach ($this->content[$domain] as $key=>$value) { $html = ""; $type = array_pop(explode('.',$key)); if ($type == $prev) { continue; } elseif ($prev != null) { $html = ""; } $html .= "
"; $this->content[$domain][$key] = $html.$value; $prev = $type; } $this->content[$domain][] = "
"; } } } ////////////////////// // read config data // ////////////////////// function read_config($domain=false) { foreach ($this->domains as $source=>$destination) { if (is_string($domain)) { if ($source != $domain) { continue; } } elseif (is_array($domain)) { if (!in_array($source,$domain)) { continue; } } foreach ($this->structs[$source]['txt'] as $key=>$file) { $this->read_textfile($file); } } return $this->config; } //////////////// // recursions // //////////////// function search_up($key,$paths,$ext) { $return = ""; if(count($paths) == 2) { $current = $paths[0]; $last_try = $paths[1]; $ls=scandir($current); foreach($ls as $f) { if(!strncmp($f,'.',1)) continue; // ignore hidden files $ex=explode(".", $f); if(in_array(strtolower(end($ex)),$ext)) { if($ex[0]==$key) { $return = $current.$f; break; } } } } if ($return) { return $return; } elseif($current == $last_try) { return false; } else { $p = explode('/',$current); array_pop($p); array_pop($p); return self::search_up($key,array(implode("/",$p)."/",$last_try),$ext); } } /////////////////////// // Utility functions // /////////////////////// function read_textfile($file) { debug("about to read file: $file"); $str = file_get_contents($file); debug("read file: $file"); $str = self::linkify($str); $str = self::strip_comments($str); $str = self::get_config_from_content($str); debug("processed file: $file"); return $str; } function strip_comments($str) { $single_line_comments = "/(^;.*\R)/m"; $str = preg_replace($single_line_comments,"",$str); $multi_line_comments = "/\/\*.*?\*\//s"; $str = preg_replace($multi_line_comments,"",$str); return $str; } function linkify($string) { $pattern = "/\s@(\w+)[=]([\w,]+)\s/"; $count = 0; $new = preg_replace_callback ($pattern, function($m){ $f3 = \Base::instance(); return $f3->get('SITE_URL') .$f3->alias($m[1],self::$keyword."=".$m[2]) ;}, $string); return $new; } function get_config_from_content($string) { $f3 = \Base::instance(); $f = 0; $tmp = null; $pattern = "/#\+(\w+):\s?(.*)/"; $f = preg_match_all($pattern, $string,$matches,PREG_PATTERN_ORDER); for ($i=0;$i<$f;$i++) { $string = str_replace($matches[0][$i],"",$string); $key = $matches[1][$i]; $value = trim($matches[2][$i]); if(strtolower($value) == "false") { $value = FALSE; } if(!strncmp(trim($value),'@',1)) { //var_dump($f3->get('DATA')); if (array_key_exists($key,$f3->get('DATA'))) { $DATA = $f3->get('DATA.'.$key); $conf = array($DATA['type'],$DATA['dir']); $relation = new \Modules\TOC($conf,$f3->get('CONTENT'),substr($value,1)); $relation->dispatch(); $this->config[$key]=array_shift($relation->entries); } else { $this->config[$key]=$value; } } else { if (array_key_exists($key, $this->config)) { if (is_array($this->config[$key])) { $this->config[$key][]=$value; } else { $tmp = $this->config[$key]; $this->config[$key] = [$tmp,$value]; $tmp=null; } } else { $this->config[$key]=$value; } } } $pattern = "/ยง>\s*(\w+):(.*?)\R[\011\040]*\R/s"; $f = preg_match_all($pattern, $string,$matches,PREG_PATTERN_ORDER); for ($i=0;$i<$f;$i++) { $string = str_replace($matches[0][$i],"",$string); $key = $matches[1][$i]; $value = trim($matches[2][$i]); if(strtolower($value) == "false") { $value = FALSE; } if (!strncmp($value,'@',1)) { # var_dump(); if (array_key_exists($key,$f3->get('DATA'))) { $entries = explode("@",$value); array_shift($entries); // first entry is always empty $DATA = $f3->get('DATA.'.$key); $conf = array($DATA['type'],$DATA['dir']); $relation = new \Modules\TOC($conf,$f3->get('CONTENT'),$entries); $relation->dispatch(); if(/*count($entries) >*/ 1) { $this->config[$key]= new CMultiple($relation->entries); } else { $this->config[$key]=array_shift($relation->entries); } } else { $this->config[$key]=$value; } } else { $this->config[$key]=$value; } } return $string; } function content_element_dispatcher($string) { $f3 = \Base::instance(); $ED = new ElementDispatcher($this->folder,$this->config,$this->structs,$this->content,$this->domains); $string = $ED->dispatch($string); return $string; } static function warn($message) { return sprintf("
%s
",$message); } }