Server IP : 80.87.202.40 / Your IP : 216.73.216.169 Web Server : Apache System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64 User : bitrix ( 600) PHP Version : 8.2.27 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /home/bitrix/ext_www/cvetdv.ru/bitrix/modules/workflow/ |
Upload File : |
<?php CModule::AddAutoloadClasses( 'workflow', [ 'CWorkflow' => 'classes/general/workflow.php', 'CWorkflowStatus' => 'classes/general/status.php', ], ); function GetDefaultProlog($title) { return '<' . "?\n" . "require(\$_SERVER[\"DOCUMENT_ROOT\"].\"/bitrix/modules/main/include/prolog_before.php\");\n" . '$APPLICATION->SetTitle("' . EscapePHPString($title) . "\");\n" . "require(\$_SERVER[\"DOCUMENT_ROOT\"].\"/bitrix/modules/main/include/prolog_after.php\");\n" . '?' . ">\n"; } function GetDefaultEpilog() { return "\n<" . '?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog.php");?' . '>'; } function PathToWF($text, $DOCUMENT_ID) { return preg_replace("'(<img[^>]+?src\\s*=\\s*\")(\\S+)(\"[^>]*>)'i", "\\1/bitrix/admin/workflow_get_file.php?did=" . $DOCUMENT_ID . "&fname=\\2\\3", $text); } function convert_image($img='', $query='', $param='') { if (is_array($img)) { $param = $img[3]; $query = $img[2]; $img = $img[1]; } else { $param = stripslashes($param); $query = stripslashes($query); $img = stripslashes($img); } $params = []; parse_str(htmlspecialcharsback($query), $params); return $img . $params['fname'] . $param; } function WFToPath($text) { return preg_replace_callback("'(<img[^>]+?src\\s*=\\s*[\"\'])/bitrix/admin/workflow_get_file.php\\?([^>]+)([\"\'][^>]*>)'i", 'convert_image', $text); } function SavePreviewContent($abs_path, $strContent) { CheckDirPath($abs_path); $fd = fopen($abs_path, 'wb'); if (is_resource($fd)) { $result = fwrite($fd, $strContent); fclose($fd); chmod($abs_path, BX_FILE_PERMISSIONS); return $result > 0; } else { return false; } } //http://en.wikipedia.org/wiki/Longest_common_subsequence_problem //function LCS(X[1..m], Y[1..n]) function LongestCommonSubsequence($X, $Y) { // m_start := 1 $m_start = 0; // m_end := m $m_end = count($X) - 1; // n_start := 1 $n_start = 0; // n_end := n $n_end = count($Y) - 1; // C = array(m_start-1..m_end, n_start-1..n_end) $C = []; // for($i = $m_start-1; $i <= $m_end; $i++) // { // $C[$i] = array(); // for($j = $n_start-1; $j <= $n_end; $j++) // { // $C[$i][$j] = 0; // } // } // for i := m_start..m_end for ($i = $m_start; $i <= $m_end; $i++) { // for j := n_start..n_end for ($j = $n_start; $j <= $n_end; $j++) { // if X[i] = Y[j] if ($X[$i] == $Y[$j]) { // C[i, j] := C[i-1, j-1] + 1 $C[$i][$j] = $C[$i - 1][$j - 1] + 1; } // else: else { $k = max($C[$i][$j - 1], $C[$i - 1][$j]); // C[i, j] := max(C[i, j-1], C[i-1, j]) if ($k != 0) { $C[$i][$j] = $k; //Clean up to the left if ($C[$i][$j - 1] < $k) { for ($jj = $j - 1;$jj >= $n_start;$jj--) { if (is_array($C[$i]) && array_key_exists($jj, $C[$i])) { unset($C[$i][$jj]); } else { break; } } } } } } //Clean up to the up if ($i > $m_start) { $ii = $i - 1; if (is_array($C[$ii])) { for ($j = $n_end; $j > $n_start && array_key_exists($j, $C[$ii]); $j--) { if ($C[$i][$j] > $C[$ii][$j]) { unset($C[$ii][$j]); } } } } } // return C[m, n] return $C; } //function printDiff(C[0..m, 0..n], X[1..m], Y[1..n], i, j) // if i > 0 and j > 0 and X[i] = Y[j] // printDiff(C, X, Y, i-1, j-1) // print " " + X[i] // else // if j > 0 and (i = 0 or C[i, j-1] >= C[i-1, j]) // printDiff(C, X, Y, i, j-1) // print "+ " + Y[j] // else if i > 0 and (j = 0 or C[i, j-1] < C[i-1, j]) // printDiff(C, X, Y, i-1, j) // print "- " + X[i] function printDiff($C, $X, $Y, $Xt, $Yt, $i, $j) { $a = []; while ($i >= 0 || $j >= 0) { if ( ($i >= 0) && ($j >= 0) && ($Xt[$i] == $Yt[$j]) ) { array_unshift($a, $X[1][$i] . $X[2][$i]); $i--; $j--; } elseif ( ($j >= 0) && ($i <= 0 || ($C[$i][$j - 1] >= $C[$i - 1][$j])) ) { array_unshift($a, $Y[1][$j] . '<b style="color:green">', $Y[2][$j], '</b >'); $j--; } elseif ( ($i >= 0) && ($j <= 0 || ($C[$i][$j - 1] < $C[$i - 1][$j])) ) { array_unshift($a, $X[1][$i] . '<s style="color:red">', $X[2][$i], '</s >'); $i--; } } echo implode('', $a); } function getDiff($X, $Y) { preg_match_all('/(<.*?>\s*|\s+)([^\s<]*)/', ' ' . $X, $Xmatch); preg_match_all('/(<.*?>\s*|\s+)([^\s<]*)/', ' ' . $Y, $Ymatch); //Determine common beginning $sHTMLStart = ''; while ( count($Xmatch[0]) && count($Ymatch[0]) && (trim($Xmatch[2][0]) == trim($Ymatch[2][0])) ) { $sHTMLStart .= $Xmatch[0][0]; array_shift($Xmatch[0]);array_shift($Xmatch[1]);array_shift($Xmatch[2]); array_shift($Ymatch[0]);array_shift($Ymatch[1]);array_shift($Ymatch[2]); } //Find common ending $X_end = count($Xmatch[0]) - 1; $Y_end = count($Ymatch[0]) - 1; $sHTMLEnd = ''; while ( ($X_end >= 0) && ($Y_end >= 0) && (trim($Xmatch[2][$X_end]) == trim($Ymatch[2][$Y_end])) ) { $sHTMLEnd = $Xmatch[0][$X_end] . $sHTMLEnd; unset($Xmatch[0][$X_end]);unset($Xmatch[1][$X_end]);unset($Xmatch[2][$X_end]); unset($Ymatch[0][$Y_end]);unset($Ymatch[1][$Y_end]);unset($Ymatch[2][$Y_end]); $X_end--; $Y_end--; } //What will actually diff $Xmatch_trimmed = []; foreach ($Xmatch[2] as $i => $match) { $Xmatch_trimmed[] = trim($match); } $Ymatch_trimmed = []; foreach ($Ymatch[2] as $i => $match) { $Ymatch_trimmed[] = trim($match); } ob_start(); printDiff( LongestCommonSubsequence($Xmatch_trimmed, $Ymatch_trimmed), $Xmatch, $Ymatch, $Xmatch_trimmed, $Ymatch_trimmed, count($Xmatch_trimmed) - 1, count($Ymatch_trimmed) - 1, ); $sHTML = ob_get_contents(); ob_end_clean(); $sHTML = preg_replace('#</b >(\s*)<b style="color:green">#', '\\1', $sHTML); $sHTML = preg_replace('#<b style="color:green">(\s*)</b >#', '\\1', $sHTML); $sHTML = preg_replace('#</s >(\s*)<s style="color:red">#', '\\1', $sHTML); $sHTML = preg_replace('#<s style="color:red">(\s*)</s >#', '\\1', $sHTML); return $sHTMLStart . $sHTML . $sHTMLEnd; }