| public function as_html()␊ |
| {␊ |
| $out = '';␊ |
| foreach ($this->files as $filename=>$file) {␊ |
| foreach ($this->files as $filename => $file) {␊ |
| $pretty = '';␊ |
| $fileinfo = IDF_FileUtil::getMimeType($filename);␊ |
| if (IDF_FileUtil::isSupportedExtension($fileinfo[2])) {␊ |
| $pretty = ' prettyprint';␊ |
| }␊ |
| $out .= "\n".'<table class="diff" summary="">'."\n";␊ |
| $out .= '<tr id="diff-'.md5($filename).'"><th colspan="3">'.Pluf_esc($filename).'</th></tr>'."\n";␊ |
| ␊ |
| $cc = 1;␊ |
| $offsets = array();␊ |
| $contents = array();␊ |
| $maxlinenum = 0;␊ |
| ␊ |
| foreach ($file['chunks'] as $chunk) {␊ |
| foreach ($chunk as $line) {␊ |
| if ($line[0] and $line[1]) {␊ |
| list($left, $right, $content) = $line;␊ |
| if ($left and $right) {␊ |
| $class = 'diff diff-c';␊ |
| } elseif ($line[0]) {␊ |
| } elseif ($left) {␊ |
| $class = 'diff diff-r';␊ |
| } else {␊ |
| $class = 'diff diff-a';␊ |
| }␊ |
| $line_content = Pluf_esc($line[2]);␊ |
| $line_content = preg_replace("/\t/", " ", $line_content);␊ |
| $line_content = self::makeNonPrintableCharsVisible($line_content);␊ |
| $out .= sprintf('<tr class="diff-line"><td class="diff-lc">%s</td><td class="diff-lc">%s</td><td class="%s%s mono">%s</td></tr>'."\n", $line[0], $line[1], $class, $pretty, $line_content);␊ |
| ␊ |
| $offsets[] = sprintf('<td class="diff-lc">%s</td><td class="diff-lc">%s</td>', $left, $right);␊ |
| $content = Pluf_esc($content);␊ |
| $content = self::makeNonPrintableCharsVisible($content);␊ |
| $contents[] = sprintf('<td class="%s%s mono">%s</td>', $class, $pretty, $content);␊ |
| ␊ |
| $maxlinenum = max($maxlinenum, max($left, $right));␊ |
| }␊ |
| if (count($file['chunks']) > $cc) {␊ |
| $offsets[] = '<td class="next">...</td><td class="next">...</td>';␊ |
| $contents[] = '<td class="next"> </td>';␊ |
| }␊ |
| if (count($file['chunks']) > $cc)␊ |
| $out .= '<tr class="diff-next"><td>...</td><td>...</td><td> </td></tr>'."\n";␊ |
| $cc++;␊ |
| }␊ |
| $out .= '</table>';␊ |
| ␊ |
| $inner = '<table class="diff-content">' ."\n".␊ |
| '<tr class="diff-line">' .␊ |
| implode('</tr>'."\n".'<tr class="diff-line">', $contents) .␊ |
| '</tr>' ."\n".␊ |
| '</table>' ."\n";␊ |
| ␊ |
| $rows = count($offsets);␊ |
| $colwidth = (ceil(log10($maxlinenum)) + 1) * 10;␊ |
| $first = array_shift($offsets);␊ |
| ␊ |
| $out .= '<table class="diff" summary="">' ."\n".␊ |
| '<colgroup><col width="'.$colwidth.'" /><col width="'.$colwidth.'" /><col width="*" /></colgroup>' ."\n".␊ |
| '<tr id="diff-'.md5($filename).'">'.␊ |
| '<th colspan="3">'.Pluf_esc($filename).'</th>'.␊ |
| '</tr>' ."\n".␊ |
| '<tr class="line">' .␊ |
| $first . sprintf('<td rowspan="%d"><div class="diff-content">%s</div></td>', $rows, $inner) .␊ |
| '</tr>' ."\n".␊ |
| '<tr class="line">' .␊ |
| implode('</tr>'."\n".'<tr class="line">', $offsets) .␊ |
| '</tr>' ."\n".␊ |
| '</table>' ."\n";␊ |
| }␊ |
| ␊ |
| return Pluf_Template::markSafe($out);␊ |
| }␊ |
| ␊ |
| private static function makeNonPrintableCharsVisible($line)␊ |
| {␊ |
| return preg_replace('/([^[:print:]])/e',␊ |
| return preg_replace('/([^[:print:]\t])/e',␊ |
| '"<span class=\"non-printable\" title=\"0x".strtoupper(bin2hex("\\1"))."\">".bin2hex("\\1")."</span>"',␊ |
| $line);␊ |
| }␊ |