Пример #1
0
 private static function getTracebackData($template_file, $e)
 {
     $loader_debug_info = array();
     $template_does_not_exist = False;
     $template_info = null;
     if ($e instanceof TemplateDoesNotExist) {
         foreach (DjaLoader::$template_source_loaders as $loader) {
             $template_does_not_exist = True;
             $template_list = array();
             $tpl_sources = $loader->getTemplateSources($template_file);
             foreach ($tpl_sources as $t) {
                 $template_list[] = array('name' => $t, 'exists' => file_exists($t));
             }
             $loader_debug_info[] = array('loader' => get_class($loader), 'templates' => $template_list);
         }
     }
     if (isset($e->django_template_source)) {
         list($origin, $pos) = $e->django_template_source;
         list($start, $end) = $pos;
         $template_source = $origin->reload();
         $context_lines = 10;
         $line = 0;
         $upto = 0;
         $source_lines = array();
         $before = $during = $after = '';
         $linebreak_iter = function ($source, &$last_pos) {
             if ($last_pos === null) {
                 $last_pos = 0;
                 return $last_pos;
             } elseif ($last_pos === false) {
                 return -1;
             }
             $p = strpos($source, "\n", $last_pos);
             if ($p === false) {
                 $last_pos = strlen($source) + 1;
                 // TODO check unicode handling
             } else {
                 $last_pos = $p + 1;
             }
             return $p;
         };
         $num = 0;
         $next = null;
         while (($r_ = $linebreak_iter($template_source, $next)) != -1) {
             if ($start >= $upto && $end <= $next) {
                 $line = $num;
                 $before = escape(py_slice($template_source, $upto, $start));
                 $during = escape(py_slice($template_source, $start, $end));
                 $after = escape(py_slice($template_source, $end, $next));
             }
             $source_lines[] = array($num, escape(py_slice($template_source, $upto, $next)));
             $upto = $next;
             if ($r_ === false) {
                 $next = false;
             }
             $num++;
         }
         $total = count($source_lines);
         $top = max(1, $line - $context_lines);
         $bottom = min($total, $line + 1 + $context_lines);
         $template_info = array('message' => $e->getMessage(), 'source_lines' => py_slice($source_lines, $top, $bottom), 'before' => $before, 'during' => $during, 'after' => $after, 'top' => $top, 'bottom' => $bottom, 'total' => $total, 'line' => $line, 'name' => $origin->name);
     }
     return array('exception_type' => get_class($e), 'exception_value' => $e->getMessage(), 'dja_version_info' => Dja::getVersion(), 'template_info' => $template_info, 'template_does_not_exist' => $template_does_not_exist, 'loader_debug_info' => $loader_debug_info);
 }