function ewiki_handler_jump(&$id, &$data, &$action) { global $ewiki_config; static $redirect_count = 5; $jump_markup = array("jump", "goto", "redirect", "location"); #-- we only care about "view" action if ($action != "view") { return; } #-- escape from loop if (isset($_REQUEST[EWIKI_UP_REDIRECT_COUNT])) { $redirect_count = $_REQUEST[EWIKI_UP_REDIRECT_COUNT]; } if ($redirect_count-- <= 0) { return ewiki_t("REDIRECTION_LOOP", array("id" => $id)); } #-- search for [jump:...] if ($links = explode("\n", trim($data["refs"]))) { foreach ($links as $link) { if (strlen($link) && strpos($link, ":") && in_array(strtolower(strtok($link, ":")), $jump_markup) && ($dest = trim(strtok("\n")))) { #-- URL $url = ""; if (strpos($dest, "://")) { $url = $dest; } else { $url = ewiki_interwiki($dest, $uu, $uu2); } #-- Location: if (EWIKI_JUMP_HTTP && EWIKI_HTTP_HEADERS && !headers_sent()) { #-- simple PageLink if (empty($url)) { $url = ewiki_script("", $dest, array(EWIKI_UP_REDIRECT_COUNT => $redirect_count), 0, 0, ewiki_script_url()); $url .= defined("SID") ? EWIKI_ADDPARAMDELIM . SID : ""; } header("Location: {$url}"); die; } elseif ($url) { return ""; # the rendering kernel will just show up the [jump:]! # (without the jump: of course) } else { #-- we'll just restart ewiki $data = array(); $id = $dest; return ewiki_page("view/" . $id); } } } } #-search }
function ewiki_add_action_link_for_translation($id, &$data, $action) { global $language_comb, $language_service, $language_names, $ewiki_t, $ewiki_config; $o = ""; $url = ""; if ($data["version"]) { $lang_src = ewiki_guess_lang($data["content"]); #-- check if page is already in desired language if ($ewiki_t["languages"][0] == $lang_src) { } else { foreach ($ewiki_t["languages"] as $lang_dest) { $url = ""; $comb = "{$lang_src}|{$lang_dest}"; foreach ($language_service as $SERVICE => $params) { if (in_array($comb, $language_comb[$SERVICE]) || $SERVICE == "intertran") { if ($SERVICE == "babelfish") { $lp = "&" . $params[1] . "=" . strtr($comb, "|", "_"); } elseif ($SERVICE == "google") { $lp = "&" . $params[1] . "=" . $comb; } else { $from = $language_names[strtok($comb, "|")]; $to = $language_names[strtok("|")]; if (!$from || !$to) { continue; } $lp = "&" . $params[1][0] . "=" . $from . "&" . $params[1][1] . "=" . $to; } $url = $params[0] . $lp . "&" . $params[2] . "=" . urlencode(ewiki_script($action, $id, "", 0, 0, ewiki_script_url())); break; } } #-- add translation link to page if ($url) { $ewiki_config["action_links"]["view"][$url] = "TranslateInto" . $ewiki_t["C"][$lang_dest]; /*--- $o = "<br /><a class=\"tool-button\" href=\"" . $url . "\">" . "TranslateInto" . $ewiki_t["C"][$lang_dest] . "</a>\n"; ---*/ break; } } } } /*--- return($o); ---*/ }
function ewiki_action_infoqdiff_plain($id, $data, $prev, $ver) { $CLK = "%c"; #-- get if ($d = ewiki_db::GET($id, $ver - 1)) { $curr = $prev; $prev = $d; $d = NULL; } else { continue; } #-- info header $o .= '<p>'; $o .= 'Version: <b><a href="' . ewiki_script_url("", $id, "version={$ver}") . "\">version {$ver}</a></b> / " . 'Author: <b>' . ewiki_author_html($curr["author"]) . "</b> / " . 'Time: <b>' . strftime($CLK, $curr["lastmodified"]) . "</b>"; $o .= '</p>'; #-- diff part $diff = ewiki_stupid_diff($curr["content"], $prev["content"], $show_unchanged = 0, $magic_notes = 1); $o .= '<p>' . $diff . '</p>'; return $o; }
function ewiki_page_edit($id, $data, $action) { global $ewiki_links, $ewiki_author, $ewiki_plugins, $ewiki_ring, $ewiki_errmsg; $content = optional_param('content', ''); $version = optional_param('version', ''); $preview = optional_param('preview', false); $save = optional_param('save', false); $hidden_postdata = array(); #-- previous version come back if (@$data["forced_version"]) { $current = ewiki_database("GET", array("id" => $id)); $data["version"] = $current["version"]; unset($current); /// Is this done for somewhere else? $_REQUEST['content'] = $_POST['content'] = $_GET['content'] = null; $_REQUEST['version'] = $_POST['version'] = $_GET['version'] = null; $content = ''; $version = ''; } #-- edit hacks if ($pf_a = @$ewiki_plugins["edit_hook"]) { foreach ($pf_a as $pf) { if ($output = $pf($id, $data, $hidden_postdata)) { return $output; } } } #-- permission checks if (isset($ewiki_ring)) { $ring = $ewiki_ring; } else { $ring = 3; } $flags = @$data["flags"]; if (!($flags & EWIKI_DB_F_WRITEABLE)) { #-- perform auth $edit_ring = EWIKI_PROTECTED_MODE >= 2 ? 2 : NULL; if (EWIKI_PROTECTED_MODE && !ewiki_auth($id, $data, $action, $edit_ring, "FORCE")) { return $ewiki_errmsg; } #-- flag checking if ($flags & EWIKI_DB_F_READONLY and $ring >= 2) { return ewiki_t("CANNOTCHANGEPAGE"); } if ($flags and ($flags & EWIKI_DB_F_TYPE) != EWIKI_DB_F_TEXT and $ring >= 1) { return ewiki_t("CANNOTCHANGEPAGE"); } } #-- "Edit Me" $o = ewiki_make_title($id, ewiki_t("EDITTHISPAGE") . " '{$id}'", 2, $action, "", "_MAY_SPLIT=1"); #-- preview if ($preview) { $o .= $ewiki_plugins["edit_preview"][0]($data); } #-- save if ($save) { #-- normalize to UNIX newlines $content = str_replace("\r\n", "\n", $content); $content = str_replace("\r", "\n", $content); #-- check for concurrent version saving $error = 0; if (@$data["version"] >= 1 && $data["version"] != $version || $version < 1) { $pf = $ewiki_plugins["edit_patch"][0]; if (!$pf || !$pf($id, $data)) { $error = 1; $o .= ewiki_t("ERRVERSIONSAVE") . "<br /><br />"; } } if (!$error) { #-- new pages` flags if (!($set_flags = @$data["flags"] & EWIKI_DB_F_COPYMASK)) { $set_flags = 1; } if (EWIKI_ALLOW_HTML) { $set_flags |= EWIKI_DB_F_HTML; } #-- mk db entry $save = array("id" => $id, "version" => @$data["version"] + 1, "flags" => $set_flags, "content" => $content, "created" => ($uu = @$data["created"]) ? $uu : time(), "meta" => ($uu = @$data["meta"]) ? $uu : "", "hits" => ($uu = @$data["hits"]) ? $uu : "0"); ewiki_data_update($save); #-- edit storage hooks if ($pf_a = @$ewiki_plugins["edit_save"]) { foreach ($pf_a as $pf) { $pf($save, $data); } } #-- save if (!$save || !ewiki_database("WRITE", $save)) { $o .= $ewiki_errmsg ? $ewiki_errmsg : ewiki_t("ERRORSAVING"); } else { #-- prevent double saving, when ewiki_page() is re-called $_REQUEST = $_GET = $_POST = array(); $o = ewiki_t("THANKSFORCONTRIBUTION") . "<br /><br />"; $o .= ewiki_page($id); if (EWIKI_EDIT_REDIRECT) { $url = ewiki_script("", $id, "thankyou=1", 0, 0, EWIKI_HTTP_HEADERS ? ewiki_script_url() : 0); if (EWIKI_HTTP_HEADERS && !headers_sent()) { header("Status: 303 Redirect for GET"); header("Location: {$url}"); #header("URI: $url"); #header("Refresh: 0; URL=$url"); } else { $o .= '<meta http-equiv="Refresh" content="0; URL=' . s($url) . '">'; } } } } //@REWORK // header("Reload-Location: " . ewiki_script("", $id, "", 0, 0, ewiki_script_url()) ); } else { #-- Edit <form> $o .= ewiki_page_edit_form($id, $data, $hidden_postdata); #-- additional forms if ($pf_a = $ewiki_plugins["edit_form_final"]) { foreach ($pf_a as $pf) { $pf($o, $id, $data, $action); } } } return $o; }
<meta name="wiki.base" content="<?php echo ewiki_script_url(); ?> " /> <meta name="wiki.moniker" content="<?php echo EWIKI_NAME; ?> " /> <?php /* adds a few html <head> meta tags, if appropriate: - NOINDEX for old revisions */ if (isset($_REQUEST["version"]) or $ewiki_data["lastmodified"] + 12 * 60 * 60 > time()) { echo '<meta name="ROBOTS" content="NOINDEX,NOFOLLOW,NOCOUNT,NOARCHIVE" />' . "\n"; } elseif (isset($ewiki_id) && empty($ewiki_data["version"])) { echo '<meta name="ROBOTS" content="NOINDEX,NOARCHIVE" />' . "\n"; }
function ewiki_opensearch_api($query, $params) { #-- database connection // should already be established #-- check request params $params = (array) $params + array("n_hit" => 1000, "m_title" => 3.0, "q_pos" => 2.0, "q_not" => 0.0, "limit" => 5000); $n_hit = $params["n_hit"]; $q_pos = $params["q_pos"]; $q_not = $params["q_not"]; $calc = array(); #-- search target field mapped to internal SQL row names $fieldnames = array("title" => "title", "text" => "text", "" => "content", "author" => "author", "links" => "links", "meta" => "meta", "filename" => "title"); #-- sort request terms into MUST and NOT ------------------------ SQL --- $sql = array("MUST" => array(), "NOT" => array()); foreach ($query as $i => $qterm) { list($pattern, $dep, $field, $flags) = $qterm; $f_regex = strpos($flags, "REGEX") !== false; $f_nocase = strpos($flags, "NOCASE") !== false; $m_field = isset($params["m_{$field}"]) ? $params["m_{$field}"] : 0; if ($field = $fieldnames[$field]) { $pattern = mysql_escape_string($pattern); if ($f_regex) { $s = "{$field} REGEXP '{$pattern}'"; } elseif ($f_nocase) { $pattern = strtolower($pattern); $s = "LOCATE('{$pattern}', LCASE({$field})) > 0"; } else { $s = "LOCATE('{$pattern}', {$field}) > 0"; } #-- add $sql[$dep][] = "({$s})"; } $calc[] = array($pattern, $dep, $field, $f_regex, $f_nocase, $m_field); } if ($q_not) { $sql_MUST = implode(" OR ", $sql["MUST"]); $sql_NOT = ""; } else { $sql_MUST = implode(" AND ", $sql["MUST"]); $sql_NOT = implode(" OR ", $sql["NOT"]); if ($sql_NOT) { $sql_NOT = " AND NOT ({$sql_NOT})"; } } #-- last validity checks if (!$sql_MUST) { // no way to send an error with ED xmlrpclib ? return "551: at least one MUST search term must be given"; } #-- get hit list $sql_DB_F_TEXT = "((flags & 1) > 0) AND"; $sql_query_result = mysql_query($sql = "\n SELECT\n pagename AS id, version AS version,\n pagename AS title,\n content AS text,\n CONCAT(pagename, content) AS content,\n meta,\n author,\n refs AS links,\n lastmodified,\n created,\n flags\n FROM\n ewiki\n WHERE\n {$sql_DB_F_TEXT}\n {$sql_MUST}\n {$sql_NOT}\n GROUP BY id ORDER BY version\n "); #-- start hit score calculation ---------------------------------- CALC --- $result_list = array(); $ordered_list = array(); if ($sql_query_result) { while ($row = mysql_fetch_array($sql_query_result)) { $score = 0.0; // final score $m_fin = 1.0; // to eventually decrease it later #-- score each search term for hit foreach ($calc as $qterm) { list($pattern, $dep, $field, $f_regex, $f_nocase, $m_field) = $qterm; #-- minscore $add = $n_hit; if ($m_field) { $add *= $m_field; } #-- regex hit if ($f_regex) { $ok = preg_match($pattern, $row["field"]); if ($dep == "MUST") { $score += $add * ($ok ? 1.0 : $q_not); } elseif ($dep == "NOT") { if ($ok) { $m_fin *= $q_not; } } } else { $text = $f_nocase ? strtolower($row[$field]) : $row[$field]; $len = strlen($text) + 1; #-- add points for each hit, weighted by match position if ($dep == "MUST") { $p = -1; while (false !== ($p = strpos($text, $pattern, $p + 1))) { $score += $add * ($q_pos - ($q_pos - 1) * ($p / $len)); } } elseif (strpos($text, $pattern) !== false) { $m_fin *= $q_not; } } } #-- add to list if ($score *= $m_fin) { $result_list[] = array("title" => $row["title"], "url" => ewiki_script_url("", $row["title"]), "excerpt" => substr(strtr($row["text"], "\r\n\t\f", " "), 0, 300), "score" => $score, "lastmodified" => $row["lastmodified"]); $ordered_list[] = $score; } } } #-- sort result? arsort($ordered_list); foreach ($ordered_list as $i => $uu) { $ordered_list[$i] = $result_list[$i]; unset($result_list[$i]); } $result_list =& $ordered_list; #-- done return $ordered_list; }
function ewiki_feed_rss1($info, $pages) { header('Content-Type: application/rss+xml; revision="1.0"'); $name = $info["title"]; $urnpfix = "x-wiki"; // uniform resource name prefix ("urn:x-wiki" was ok) #-- parts $_logo = $info["logo"] ? "<image rdf:resource=\"{$urnpfix}:{$name}:logo#1\" />\n" : ""; echo <<<EOT <?xml version="1.0" encoding="{$info['charset']}"?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:RSS="http://purl.org/rss/1.0/" xmlns:wiki="http://purl.org/rss/1.0/modules/wiki/"> <RSS:channel rdf:about="{$info['url']}"> <RSS:title>{$name}</RSS:title> <dc:title>{$name}</dc:title> <RSS:link>{$info['rc_url']}</RSS:link> <RSS:description>UpdatedPages on {$name}</RSS:description> <wiki:interwiki>{$name}</wiki:interwiki> {$_logo} <RSS:items> <rdf:Seq> EOT; #-- output Seq ids foreach ($pages as $i => $data) { $pages[$i]["rdf_id"] = "{$urnpfix}:{$name}:" . ewiki_xmlentities(urlencode($data["id"])) . "#{$data['version']}_{$data['lastmodified']}"; echo ' <rdf:li rdf:resource="' . $pages[$i]["rdf_id"] . '"/>' . "\n"; } //<? echo <<<EOT </rdf:Seq> </RSS:items> </RSS:channel> <!-- RDF associated data for references from above --> EOT; #-- logo if ($_logo) { echo <<<EOT <RSS:image rdf:about="{$urnpfix}:{$name}:logo#1"> <RSS:title>{$name}</RSS:title> <RSS:link>{$url}</RSS:link> <RSS:url>{$info['logo']}</RSS:url> </RSS:image> EOT; } //<? #-- write items foreach ($pages as $i => $data) { preg_match('/^([^\\s]+).+\\(.*([\\d.]+)\\)/', $data["author"], $uu); $author_host = $uu[2]; $author_name = $uu[1]; $url_diff = ewiki_script_url("diff", $data["id"]); $url_info = ewiki_script_url("info", $data["id"]); $stat = $data["version"] == 1 ? "created" : "updated"; echo <<<EOT <RSS:item rdf:about="{$data['rdf_id']}"> <RSS:title>{$data['title']}</RSS:title> <dc:title>{$data['title']}</dc:title> <RSS:description>{$data['content']}</RSS:description> <RSS:link>{$data['url']}</RSS:link> <wiki:diff>{$url_diff}</wiki:diff> <wiki:history>{$url_info}</wiki:history> <wiki:version>{$data['version']}</wiki:version> <wiki:status>{$stat}</wiki:status> <dc:date>{$data['idate']}</dc:date> <dc:contributor> <rdf:Description wiki:host="{$author_host}"> <rdf:value>{$author_name}</rdf:value> </rdf:Description> </dc:contributor> </RSS:item> EOT; } //<? echo "</rdf:RDF>\n"; die; }
function ewiki_pingback_start() { global $ewiki_plugins, $ewiki_config, $ewiki_id; $source_url = ewiki_script_url("", $ewiki_id); foreach ($ewiki_config["pingback"] as $target_url) { ewiki_pingback_ping($source_url, $target_url); } }
$m_flags .= " MINOR EDIT"; } if ($row["flags"] & EWIKI_DB_F_APPENDONLY) { $m_flags .= " (append-only)"; } if ($row["flags"] & EWIKI_DB_F_HIDDEN) { $m_flags .= " (hidden page)"; } $datestr = strftime("%Y-%m-%d, %a", $lm); if ($lastdatestr != $datestr) { $lastdatestr = $datestr; $mail .= "\n{$datestr}\n"; } $mail .= "· {$id} - [{$m_ver}]{$m_flags} {$m_time} . . .{$m_log} by {$m_author} / {$m_ua}\n"; #-- check previous version of this page if ($ver-- && ($row = ewiki_db::GET($id, $ver))) { if ($row["lastmodified"] >= $min_time) { $vers[$id] = $row["version"]; $rc[$id] = $row["lastmodified"]; arsort($rc); } } } while ($rc); #-- send it echo "{$mail}"; $subj = RECENTNOTIFY . " on " . EWIKI_NAME; $to = implode(", ", $subscribers); $mail = "This is the full list of latest changes on " . EWIKI_NAME . ".\n" . ewiki_script_url("", EWIKI_PAGE_INDEX) . "\n" . "Unsubscribe yourself on " . ewiki_script_url("edit", RECENTNOTIFY) . "\n" . "\n" . $mail . "\n\n-- \nThere is no Web like WikiWikiWeb.\n"; mail($to, $subj, $mail); } }