[P2-php-svn] [769] - タイトルが似ているスレッドを検索する際の正規化にintlエクステンションが

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2010年 1月 10日 (日) 20:34:07 JST


Revision: 769
          http://sourceforge.jp/projects/p2-php/svn/view?view=rev&revision=769
Author:   rsk
Date:     2010-01-10 20:34:07 +0900 (Sun, 10 Jan 2010)

Log Message:
-----------
- タイトルが似ているスレッドを検索する際の正規化にintlエクステンションが
  利用できる場合は Normalizer::normalize() を使うようにした。
- PC用ビューでスレッド一覧の行に以下のCSSクラスを付加するようにした。
  r_odd: 奇数行、r1と同じ
  r_even: 偶数行、r2と同じ
  r_read: 既読スレッド
  r_offline: subject.txt に無いスレッド
  r_new: 新着レスのあるスレッド
  r_brand_new: 新着スレッド

Modified Paths:
--------------
    p2ex/trunk/lib/p2util.inc.php
    p2ex/trunk/lib/sb_print.inc.php


-------------- next part --------------
Modified: p2ex/trunk/lib/p2util.inc.php
===================================================================
--- p2ex/trunk/lib/p2util.inc.php	2010-01-10 06:52:28 UTC (rev 768)
+++ p2ex/trunk/lib/p2util.inc.php	2010-01-10 11:34:07 UTC (rev 769)
@@ -6,14 +6,15 @@
 // {{{ CONSTANTS
 
 /**
- * ®”‚̍ŏ¬’l
+ * ®”‚̍őå’l‚ƍŏ¬’l
  */
+define('P2_INT_MAX', PHP_INT_MAX);
 define('P2_INT_MIN', - PHP_INT_MAX - 1);
 
 /**
  * Š¿Žš‚Ƀ}ƒbƒ`‚·‚鐳‹K•\Œ»
  */
-//define('P2_REGEX_KANJI', mb_convert_encoding('/[ˆê-êž]/u', 'UTF-8', 'CP932'));
+//define('P2_REGEX_KANJI', mb_convert_encoding('/[ˆê-êž]/u', 'UTF-8', 'SJIS-win'));
 define('P2_REGEX_KANJI', '/[\\x{4e00}-\\x{9fa0}]/u');
 
 /**
@@ -30,7 +31,7 @@
     //'[a-z][a-z_\\-]*',
     //'[0-9][0-9.]*',
     '[0-9a-z][0-9a-z_\\-]*',
-)) . ')/u', 'UTF-8', 'CP932'));
+)) . ')/u', 'UTF-8', 'SJIS-win'));
 */
 define('P2_REGEX_WAKATI', '/(
 #[\\x{4e00}-\\x{9fa0}]+[\\x{3041}-\\x{3093}]*|
@@ -54,7 +55,7 @@
         mb_convert_encoding(
             '/([‚¤‚©-‚±‚³-‚»‚½-‚Æ‚Í-‚ÙƒEƒJ-ƒRƒT-ƒ\ƒ^-ƒgƒn-ƒzTR])%u3099%|([‚Í-‚Ùƒn-ƒz])%u309A%/u',
             'UTF-8',
-            'CP932'
+            'SJIS-win'
         )
     )
 );
@@ -68,11 +69,13 @@
 * htmlspecialchars($value, ENT_QUOTES) ‚̃Vƒ‡[ƒgƒJƒbƒg
 *
 * @param    string $str
+* @param    string $charset
+* @param    bool   $double_encode
 * @return   string
 */
-function p2h($str)
+function p2h($str, $charset = 'Shift_JIS', $double_encode = true)
 {
-    return htmlspecialchars($str, ENT_QUOTES);
+    return htmlspecialchars($str, ENT_QUOTES, $charset, $double_encode);
 }
 
 // }}}
@@ -261,7 +264,7 @@
     $kb = $usage / 1024;
     $kb = number_format($kb, 2, '.', '');
 
-    echo 'Memory Usage: ' . $kb . 'KB';
+    echo 'Memory Usage: ' . $kb . 'KiB';
 }
 
 // }}}
