array() ); if( $section_data['type'] == 'wrapper_section' ){ if( isset($section_data['contains_sections']) ){ for( $cc=0; $cc < $section_data['contains_sections']; $cc++ ){ $content .= self::GetSection($sections, $section_num); } } }else{ $content .= self::SectionToContent($section_data,$curr_section_num); } $is_hidden = isset($section_data['gp_hidden']) && $section_data['gp_hidden'] == 'true'; $is_hidden = \gp\tool\Plugins::Filter('SectionIsHidden', array($is_hidden, $section_data, $curr_section_num)); if( $is_hidden ){ return ''; // this of course could be done a lot smarter } if( !isset($section_data['nodeName']) ){ $content = '' . $content . '
'; }else{ if( empty($content) ){ $content = '<'.$section_data['nodeName'].self::SectionAttributes($section_data['attributes'],$section_data['type']).' />'; }else{ $content = '<'.$section_data['nodeName'].self::SectionAttributes($section_data['attributes'],$section_data['type']).'>' . $content . self::EndTag($section_data['nodeName']); } } return $content; } /** * Output an end tag if appropriate * */ static function EndTag($node_name){ $empty_nodes = array('link','track','param','area','command','col','base','meta','hr','source','img','keygen','br','wbr','input'); if( in_array($node_name,$empty_nodes) ){ return; } return ''; } /** * Render the content of a single page section * @param $section array The unformatted data of the page * @param $section_num int The unformatted data of the page * @param $title string The title of the page * @param $meta array Meta content of the page * @return string * */ static function RenderSection($section,$section_num,$title,$meta = array()){ self::SetVars($title,$meta); return self::SectionToContent($section,$section_num); } /** * Return the data types available for content areas * @since 3.6 */ static function GetTypes(){ global $langmessage; static $types = false; if( !$types ){ $types['text']['label'] = $langmessage['editable_text']; $types['image']['label'] = $langmessage['Image']; $types['gallery']['label'] = $langmessage['Image Gallery']; $types['include']['label'] = $langmessage['File Include']; $types['wrapper_section']['label'] = $langmessage['Section Wrapper']; $types = \gp\tool\Plugins::Filter('SectionTypes',array($types)); } return $types; } static function SetVars($title,$meta){ self::$title = $title; self::$label = \gp\tool::GetLabel($title); self::$meta = array(); if( is_array($meta) ){ self::$meta = $meta; } } /** * Return formatted content for the $section_data * @return string * */ static function SectionToContent($section_data,$section_num){ $section_data = \gp\tool\Plugins::Filter('SectionToContent',array($section_data,$section_num)); switch($section_data['type']){ case 'text': return self::TextContent($section_data['content']); case 'include': return self::IncludeContent($section_data); case 'gallery': \gp\tool::ShowingGallery(); return $section_data['content']; } return $section_data['content']; } /** * Replace content variables in $content * */ static function TextContent(&$content){ self::$meta += array('modified'=>''); //variables $vars = array( 'dirPrefix' => $GLOBALS['dirPrefix'], 'linkPrefix' => \gp\tool::HrefEncode($GLOBALS['linkPrefix']), 'fileModTime' => self::$meta['modified'], 'title' => self::$title, 'label' => self::$label, 'currentYear' => date('Y'), 'currentMonths' => date('m'), 'currentDay' => date('d'), ); $vars = \gp\tool\Plugins::Filter('ReplaceContentVars', array($vars)); $offset = 0; $i = 0; do{ $i++; $pos = strpos($content,'$',$offset); if( $pos === false ){ break; } //escaped? if( $pos > 0 ){ $prev_char = $content{$pos-1}; if( $prev_char == '\\' ){ $offset = $pos+1; continue; } } $len = strspn($content,'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',$pos+1); if( $len == 0 ){ $offset = $pos+1; continue; } $var = substr($content,$pos+1,$len); if( isset($vars[$var]) ){ $content = substr_replace($content,$vars[$var],$pos,$len+1); } $offset = $pos+$len; }while(true); /* Testing old includes system ... this breaks editing */ self::ReplaceContent($content); return $content; } /** * Include the content of another page into the current content by replacing {{--page_name--}} with the content of page_name * @param string $content The content of the current page * @param int $offset The current string position of the page parser * */ static function ReplaceContent(&$content,$offset=0){ global $gp_index; static $includes = 0; //prevent too many inlcusions if( $includes >= 10 ){ return; } $pos = strpos($content,'{{',$offset); if( $pos === false ){ return; } $pos2 = strpos($content,'}}',$pos); if( $pos2 === false ){ return; } $title = substr($content,$pos+2,$pos2-$pos-2); $title = str_replace(' ','_',$title); if( !isset($gp_index[$title]) ){ self::ReplaceContent($content,$pos2); return; } $file = \gp\tool\Files::PageFile($title); $file_sections = \gp\tool\Files::Get($file,'file_sections'); if( !$file_sections ){ self::ReplaceContent($content,$pos2); return; } $includes++; $replacement = ''; foreach($file_sections as $section_num => $section_data){ $replacement .= '
'; //contentEditable="false" $replacement .= self::SectionToContent($section_data,$section_num); $replacement .= '
'; } //is {{...}} wrapped by

..

? $pos3 = strpos($content,'

',$pos2); if( $pos3 > 0 ){ $pieceAfter = substr($content,$pos2,($pos3-$pos2)); if( strpos($pieceAfter,'<') == false ){ $replacement = "

\n".$replacement."\n

"; } } $content = substr_replace($content,$replacement,$pos,$pos2-$pos+2); self::ReplaceContent($content,$pos); } /** * Include the content of a page or gadget as specified in $data * @param array $data * @param string The included content */ static function IncludeContent($data){ global $langmessage, $gp_index; if( isset($data['index']) ){ $requested = \gp\tool::IndexToTitle($data['index']); }else{ $requested = $data['content']; } if( empty($requested) ){ return '

'.$langmessage['File Include'].'

'; } if( self::$title == $requested ){ if( \gp\tool::LoggedIn() ){ msg('Infinite loop detected: '.htmlspecialchars($requested) ); } return; } if( isset($data['include_type']) ){ $type = $data['include_type']; }else{ $type = \gp\tool::SpecialOrAdmin($requested); } switch($type){ case 'gadget': return self::IncludeGadget($requested); case 'special': return self::IncludeSpecial($requested); case 'extra': return self::IncludeExtra($requested); default: return self::IncludePage($requested); } } /** * Include the content of a gadget * @param string $requested The name of the gadget to include * */ static function IncludeGadget($requested){ global $config; if( !isset($config['gadgets'][$requested]) ){ return '{{Gadget Not Found: '.htmlspecialchars($requested).'}}'; } ob_start(); \gp\tool\Output::GetGadget($requested); return ob_get_clean(); } /** * Include the content of a special page * @param string $requested The name of the special page to include * */ static function IncludeSpecial($requested){ global $langmessage; $scriptinfo = \gp\special\Page::GetScriptInfo( $requested, false ); if( $scriptinfo === false ){ return '

'.$langmessage['File Include'].'

'; } return \gp\special\Page::ExecInfo($scriptinfo); } /** * Include the content of an extra content area * @param string $requested The name of the extra content to include * */ static function IncludeExtra($requested){ if( \gp\admin\Content\Extra::AreaExists($requested) === false && \gp\admin\Content\Extra::AreaExists($requested.'.php') === false ){ return '{{Extra Area Not Found: '.htmlspecialchars($requested).'}}'; } ob_start(); \gp\tool\Output::GetExtra($requested); return ob_get_clean(); } /** * Include the content of a normal page * @param string $requested The name of the page to include * */ static function IncludePage($requested){ global $gp_index; $requested = str_replace(' ','_',$requested); if( !isset($gp_index[$requested]) ){ return '{{'.htmlspecialchars($requested).'}}'; } $file = \gp\tool\Files::PageFile($requested); $file_sections = \gp\tool\Files::Get($file,'file_sections'); if( !$file_sections ){ return '{{'.htmlspecialchars($requested).'}}'; } return self::Render($file_sections,self::$title,self::$meta); } /** * Convert array of html attributes into a string for output * */ static function SectionAttributes($attrs,$type){ switch($type){ case 'image': $attrs['src'] = \gp\tool::GetDir($attrs['src']); break; } $attrs += array('class' => '' ); $attrs['class'] = trim('GPAREA filetype-'.$type.' '.$attrs['class']); $attr_string = ''; foreach($attrs as $attr => $value){ $attr_string .= ' '.htmlspecialchars($attr).'="'.htmlspecialchars($value).'"'; } return $attr_string; } } } namespace { class section_content extends \gp\tool\Output\Sections{} }