$line, 'meta' => true, 'cls' =>'meta' ); } $class = 'meta'; $lines = array(0, 0); $first = false; $in_meta = false; while (true) { $class = 'unmod'; if (preg_match("/^@@\s+-(\pN+)(?:,\pN+)?\s+\+(\pN+)(?:,\pN+)?\s*@@/", $line, $M)) { $lines[0] = (int)$M[1] - 1; $lines[1] = (int)$M[2] - 1; $class = 'meta'; $first = true; $in_meta = false; } else if (preg_match("/^diff /", $line)) { $class = 'meta'; $in_meta=true; } elseif (strlen($line)) { if ($line[0] == '-') { $lines[0]++; $class = 'removed'; } elseif ($line[0] == '+') { $lines[1]++; $class = 'added'; } else { $lines[0]++; $lines[1]++; } } else { $lines[0]++; $lines[1]++; } if ($in_meta) { $class = 'meta'; } $cls = $class; if ($first) { $cls .= ' first'; } else if ($class != 'meta' && $first) { $first = false; } $anchor = $abase . '.' . $nlines; $add = (object)array( 'line' => $class == 'meta' ? $line : substr($line, 1), 'meta' => $class == 'meta', 'cls' => $cls, 'anchor' => $class == 'meta' ? $anchor : false ); $add->$class = true; $ret[] = $add; if (!count($input)) { break; } $line = array_shift($input); $nlines++; } if ($nlines == 0) { return null; } return $ret; } }