Хранилища Subversion ant

Редакция

Редакция 2 | Только различия | Не учитывать пробелы | Содержимое файла | Авторство | Последнее изменение | Открыть журнал | RSS

Редакция 2 Редакция 3
1
<?php
1
<?php
2
/**
2
/**
3
 * Smarty plugin
3
 * Smarty plugin
4
 * @package Smarty
4
 * @package Smarty
5
 * @subpackage plugins
5
 * @subpackage plugins
6
 */
6
 */
7
7
8
8
9
/**
9
/**
10
 * Smarty {mailto} function plugin
10
 * Smarty {mailto} function plugin
11
 *
11
 *
12
 * Type:     function<br>
12
 * Type:     function<br>
13
 * Name:     mailto<br>
13
 * Name:     mailto<br>
14
 * Date:     May 21, 2002
14
 * Date:     May 21, 2002
15
 * Purpose:  automate mailto address link creation, and optionally
15
 * Purpose:  automate mailto address link creation, and optionally
16
 *           encode them.<br>
16
 *           encode them.<br>
17
 * Input:<br>
17
 * Input:<br>
18
 *         - address = e-mail address
18
 *         - address = e-mail address
19
 *         - text = (optional) text to display, default is address
19
 *         - text = (optional) text to display, default is address
20
 *         - encode = (optional) can be one of:
20
 *         - encode = (optional) can be one of:
21
 *                * none : no encoding (default)
21
 *                * none : no encoding (default)
22
 *                * javascript : encode with javascript
22
 *                * javascript : encode with javascript
23
 *                * javascript_charcode : encode with javascript charcode
23
 *                * javascript_charcode : encode with javascript charcode
24
 *                * hex : encode with hexidecimal (no javascript)
24
 *                * hex : encode with hexidecimal (no javascript)
25
 *         - cc = (optional) address(es) to carbon copy
25
 *         - cc = (optional) address(es) to carbon copy
26
 *         - bcc = (optional) address(es) to blind carbon copy
26
 *         - bcc = (optional) address(es) to blind carbon copy
27
 *         - subject = (optional) e-mail subject
27
 *         - subject = (optional) e-mail subject
28
 *         - newsgroups = (optional) newsgroup(s) to post to
28
 *         - newsgroups = (optional) newsgroup(s) to post to
29
 *         - followupto = (optional) address(es) to follow up to
29
 *         - followupto = (optional) address(es) to follow up to
30
 *         - extra = (optional) extra tags for the href link
30
 *         - extra = (optional) extra tags for the href link
31
 *
31
 *
32
 * Examples:
32
 * Examples:
33
 * <pre>
33
 * <pre>
34
 * {mailto address="me@domain.com"}
34
 * {mailto address="me@domain.com"}
35
 * {mailto address="me@domain.com" encode="javascript"}
35
 * {mailto address="me@domain.com" encode="javascript"}
36
 * {mailto address="me@domain.com" encode="hex"}
36
 * {mailto address="me@domain.com" encode="hex"}
37
 * {mailto address="me@domain.com" subject="Hello to you!"}
37
 * {mailto address="me@domain.com" subject="Hello to you!"}
38
 * {mailto address="me@domain.com" cc="you@domain.com,they@domain.com"}
38
 * {mailto address="me@domain.com" cc="you@domain.com,they@domain.com"}
39
 * {mailto address="me@domain.com" extra='class="mailto"'}
39
 * {mailto address="me@domain.com" extra='class="mailto"'}
40
 * </pre>
40
 * </pre>
41
 * @link http://smarty.php.net/manual/en/language.function.mailto.php {mailto}
41
 * @link http://smarty.php.net/manual/en/language.function.mailto.php {mailto}
42
 *          (Smarty online manual)
42
 *          (Smarty online manual)
43
 * @version  1.2
43
 * @version  1.2
44
 * @author   Monte Ohrt <monte at ohrt dot com>
44
 * @author   Monte Ohrt <monte at ohrt dot com>
45
 * @author   credits to Jason Sweat (added cc, bcc and subject functionality)
45
 * @author   credits to Jason Sweat (added cc, bcc and subject functionality)
46
 * @param    array
46
 * @param    array
47
 * @param    Smarty
47
 * @param    Smarty
48
 * @return   string
48
 * @return   string
49
 */
