Beispiel #1
0
function compile($expr, &$oob)
{
    global $ENVIRONMENT;
    if (is_array($expr)) {
        switch ($expr[0] . "") {
            case "def":
                return compile_def($expr, $oob);
            case "define":
                return compile_def($expr, $oob);
            case "fn":
                return compile_fn($expr, $oob);
            case "λ":
                return compile_fn($expr, $oob);
            case "do":
                return compile_do($expr, $oob);
            case "«":
                compile_php($expr, $oob);
                return null;
            case "function":
                return compile_function($expr, $oob);
            case "macro":
                compile_macro($expr, $oob);
                return null;
            case "if":
                return compile_if($expr, $oob);
            case "quote":
                return var_export($expr[1], true);
            case "env":
                return compile_env($expr, $oob);
            case "inline":
                return compile_inline($expr, $oob);
            case "let":
                return compile_let($expr, $oob);
            case "recur":
                return compile_recur($expr, $oob);
            case "set!":
                return compile_set($expr, $oob);
            case "ref":
                return compile_ref($expr, $oob);
            case "-":
            case "*":
            case "/":
            case "+":
                return compile_math($expr, $oob);
            default:
                return compile_call($expr, $oob);
        }
    } else {
        if (is_symbol($expr)) {
            if ($expr . "" == "true") {
                return "true";
            }
            if ($expr . "" == "false") {
                return "false";
            }
            if ($expr . "" == "nil") {
                return "null";
            }
            $p = count($oob["locals"]) - 1;
            if (is_array($oob["locals"][$p]) && in_array($expr, $oob["locals"][$p])) {
                return compile(array(symbol("env"), $expr), $oob);
            }
            //$expr=mangle($expr);
            return "(" . $ENVIRONMENT . "[\"" . symbol_str($expr) . "\"] ? \$" . mangle(symbol_str($expr)) . " : \$GLOBALS[\"" . mangle(symbol_str($expr)) . "\"])";
        }
        if (is_string($expr)) {
            return "\"" . $expr . "\"";
        }
        if ($expr == 0) {
            return "0";
        }
        if ($expr == null) {
            return "null";
        }
        return $expr . "";
    }
}
Beispiel #2
0
function get_test_result($name, $verbose = false, $moreVerbose = false)
{
    $mergeSpace = IGNORE_INDENT && strpos($name, 'indent.') === false;
    $path = TEMPLATES_DIRECTORY . DIRECTORY_SEPARATOR . $name;
    $expectedHtml = @file_get_contents($path . '.html');
    if ($expectedHtml === false) {
        if ($verbose) {
            echo "! sample for test '{$name}' not found.\n";
        }
        return array(false, array($name, null, "! sample for test '{$name}' not found.\n"));
    }
    if ($verbose) {
        echo "* rendering test '{$name}'\n";
    }
    try {
        $new = get_php_code($path . '.jade');
    } catch (Exception $err) {
        if ($verbose) {
            echo "! FATAL: php exception: " . str_replace("\n", "\n\t", $err) . "\n";
        }
        return array(false, array($name, null, "! FATAL: php exception: " . str_replace("\n", "\n\t", $err) . "\n"));
    }
    if (is_null($new)) {
        return array(false, array($name, null, "! FATAL: " . $path . ".jade returns null\n"));
    }
    $actualHtml = get_generated_html($new);
    $from = array("'", "\r", "<!DOCTYPEhtml>");
    $to = array('"', '', '');
    if ($mergeSpace) {
        array_push($from, "\n", "\t", " ");
        array_push($to, '', '', '');
    }
    $expectedHtml = preg_replace_callback('`class\\s*=\\s*(["\'])([^"\']+)\\1`', 'orderWords', $expectedHtml);
    $actualHtml = preg_replace_callback('`class\\s*=\\s*(["\'])([^"\']+)\\1`', 'orderWords', $actualHtml);
    if ($mergeSpace) {
        $expectedHtml = preg_replace('`(?<=[\'"])\\s(?=>)|(?<=[a-zA-Z0-9:])\\s(?=(>|\\s[a-zA-Z0-9:]))`', '', $expectedHtml);
        $actualHtml = preg_replace('`(?<=[\'"])\\s(?=>)|(?<=[a-zA-Z0-9:])\\s(?=(>|\\s[a-zA-Z0-9:]))`', '', $actualHtml);
    }
    $minifiedExpectedHtml = str_replace($from, $to, trim($expectedHtml));
    $minifiedActualHtml = str_replace($from, $to, trim($actualHtml));
    $result = array($name, $minifiedExpectedHtml, $minifiedActualHtml);
    if (strcmp($minifiedExpectedHtml, $minifiedActualHtml)) {
        if ($verbose) {
            include_once __DIR__ . '/diff.php';
            $actualHtml = preg_replace('`(\\r\\n|\\r|\\n)([\\t ]*(\\r\\n|\\r|\\n))+`', "\n", $actualHtml);
            $expectedHtml = preg_replace('`(\\r\\n|\\r|\\n)([\\t ]*(\\r\\n|\\r|\\n))+`', "\n", $expectedHtml);
            echo Diff::toString(Diff::compare($expectedHtml, $actualHtml)) . "\n";
            /*
            echo "  Expected: $expectedHtml\n";
            echo "  Actual  : $actualHtml\n\n";
            */
        }
        if ($moreVerbose) {
            echo "  PHP     : " . compile_php($name);
        }
        return array(false, $result);
    }
    return array(true, $result);
}