Хранилища Subversion ant

Редакция

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

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