// PukiWiki - Yet another WikiWikiWeb clone.
// func.php
// Copyright
-// 2002-2018 PukiWiki Development Team
+// 2002-2022 PukiWiki Development Team
// 2001-2002 Originally written by yu-ji
// License: GPL v2 or (at your option) any later version
//
/** Absolute URI. */
define('PKWK_URI_ABSOLUTE', 2);
+/** New page name - its length is need to be within the soft limit. */
+define('PKWK_PAGENAME_BYTES_SOFT_LIMIT', 115);
+/** Page name - its length is need to be within the hard limit. */
+define('PKWK_PAGENAME_BYTES_HARD_LIMIT', 125);
+
function pkwk_log($message)
{
$log_filepath = 'log/error.log.php';
return file_exists(get_filename($page));
}
+function is_pagename_bytes_within_soft_limit($page)
+{
+ return strlen($page) <= PKWK_PAGENAME_BYTES_SOFT_LIMIT;
+}
+
+function is_pagename_bytes_within_hard_limit($page)
+{
+ return strlen($page) <= PKWK_PAGENAME_BYTES_SOFT_LIMIT;
+}
+
+function page_exists_in_history($page)
+{
+ if (is_page($page)) {
+ return true;
+ }
+ $diff_file = DIFF_DIR . encode($page) . '.txt';
+ if (file_exists($diff_file)) {
+ return true;
+ }
+ $backup_file = BACKUP_DIR . encode($page) . BACKUP_EXT;
+ if (file_exists($backup_file)) {
+ return true;
+ }
+ return false;
+}
+
function is_editable($page)
{
global $cantedit;
function _pagename_urlencode_callback($matches)
{
- return rawurlencode($matches[0]);
+ return urlencode($matches[0]);
}
function pagename_urlencode($page)
mb_regex_encoding(SOURCE_ENCODING);
$readings = get_readings($pages);
}
-
$list = $matches = array();
-
- // Shrink URI for read
- if ($cmd == 'read') {
- $href = $script . '?';
- } else {
- $href = $script . '?cmd=' . $cmd . '&page=';
- }
-
+ uasort($pages, 'strnatcmp');
foreach($pages as $file=>$page) {
- $r_page = pagename_urlencode($page);
$s_page = htmlsc($page, ENT_QUOTES);
- $str = ' <li><a href="' . $href . $r_page . '">' .
- $s_page . '</a>' . get_passage_html_span($page);
+ // Shrink URI for read
+ if ($cmd == 'read') {
+ $href = get_page_uri($page);
+ } else {
+ $href = $script . '?cmd=' . $cmd . '&page=' . rawurlencode($page);
+ }
+ $str = ' <li><a href="' . $href . '">' .
+ $s_page . '</a> ' . get_pg_passage($page);
if ($withfilename) {
$s_file = htmlsc($file);
$str .= "\n" . ' <ul><li>' . $s_file . '</li></ul>' .
}
$list[$head][$page] = $str;
}
- uksort($pages, 'strnatcmp');
+ uksort($list, 'strnatcmp');
$cnt = 0;
$arr_index = array();
$retval .= '<ul>' . "\n";
- foreach ($list as $head=>$pages) {
+ foreach ($list as $head=>$sub_pages) {
if ($head === $symbol) {
$head = $_msg_symbol;
} else if ($head === $other) {
'"><strong>' . $head . '</strong></a>' . "\n" .
' <ul>' . "\n";
}
- ksort($pages, SORT_STRING);
- $retval .= join("\n", $pages);
+ $retval .= join("\n", $sub_pages);
if ($list_index)
$retval .= "\n </ul>\n </li>\n";
}
exit;
}
+function die_invalid_pagename() {
+ $title = 'Error';
+ $page = 'Error: Invlid page name';
+ $body = <<<EOD
+<h3>Error</h3>
+<strong>Error message: Invalid page name</strong>
+EOD;
+
+ pkwk_common_headers();
+ header('HTTP/1.0 400 Bad request');
+ catbody($title, $page, $body);
+ exit;
+}
+
+
// Have the time (as microtime)
function getmicrotime()
{
}
// Generate AutoLink patterns (thx to hirofummy)
-function get_autolink_pattern(& $pages)
+function get_autolink_pattern($pages, $min_length)
{
- global $WikiName, $autolink, $nowikiname;
+ global $WikiName, $nowikiname;
$config = new Config('AutoLink');
$config->read();
unset($config);
$auto_pages = array_merge($ignorepages, $forceignorepages);
- foreach ($pages as $page)
+ foreach ($pages as $page) {
if (preg_match('/^' . $WikiName . '$/', $page) ?
- $nowikiname : strlen($page) >= $autolink)
+ $nowikiname : strlen($page) >= $min_length) {
$auto_pages[] = $page;
-
+ }
+ }
if (empty($auto_pages)) {
$result = $result_a = '(?!)';
} else {
return array($result, $result_a, $forceignorepages);
}
-function get_autolink_pattern_sub(& $pages, $start, $end, $pos)
+function get_autolink_pattern_sub($pages, $start, $end, $pos)
{
if ($end == 0) return '(?!)';
return $result;
}
+// Get AutoAlias value
+function get_autoalias_right_link($alias_name)
+{
+ $pairs = get_autoaliases();
+ // A string: Seek the pair
+ if (isset($pairs[$alias_name])) {
+ return $pairs[$alias_name];
+ }
+ return '';
+}
+
+// Load setting pairs from AutoAliasName
+function get_autoaliases()
+{
+ global $aliaspage, $autoalias_max_words;
+ static $pairs;
+ $preg_u = get_preg_u();
+
+ if (! isset($pairs)) {
+ $pairs = array();
+ $pattern = <<<EOD
+\[\[ # open bracket
+((?:(?!\]\]).)+)> # (1) alias name
+((?:(?!\]\]).)+) # (2) alias link
+\]\] # close bracket
+EOD;
+ $postdata = join('', get_source($aliaspage));
+ $matches = array();
+ $count = 0;
+ $max = max($autoalias_max_words, 0);
+ if (preg_match_all('/' . $pattern . '/x' . get_preg_u(), $postdata,
+ $matches, PREG_SET_ORDER)) {
+ foreach($matches as $key => $value) {
+ if ($count == $max) break;
+ $name = trim($value[1]);
+ if (! isset($pairs[$name])) {
+ ++$count;
+ $pairs[$name] = trim($value[2]);
+ }
+ unset($matches[$key]);
+ }
+ }
+ }
+ return $pairs;
+}
+
/**
* Get propery URI of this script
*
*/
function get_page_uri($page, $uri_type = PKWK_URI_RELATIVE)
{
- global $defaultpage;
+ global $page_uri_handler, $defaultpage;
if ($page === $defaultpage) {
return get_base_uri($uri_type);
}
- return get_base_uri($uri_type) . '?' . pagename_urlencode($page);
+ return get_base_uri($uri_type) . $page_uri_handler->get_page_uri_virtual_query($page);
}
// Get absolute-URI of this script
function input_filter($param)
{
static $magic_quotes_gpc = NULL;
- if ($magic_quotes_gpc === NULL)
- $magic_quotes_gpc = get_magic_quotes_gpc();
-
+ if ($magic_quotes_gpc === NULL) {
+ if (function_exists('get_magic_quotes_gpc')) {
+ // No 'get_magic_quotes_gpc' function in PHP8
+ $magic_quotes_gpc = get_magic_quotes_gpc();
+ } else {
+ $magic_quotes_gpc = 0;
+ }
+ }
if (is_array($param)) {
return array_map('input_filter', $param);
} else {
foreach ($matches[1] as $str) {
$len = strlen($str);
- if ($len > 1 && $str{0} == '"' && $str{$len - 1} == '"')
+ if ($len > 1 && $str[0] == '"' && $str[$len - 1] == '"')
$str = str_replace('""', '"', substr($str, 1, -1));
$retval[] = $str;
}
// Implode an array with CSV data format (escape double quotes)
function csv_implode($glue, $pieces)
{
- $_glue = ($glue != '') ? '\\' . $glue{0} : '';
+ $_glue = ($glue != '') ? '\\' . $glue[0] : '';
$arr = array();
foreach ($pieces as $str) {
if (preg_match('/[' . '"' . "\n\r" . $_glue . ']/', $str))
}
/**
+ * Get JSON string with htmlspecialchars().
+ */
+function htmlsc_json($obj)
+{
+ // json_encode: PHP 5.2+
+ // JSON_UNESCAPED_UNICODE: PHP 5.4+
+ // JSON_UNESCAPED_SLASHES: PHP 5.4+
+ if (defined('JSON_UNESCAPED_UNICODE')) {
+ return htmlsc(json_encode($obj,
+ JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
+ }
+ return '';
+}
+
+/**
* Get redirect page name on Page Redirect Rules
*
* This function returns exactly false if it doesn't need redirection.
return FALSE;
}
+/**
+ * Return 'u' (PCRE_UTF8) if PHP7+ and UTF-8.
+ */
+function get_preg_u() {
+ static $utf8u; // 'u'(PCRE_UTF8) or ''
+ if (! isset($utf8u)) {
+ if (version_compare('7.0.0', PHP_VERSION, '<=')
+ && defined('PKWK_UTF8_ENABLE')) {
+ $utf8u = 'u';
+ } else {
+ $utf8u = '';
+ }
+ }
+ return $utf8u;
+}
+
+// Default Page name - URI mapping handler
+class PukiWikiStandardPageURIHandler {
+ function filter_raw_query_string($query_string) {
+ return $query_string;
+ }
+
+ function get_page_uri_virtual_query($page) {
+ return '?' . pagename_urlencode($page);
+ }
+
+ function get_page_from_query_string($query_string) {
+ $param1st = preg_replace("#^([^&]*)&.*$#", "$1", $query_string);
+ if ($param1st == '') {
+ return null; // default page
+ }
+ if (strpos($param1st, '=') !== FALSE) {
+ // Found '/?key=value' (Top page with additional query params)
+ return null; // default page
+ }
+ $page = urldecode($param1st);
+ $page2 = input_filter($page);
+ if ($page !== $page2) {
+ return FALSE; // Error page
+ }
+ return $page2;
+ }
+}
+
//// Compat ////
// is_a -- Returns TRUE if the object is of this class or has this class as one of its parents