@@ -288,7 +291,7 @@
 // {{{ p2_si2int()
 
 /**
- * SI’PˆÊŒn‚Ì’l‚𐮐”‚É•ÏŠ·‚·‚é
+ * SIÚ“ªŽ«‚‚«‚̐”’l‚𐮐”‚É•ÏŠ·‚·‚é
  *
  * @param   numeric $num
  * @param   string  $kmg
@@ -313,7 +316,7 @@
 // {{{ p2_si2real()
 
 /**
- * SI’PˆÊŒn‚Ì’l‚ðŽÀ”‚É•ÏŠ·‚·‚é
+ * SIÚ“ªŽ«‚‚«‚̐”’l‚ðŽÀ”‚É•ÏŠ·‚·‚é
  * Œµ–§‚É‚Í1000”{‚·‚é‚Ì‚ª³‚µ‚¢‚ªA‚ ‚¦‚Ä1024”{‚·‚é
  *
  * @param   numeric $num
@@ -341,7 +344,7 @@
  * @param   string $encoding
  * @return  string
  */
-function p2_mb_basename($path, $encoding = 'CP932')
+function p2_mb_basename($path, $encoding = 'SJIS-win')
 {
     if (DIRECTORY_SEPARATOR != '/') {
         $path = str_replace(DIRECTORY_SEPARATOR, '/', $path);
@@ -423,20 +426,47 @@
 }
 
 // }}}
+// {{{ p2_normalize()
+
+if (extension_loaded('intl')) {
+    /**
+     * NormalizerƒNƒ‰ƒX‚ðŽg‚Á‚½³‹K‰»ŠÖ”
+     *
+     * @param   string $str
+     * @return  string
+     */
+    function p2_normalize($str)
+    {
+        return strtolower(Normalizer::normalize(mb_convert_encoding(
+                $str, 'UTF-8', 'SJIS-win'), Normalizer::NFKC));
+    }
+} else {
+    /**
+     * ‚·‚²‚­“K“–‚Ȑ³‹K‰»ŠÖ”
+     *
+     * @param   string $str
+     * @return  string
+     */
+    function p2_normalize($str)
+    {
+        return mb_strtolower(mb_convert_kana(mb_convert_encoding(
+                $str, 'UTF-8', 'SJIS-win'), 'KVas', 'UTF-8'), 'UTF-8');
+    }
+}
+
+// }}}
 // {{{ p2_wakati()
 
 /**
- * ‚·‚²‚­“K“–‚Ȑ³‹K‰»&•ª‚©‚¿‘‚«ŠÖ”
+ * ‚·‚²‚­“K“–‚È•ª‚©‚¿‘‚«ŠÖ”
  *
  * @param   string $str
  * @return  array
  */
 function p2_wakati($str)
 {
-    return array_filter(array_map('trim', preg_split(P2_REGEX_WAKATI,
-        mb_strtolower(mb_convert_kana(mb_convert_encoding(
-            $str, 'UTF-8', 'CP932'), 'KVas', 'UTF-8'), 'UTF-8'),
-        -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY)), 'strlen');
+    $str = preg_replace(P2_REGEX_WAKATI, '$0 ', p2_normalize($str));
+    return preg_split('/\\s+/u', $str, -1, PREG_SPLIT_NO_EMPTY);
 }
 
 // }}}
@@ -460,7 +490,7 @@
     }
     //rsort($featured_words, SORT_STRING);
 
-    $pattern = mb_convert_encoding(implode(' ', $featured_words), 'CP932', 'UTF-8');
+    $pattern = mb_convert_encoding(implode(' ', $featured_words), 'SJIS-win', 'UTF-8');
     return str_replace(' ', '|', StrCtl::wordForMatch($pattern, 'or'));
 
 }