49
 */
50
function smarty_function_mailto($params, &$smarty)
50
function smarty_function_mailto($params, &$smarty)
51
{
51
{
52
    $extra = '';
52
    $extra = '';
53
53
54
    if (empty($params['address'])) {
54
    if (empty($params['address'])) {
55
        $smarty->trigger_error("mailto: missing 'address' parameter");
55
        $smarty->trigger_error("mailto: missing 'address' parameter");
56
        return;
56
        return;
57
    } else {
57
    } else {
58
        $address = $params['address'];
58
        $address = $params['address'];
59
    }
59
    }
60
60
61
    $text = $address;
61
    $text = $address;
62
62
63
    // netscape and mozilla do not decode %40 (@) in BCC field (bug?)
63
    // netscape and mozilla do not decode %40 (@) in BCC field (bug?)
64
    // so, don't encode it.
64
    // so, don't encode it.
65
    $search = array('%40', '%2C');
65
    $search = array('%40', '%2C');
66
    $replace  = array('@', ',');
66
    $replace  = array('@', ',');
67
    $mail_parms = array();
67
    $mail_parms = array();
68
    foreach ($params as $var=>$value) {
68
    foreach ($params as $var=>$value) {
69
        switch ($var) {
69
        switch ($var) {
70
            case 'cc':
70
            case 'cc':
71
            case 'bcc':
71
            case 'bcc':
72
            case 'followupto':
72
            case 'followupto':
73
                if (!empty($value))
73
                if (!empty($value))
74
                    $mail_parms[] = $var.'='.str_replace($search,$replace,rawurlencode($value));
74
                    $mail_parms[] = $var.'='.str_replace($search,$replace,rawurlencode($value));
75
                break;
75
                break;
76
               
76
               
77
            case 'subject':
77
            case 'subject':
78
            case 'newsgroups':
78
            case 'newsgroups':
79
                $mail_parms[] = $var.'='.rawurlencode($value);
79
                $mail_parms[] = $var.'='.rawurlencode($value);
80
                break;
80
                break;
81
81
82
            case 'extra':
82
            case 'extra':
83
            case 'text':
83
            case 'text':
84
                $$var = $value;
84
                $$var = $value;
85
85
86
            default:
86
            default:
87
        }
87
        }
88
    }
88
    }
89
89
90
    $mail_parm_vals = '';
90
    $mail_parm_vals = '';
91
    for ($i=0; $i<count($mail_parms); $i++) {
91
    for ($i=0; $i<count($mail_parms); $i++) {
92
        $mail_parm_vals .= (0==$i) ? '?' : '&';
92
        $mail_parm_vals .= (0==$i) ? '?' : '&';
93
        $mail_parm_vals .= $mail_parms[$i];
93
        $mail_parm_vals .= $mail_parms[$i];
94
    }
94
    }
95
    $address .= $mail_parm_vals;
95
    $address .= $mail_parm_vals;
96
96
97
    $encode = (empty($params['encode'])) ? 'none' : $params['encode'];
97
    $encode = (empty($params['encode'])) ? 'none' : $params['encode'];
98
    if (!in_array($encode,array('javascript','javascript_charcode','hex','none')) ) {
98
    if (!in_array($encode,array('javascript','javascript_charcode','hex','none')) ) {
99
        $smarty->trigger_error("mailto: 'encode' parameter must be none, javascript or hex");
99
        $smarty->trigger_error("mailto: 'encode' parameter must be none, javascript or hex");
100
        return;
100
        return;
101
    }
101
    }
102
102
103
    if ($encode == 'javascript' ) {
103
    if ($encode == 'javascript' ) {
104
        $string = 'document.write(\'<a href="mailto:'.$address.'" '.$extra.'>'.$text.'</a>\');';
104
        $string = 'document.write(\'<a href="mailto:'.$address.'" '.$extra.'>'.$text.'</a>\');';
105
105
106
        $js_encode = '';
106
        $js_encode = '';
107
        for ($x=0; $x < strlen($string); $x++) {
107
        for ($x=0; $x < strlen($string); $x++) {
108
            $js_encode .= '%' . bin2hex($string[$x]);
108
            $js_encode .= '%' . bin2hex($string[$x]);
109
        }
109
        }
110
110
111
        return '<script type="text/javascript">eval(unescape(\''.$js_encode.'\'))</script>';
111
        return '<script type="text/javascript">eval(unescape(\''.$js_encode.'\'))</script>';
112
112
113
    } elseif ($encode == 'javascript_charcode' ) {
113
    } elseif ($encode == 'javascript_charcode' ) {
114
        $string = '<a href="mailto:'.$address.'" '.$extra.'>'.$text.'</a>';
114
        $string = '<a href="mailto:'.$address.'" '.$extra.'>'.$text.'</a>';
115
115
116
        for($x = 0, $y = strlen($string); $x < $y; $x++ ) {
116
        for($x = 0, $y = strlen($string); $x < $y; $x++ ) {
117
            $ord[] = ord($string[$x]);  
117
            $ord[] = ord($string[$x]);  
118
        }
118
        }
119
119
120
        $_ret = "<script type=\"text/javascript\" language=\"javascript\">\n";
120
        $_ret = "<script type=\"text/javascript\" language=\"javascript\">\n";
121
        $_ret .= "<!--\n";
121
        $_ret .= "<!--\n";
122
        $_ret .= "{document.write(String.fromCharCode(";
122
        $_ret .= "{document.write(String.fromCharCode(";
123
        $_ret .= implode(',',$ord);
123
        $_ret .= implode(',',$ord);
124
        $_ret .= "))";
124
        $_ret .= "))";
125
        $_ret .= "}\n";
125
        $_ret .= "}\n";
126
        $_ret .= "//-->\n";
126
        $_ret .= "//-->\n";
127
        $_ret .= "</script>\n";
127
        $_ret .= "</script>\n";
128
       
128
       
129
        return $_ret;
129
        return $_ret;
130
       
130
       
131
       
131
       
132
    } elseif ($encode == 'hex') {
132
    } elseif ($encode == 'hex') {
133
133
134
        preg_match('!^(.*)(\?.*)$!',$address,$match);
134
        preg_match('!^(.*)(\?.*)$!',$address,$match);
135
        if(!empty($match[2])) {
135
        if(!empty($match[2])) {
136
            $smarty->trigger_error("mailto: hex encoding does not work with extra attributes. Try javascript.");
136
            $smarty->trigger_error("mailto: hex encoding does not work with extra attributes. Try javascript.");
137
            return;
137
            return;
138
        }
138
        }
139
        $address_encode = '';
139
        $address_encode = '';
140
        for ($x=0; $x < strlen($address); $x++) {
140
        for ($x=0; $x < strlen($address); $x++) {
141
            if(preg_match('!\w!',$address[$x])) {
141
            if(preg_match('!\w!',$address[$x])) {
142
                $address_encode .= '%' . bin2hex($address[$x]);
142
                $address_encode .= '%' . bin2hex($address[$x]);
143
            } else {
143
            } else {
144
                $address_encode .= $address[$x];
144
                $address_encode .= $address[$x];
145
            }
145
            }
146
        }
146
        }
147
        $text_encode = '';
147
        $text_encode = '';
148
        for ($x=0; $x < strlen($text); $x++) {
148
        for ($x=0; $x < strlen($text); $x++) {
149
            $text_encode .= '&#x' . bin2hex($text[$x]).';';
149
            $text_encode .= '&#x' . bin2hex($text[$x]).';';
150
        }
150
        }
151
151
152
        $mailto = "&#109;&#97;&#105;&#108;&#116;&#111;&#58;";
152
        $mailto = "&#109;&#97;&#105;&#108;&#116;&#111;&#58;";
153
        return '<a href="'.$mailto.$address_encode.'" '.$extra.'>'.$text_encode.'</a>';
153
        return '<a href="'.$mailto.$address_encode.'" '.$extra.'>'.$text_encode.'</a>';
154
154
155
    } else {
155
    } else {
156
        // no encoding
156
        // no encoding
157
        return '<a href="mailto:'.$address.'" '.$extra.'>'.$text.'</a>';
157
        return '<a href="mailto:'.$address.'" '.$extra.'>'.$text.'</a>';
158
158
159
    }
159
    }
160
160
161
}
161
}
162
162
163
/* vim: set expandtab: */
163
/* vim: set expandtab: */
164
164
165
?>
165
?>
166
 
166