OSDN Git Service

BugTrack/2436 ESLint - Linting utility for JavaScript
[pukiwiki/pukiwiki.git] / lib / link.php
index 0c9b3e2..67ccd9f 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 // PukiWiki - Yet another WikiWikiWeb clone
-// $Id: link.php,v 1.9 2006/01/12 08:49:54 teanan Exp $
-// Copyright (C) 2003-2005 PukiWiki Developers Team
+// $Id: link.php,v 1.20 2011/01/25 15:01:01 henoheno Exp $
+// Copyright (C) 2003-2007 PukiWiki Developers Team
 // License: GPL v2 or (at your option) any later version
 //
 // Backlinks / AutoLinks related functions
@@ -29,7 +29,7 @@
 // ------------------------------------------------------------
 
 
-// ¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤é´ØÏ¢¥Ú¡¼¥¸¤òÆÀ¤ë
+// データベースから関連ページを得る
 function links_get_related_db($page)
 {
        $ref_name = CACHE_DIR . encode($page) . '.ref';
@@ -44,7 +44,7 @@ function links_get_related_db($page)
        return $times;
 }
 
-//¥Ú¡¼¥¸¤Î´ØÏ¢¤ò¹¹¿·¤¹¤ë
+//ページの関連を更新する
 function links_update($page)
 {
        if (PKWK_READONLY) return; // Do nothing
@@ -62,15 +62,15 @@ function links_update($page)
                if (isset($lines[0]))
                        $rel_old = explode("\t", rtrim($lines[0]));
        }
-       $rel_new  = array(); // »²¾ÈÀè
-       $rel_auto = array(); // ¥ª¡¼¥È¥ê¥ó¥¯¤·¤Æ¤¤¤ë»²¾ÈÀè
+       $rel_new  = array(); // 参照先
+       $rel_auto = array(); // オートリンクしている参照先
        $links    = links_get_objects($page, TRUE);
        foreach ($links as $_obj) {
                if (! isset($_obj->type) || $_obj->type != 'pagename' ||
-                   $_obj->name == $page || $_obj->name == '')
+                   $_obj->name === $page || $_obj->name == '')
                        continue;
 