@@ -498,6 +528,9 @@
  */
 function p2_combine_nfd_kana($str)
 {
+    if (extension_loaded('intl')) {
+        return Normalizer::normalize($str, Normalizer::NFC);
+    }
     return preg_replace_callback(P2_REGEX_NFD_KANA, '_p2_combine_nfd_kana', $str);
 }
 
@@ -557,7 +590,7 @@
  */
 function p2_correct_css_color($color)
 {
-    return preg_replace('/^#([0-9A-F])([0-9A-F])([0-9A-F])$/i', '#\\1\\1\\2\\2\\3\\3', $color);
+    return preg_replace('/^#([0-9A-F])([0-9A-F])([0-9A-F])$/i', '#$1$1$2$2$3$3', $color);
 }
 
 // }}}

Modified: p2ex/trunk/lib/sb_print.inc.php
===================================================================
--- p2ex/trunk/lib/sb_print.inc.php	2010-01-10 06:52:28 UTC (rev 768)
+++ p2ex/trunk/lib/sb_print.inc.php	2010-01-10 11:34:07 UTC (rev 769)
@@ -218,15 +218,16 @@
 
         // tr—“ cssƒNƒ‰ƒX
         if ($i % 2) {
-            $class_r = ' class="r1"';   // Šï”s
+            $row_class = 'r1 r_odd';
         } else {
-            $class_r = ' class="r2"';   // ‹ô”s
+            $row_class = 'r2 r_even';
         }
 
         //V’…ƒŒƒX” =============================================
         $unum_ht_c = ' ';
         // Šù“¾Ï‚Ý
         if ($aThread->isKitoku()) {
+            $row_class .= ' r_read'; // read‚͉ߋŽ•ªŽŒ
 
             // $ttitle_en_q ‚͐ߌ¸È—ª
             $delelog_js = "return wrapDeleLog('{$base_q}{$sid_q}',this);";
@@ -236,6 +237,7 @@
 
             // subject.txt‚É‚È‚¢Žž
             if (!$aThread->isonline) {
+                $row_class .= ' r_offline';
                 // JavaScript‚Å‚ÌŠm”Fƒ_ƒCƒAƒƒO‚ ‚è
                 $unum_ht_c = <<<EOP
 <a class="un_n" href="{$_conf['subject_php']}?{$base_q}{$spmode_q}&amp;dele=true" target="_self" onclick="if (!window.confirm('ƒƒO‚ðíœ‚µ‚Ü‚·‚©H')) {return false;} {$delelog_js}"{$title_at}>-</a>
@@ -243,6 +245,7 @@
 
             // V’…‚ ‚è
             } elseif ($aThread->unum > 0) {
+                $row_class .= ' r_new';
                 $midoku_ari = true;
                 $unum_ht_c = <<<EOP
 <a id="un{$i}" class="un_a" href="{$_conf['subject_php']}?{$base_q}{$spmode_q}&amp;dele=true" target="_self" onclick="{$delelog_js}"{$title_at}>{$aThread->unum}</a>
@@ -332,6 +335,7 @@
 
         // V‹KƒXƒŒ
         if ($aThread->new) {
+            $row_class .= ' r_brand_new';
             $classtitle_q = ' class="thre_title_new"';
         } else {
             $classtitle_q = ' class="thre_title"';
@@ -430,7 +434,7 @@
 
         // ƒ{ƒfƒB
         echo <<<EOR
-<tr{$class_r}>
+<tr class="{$row_class}">
 {$td['edit']}{$td['offrec']}{$td['unum']}{$td['rescount']}{$td['one']}{$td['checkbox']}<td{$class_to}>{$torder_ht}</td>
 <td{$class_tl}>{$moto_thre_ht}<a id="tt{$i}" href="{$thre_url}" title="{$aThread->ttitle_hd}"{$classtitle_q}{$change_color}>{$ttitle_ht}</a></td>
 {$td['ita']}{$td['spd']}{$td['ikioi']}{$td['birth']}{$td['fav']}</tr>\n



P2-php-svn メーリングリストの案内
Back to archive index