/** * @return string */ public function getDiffHTMLForODS() { if ($this->zeile_von !== null && $this->zeile_bis !== null) { $str_pre = "<div class='ae_absatz_header'>Im Absatz von Zeile " . $this->zeile_von . " bis " . $this->zeile_bis . "</div>"; } else { $str_pre = ""; } $str = DiffUtils::renderBBCodeDiff2HTML($this->str_bbcode_vorher, $this->str_bbcode_nachher, false, 0, "", false); return $str_pre . "<div>" . $str . "</div>"; }
public function run($args) { foreach ($GLOBALS["TESTS"] as $test) { /** @var Antrag $antrag */ $antrag = Antrag::model()->findByPk($test["antrag_id"]); $diffs = array(); /** @var array|AntragAbsatz[] $pars */ $pars = $antrag->getParagraphs(); $diffs[$test["absatz_nr"]] = DiffUtils::renderBBCodeDiff2HTML($pars[$test["absatz_nr"]]->str_bbcode, $test["text_neu"], false, 0, "", true, true); var_dump($diffs); } }
if (!isset($aes2absaetze[IntVal($ant->id)])) { $aes2absaetze[IntVal($ant->id)] = array(); $aes[IntVal($ant->id)] = $ant; } $aes2absaetze[IntVal($ant->id)][] = IntVal($i); $par = $ant->getDiffParagraphs(); if ($par[$i] != "") { $ae_link = "<a href=\"" . CHtml::encode($this->createUrl("aenderungsantrag/anzeige", array("antrag_id" => $antrag->id, "aenderungsantrag_id" => $ant->id))) . "\" target=\"_blank\">" . CHtml::encode($ant->revision_name) . "</a>"; $antragstellerInnen = $ant->getAntragstellerInnen(); $x = array(); foreach ($antragstellerInnen as $a) { $x[] = $a->name; } $von = implode(", ", $x); echo "<label><input type='radio' name='absatz_typ[{$i}]' value='" . $ant->id . "'> " . $ae_link . " (von " . CHtml::encode($von) . ")</label>"; $full_texts .= "<blockquote class='aenderung ae_" . $ant->id . "'>" . DiffUtils::renderBBCodeDiff2HTML($abs->str_bbcode, $par[$i]) . "</blockquote>"; } } echo "<label><input type='radio' name='absatz_typ[{$i}]' value='neu'> Neuer Text</label><br>"; echo "<blockquote class='original'>" . $abs->str_html_plain . "</blockquote>" . $full_texts; echo "<div><textarea class='neu_text' name='neu_text[{$i}]' id='neu_text_{$i}' style='width: 550px; height: 200px;'>" . CHtml::encode($abs->str_bbcode) . "</textarea></div>"; echo "</div>"; } echo "<h3>Begründung</h3><div class='absatz_selector_holder content absatz_begruendung'>"; /** @var AntragAbsatz $abs */ $full_texts = ""; echo "<label><input type='radio' name='begruendung_typ' value='original' checked> Original beibehalten</label>"; echo "<label><input type='radio' name='begruendung_typ' value='neu'> Neuer Text</label><br>"; echo "<blockquote class='original'>" . HtmlBBcodeUtils::bbcode2html($antrag->begruendung) . "</blockquote>" . $full_texts; echo "<div><textarea class='neu_text' name='neu_begruendung' id='neu_begruendung' style='width: 550px; height: 200px;'>" . CHtml::encode($antrag->begruendung) . "</textarea></div>"; echo "</div>";
/** * @static * @param string $text_alt * @param string $text_neu * @param bool $compact * @param int $css_width_hack * @param string $pre_str_html * @param bool $wrapWithCssClass * @param bool $debug * @return string */ public static function renderBBCodeDiff2HTML($text_alt, $text_neu, $compact = false, $css_width_hack = 0, $pre_str_html = "", $wrapWithCssClass = true, $debug = false) { $text_alt = static::bbNormalizeForDiff($text_alt); $text_neu = static::bbNormalizeForDiff($text_neu); $diff = DiffUtils::getTextDiff($text_alt, $text_neu); if ($compact) { $renderer = new Horde_Text_Diff_Renderer_Inline_Antrag15(); $absatz = $renderer->render($diff); } else { $absatz = DiffUtils::renderAbsatzDiff($diff); } if ($debug) { echo "\n\n============== Nach DIFF ===============\n\n"; var_dump($absatz); } $split_lists = function ($matches) use($debug) { $lis = explode("[*]", $matches["inhalt"]); if (count($lis) == 1) { return $matches[0]; } $output = ""; for ($i = 0; $i < count($lis); $i++) { if ($i == 0) { if (trim($lis[$i]) == "") { $output .= $lis[$i]; } else { $output .= $matches["anfang"] . $lis[$i] . $matches["ende"]; } } elseif ($i == count($lis) - 1) { if (trim($lis[$i]) == "") { $output .= "[*]" . $lis[$i]; } else { $output .= "[*]" . $matches["anfang"] . $lis[$i] . $matches["ende"]; } } else { $output .= "[*]" . $matches["anfang"] . $lis[$i] . $matches["ende"]; } } if ($debug) { echo "-----------------\n"; var_dump($matches); var_dump($lis); var_dump($output); } return $output; }; $absatz = preg_replace_callback("/(?<anfang><del>)(?<inhalt>.*)(?<ende><\\/del>)/siU", $split_lists, $absatz); $absatz = preg_replace_callback("/(?<anfang><ins>)(?<inhalt>.*)(?<ende><\\/ins>)/siU", $split_lists, $absatz); $diffstr = HtmlBBcodeUtils::bbcode2html($absatz); $diffstr = str_ireplace(array("<ins>", "</ins>", "<del>", "</del>"), array("<ins>", "</ins>", "<del>", "</del>"), $diffstr); if ($debug) { echo "\n\n============== In HTML ===============\n\n"; var_dump($diffstr); } static::$ins_mode_active = false; static::$del_mode_active = false; $diffstr = preg_replace_callback("/(<li>)(.*)(<\\/li>)/siuU", function ($matches) { $pos_del_open = mb_stripos($matches[2], "<del>"); $pos_del_close = mb_stripos($matches[2], "</del>"); $pos_ins_open = mb_stripos($matches[2], "<ins>"); $pos_ins_close = mb_stripos($matches[2], "</ins>"); $middle = $matches[2]; if ($pos_del_close !== false && ($pos_del_open === false || $pos_del_open > $pos_del_close)) { $middle = "<del>" . $middle; static::$del_mode_active = false; } if ($pos_del_open !== false && ($pos_del_close === false || $pos_del_open > $pos_del_close)) { $middle .= "</del>"; static::$del_mode_active = true; } if ($pos_del_close === false && $pos_del_open === false && static::$del_mode_active) { $middle = "<del>{$middle}</del>"; } if ($pos_ins_close !== false && ($pos_ins_open === false || $pos_ins_open > $pos_ins_close)) { $middle = "<ins>" . $middle; static::$ins_mode_active = false; } if ($pos_ins_open !== false && ($pos_ins_close === false || $pos_ins_open > $pos_ins_close)) { $middle .= "</ins>"; static::$ins_mode_active = true; } if ($pos_ins_close === false && $pos_ins_open === false && static::$ins_mode_active) { $middle = "<ins>{$middle}</ins>"; } return $matches[1] . $middle . $matches[3]; }, $diffstr); if ($diffstr == "") { $diffstr = HtmlBBcodeUtils::bbcode2html($text_alt); } if ($wrapWithCssClass) { $diffstr = HtmlBBcodeUtils::wrapWithTextClass($pre_str_html . $diffstr, $css_width_hack); } return $diffstr; }
<div style="text-align: center; display: none;" id="antrags_diff_closer"> <a href="#" onClick="$('#antrags_diff_holder').hide(); $('#antrags_diff_opener').show(); $('#antrags_diff_closer').hide(); return false;"><i class="icon-up-open"></i> Antragstext mit Änderungen anzeigen</a> </div> <div id="antrags_diff_holder" class="content" style="display: none;"> <?php $abs_alt = $aenderungsantrag->antrag->getParagraphs(); $abs_neu = json_decode($aenderungsantrag->text_neu); $letztes_leer = false; foreach ($abs_alt as $i => $abs) { if (isset($abs_neu[$i]) && $abs_neu[$i] != "") { $letztes_leer = false; echo "<div class='row-fluid'>"; /** @var AntragAbsatz $abs */ echo DiffUtils::renderBBCodeDiff2HTML($abs->str_bbcode, $abs_neu[$i]); echo "</div>\n"; } else { if (!$letztes_leer) { $letztes_leer = true; echo "<div class='absatz_ueberspringen'>.<br>.<br>.</div>"; } } } ?> </div> </div> <div class="begruendungs_text_holder"> <h3>Begründung</h3>
echo "checked"; } echo "> Ändern<br></label>\n\t\t\t<h4>Neue Fassung</h4>\n\t\t\t<textarea id='neu_text_{$i}' name='neu_text[{$i}]' style='width: 550px; height: 200px;'>"; $str_neu = $text_pre && $text_pre[$i] != "" ? $text_pre[$i] : $abs->str_bbcode; echo CHtml::encode($str_neu) . "</textarea>"; echo "<a href='#' class='ae_verwerfen' style='float: right;'>Unverändert lassen</a>"; echo "<div style='text-align: center;'>"; $this->widget('bootstrap.widgets.TbButton', array('type' => 'success', 'icon' => 'chevron-right white', 'label' => 'Weiter', 'url' => '#begruendungs_holder')); echo "</div></div>\n"; echo "<div class='antragstext_diff antrags_text_holder_keinenummern absatz_text' "; if (!$text_pre || $text_pre[$i] == "") { echo "style='display: none;'"; } echo ">"; if ($text_pre && $text_pre[$i] != "") { echo DiffUtils::renderBBCodeDiff2HTML($abs->str_bbcode, $text_pre[$i]); } else { echo $abs->str_html_plain; } echo "</div>"; echo "</div>"; } ?> </div> <div id="ae_metatext_holder" style="display: none;"> <h3><label for="ae_metatext"><?php echo $sprache->get("Redaktioneller Antrag"); ?> </label></h3>
} $html .= "<br><br>"; } $letztes_leer = true; foreach ($abs_alt as $i => $abs) { if (isset($abs_neu[$i]) && $abs_neu[$i] != "") { if ($letztes_leer) { $letztes_leer = false; preg_match_all("/<span class='zeilennummer'>([0-9]+)<\\/span>/siu", $abs->str_html, $matches); $zeile_von = isset($matches[1][0]) ? IntVal($matches[1][0]) : "????"; $zeile_bis = isset($matches[1]) ? $matches[1][count($matches[1]) - 1] : "???"; $html .= "Im Absatz von Zeile {$zeile_von} - {$zeile_bis}:"; } $html .= "<div class='row-fluid' style=\"line-height: 18px;\">"; /** @var AntragAbsatz $abs */ $str = DiffUtils::renderBBCodeDiff2HTML($abs->str_bbcode, $abs_neu[$i], true); if (function_exists("normalizer_normalize")) { $str = normalizer_normalize($str); } $replaces = array("<ins> " => " <span style=\"color: green; text-decoration: underline; font-weight: bold;\">", "<ins>" => "<span style=\"color: green; text-decoration: underline; font-weight: bold;\">", "</ins>" => "</span>", " </ins>" => "</span> ", "<del>" => "<span style=\"color: red; text-decoration: line-through;\">", "</del>" => "</span>"); $html .= str_replace(array_keys($replaces), array_values($replaces), $str); $html .= "</div>\n"; } } $pdf->writeHTML($html); } else { $linenr = 1; $absae = $aenderungsantrag->getAntragstextParagraphs_flat(); foreach ($absae as $i => $abs) { /** @var AntragAbsatz $abs */ $text = $abs->str_html;
/** * @return int */ public function getFirstDiffLine() { if ($this->aenderung_first_line_cache > -1) { return $this->aenderung_first_line_cache; } $text_vorher = $this->antrag->text; $paragraphs = $this->antrag->getParagraphs(false, false); $text_neu = array(); $diff = $this->getDiffParagraphs(); foreach ($paragraphs as $i => $para) { if (isset($diff[$i]) && $diff[$i] != "") { $text_neu[] = $diff[$i]; } else { $text_neu[] = $para->str_bbcode; } } $diff = DiffUtils::getTextDiffMitZeilennummern(trim($text_vorher), trim(implode("\n\n", $text_neu)), $this->antrag->veranstaltung->getEinstellungen()->zeilenlaenge); $this->aenderung_first_line_cache = DiffUtils::getFistDiffLine($diff, $this->antrag->getFirstLineNo()); $this->save(); return $this->aenderung_first_line_cache; }
/** * @param string $veranstaltungsreihe_id * @param string $veranstaltung_id * @param int $antrag_id * @param int $adoptInitiators */ public function actionNeu($veranstaltungsreihe_id = "", $veranstaltung_id, $antrag_id, $adoptInitiators = 0) { $this->layout = '//layouts/column2'; $this->testeWartungsmodus(); $antrag_id = IntVal($antrag_id); /** @var Antrag $antrag */ $antrag = Antrag::model()->findByPk($antrag_id); $this->loadVeranstaltung($veranstaltungsreihe_id, $veranstaltung_id, $antrag); if (!$antrag->veranstaltung->getPolicyAenderungsantraege()->checkCurUserHeuristically()) { $msg = $antrag->veranstaltung->getPolicyAenderungsantraege()->getPermissionDeniedMsg(); Yii::app()->user->setFlash("error", "Es kann kein Änderungsantrag werden: " . $msg); $this->redirect($this->createUrl("antrag/anzeige", array("antrag_id" => $antrag->id))); } $aenderungsantrag = new Aenderungsantrag(); $aenderungsantrag->aenderung_first_line_cache = -1; $aenderungsantrag->antrag = $antrag; $aenderungsantrag->antrag_id = $antrag->id; $aenderungsantrag->status = Aenderungsantrag::$STATUS_UNBESTAETIGT; $aenderungsantrag->status_string = ""; $unterstuetzerInnen = array(); $changed = false; if (AntiXSS::isTokenSet("antragneu")) { $aenderungsantrag->name_neu = $_REQUEST["Aenderungsantrag"]["name_neu"]; $aenderungsantrag->begruendung_neu = ""; $aenderungsantrag->aenderung_metatext = HtmlBBcodeUtils::html_normalize($_REQUEST["ae_metatext"]); if ($aenderungsantrag->antrag->veranstaltung->getEinstellungen()->begruendung_in_html && isset($_REQUEST["ae_begruendung_html"])) { $aenderungsantrag->aenderung_begruendung_html = 1; $aenderungsantrag->aenderung_begruendung = HtmlBBcodeUtils::html_normalize($_REQUEST["ae_begruendung"]); } else { $aenderungsantrag->aenderung_begruendung_html = 0; $aenderungsantrag->aenderung_begruendung = HtmlBBcodeUtils::bbcode_normalize($_REQUEST["ae_begruendung"]); } if ($aenderungsantrag->name_neu != $antrag->name) { $changed = true; } if (trim($aenderungsantrag->aenderung_metatext) != "") { $changed = true; } $orig_absaetze = $antrag->getParagraphs(); $neue_absaetze = array(); $neuer_text = ""; for ($i = 0; $i < count($orig_absaetze); $i++) { /** @var AntragAbsatz $abs */ $abs = $orig_absaetze[$i]; if (isset($_REQUEST["change_text"][$i])) { $abs_text = HtmlBBcodeUtils::bbcode_normalize($_REQUEST["neu_text"][$i]); $neue_absaetze[$i] = $abs_text; $neuer_text .= $abs_text . "\n\n"; $changed = true; } else { $neue_absaetze[$i] = ""; $neuer_text .= $abs->str_bbcode . "\n\n"; } } if ($changed) { $aenderungsantrag->setDiffParagraphs($neue_absaetze); $diff = DiffUtils::getTextDiffMitZeilennummern($antrag->text, $neuer_text, $antrag->veranstaltung->getEinstellungen()->zeilenlaenge); $diff_text = ""; if ($aenderungsantrag->name_neu != $antrag->name) { $diff_text .= "Neuer Titel des Antrags:\n[QUOTE]" . $aenderungsantrag->name_neu . "[/QUOTE]\n\n"; } if (trim($aenderungsantrag->aenderung_metatext) != "") { $diff_text = $aenderungsantrag->aenderung_metatext . "\n\n"; } $diff_text .= DiffUtils::diff2text($diff, $antrag->getFirstLineNo()); $aenderungsantrag->aenderung_text = $diff_text; $aenderungsantrag->datum_einreichung = new CDbExpression('NOW()'); } else { Yii::app()->user->setFlash("error", "Es wurde nichts am Text geändert."); } if (!$this->veranstaltung->getPolicyAenderungsantraege()->checkAenderungsantragSubmit()) { Yii::app()->user->setFlash("error", "Keine Berechtigung zum Anlegen von Änderungsanträgen."); $changed = false; } } $hiddens = array("antrag_id" => $antrag->id); $js_protection = Yii::app()->user->isGuest; if ($js_protection) { $hiddens["form_token"] = AntiXSS::createToken("antragneu"); } else { $hiddens[AntiXSS::createToken("antragneu")] = "1"; } if ($changed) { if (!$aenderungsantrag->save()) { foreach ($aenderungsantrag->getErrors() as $val) { foreach ($val as $val2) { Yii::app()->user->setFlash("error", "Änderungsantrag konnte nicht angelegt werden: " . $val2); } } $antragstellerIn = Yii::app()->user->isGuest ? null : Person::model()->findByAttributes(array("auth" => Yii::app()->user->id)); if ($antragstellerIn === null) { $antragstellerIn = new Person(); } $this->render('bearbeiten_form', array("mode" => "neu", "antrag" => $antrag, "aenderungsantrag" => $aenderungsantrag, "antragstellerIn" => $antragstellerIn, "unterstuetzerInnen" => $unterstuetzerInnen, "hiddens" => $hiddens, "js_protection" => $js_protection, "sprache" => $aenderungsantrag->antrag->veranstaltung->getSprache())); return; } $this->veranstaltung->getPolicyAenderungsantraege()->submitAntragsstellerInView_Aenderungsantrag($aenderungsantrag); $this->redirect($this->createUrl("aenderungsantrag/neuConfirm", array("antrag_id" => $antrag_id, "aenderungsantrag_id" => $aenderungsantrag->id))); } else { if (Yii::app()->user->isGuest || $this->veranstaltung->isAdminCurUser()) { $antragstellerIn = new Person(); $antragstellerIn->typ = Person::$TYP_PERSON; } else { $antragstellerIn = Person::model()->findByAttributes(array("auth" => Yii::app()->user->id)); } if ($adoptInitiators > 0 && $this->veranstaltung->isAdminCurUser()) { $templateAmendment = $this->veranstaltung->getAmendment($adoptInitiators); if ($templateAmendment) { foreach ($templateAmendment->aenderungsantragUnterstuetzerInnen as $unt) { if ($unt->rolle == AenderungsantragUnterstuetzerInnen::$ROLLE_INITIATORIN) { $antragstellerIn = $unt->person; } if ($unt->rolle == AenderungsantragUnterstuetzerInnen::$ROLLE_UNTERSTUETZERIN) { $unterstuetzerInnen[] = $unt->person; } } } } $aenderungsantrag->name_neu = $antrag->name; $this->render('bearbeiten_form', array("mode" => "neu", "antrag" => $antrag, "aenderungsantrag" => $aenderungsantrag, "antragstellerIn" => $antragstellerIn, "unterstuetzerInnen" => $unterstuetzerInnen, "hiddens" => $hiddens, "js_protection" => $js_protection, "sprache" => $aenderungsantrag->antrag->veranstaltung->getSprache())); } }
?> </div> <?php foreach ($abs->aenderungsantraege as $ant) { $par = $ant->getDiffParagraphs(); if ($par[$i] != "") { ?> <div class="absatz_text diff ae_<?php echo $ant->id; ?> " style="display: none; position: relative; border-right: solid 1px lightgray; margin-left: 0;"> <?php echo DiffUtils::renderBBCodeDiff2HTML($abs->str_bbcode, $par[$i], false, $this->veranstaltung->getEinstellungen()->zeilenlaenge); ?> </div> <?php } } $this->renderPartial("anzeige_kommentare", array("antrag" => $antrag, "absatz_nr" => $abs->absatz_nr, "komm_del_link" => $komm_del_link, "js_protection" => $js_protection, "hiddens" => $hiddens, "kommentar_person" => $kommentar_person, "kommentare" => $abs->kommentare)); ?> </div> <?php } ?> </div> <?php