-               if (is_a($_obj, 'Link_autolink')) { // ¹Ôµ·¤¬°­¤¤
+               if (is_a($_obj, 'Link_autolink')) { // 行儀が悪い
                        $rel_auto[] = $_obj->name;
                } else {
                        $rel_new[]  = $_obj->name;
@@ -78,49 +78,48 @@ function links_update($page)
        }
        $rel_new = array_unique($rel_new);
        
-       // autolink¤·¤«¸þ¤¤¤Æ¤¤¤Ê¤¤¥Ú¡¼¥¸
+       // autolinkã\81\97ã\81\8bå\90\91ã\81\84ã\81¦ã\81\84ã\81ªã\81\84ã\83\9aã\83¼ã\82¸
        $rel_auto = array_diff(array_unique($rel_auto), $rel_new);
 
-       // Á´¤Æ¤Î»²¾ÈÀè¥Ú¡¼¥¸
+       // å\85¨ã\81¦ã\81®å\8f\82ç\85§å\85\88ã\83\9aã\83¼ã\82¸
        $rel_new = array_merge($rel_new, $rel_auto);
 
-       // .rel:$page¤¬»²¾È¤·¤Æ¤¤¤ë¥Ú¡¼¥¸¤Î°ìÍ÷
+       // .rel:$pageが参照しているページの一覧
        if ($time) {
-               // ¥Ú¡¼¥¸¤¬Â¸ºß¤·¤Æ¤¤¤ë
+               // ページが存在している
                if (! empty($rel_new)) {
                        $fp = fopen($rel_file, 'w')
-                               or die_message('cannot write ' . htmlspecialchars($rel_file));
+                               or die_message('cannot write ' . htmlsc($rel_file));
                        fputs($fp, join("\t", $rel_new));
                        fclose($fp);
                }
        }
 
-       // .ref:$_page¤ò»²¾È¤·¤Æ¤¤¤ë¥Ú¡¼¥¸¤Î°ìÍ÷
+       // .ref:$_pageを参照しているページの一覧
        links_add($page, array_diff($rel_new, $rel_old), $rel_auto);
        links_delete($page, array_diff($rel_old, $rel_new));
 
-       global $WikiName, $autolink, $nowikiname, $search_non_list;
+       global $WikiName, $autolink, $nowikiname;
 
-       // $page¤¬¿·µ¬ºîÀ®¤µ¤ì¤¿¥Ú¡¼¥¸¤Ç¡¢AutoLink¤ÎÂоݤȤʤêÆÀ¤ë¾ì¹ç
+       // $pageが新規作成されたページで、AutoLinkの対象となり得る場合
        if ($time && ! $rel_file_exist && $autolink
                && (preg_match("/^$WikiName$/", $page) ? $nowikiname : strlen($page) >= $autolink))
        {
-               // $page¤ò»²¾È¤·¤Æ¤¤¤½¤¦¤Ê¥Ú¡¼¥¸¤ò°ìÀƹ¹¿·¤¹¤ë(¤ª¤¤)
-               $search_non_list = 1;
-               $pages           = do_search($page, 'AND', TRUE);
+               // $pageを参照していそうなページを一斉更新する(おい)
+               $pages = links_do_search_page($page);
                foreach ($pages as $_page) {
-                       if ($_page != $page)
+                       if ($_page !== $page)
                                links_update($_page);
                }
        }
        $ref_file = CACHE_DIR . encode($page) . '.ref';
 
-       // $page¤¬ºï½ü¤µ¤ì¤¿¤È¤­¤Ë¡¢
+       // $pageが削除されたときに、
        if (! $time && file_exists($ref_file)) {
                foreach (file($ref_file) as $line) {
                        list($ref_page, $ref_auto) = explode("\t", rtrim($line));
 
-                       // $page¤òAutoLink¤Ç¤·¤«»²¾È¤·¤Æ¤¤¤Ê¤¤¥Ú¡¼¥¸¤ò°ìÀƹ¹¿·¤¹¤ë(¤ª¤¤¤ª¤¤)
+                       // $pageをAutoLinkでしか参照していないページを一斉更新する(おいおい)
                        if ($ref_auto)
                                links_delete($ref_page, array($page));
                }
@@ -142,11 +141,11 @@ function links_init()
        foreach (get_existfiles(CACHE_DIR, '.rel') as $cache)
                unlink($cache);
 
-       $ref   = array(); // »²¾È¸µ
+       $ref   = array(); // 参照元
        foreach (get_existpages() as $page) {
                if ($page == $whatsnew) continue;
 
-               $rel   = array(); // »²¾ÈÀè
+               $rel   = array(); // 参照先
                $links = links_get_objects($page);
                foreach ($links as $_obj) {
                        if (! isset($_obj->type) || $_obj->type != 'pagename' ||
@@ -162,7 +161,7 @@ function links_init()
                $rel = array_unique($rel);
                if (! empty($rel)) {
                        $fp = fopen(CACHE_DIR . encode($page) . '.rel', 'w')
-                               or die_message('cannot write ' . htmlspecialchars(CACHE_DIR . encode($page) . '.rel'));
+                               or die_message('cannot write ' . htmlsc(CACHE_DIR . encode($page) . '.rel'));
                        fputs($fp, join("\t", $rel));
                        fclose($fp);
                }
@@ -170,7 +169,7 @@ function links_init()
 
        foreach ($ref as $page=>$arr) {
                $fp  = fopen(CACHE_DIR . encode($page) . '.ref', 'w')
-                       or die_message('cannot write ' . htmlspecialchars(CACHE_DIR . encode($page) . '.ref'));
+                       or die_message('cannot write ' . htmlsc(CACHE_DIR . encode($page) . '.ref'));
                foreach ($arr as $ref_page=>$ref_auto)
                        fputs($fp, $ref_page . "\t" . $ref_auto . "\n");
                fclose($fp);
@@ -193,13 +192,13 @@ function links_add($page, $add, $rel_auto)
                        foreach (file($ref_file) as $line) {
                                list($ref_page, $ref_auto) = explode("\t", rtrim($line));
                                if (! $ref_auto) $all_auto = FALSE;
-                               if ($ref_page != $page) $ref .= $line;
+                               if ($ref_page !== $page) $ref .= $line;
                        }
                        unlink($ref_file);
                }
                if ($is_page || ! $all_auto) {
                        $fp = fopen($ref_file, 'w')
-                                or die_message('cannot write ' . htmlspecialchars($ref_file));
+                                or die_message('cannot write ' . htmlsc($ref_file));
                        fputs($fp, $ref);
                        fclose($fp);
                }
@@ -220,15 +219,15 @@ function links_delete($page, $del)
                $ref = '';
                foreach (file($ref_file) as $line) {
                        list($ref_page, $ref_auto) = explode("\t", rtrim($line));
-                       if ($ref_page != $page) {
+                       if ($ref_page !== $page) {
                                if (! $ref_auto) $all_auto = FALSE;
                                $ref .= $line;
                        }
                }
                unlink($ref_file);
-               if ($is_page && ! $all_auto && $ref != '') {
+               if (($is_page || ! $all_auto) && $ref != '') {
                        $fp = fopen($ref_file, 'w')
-                               or die_message('cannot write ' . htmlspecialchars($ref_file));
+                               or die_message('cannot write ' . htmlsc($ref_file));
                        fputs($fp, $ref);
                        fclose($fp);
                }
@@ -240,9 +239,39 @@ function & links_get_objects($page, $refresh = FALSE)
        static $obj;
 
        if (! isset($obj) || $refresh)
-               $obj = new InlineConverter(NULL, array('note'));
+               $obj = new InlineConverter(NULL, array('note'));
 
        $result = $obj->get_objects(join('', preg_grep('/^(?!\/\/|\s)./', get_source($page))), $page);
        return $result;
 }
-?>
+
+/**
+ * Search function for AutoLink updating
+ *
+ * @param $word page name
+ * @return list of page name that contains $word
+ */
+function links_do_search_page($word)
+{
+       global $whatsnew;
+
+       $keys = get_search_words(preg_split('/\s+/', $word, -1, PREG_SPLIT_NO_EMPTY));
+       foreach ($keys as $key=>$value)
+               $keys[$key] = '/' . $value . '/S';
+       $pages = get_existpages();
+       $pages = array_flip($pages);
+       unset($pages[$whatsnew]);
+       $count = count($pages);
+       foreach (array_keys($pages) as $page) {
+               $b_match = FALSE;
+               // Search for page contents
+               foreach ($keys as $key) {
+                       $body = get_source($page, TRUE, TRUE, TRUE);
+                       $b_match = preg_match($key, remove_author_header($body));
+                       if (! $b_match) break; // OR
+               }
+               if ($b_match) continue;
+               unset($pages[$page]); // Miss
+       }
+       return array_keys($pages);
+}