{$titlelookup}
{$item['content']}
(.*?)\n/', // Blockquotes (> text) '/\n-{3,}/', // Horizontal rules (---) '/\n\*{3,}/', // Horizontal rules (***) '/\n_{3,}/', // Horizontal rules (___) '/\n={3,}/', // Horizontal rules (===) '/\#+(.*?)\n/', // Headings (# text) ]; $replacements = [ '$1', '$1', '$1', '$1', '$1', '$1', '$1', '$1', '$1', '$1', '', '', '', '', '$1' ]; $stripped_text = preg_replace($markdown_patterns, $replacements, $text); return $stripped_text; } function highlight_and_extract($haystack, $needle, $padding = 256, $highlight_tag = 'mark') { // Use preg_quote to escape any special characters in the needle for use in a regular expression $needle = preg_replace('/\PL/u', ' ', trim($needle)); // Split the needle into words $needle_words = preg_split('/[\p{Z}\p{P}]+/u', $needle); // Create a regular expression pattern that matches any of the needle words $pattern_needle = implode('|', array_map(function ($word) { return preg_quote($word, '/'); }, $needle_words)); $pattern_needle = trim($pattern_needle, '|'); // Use preg_match to find the needle and its position in the haystack $found = preg_match('/' . $pattern_needle . '/ium', $haystack, $matches, PREG_OFFSET_CAPTURE); if ($found === false) { return 'Error!'; } if (!$found) { return false; } $needle_pos = $matches[0][1]; $matched_needle = $matches[0][0]; $start_pos = max(0, $needle_pos - $padding); $end_pos = min(mb_strlen($haystack), $needle_pos + mb_strlen($matched_needle) + $padding); $before_needle = mb_substr($haystack, $start_pos, $needle_pos - $start_pos); $after_needle = mb_substr($haystack, $needle_pos + mb_strlen($matched_needle), $end_pos - ($needle_pos + mb_strlen($matched_needle))); // Apply stripMarkdown to the surrounding text $before_needle = stripMarkdown($before_needle); $after_needle = stripMarkdown($after_needle); $highlighted_needle = "<{$highlight_tag}>{$matched_needle}{$highlight_tag}>"; return $before_needle . $highlighted_needle . $after_needle; } function enc_url($text) { $text = str_replace('-', '--', $text); $text = str_replace(' ', '-', $text); $url_encoded_text = urlencode($text); return $url_encoded_text; } function dec_url($url_encoded_text) { $decoded_text = urldecode($url_encoded_text); $decoded_text = preg_replace('/(?render($string1, $string2); } function loadCategory($cat, $conn) { $sql = "SELECT t1.cat as cat,t1.title as title,t1.timestamp as timestamp FROM knowledgebase_content t1 JOIN (SELECT title, MAX(version) AS max_version FROM knowledgebase_content where cat = '$cat' and status = 'public' GROUP BY title) t2 ON t1.title = t2.title and t1.version = t2.max_version WHERE t1.cat = '$cat' and t1.status = 'public' order by t1.title asc,t1.timestamp DESC;"; $result = $conn->query($sql); $catlink = enc_url($cat); $text = "#### [$cat]($catlink)\n"; while ($row = $result->fetch_assoc()) { if (empty($row['cat'])) { $text .= '- [' . $row['title'] . '](' . enc_url($row['title']) . ") (last modified " . $row['timestamp'] . ")\n"; } else { $text .= '- [' . $row['title'] . '](' . enc_url($row['cat']) . '/' . enc_url($row['title']) . ") (last modified " . $row['timestamp'] . ")\n"; } } return $text; } function replaceCategory($matches) { global $conn; return loadCategory($matches[1], $conn); } $link = $_GET['link']; if (isset($_GET['search']) && !empty($_GET['search'])){ $_GET['search'] = htmlspecialchars(strip_tags($_GET['search'])); } $link = filter_var($link, FILTER_SANITIZE_URL); // If the link ends with '/', it's a category. if (substr($link, -1) === '/') { $category = rtrim($link, '/'); $rectitle = ''; } else { $last_slash_pos = strrpos($link, '/'); if ($last_slash_pos !== false) { $category = substr($link, 0, $last_slash_pos); $rectitle = substr($link, $last_slash_pos + 1); } else { // If there's no '/', it's a rectitle with an empty category. $category = ''; $rectitle = $link; } } $cat = isset($category) ? $category : ''; $cat = dec_url($cat); $title = isset($rectitle) ? $rectitle : ''; $title = dec_url($title); if (isset($category) && $title != '') { if (empty($cat)) { $sql = "SELECT cat, title FROM knowledgebase_content WHERE url = ? and status in ('public','hidden') order by version DESC limit 1"; $stmt = $conn->prepare($sql); $stmt->bind_param('s', $rectitle); $stmt->execute(); $result = $stmt->get_result(); $row = $result->fetch_assoc(); $catlink = enc_url($row['cat']); $stmt->close(); if ($catlink !== '') { $url = "/docs/" . $catlink . '/' . enc_url($row['title']); } else { $url = "/docs/" . enc_url($row['title']); } if ($_SERVER['REQUEST_URI'] != $url) { if ($row['title']) { header("Location: " . $url ); exit(); } } } $sql = "SELECT version,timestamp, status FROM knowledgebase_content WHERE cat = ? and title = ? and status in ('public','hidden') order by version DESC"; $stmt = $conn->prepare($sql); $stmt->bind_param('ss', $cat, $title); $stmt->execute(); $result = $stmt->get_result(); $versions = $result->fetch_all(MYSQLI_ASSOC); $stmt->close(); if ($result->num_rows == 0) { $redirect_url = "/docs/" . enc_url($rectitle) . "/"; header("Location: {$redirect_url}"); exit(); } $version = ''; if ($_GET['version'] !== '') { $version = (int)$_GET['version']; $sql = "SELECT * FROM knowledgebase_content WHERE cat = ? and title = ? and status in ('public','hidden') and version = ?"; $stmt = $conn->prepare($sql); $stmt->bind_param('ssi', $cat, $title, $version); } else { $sql = "SELECT * FROM knowledgebase_content WHERE cat = ? and title = ? and status in ('public','hidden') order by version DESC limit 1"; $stmt = $conn->prepare($sql); $stmt->bind_param('ss', $cat, $title); } $stmt->execute(); $result = $stmt->get_result(); $row = $result->fetch_assoc(); if ($row['url'] == '404') { http_response_code(404); } $stmt->close(); $date1 = $row['timestamp']; $parsedown = new Parsedown(); $text = $row['content']; $status = $row['status']; $sqlu = "UPDATE `knowledgebase_content` SET `rating` = `rating` + 1 WHERE `id` = ? and `version` = ?"; $stmtu = $conn->prepare($sqlu); $stmtu->bind_param('ii', $row['id'], $row['version']); $stmtu->execute(); $stmtu->close(); // Check if a previous version was selected if (isset($_GET['version']) && $_GET['version'] !== '') { $version = (int)$_GET['version']; $sql = "SELECT * FROM knowledgebase_content WHERE cat = ? and title = ? and status in ('public','hidden') and version = (select min(version) from knowledgebase_content where version > ?)"; $stmt = $conn->prepare($sql); $stmt->bind_param('ssi', $cat, $title, $version); $stmt->execute(); $result = $stmt->get_result(); $row = $result->fetch_assoc(); $date2 = $row['timestamp']; $stmt->close(); if (!empty($row)) { require "vendor/autoload.php"; $text = get_diff($text, $row['content']); } else { $_GET['version'] = ''; $version = ''; } } $titlelink = enc_url($title); $catlink = enc_url($cat); } if (($cat == '' && $title == '') || ($cat != '' && $title == '')) { if ($cat != '') { $headtitle = "Category $cat - Documentation Vault"; } else { $headtitle = "Documentation Vault"; } if (isset($_GET['search']) && !empty($_GET['search'])) { $search = $_GET['search']; if ($search == '') { header("Location: /docs/"); } $needle = preg_replace('/\PL/u', ' ', trim($search)); $headtitle = "Search $needle - Documentation Vault"; } } if (isset($category) && isset($rectitle) && !empty($rectitle)) { $headtitle = "$title - Documentation Vault"; } require "./header.php"; ?>
{$item['content']}