Example #1
0
 /**
  * internal function to add update markers to wiki texts
  * these markers will later be replaced by render_wiki (see render_wiki.inc.php FormatBlockChangemarks)
  */
 public function getTextfieldWithUpdateNotes($fieldname)
 {
     require_once confGet('DIR_STREBER') . "db/db_itemchange.inc.php";
     require_once confGet('DIR_STREBER') . 'db/db_itemperson.inc.php';
     global $auth;
     ### has user last edited this item? ###
     if ($this->modified_by == $auth->cur_user->id) {
         return $this->{$fieldname};
     } else {
         if ($item_people = ItemPerson::getAll(array('person' => $auth->cur_user->id, 'item' => $this->id))) {
             $ip = $item_people[0];
             if ($ip->viewed_last > $this->modified) {
                 return $this->{$fieldname};
             }
         } else {
             return $this->{$fieldname};
         }
     }
     $new_version = $this->{$fieldname};
     $changes = ItemChange::getItemChanges(array('item' => $this->id, 'field' => $fieldname, 'order_by' => 'modified', 'date_min' => $ip->viewed_last));
     if (!$changes) {
         return $this->{$fieldname};
     }
     $old_version = $changes[0]->value_old;
     require_once confGet('DIR_STREBER') . "std/difference_engine.inc.php";
     $ota = explode("\n", str_replace("\r\n", "\n", $old_version));
     $nta = explode("\n", str_replace("\r\n", "\n", $new_version));
     $diffs = new Diff($ota, $nta);
     $new_lines = array();
     foreach ($diffs as $d) {
         foreach ($d as $do) {
             if ($do->type == 'copy') {
                 $new_lines[] .= join("\n", $do->orig);
             } else {
                 if ($do->type == 'add') {
                     $new_lines[] = "[added word]" . join("\n", $do->closing) . "[/added word]";
                 } else {
                     if ($do->type == 'delete') {
                         $new_lines[] = '[deleted word]' . join("\n", $do->orig) . '[/deleted word]';
                     } else {
                         if ($do->type == 'change') {
                             ### render word level differences
                             $wld = new WordLevelDiff($do->orig, $do->closing);
                             $change_ratio = DbProjectItem::getEditRatioOfWordLevelDiff($wld);
                             if ($change_ratio > 0.1) {
                                 $new_lines[] = "[deleted word]" . join("\n", $do->orig) . "[/deleted word]";
                                 $new_lines[] = "[added word]" . join("\n", $do->closing) . "[/added word]";
                             } else {
                                 $new_lines[] = formatWordLevelDiff($wld);
                             }
                         }
                     }
                 }
             }
         }
     }
     $buffer = join($new_lines, "\n");
     #debugMessage($old_version);
     #debugMessage( htmlspecialchars($buffer));
     return $buffer;
 }