]> git.mxchange.org Git - friendica.git/blob - vendor/smarty/smarty/libs/plugins/function.mailto.php
Add Smarty to Composer
[friendica.git] / vendor / smarty / smarty / libs / plugins / function.mailto.php
1 <?php
2 /**
3  * Smarty plugin
4  *
5  * @package    Smarty
6  * @subpackage PluginsFunction
7  */
8
9 /**
10  * Smarty {mailto} function plugin
11  * Type:     function<br>
12  * Name:     mailto<br>
13  * Date:     May 21, 2002
14  * Purpose:  automate mailto address link creation, and optionally encode them.<br>
15  * Params:
16  * <pre>
17  * - address    - (required) - e-mail address
18  * - text       - (optional) - text to display, default is address
19  * - encode     - (optional) - can be one of:
20  *                             * none : no encoding (default)
21  *                             * javascript : encode with javascript
22  *                             * javascript_charcode : encode with javascript charcode
23  *                             * hex : encode with hexidecimal (no javascript)
24  * - cc         - (optional) - address(es) to carbon copy
25  * - bcc        - (optional) - address(es) to blind carbon copy
26  * - subject    - (optional) - e-mail subject
27  * - newsgroups - (optional) - newsgroup(s) to post to
28  * - followupto - (optional) - address(es) to follow up to
29  * - extra      - (optional) - extra tags for the href link
30  * </pre>
31  * Examples:
32  * <pre>
33  * {mailto address="me@domain.com"}
34  * {mailto address="me@domain.com" encode="javascript"}
35  * {mailto address="me@domain.com" encode="hex"}
36  * {mailto address="me@domain.com" subject="Hello to you!"}
37  * {mailto address="me@domain.com" cc="you@domain.com,they@domain.com"}
38  * {mailto address="me@domain.com" extra='class="mailto"'}
39  * </pre>
40  *
41  * @link     http://www.smarty.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  *
47  * @param array $params parameters
48  *
49  * @return string
50  */
51 function smarty_function_mailto($params)
52 {
53     static $_allowed_encoding =
54         array('javascript' => true, 'javascript_charcode' => true, 'hex' => true, 'none' => true);
55     $extra = '';
56
57     if (empty($params[ 'address' ])) {
58         trigger_error("mailto: missing 'address' parameter", E_USER_WARNING);
59
60         return;
61     } else {
62         $address = $params[ 'address' ];
63     }
64
65     $text = $address;
66     // netscape and mozilla do not decode %40 (@) in BCC field (bug?)
67     // so, don't encode it.
68     $search = array('%40', '%2C');
69     $replace = array('@', ',');
70     $mail_parms = array();
71     foreach ($params as $var => $value) {
72         switch ($var) {
73             case 'cc':
74             case 'bcc':
75             case 'followupto':
76                 if (!empty($value)) {
77                     $mail_parms[] = $var . '=' . str_replace($search, $replace, rawurlencode($value));
78                 }
79                 break;
80
81             case 'subject':
82             case 'newsgroups':
83                 $mail_parms[] = $var . '=' . rawurlencode($value);
84                 break;
85
86             case 'extra':
87             case 'text':
88                 $$var = $value;
89
90             default:
91         }
92     }
93
94     if ($mail_parms) {
95         $address .= '?' . join('&', $mail_parms);
96     }
97
98     $encode = (empty($params[ 'encode' ])) ? 'none' : $params[ 'encode' ];
99     if (!isset($_allowed_encoding[ $encode ])) {
100         trigger_error("mailto: 'encode' parameter must be none, javascript, javascript_charcode or hex",
101                       E_USER_WARNING);
102
103         return;
104     }
105     // FIXME: (rodneyrehm) document.write() excues me what? 1998 has passed!
106     if ($encode == 'javascript') {
107         $string = 'document.write(\'<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>\');';
108
109         $js_encode = '';
110         for ($x = 0, $_length = strlen($string); $x < $_length; $x ++) {
111             $js_encode .= '%' . bin2hex($string[ $x ]);
112         }
113
114         return '<script type="text/javascript">eval(unescape(\'' . $js_encode . '\'))</script>';
115     } elseif ($encode == 'javascript_charcode') {
116         $string = '<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>';
117
118         for ($x = 0, $y = strlen($string); $x < $y; $x ++) {
119             $ord[] = ord($string[ $x ]);
120         }
121
122         $_ret = "<script type=\"text/javascript\" language=\"javascript\">\n" . "{document.write(String.fromCharCode(" .
123                 implode(',', $ord) . "))" . "}\n" . "</script>\n";
124
125         return $_ret;
126     } elseif ($encode == 'hex') {
127         preg_match('!^(.*)(\?.*)$!', $address, $match);
128         if (!empty($match[ 2 ])) {
129             trigger_error("mailto: hex encoding does not work with extra attributes. Try javascript.", E_USER_WARNING);
130
131             return;
132         }
133         $address_encode = '';
134         for ($x = 0, $_length = strlen($address); $x < $_length; $x ++) {
135             if (preg_match('!\w!' . Smarty::$_UTF8_MODIFIER, $address[ $x ])) {
136                 $address_encode .= '%' . bin2hex($address[ $x ]);
137             } else {
138                 $address_encode .= $address[ $x ];
139             }
140         }
141         $text_encode = '';
142         for ($x = 0, $_length = strlen($text); $x < $_length; $x ++) {
143             $text_encode .= '&#x' . bin2hex($text[ $x ]) . ';';
144         }
145
146         $mailto = "&#109;&#97;&#105;&#108;&#116;&#111;&#58;";
147
148         return '<a href="' . $mailto . $address_encode . '" ' . $extra . '>' . $text_encode . '</a>';
149     } else {
150         // no encoding
151         return '<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>';
152     }
153 }