function ewiki_page_wantedpages($id, $data, $action) { #-- collect referenced pages $result = ewiki_db::GETALL(array("refs")); while ($row = $result->get()) { if (EWIKI_PROTECTED_MODE && EWIKI_PROTECTED_MODE_HIDING && !ewiki_auth($row["id"], $uu, "view")) { continue; } $refs .= $row["refs"]; } #-- build array $refs = array_unique(explode("\n", $refs)); #-- strip existing pages from array $refs = ewiki_db::FIND($refs); foreach ($refs as $id => $exists) { if (EWIKI_PROTECTED_MODE && EWIKI_PROTECTED_MODE_HIDING && !ewiki_auth($row["id"], $uu, "view")) { continue; } if (!$exists && !strstr($id, "://") && strlen(trim($id))) { $wanted[] = $id; } } #-- print out $o .= "<ul>\n"; foreach ($wanted as $page) { $o .= " <li>" . ewiki_link($page) . "</li>\n"; } $o .= "<ul>\n"; return $o; }
function ewiki_linking_titlefix(&$title, &$href, &$href2, &$type) { global $ewiki_links; $href_mod = str_replace(" ", " ", $href); $href_mod = str_replace(' ', '_', $href); // Edit 'Nov09: replace spaces with underscores $find = ewiki_db::FIND(array($href_mod)); if ($find[$href_mod]) { $str = '<a href="' . ewiki_script("", rawurlencode($href_mod)) . htmlentities($href2) . '">' . $title . '</a>'; $type = array("wikipage", "title-swapped"); } else { $str = '<span class="NotFound"><a href="' . ewiki_script("", rawurlencode($href_mod)) . htmlentities($href2) . '">' . $title . '</a></span>'; $type = array("wikipage", "title-swapped"); } return $str; }
function ewiki_plural_alternative($id) { #-- make possible plural/singular $id versions $variants = ewiki_plural_variants($id); array_shift($variants); # skip original #-- search in DB $variants = ewiki_db::FIND($variants); foreach ($variants as $new_id => $exists) { if ($new_id && $exists) { return $new_id; } } #-- none found return false; }
function ewiki_imgupload_better_fn(&$fn, &$id, &$meta, &$ext) { $parent = $_REQUEST[EWIKI_UP_PARENTID]; $name = $meta["Content-Location"]; $bad_names = '/^(DSC.?0\\d+|test|bild.?\\d+|pic.?\\d+|image.?\\d+|img.?\\d+)/i'; #-- normalize desired name (discard path/ and old .extension) $name = substr($name, strrpos($name, "/\\")); $name = substr($name, 0, strrpos($name, ".")); $name = preg_replace('/[^-_+.\\w\\d]+/', "_", $name); #-- filter names if (preg_match($bad_names, $name)) { $name = ""; } elseif (strlen($name) < 5) { $name = ""; } #-- check if wish name is free if ($name) { $name = $name . ".{$ext}"; $found = ewiki_db::FIND(array($name)); if ($found[$name]) { $name = ""; // no, is used } } #-- else use page name as base if (!$name && $parent) { for ($n = 1; $n++; $n <= 99) { $name = "{$parent}.{$n}.{$ext}"; $found = ewiki_db::FIND(array($name)); if ($found[$name]) { $name = ""; // name is already occoupied } else { break; // done } } } #-- assign new internal:// name if ($name) { $id = EWIKI_IDF_INTERNAL . $name; } else { // (it else gets a md5md5md5md5-sum as name) } }
function ewiki_initialization_wizard($id, &$data, &$action) { global $ewiki_plugins; #-- proceed only if frontpage missing or explicetely requested if (strtolower($id) == "wikisetupwizard" || $id == EWIKI_PAGE_INDEX && $action == "edit" && empty($data["version"]) && !$_REQUEST["abort"]) { if ($_REQUEST["abort"]) { } elseif (empty($_REQUEST["init"])) { $o = "<h2>WikiSetupWizard</h2>\n"; $o .= "You don't have any pages in your Wiki yet, so we should try to read-in the default ones from <tt>init-pages/</tt> now.<br /><br />"; $o .= '<a href="' . ewiki_script("", $id, array("init" => "now")) . '">[InitializeWikiDatabase]</a>'; $o .= " "; $o .= '<a href="' . ewiki_script("", $id, array("abort" => "this")) . '">[NoThanks]</a>'; $o .= "<br /><br />"; #-- analyze and print settings and misconfigurations $pf_db = $ewiki_plugins["database"][0]; $db = substr("_{$pf_db}", strrpos($pf_db, "_") + 1); $o .= '<table border="0" width="90%" class="diagnosis">'; $o .= '<tr><td>DatabaseBackend</td><td>'; $o .= "<b>" . $db . "</b><br />"; if ($db == "files" || strstr($db, "f2")) { $o .= "<small>_DBFILES_DIR='</small><tt>" . EWIKI_DBFILES_DIRECTORY . "'</tt>"; if (strpos(EWIKI_DBFILES_DIRECTORY, "tmp")) { $o .= "<br /><b>Warning</b>: Storing your pages into a temporary directory is not what you want (there they would get deleted randomly), except for testing purposes of course. See the README."; } } else { $o .= "(looks ok)"; } $o .= "</td></tr>"; $o .= '<tr><td>WikiSoftware</td><td>ewiki ' . EWIKI_VERSION . "</td></tr>"; $o .= "</table>"; #-- more diagnosis if (ini_get("magic_quotes")) { $o .= "<b>Warning</b>: Your PHP interpreter has enabled the ugly and outdated '<i>magic_quotes</i>'. This will lead to problems, so please ask your provider to correct it; or fix it yourself with .htaccess settings as documented in the README. Otherwise don't forget to include() the <tt>fragments/strip_wonderful_slashes.php</tt> (it's ok to proceed for the moment).<br /><br />"; } if (ini_get("register_globals")) { $o .= "<b>Security warning</b>: The horrible '<i>register_globals</i>' setting is enabled. Without always using <tt>fragments/strike_register_globals.php</tt> or letting your provider fix that, you could get into trouble some day.<br /><br />"; } return '<div class="wiki view WikiSetupWizard">' . $o . '</div>'; } else { ewiki_db::INIT(); if ($dh = @opendir($path = EWIKI_INIT_PAGES)) { while ($filename = readdir($dh)) { if (preg_match('/^([' . EWIKI_CHARS_U . ']+[' . EWIKI_CHARS_L . ']+\\w*)+/', $filename)) { $found = ewiki_db::FIND(array($filename)); if (!$found[$filename]) { $content = implode("", file("{$path}/{$filename}")); ewiki_scan_wikiwords($content, $ewiki_links, "_STRIP_EMAIL=1"); $refs = "\n\n" . implode("\n", array_keys($ewiki_links)) . "\n\n"; $save = array("id" => "{$filename}", "version" => "1", "flags" => "1", "content" => $content, "author" => ewiki_author("ewiki_initialize"), "refs" => $refs, "lastmodified" => filemtime("{$path}/{$filename}"), "created" => filectime("{$path}/{$filename}")); ewiki_db::WRITE($save); } } } closedir($dh); ewiki_log("initializing database", 0); } else { return "<b>ewiki error</b>: could not read from directory " . realpath($path) . "<br />\n"; } #-- try to view/ that newly inserted page if ($data = ewiki_db::GET($id)) { $action = "view"; } #-- let ewiki_page() proceed as usual return ""; } } }
<?php /* lists pages which are referenced but not yet written (AKA "DanglingSymlinks") */ #-- title echo ewiki_make_title($id, $id, 2); #-- collect referenced pages $result = ewiki_db::GETALL(array("refs")); while ($row = $result->get()) { if (EWIKI_PROTECTED_MODE && EWIKI_PROTECTED_MODE_HIDING && !ewiki_auth($row["id"], $uu, "view")) { continue; } $refs .= $row["refs"]; } #-- build array $refs = array_unique(explode("\n", $refs)); #-- strip existing pages from array $refs = ewiki_db::FIND($refs); foreach ($refs as $id => $exists) { if (!$exists && !strstr($id, "://") && strlen(trim($id))) { $wanted[] = $id; } } #-- print out echo "<ul>\n"; foreach ($wanted as $page) { echo " <li>" . ewiki_link($page) . "</li>\n"; } echo "<ul>\n";
function ewiki_linkdatabase($id, &$data, $action) { if ($_REQUEST["action"] == "links" && $id == "action=links" && empty($_REQUEST["id"])) { $o = array("editlink" => 0, "empty" => 0, "names" => 1, "unique" => 1, "sort" => 1, "exists" => 2, "url" => 0, "inter" => 0, "search" => ""); $o = array_merge($o, $_REQUEST); #-- first read in all pages $res = ewiki_db::GETALL(array("flags", "version", "refs")); $all = array(); while ($row = $res->get()) { if (($row["version"] & EWIKI_DB_F_TYPE) == EWIKI_DB_F_TEXT) { $refs = trim($row["refs"]); if (!$o["empty"] && empty($refs)) { continue; } $all[$row["id"]] = $refs; } } #-- sort ksort($all); #-- output $out = ""; foreach ($all as $i => $refs) { $refs = explode("\n", $refs); if ($refs) { $refs = ewiki_db::FIND($refs); } foreach ($refs as $ri => $rv) { if ($o["exists"] != 2) { if ($rv != $o["exists"]) { unset($refs[$ri]); } } if ($o["url"] != 1) { if ($o["url"] xor strpos($ri, "://")) { unset($refs[$ri]); } } if ($o["inter"] != 1) { if ($o["inter"] xor strpos($ri, ":") && !strpos($ri, "://")) { unset($refs[$ri]); } } if ($o["search"] && strpos($ri, $o["search"]) === false) { unset($refs[$ri]); } } if (!$o["empty"] && empty($refs)) { continue; } if ($o["sort"]) { asort($refs); } $out .= "<a href=\"" . ewiki_script("", $i) . "\">{$i}</a> "; foreach ($refs as $i => $rv) { $title = $o[names] ? $i : " "; if ($rv) { $out .= " <a href=\"" . ewiki_script("", $i) . "\">{$title}</a>"; } else { $out .= " {$title}"; if ($o["editlink"]) { $out .= "<a href=\"" . ewiki_script("", $i) . "\">?</a>"; } } } $out .= "\n"; } return "\n<pre>\n\n\n\n{$out}</pre>\n"; } elseif ($id == "LinkDatabase") { $url = "url:?"; # $url = "ErfurtWiki:"; return ewiki_format(<<<EOT !!! LinkDatabase The LinkDatabase provides a list of all internal pages together with the links outgoing from each. * [{$url}action=links] list pages and links, using default options * [{$url}action=links&editlink=1] add the "?" link for not existent pages * [{$url}action=links&empty=1] allowes listing of pages without forward links * [{$url}action=links&names=0] no link title, just the <a href="..."> * [{$url}action=links&sort=0] order pages and their links * [{$url}action=links&exists=0] only links to not existing pages * [{$url}action=links&exists=1] only existing page links * [{$url}action=links&url=1] add URLs * [{$url}action=links&url=2] __only__ URLs * [{$url}action=links&inter=1] add ~InterWiki:Links * [{$url}action=links&inter=2] __only__ ~InterWiki:Links * [{$url}action=links&search=google] apply search pattern to page links handy combinations * [{$url}action=links&inter=1&editlink=1&empty=1&url=1&sort=0&names=1] show all links * [{$url}action=links&search=sourceforge&url=2] only URL links to sourceforge * [{$url}action=links&sort=0&exists=0] unsorted missing pages Only [{$url}action=links&unique=0] has not been implemented. EOT ); } }
function renderCalendar($pgname, $more, $year = NULL, $month = NULL) { if (preg_match(CALENDAR_PAGE_TITLE_REGEX, $pgname, $match)) { $pgname = $match[1]; } $month_names = explode(" ", ewiki_t("MONTHS")); $day_names = explode(" ", ewiki_t("DAYABBRVS")); if (!isset($year)) { $year = date("Y"); } if (!isset($month)) { $month = date("n"); } $shift = 0; $today_ts = mktime(0, 0, 0, $month, date("d"), $year); // non relative date $firstday_month_ts = mktime(0, 0, 0, $month, 1, $year); // first day of the month $lastday_month_ts = mktime(0, 0, 0, $month + 1, 0, $year); // last day of the month $numYear = date("Y", $firstday_month_ts); $numMonth = date("m", $firstday_month_ts); $textMonth = $month_names[date("m", $firstday_month_ts) - 1]; $daysInMonth = date("t", $firstday_month_ts); $dayMonth_start = date("w", $firstday_month_ts); if ($dayMonth_start == 0) { $dayMonth_start = 7; } $dayMonth_end = date("w", $lastday_month_ts); if ($dayMonth_end == 0) { $dayMonth_end = 7; } $ret = ""; #-- start table, print month name as title $ret .= '<table class="calendar caltable" cellpadding="2" cellspacing="1">' . "\n"; $ret .= '<tr><th class="head calhead" colspan="7">'; $ret .= ($more ? '<a href="' . ewiki_script(EWIKI_ACTION_CALENDAR, $pgname, 'year=' . $year) . '">' : "") . $textMonth . " " . $numYear . ($more ? "</a>" : ""); $ret .= "</th></tr>\n"; #-- output days $ret .= "<tr>\n"; for ($n = 0; $n < 7; $n++) { $ret .= '<th class="days daynames caldays">' . $day_names[$n] . '</th>'; } $ret .= "</tr>\n"; #-- not-existent days $ret .= "<tr>\n"; for ($k = 1; $k < $dayMonth_start; $k++) { $ret .= "<td> </td>\n"; } #-- pre-scan for calendar day pages $f = array(); for ($i = 1; $i <= $daysInMonth; $i++) { $f[] = $pgname . CALENDAR_NAME_SEP . $numYear . $numMonth . (strlen($i) < 2 ? "0{$i}" : "{$i}"); } $f = ewiki_db::FIND($f); for ($i = 1; $i <= $daysInMonth; $i++) { $day_i_ts = mktime(0, 0, 0, date("n", $firstday_month_ts), $i, date("Y", $firstday_month_ts)); $day_i = date("w", $day_i_ts); if ($day_i == 0) { $day_i = 7; } #-- calendar day page name $page = $pgname . CALENDAR_NAME_SEP . $numYear . $numMonth . (strlen($i) < 2 ? "0{$i}" : "{$i}"); #-- retrieve and check rights if running in protected mode if (EWIKI_PROTECTED_MODE && EWIKI_PROTECTED_MODE_HIDING && $f[$page] && !ewiki_auth($page, $uu, "view", $ring = false, $force = 0)) { unset($f[$page]); } #-- link to calendar day page $link_i = '<a href="' . ewiki_script("", $page) . '"' . ($f[$page] ? ' class="found calpg"><b>' . $i . '</b>' : ' class="hide calhide">' . $i) . "</a>"; #-- day table cell $day_class = $month == date("n") && $today_ts == $day_i_ts ? "today caltoday" : "day calday"; $ret .= '<td class="' . $day_class . '">' . $link_i . "</td>"; #-- close week-row if ($day_i == 7 && $i < $daysInMonth) { $ret .= "</tr><tr>\n"; } else { if ($day_i == 7 && $i == $daysInMonth) { $ret .= "</tr>\n"; } else { if ($i == $daysInMonth) { for ($h = $dayMonth_end; $h < 7; $h++) { $ret .= "<td> </td>\n"; } $ret .= "</tr>\n"; } } } } $ret .= "</table>\n"; return $ret; }