HEX
Server: Apache
System: Linux pdx1-shared-a1-38 6.6.104-grsec-jammy+ #3 SMP Tue Sep 16 00:28:11 UTC 2025 x86_64
User: mmickelson (3396398)
PHP: 8.1.31
Disabled: NONE
Upload Files
File: /home/mmickelson/theflexguy.com/wp-content/themes/vanilla/PHPTAL/Php/Tales.php
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4: */
//  
//  Copyright (c) 2004-2005 Laurent Bedubourg
//  
//  This library is free software; you can redistribute it and/or
//  modify it under the terms of the GNU Lesser General Public
//  License as published by the Free Software Foundation; either
//  version 2.1 of the License, or (at your option) any later version.
//  
//  This library is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
//  Lesser General Public License for more details.
//  
//  You should have received a copy of the GNU Lesser General Public
//  License along with this library; if not, write to the Free Software
//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//  
//  Authors: Laurent Bedubourg <lbedubourg@motion-twin.com>
//  

define('PHPTAL_TALES_DEFAULT_KEYWORD', '_DEFAULT_DEFAULT_DEFAULT_DEFAULT_');
define('PHPTAL_TALES_NOTHING_KEYWORD', '_NOTHING_NOTHING_NOTHING_NOTHING_');


// TALES Specification 1.3
//
//      Expression  ::= [type_prefix ':'] String
//      type_prefix ::= Name
//
// Examples:
//
//      a/b/c
//      path:a/b/c
//      nothing
//      path:nothing
//      python: 1 + 2
//      string:Hello, ${username}
//
//
// Builtin Names in Page Templates (for PHPTAL)
//
//      * nothing - special singleton value used by TAL to represent a 
//        non-value (e.g. void, None, Nil, NULL).
//        
//      * default - special singleton value used by TAL to specify that 
//        existing text should not be replaced.
//
//      * repeat - the repeat variables (see RepeatVariable).
// 

function _phptal_tale_wrap($array, $nothrow)
{
	if (count($array)==1) return '($ctx->noThrow('.($nothrow?'true':'false').')||1?('.
		($array[0]==PHPTAL_TALES_NOTHING_KEYWORD?'NULL':$array[0]).
		'):"")';
	
	$expr = array_shift($array);
	
	return "((\$tmp5=$expr) && (\$ctx->noThrow(false)||1)?\$tmp5:"._phptal_tale_wrap($array, $nothrow).')';
}

/** translates array of alternative expressions into single PHP expression. Identical to phptal_tales() for singular expressions. */
function phptal_tale($expression, $nothrow=false)
{
	$r = phptal_tales($expression,true);
	if (!is_array($r)) return $r;
	
	// this weird ternary operator construct is to execute noThrow inside the expression
	return '($ctx->noThrow(true)||1?'._phptal_tale_wrap($r, $nothrow).':"")';
}

function phptal_tales($expression, $nothrow=false)
{
	$expression = trim($expression);

    // Look for tales modifier (string:, exists:, etc...)
    //if (preg_match('/^([-a-z]+):(.*?)$/', $expression, $m)) {
    if (preg_match('/^([a-z][-.a-z]*[a-z]):(.*?)$/i', $expression, $m)) {
        list(,$typePrefix,$expression) = $m;
    }
    // may be a 'string'
    else if (preg_match('/^\'((?:[^\']|\\\\.)*)\'$/', $expression, $m)) {
        $expression = stripslashes($m[1]);
        $typePrefix = 'string';
    }
    // failback to path:
    else {
        $typePrefix = 'path';
    }
    
    // is a registered TALES expression modifier
    if(PHPTAL_TalesRegistry::getInstance()->isRegistered($typePrefix)) {
    	$callback = PHPTAL_TalesRegistry::getInstance()->getCallback($typePrefix);
		return call_user_func($callback, $expression, $nothrow);
    }

    // class method
    if (strpos($typePrefix, '.')){
        $classCallback = explode('.', $typePrefix, 2);
        $callbackName  = NULL;
        if(!is_callable($classCallback, FALSE, $callbackName)) {
            $err = 'Unknown phptal modifier %s function %s does not exists or is not statically callable.';
            $err = sprintf($err, $typePrefix, $callbackName);
            throw new PHPTAL_Exception($err);
        }
        $ref = new ReflectionClass($classCallback[0]);
        if(!$ref->implementsInterface('PHPTAL_Tales')){
            $err = 'Unable to use phptal modifier %s as the class %s does not implement the PHPTAL_Tales interface.';
            $err = sprintf($err, $typePrefix, $callbackName);
            throw new PHPTAL_Exception($err);
        }
        return call_user_func($classCallback, $expression, $nothrow);
    }

    // check if it is implemented via code-generating function
    $func = 'phptal_tales_'.str_replace('-','_',$typePrefix);
    if (function_exists($func)) {
        return $func($expression, $nothrow);
    }
    
    // check if it is implemented via runtime function
    $runfunc = 'phptal_runtime_tales_'.str_replace('-','_',$typePrefix);
    if (function_exists($runfunc)) {
        return "$runfunc(".phptal_tale($expression, $nothrow).")";
    }
    
    throw new PHPTAL_Exception("Unknown phptal modifier '$typePrefix'. Function '$func' does not exist");
}

// Register internal Tales expression modifiers
require_once PHPTAL_DIR.'PHPTAL/Php/TalesInternal.php';
PHPTAL_TalesInternal::registerInternalTales();
?>