ここの情報は古いです。ご理解頂いた上でお取り扱いください。

source: OpenPNE/branches/stable-2.12.x/webapp/lib/smarty_plugins/modifier.t_url2cmd.php @ 8620

Last change on this file since 8620 was 8620, checked in by ebihara, 12 years ago

#2768:entry_point の場合のみ、t_url2cmd 実行時に textarea など「小窓に変換するべきでない箇所」であるかどうかを考慮するようにした

File size: 3.0 KB
Line 
1<?php
2/**
3 * @copyright 2005-2008 OpenPNE Project
4 * @license   http://www.php.net/license/3_01.txt PHP License 3.01
5 */
6
7function smarty_modifier_t_url2cmd($string, $type = '', $target_c_member_id = '', $is_html = true)
8{
9    $list = array();
10
11    if ($type === 'entry_point') {
12        // 置換用に文字列を退避
13        list ($list, $string) = util_replace_patterns_to_marker($string);
14    }
15
16    if (!$is_html || in_array($type, db_get_url2a_denied_list())) {
17        // HTMLエスケープされていない場合、 t_url2a の変換対象でない場合
18        // ", ', </a> がURLの後に続く場合はマッチさせない
19        $url_pattern = '/https?:\/\/([a-zA-Z0-9\-.]+)\/?(?:[a-zA-Z0-9_\-\/.,:;~?@=+$%#!()&])*(?!["\'a-zA-Z0-9_\-\/.,:;~?@=+$%#!()&]|<\/a>)/';
20    } else {
21        $url_pattern = '/https?:\/\/([a-zA-Z0-9\-.]+)\/?(?:[a-zA-Z0-9_\-\/.,:;~?@=+$%#!()]|&amp;)*/';
22    }
23
24    $GLOBALS['_CMD']['type'] = $type;
25    $GLOBALS['_CMD']['target_c_member_id'] = $target_c_member_id;
26
27    $string = preg_replace_callback($url_pattern, '_smarty_modifier_t_cmd_make_url_js', $string);
28
29    if ($type === 'entry_point') {
30        // 退避した文字列を元に戻す
31        $string = str_replace(array_keys($list), array_values($list), $string);
32    }
33
34    return $string;
35}
36
37function _smarty_modifier_t_cmd_make_url_js($matches)
38{
39    $url = str_replace('&amp;', '&', $matches[0]);
40    $cmd = $matches[1];
41
42    // SNS内を指すURLの場合は cmd/openpne ディレクトリ以下の小窓を読み込む
43    $openpne_url = '';
44    if (strpos($url, OPENPNE_URL) === 0) {
45        $openpne_url = OPENPNE_URL;
46    } elseif (OPENPNE_USE_PARTIAL_SSL && strpos($url, OPENPNE_SSL_URL) === 0) {
47        $openpne_url = OPENPNE_SSL_URL;
48    }
49
50    if ($openpne_url) {
51        $url_pattern = sprintf('/^%s(?:index.php)?\?m=(\w+)&a=(\w+)((?:[a-zA-Z0-9_=]|&)*)$/', preg_quote($openpne_url, '/'));
52
53        $openpne_url_matches = array();
54        if (preg_match($url_pattern, $url, $openpne_url_matches)) {
55            $module = $openpne_url_matches[1];
56            $action = $openpne_url_matches[2];
57            $cmd = 'openpne/' . $module . '_' . $action;
58        }
59    }
60
61    $file = $cmd . '.js';
62    $path = './cmd/' . $file;
63
64    // ファイルが読み込めない場合は、小窓キャスト配信者のJavaScriptを読み込む
65    if (!is_readable($path)) {
66        $path = db_etc_c_cmd_url4name($cmd);
67    }
68
69    if (!OPENPNE_USE_CMD_TAG || !db_is_use_cmd($cmd, $GLOBALS['_CMD']['type']) || !$path) {
70        if (in_array($GLOBALS['_CMD']['type'], db_get_url2a_denied_list())) {
71            // t_url2aが無効: 何もせずに返す
72            return $matches[0];
73        } else {
74            // t_url2aが有効
75            return pne_url2a($url);
76        }
77    }
78
79    $url_html = str_replace('&', '&amp;', $url);
80    $result = <<<EOD
81<script type="text/javascript" src="{$path}"></script>
82<script type="text/javascript">
83<!--
84url2cmd('{$url_html}', '{$GLOBALS['_CMD']['target_c_member_id']}');
85//-->
86</script>
87EOD;
88    return $result;
89}
90
91?>
Note: See TracBrowser for help on using the repository browser.