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 . ""; } }
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); }