Project

General

Profile

Bug #22410 » 14050_cleaning_t3lib_htmlmail.patch

Administrator Admin, 2010-11-24 12:19

View differences:

t3lib/class.t3lib_htmlmail.php (revision )
<?php
/***************************************************************
* Copyright notice
*
* (c) 1999-2010 Kasper Sk?rh?j (kasperYYYY@typo3.com)
* All rights reserved
*
* This script is part of the TYPO3 project. The TYPO3 project is
* free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* The GNU General Public License can be found at
* http://www.gnu.org/copyleft/gpl.html.
* A copy is found in the textfile GPL.txt and important notices to the license
* from the author is found in LICENSE.txt distributed with these scripts.
*
*
* This script is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/
* Copyright notice
*
* (c) 1999-2010 Kasper Sk?rh?j (kasperYYYY@typo3.com)
* All rights reserved
*
* This script is part of the TYPO3 project. The TYPO3 project is
* free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* The GNU General Public License can be found at
* http://www.gnu.org/copyleft/gpl.html.
* A copy is found in the textfile GPL.txt and important notices to the license
* from the author is found in LICENSE.txt distributed with these scripts.
*
*
* This script is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/
/**
* HTML mail class
*
......
*
*
* 193: class t3lib_htmlmail
* 261: function t3lib_htmlmail ()
* 261: function t3lib_htmlmail ()
* 268: function start ()
* 268: function start ()
* 305: function useQuotedPrintable()
* 305: function useQuotedPrintable()
* 315: function useBase64()
* 315: function useBase64()
* 326: function use8Bit()
* 326: function use8Bit()
* 338: function encodeMsg($content)
* 338: function encodeMsg($content)
* 348: function addPlain ($content)
* 348: function addPlain ($content)
* 360: function addAttachment($file)
* 360: function addAttachment($file)
* 378: function addHTML ($file)
* 378: function addHTML ($file)
* 401: function extractHtmlInit($html,$url)
* 401: function extractHtmlInit($html,$url)
* 412: function send($recipient)
* 412: function send($recipient)
*
* SECTION: Main functions
* SECTION: Main functions
* 441: function setHeaders()
* 441: function setHeaders()
* 500: function setRecipient ($recip)
* 500: function setRecipient ($recip)
* 518: function getHTMLContentType()
* 518: function getHTMLContentType()
* 527: function setContent()
* 527: function setContent()
* 554: function constructMixed ($boundary)
* 554: function constructMixed ($boundary)
* 593: function constructHTML ($boundary)
* 593: function constructHTML ($boundary)
* 617: function constructAlternative($boundary)
* 617: function constructAlternative($boundary)
* 638: function constructHTML_media ($boundary)
* 638: function constructHTML_media ($boundary)
* 691: function sendTheMail ()
* 691: function sendTheMail ()
* 757: function getBoundary()
* 757: function getBoundary()
* 769: function setPlain ($content)
* 769: function setPlain ($content)
* 780: function setHtml ($content)
* 780: function setHtml ($content)
* 791: function add_header($header)
* 791: function add_header($header)
* 812: function add_message($string)
* 812: function add_message($string)
* 823: function getContent($type)
* 823: function getContent($type)
* 832: function preview()
* 832: function preview()
*
* SECTION: Functions for acquiring attachments, HTML, analyzing and so on **
* SECTION: Functions for acquiring attachments, HTML, analyzing and so on **
* 860: function fetchHTML($file)
* 860: function fetchHTML($file)
* 878: function fetchHTMLMedia()
* 878: function fetchHTMLMedia()
* 899: function extractMediaLinks()
* 899: function extractMediaLinks()
* 976: function extractHyperLinks()
* 976: function extractHyperLinks()
* 1025: function extractFramesInfo()
* 1025: function extractFramesInfo()
* 1051: function substMediaNamesInHTML($absolute)
* 1051: function substMediaNamesInHTML($absolute)
* 1078: function substHREFsInHTML()
* 1078: function substHREFsInHTML()
* 1106: function substHTTPurlsInPlainText($content)
* 1106: function substHTTPurlsInPlainText($content)
* 1142: function fixRollOvers()
* 1142: function fixRollOvers()
*
* SECTION: File and URL-functions
* SECTION: File and URL-functions
* 1189: function makeBase64($inputstr)
* 1189: function makeBase64($inputstr)
* 1200: function getExtendedURL($url)
* 1200: function getExtendedURL($url)
* 1222: function addUserPass($url)
* 1222: function addUserPass($url)
* 1238: function getURL($url)
* 1238: function getURL($url)
* 1250: function getStrippedURL($url)
* 1250: function getStrippedURL($url)
* 1271: function getMimeType($url)
* 1271: function getMimeType($url)
* 1300: function absRef($ref)
* 1300: function absRef($ref)
* 1320: function split_fileref($fileref)
* 1320: function split_fileref($fileref)
* 1347: function extParseUrl($path)
* 1347: function extParseUrl($path)
* 1362: function tag_regex($tagArray)
* 1362: function tag_regex($tagArray)
* 1384: function get_tag_attributes($tag)
* 1384: function get_tag_attributes($tag)
* 1426: function quoted_printable($string)
* 1426: function quoted_printable($string)
* 1437: function convertName($name)
* 1437: function convertName($name)
*
* TOTAL FUNCTIONS: 49
* (This index is automatically created/updated by the extension "extdeveval")
......
* NOTES on MIME mail structures:
*
* Plain + HTML
* multipart/alternative (text, html)
* multipart/alternative (text, html)
* multipart/alternative (text, html)
* multipart/alternative (text, html)
*
* Plain + HTML + image
* multipart/related (m/a, cids)
* multipart/related (m/a, cids)
* multipart/alternative (text, html)
* multipart/alternative (text, html)
*
* multipart/related (m/a, cids)
* multipart/related (m/a, cids)
* multipart/alternative (text, html)
* multipart/alternative (text, html)
*
* plain + attachment
* multipart/mixed
* multipart/mixed
*
* HTML + Attachment:
* multipart/mixed (text/html , attachments)
* multipart/mixed (text/html , attachments)
*
* Plain + HTML + Attachments:
* multipart/mixed (m/a, attachments)
* multipart/mixed (m/a, attachments)
* multipart/alternative (text, html)
* multipart/alternative (text, html)
*
* Plain + HTML + image + attachment
*
* Outlook expr.
* Outlook expr.
* multipart/mixed (m/r, attachments)
* multipart/mixed (m/r, attachments)
* multipart/related (m/a, cids)
* multipart/related (m/a, cids)
* multipart/alternative (text, html)
* multipart/alternative (text, html)
*
*
*
......
* platforms with different line break conventions.
* For formalists, the syntax of quoted-printable data is described by the following grammar:
*
* quoted-printable := ([*(ptext / SPACE / TAB) ptext] ["="] CRLF)
* quoted-printable := ([*(ptext / SPACE / TAB) ptext] ["="] CRLF)
* ; Maximum line length of 76 characters excluding CRLF
* ; Maximum line length of 76 characters excluding CRLF
*
* ptext := octet /<any ASCII character except "=", SPACE, or TAB>
* ptext := octet /<any ASCII character except "=", SPACE, or TAB>
* ; characters not listed as "mail-safe" in Appendix B
* ; characters not listed as "mail-safe" in Appendix B
* ; are also not recommended.
* ; are also not recommended.
*
* octet := "=" 2(DIGIT / "A" / "B" / "C" / "D" / "E" / "F")
* octet := "=" 2(DIGIT / "A" / "B" / "C" / "D" / "E" / "F")
* ; octet must be used for characters > 127, =, SPACE, or TAB,
* ; octet must be used for characters > 127, =, SPACE, or TAB,
* ; and is recommended for any characters not listed in
* ; and is recommended for any characters not listed in
* ; Appendix B as "mail-safe".
* ; Appendix B as "mail-safe".
*/
/**
* HTML mail class
......
* @package TYPO3
* @subpackage t3lib
*/
class t3lib_htmlmail {
class t3lib_htmlmail
{
// Headerinfo:
var $recipient = '';
var $recipient = '';
var $recipient_copy = ''; // This recipient (or list of...) will also receive the mail. Regard it as a copy.
var $recipient_copy = ''; // This recipient (or list of...) will also receive the mail. Regard it as a copy.
var $recipient_blindcopy = ''; // This recipient (or list of...) will also receive the mail as a blind copy. Regard it as a copy.
var $subject = '';
var $subject = '';
var $from_email = '';
var $from_email = '';
var $from_name = '';
var $from_name = '';
var $replyto_email = '';
var $replyto_email = '';
var $replyto_name = '';
var $replyto_name = '';
var $organisation = '';
var $organisation = '';
var $priority = 3; // 1 = highest, 5 = lowest, 3 = normal
var $priority = 3; // 1 = highest, 5 = lowest, 3 = normal
var $mailer = ''; // X-mailer, set to TYPO3 Major.Minor in constructor
var $mailer = ''; // X-mailer, set to TYPO3 Major.Minor in constructor
var $alt_base64 = 0;
var $alt_base64 = 0;
var $alt_8bit = 0;
var $alt_8bit = 0;
var $jumperURL_prefix = ''; // This is a prefix that will be added to all links in the mail. Example: 'http://www.mydomain.com/jump?userid=###FIELD_uid###&url='. if used, anything after url= is urlencoded.
var $jumperURL_prefix = ''; // This is a prefix that will be added to all links in the mail. Example: 'http://www.mydomain.com/jump?userid=###FIELD_uid###&url='. if used, anything after url= is urlencoded.
var $jumperURL_useId = 0; // If set, then the array-key of the urls are inserted instead of the url itself. Smart in order to reduce link-length
var $jumperURL_useId = 0; // If set, then the array-key of the urls are inserted instead of the url itself. Smart in order to reduce link-length
var $mediaList = ''; // If set, this is a list of the media-files (index-keys to the array) that should be represented in the html-mail
var $mediaList = ''; // If set, this is a list of the media-files (index-keys to the array) that should be represented in the html-mail
var $http_password = '';
var $http_password = '';
var $http_username = '';
var $http_username = '';
var $postfix_version1 = false;
var $postfix_version1 = FALSE;
// Internal
// Internal
/*
This is how the $theParts-array is normally looking
var $theParts = array(
......
var $messageid = '';
var $returnPath = '';
var $Xid = '';
var $dontEncodeHeader = false; // If set, the header will not be encoded
var $dontEncodeHeader = FALSE; // If set, the header will not be encoded
var $headers = '';
var $message = '';
......
var $defaultCharset = 'iso-8859-1';
/**
* Constructor. If the configuration variable forceReturnPath is set,
* calls to mail will be called with a 5th parameter.
......
*
* @return void
*/
public function t3lib_htmlmail() {
public function t3lib_htmlmail()
{
$this->forceReturnPath = $GLOBALS['TYPO3_CONF_VARS']['SYS']['forceReturnPath'];
$this->mailer = 'TYPO3';
......
*
* @return void
*/
public function start() {
public function start()
{
global $TYPO3_CONF_VARS;
// Sets the message id
......
$this->charset = $GLOBALS['LANG']->charSet;
} elseif ($GLOBALS['TYPO3_CONF_VARS']['BE']['forceCharset']) {
$this->charset = $GLOBALS['TYPO3_CONF_VARS']['BE']['forceCharset'];
} else {
} else {
$this->charset = $this->defaultCharset;
}
}
......
*
* @return void
*/
public function useQuotedPrintable() {
public function useQuotedPrintable()
{
$this->plain_text_header = 'Content-Type: text/plain; charset='.$this->charset.$this->linebreak.'Content-Transfer-Encoding: quoted-printable';
$this->plain_text_header = 'Content-Type: text/plain; charset=' . $this->charset . $this->linebreak . 'Content-Transfer-Encoding: quoted-printable';
$this->html_text_header = 'Content-Type: text/html; charset='.$this->charset.$this->linebreak.'Content-Transfer-Encoding: quoted-printable';
$this->html_text_header = 'Content-Type: text/html; charset=' . $this->charset . $this->linebreak . 'Content-Transfer-Encoding: quoted-printable';
}
/**
......
*
* @return void
*/
public function useBase64() {
public function useBase64()
{
$this->plain_text_header = 'Content-Type: text/plain; charset='.$this->charset.$this->linebreak.'Content-Transfer-Encoding: base64';
$this->plain_text_header = 'Content-Type: text/plain; charset=' . $this->charset . $this->linebreak . 'Content-Transfer-Encoding: base64';
$this->html_text_header = 'Content-Type: text/html; charset='.$this->charset.$this->linebreak.'Content-Transfer-Encoding: base64';
$this->html_text_header = 'Content-Type: text/html; charset=' . $this->charset . $this->linebreak . 'Content-Transfer-Encoding: base64';
$this->alt_base64 = 1;
}
......
*
* @return void
*/
public function use8Bit() {
public function use8Bit()
{
$this->plain_text_header = 'Content-Type: text/plain; charset='.$this->charset.$this->linebreak.'Content-Transfer-Encoding: 8bit';
$this->plain_text_header = 'Content-Type: text/plain; charset=' . $this->charset . $this->linebreak . 'Content-Transfer-Encoding: 8bit';
$this->html_text_header = 'Content-Type: text/html; charset='.$this->charset.$this->linebreak.'Content-Transfer-Encoding: 8bit';
$this->html_text_header = 'Content-Type: text/html; charset=' . $this->charset . $this->linebreak . 'Content-Transfer-Encoding: 8bit';
$this->alt_8bit = 1;
}
......
* @param string $content the content that will be encoded
* @return string the encoded content
*/
public function encodeMsg($content) {
public function encodeMsg($content)
{
if ($this->alt_base64) {
return $this->makeBase64($content);
} elseif ($this->alt_8bit) {
return $content;
} else {
} else {
return t3lib_div::quoted_printable($content);
}
}
......
* @param string $content that will be added
* @return void
*/
public function addPlain($content) {
public function addPlain($content)
{
$content = $this->substHTTPurlsInPlainText($content);
$this->setPlain($this->encodeMsg($content));
}
......
* @param string $file: the filename to add
* @return boolean whether the attachment was added or not
*/
public function addAttachment($file) {
public function addAttachment($file)
{
// Fetching the content and the mime-type
$fileInfo = $this->getExtendedURL($file);
if ($fileInfo) {
......
$temp = $this->split_fileref($file);
if ($temp['file']) {
$fileInfo['filename'] = $temp['file'];
} elseif (strpos(' '.$fileInfo['content_type'], 'htm')) {
} elseif (strpos(' ' . $fileInfo['content_type'], 'htm')) {
$fileInfo['filename'] = 'index.html';
} else {
} else {
$fileInfo['filename'] = 'unknown';
}
$this->theParts['attach'][] = $fileInfo;
return true;
return TRUE;
}
return false;
return FALSE;
}
......
* @param string $file: the filename to add
* @return boolean whether the attachment was added or not
*/
public function addHTML($file) {
public function addHTML($file)
{
$status = $this->fetchHTML($file);
if (!$status) {
return false;
return FALSE;
}
if ($this->extractFramesInfo()) {
return 'Document was a frameset. Stopped';
......
$this->extractMediaLinks();
$this->extractHyperLinks();
$this->fetchHTMLMedia();
$this->substMediaNamesInHTML(0); // 0 = relative
$this->substMediaNamesInHTML(0); // 0 = relative
$this->substHREFsInHTML();
$this->setHtml($this->encodeMsg($this->theParts['html']['content']));
}
......
* @param string $url: will be added to the html "path" part
* @return void
*/
public function extractHtmlInit($html,$url) {
public function extractHtmlInit($html, $url)
{
$this->theParts['html']['content'] = $html;
$this->theParts['html']['path'] = $url;
}
......
* @param string $recipient: The recipient the message should be delivered to (if blank, $this->recipient will be used instead)
* @return boolean Returns whether the mail was sent (successfully accepted for delivery)
*/
public function send($recipient) {
public function send($recipient)
{
if ($recipient) {
$this->recipient = $recipient;
}
......
}
/*****************************************
*
* Main functions
......
*
* @return void
*/
public function setHeaders() {
public function setHeaders()
{
$this->headers = '';
// Message_id
$this->add_header('Message-ID: <'.$this->messageid.'>');
$this->add_header('Message-ID: <' . $this->messageid . '>');
// Return path
if ($this->returnPath) {
$this->add_header('Return-Path: '.$this->returnPath);
$this->add_header('Return-Path: ' . $this->returnPath);
$this->add_header('Errors-To: '.$this->returnPath);
$this->add_header('Errors-To: ' . $this->returnPath);
}
// X-id
if ($this->Xid) {
$this->add_header('X-Typo3MID: '.$this->Xid);
$this->add_header('X-Typo3MID: ' . $this->Xid);
}
// From
if ($this->from_email) {
if ($this->from_name && !t3lib_div::isBrokenEmailEnvironment()) {
$this->add_header('From: '.$this->from_name.' <'.$this->from_email.'>');
$this->add_header('From: ' . $this->from_name . ' <' . $this->from_email . '>');
} else {
$this->add_header('From: '.$this->from_email);
$this->add_header('From: ' . $this->from_email);
}
}
......
// Reply
if ($this->replyto_email) {
if ($this->replyto_name) {
$this->add_header('Reply-To: '.$this->replyto_name.' <'.$this->replyto_email.'>');
$this->add_header('Reply-To: ' . $this->replyto_name . ' <' . $this->replyto_email . '>');
} else {
$this->add_header('Reply-To: '.$this->replyto_email);
$this->add_header('Reply-To: ' . $this->replyto_email);
}
}
// Organization, using american english spelling (organization / organisation) as defined in RFC 1036 / 2076
......
}
// mailer
if ($this->mailer) {
$this->add_header('X-Mailer: '.$this->mailer);
$this->add_header('X-Mailer: ' . $this->mailer);
}
// priority
if ($this->priority) {
$this->add_header('X-Priority: '.$this->priority);
$this->add_header('X-Priority: ' . $this->priority);
}
$this->add_header('Mime-Version: 1.0');
if (!$this->dontEncodeHeader) {
$enc = $this->alt_base64 ? 'base64' : 'quoted_printable'; // Header must be ASCII, therefore only base64 or quoted_printable are allowed!
$enc = $this->alt_base64 ? 'base64' : 'quoted_printable'; // Header must be ASCII, therefore only base64 or quoted_printable are allowed!
// Quote recipient and subject
$this->recipient = t3lib_div::encodeHeader($this->recipient,$enc,$this->charset);
$this->recipient = t3lib_div::encodeHeader($this->recipient, $enc, $this->charset);
$this->subject = t3lib_div::encodeHeader($this->subject,$enc,$this->charset);
$this->subject = t3lib_div::encodeHeader($this->subject, $enc, $this->charset);
}
}
......
* @param mixed $recipient: the recipient(s) to set
* @return void
*/
public function setRecipient($recipient) {
public function setRecipient($recipient)
{
$this->recipient = (is_array($recipient) ? implode(',', $recipient) : $recipient);
}
......
*
* @return string the content type
*/
public function getHTMLContentType() {
public function getHTMLContentType()
{
return (count($this->theParts['html']['media']) ? 'multipart/related' : 'multipart/alternative');
}
......
*
* @return void
*/
public function setContent() {
public function setContent()
{
$this->message = '';
$boundary = $this->getBoundary();
// Setting up headers
if (count($this->theParts['attach'])) {
// Generate (plain/HTML) / attachments
// Generate (plain/HTML) / attachments
$this->add_header('Content-Type: multipart/mixed;');
$this->add_header(' boundary="' . $boundary . '"');
$this->add_message('This is a multi-part message in MIME format.' . LF);
$this->constructMixed($boundary);
} elseif ($this->theParts['html']['content']) {
// Generate plain/HTML mail
// Generate plain/HTML mail
$this->add_header('Content-Type: ' . $this->getHTMLContentType() . ';');
$this->add_header(' boundary="' . $boundary . '"');
$this->add_message('This is a multi-part message in MIME format.' . LF);
$this->constructHTML($boundary);
} else {
// Generate plain only
// Generate plain only
$this->add_header($this->plain_text_header);
$this->add_message($this->getContent('plain'));
}
......
* @param string $boundary: the mail boundary
* @return void
*/
public function constructMixed($boundary) {
public function constructMixed($boundary)
{
$this->add_message('--' . $boundary);
if ($this->theParts['html']['content']) {
// HTML and plain is added
// HTML and plain is added
$newBoundary = $this->getBoundary();
$this->add_message('Content-Type: '.$this->getHTMLContentType() . ';');
$this->add_message('Content-Type: ' . $this->getHTMLContentType() . ';');
$this->add_message(' boundary="' . $newBoundary . '"');
$this->add_message('');
$this->constructHTML($newBoundary);
} else {
// Purely plain
// Purely plain
$this->add_message($this->plain_text_header);
$this->add_message('');
$this->add_message($this->getContent('plain'));
}
// attachments are added
// attachments are added
if (is_array($this->theParts['attach'])) {
foreach ($this->theParts['attach'] as $media) {
$this->add_message('--' . $boundary);
......
* @param string $boundary: the boundary to use
* @return void
*/
public function constructHTML($boundary) {
public function constructHTML($boundary)
{
// If media, then we know, the multipart/related content-type has been set before this function call
// If media, then we know, the multipart/related content-type has been set before this function call
if (count($this->theParts['html']['media'])) {
$this->add_message('--' . $boundary);
// HTML has media
// HTML has media
$newBoundary = $this->getBoundary();
$this->add_message('Content-Type: multipart/alternative;');
$this->add_message(' boundary="' . $newBoundary . '"');
......
// Adding the plaintext/html mix, and use $newBoundary
$this->constructAlternative($newBoundary);
$this->constructHTML_media($boundary);
} else {
} else {
// if no media, just use the $boundary for adding plaintext/html mix
// if no media, just use the $boundary for adding plaintext/html mix
$this->constructAlternative($boundary);
}
}
......
* @param string $boundary: the boundary to use
* @return void
*/
public function constructAlternative($boundary) {
public function constructAlternative($boundary)
{
$this->add_message('--'.$boundary);
$this->add_message('--' . $boundary);
// plain is added
$this->add_message($this->plain_text_header);
......
* @param string $boundary: the boundary to use
* @return void
*/
public function constructHTML_media($boundary) {
public function constructHTML_media($boundary)
{
// media is added
// media is added
if (is_array($this->theParts['html']['media'])) {
foreach($this->theParts['html']['media'] as $key => $media) {
foreach ($this->theParts['html']['media'] as $key => $media) {
if (!$this->mediaList || t3lib_div::inList($this->mediaList, $key)) {
$this->add_message('--' . $boundary);
$this->add_message('Content-Type: ' . $media['ctype']);
......
*
* @return boolean Returns whether the mail was sent (successfully accepted for delivery)
*/
public function sendTheMail() {
$mailWasSent = false;
public function sendTheMail()
{
$mailWasSent = FALSE;
// Sending the mail requires the recipient and message to be set.
if (!trim($this->recipient) || !trim($this->message)) {
return false;
return FALSE;
}
// On windows the -f flag is not used (specific for Sendmail and Postfix),
......
}
$recipient = t3lib_div::normalizeMailAddress($this->recipient);
// If safe mode is on, the fifth parameter to mail is not allowed, so the fix wont work on unix with safe_mode=On
// If safe mode is on, the fifth parameter to mail is not allowed, so the fix wont work on unix with safe_mode=On
$returnPathPossible = (!t3lib_utility_PhpOptions::isSafeModeEnabled() && $this->forceReturnPath);
if ($returnPathPossible) {
$mailWasSent = t3lib_utility_Mail::mail($recipient,
$this->subject,
$this->message,
$this->headers,
$returnPath);
$this->subject,
$this->message,
$this->headers,
$returnPath);
} else {
$mailWasSent = t3lib_utility_Mail::mail($recipient,
$this->subject,
$this->message,
$this->headers);
$this->subject,
$this->message,
$this->headers);
}
// Auto response
if ($this->auto_respond_msg) {
$theParts = explode('/',$this->auto_respond_msg,2);
$theParts = explode('/', $this->auto_respond_msg, 2);
$theParts[0] = str_replace('###SUBJECT###', $this->subject, $theParts[0]);
$theParts[1] = str_replace("/",LF,$theParts[1]);
$theParts[1] = str_replace("/", LF, $theParts[1]);
$theParts[1] = str_replace("###MESSAGE###", $this->getContent('plain'), $theParts[1]);
if ($returnPathPossible) {
$mailWasSent = t3lib_utility_Mail::mail($this->from_email,
$theParts[0],
$theParts[1],
'From: ' . $recipient,
$returnPath);
$theParts[0],
$theParts[1],
'From: ' . $recipient,
$returnPath);
} else {
$mailWasSent = t3lib_utility_Mail::mail($this->from_email,
$theParts[0],
$theParts[1],
'From: ' . $recipient);
$theParts[0],
$theParts[1],
'From: ' . $recipient);
}
}
if ($this->returnPath) {
......
*
* @return string the boundary
*/
public function getBoundary() {
public function getBoundary()
{
$this->part++;
return "----------".uniqid("part_".$this->part."_");
return "----------" . uniqid("part_" . $this->part . "_");
}
......
* @param string $content: the plain content
* @return void
*/
public function setPlain($content) {
public function setPlain($content)
{
$this->theParts['plain']['content'] = $content;
}
......
* @param string $content: the HTML content
* @return void
*/
public function setHtml($content) {
public function setHtml($content)
{
$this->theParts['html']['content'] = $content;
}
......
* @param string $header: the header in form of "key: value"
* @return void
*/
public function add_header($header) {
public function add_header($header)
{
// Mail headers must be ASCII, therefore we convert the whole header to either base64 or quoted_printable
if (!$this->dontEncodeHeader && !stristr($header,'Content-Type') && !stristr($header,'Content-Transfer-Encoding')) {
if (!$this->dontEncodeHeader && !stristr($header, 'Content-Type') && !stristr($header, 'Content-Transfer-Encoding')) {
// Field tags must not be encoded
$parts = explode(': ',$header,2);
$parts = explode(': ', $header, 2);
if (count($parts) == 2) {
$enc = $this->alt_base64 ? 'base64' : 'quoted_printable';
$parts[1] = t3lib_div::encodeHeader($parts[1], $enc, $this->charset);
......
}
}
$this->headers .= $header.LF;
$this->headers .= $header . LF;
}
......
* @param string $msg: the message to add
* @return void
*/
public function add_message($msg) {
public function add_message($msg)
{
$this->message .= $msg.LF;
$this->message .= $msg . LF;
}
......
* @param string $type: the content type, can either plain or html
* @return void
*/
public function getContent($type) {
public function getContent($type)
{
return $this->theParts[$type]['content'];
}
......
*
* @return void
*/
public function preview() {
public function preview()
{
echo nl2br(htmlspecialchars($this->headers));
echo "<BR>";
echo nl2br(htmlspecialchars($this->message));
}
/****************************************************
*
* Functions for acquiring attachments, HTML, analyzing and so on **
......
* @param string $file: the file to load
* @return boolean whether the data was fetched or not
*/
public function fetchHTML($file) {
public function fetchHTML($file)
{
// Fetches the content of the page
$this->theParts['html']['content'] = $this->getURL($file);
if ($this->theParts['html']['content']) {
$addr = $this->extParseUrl($file);
$path = ($addr['scheme']) ? $addr['scheme'].'://'.$addr['host'].(($addr['port'])?':'.$addr['port']:'').(($addr['filepath'])?$addr['filepath']:'/') : $addr['filepath'];
$path = ($addr['scheme']) ? $addr['scheme'] . '://' . $addr['host'] . (($addr['port']) ? ':' . $addr['port'] : '') . (($addr['filepath']) ? $addr['filepath'] : '/') : $addr['filepath'];
$this->theParts['html']['path'] = $path;
return true;
return TRUE;
} else {
} else {
return false;
return FALSE;
}
}
......
*
* @return void
*/
public function fetchHTMLMedia() {
if (!is_array($this->theParts['html']['media']) || !count($this->theParts['html']['media'])) return;
public function fetchHTMLMedia()
{
if (!is_array($this->theParts['html']['media']) || !count($this->theParts['html']['media'])) {
return;
}
foreach ($this->theParts['html']['media'] as $key => $media) {
// fetching the content and the mime-type
$picdata = $this->getExtendedURL($this->theParts['html']['media'][$key]['absRef']);
if (is_array($picdata)) {
$this->theParts['html']['media'][$key]['content'] = $picdata['content'];
$this->theParts['html']['media'][$key]['ctype'] = $picdata['content_type'];
$this->theParts['html']['media'][$key]['ctype'] = $picdata['content_type'];
}
}
}
......
*
* @return void
*/
public function extractMediaLinks() {
public function extractMediaLinks()
{
$html_code = $this->theParts['html']['content'];
$attribRegex = $this->tag_regex(array('img','table','td','tr','body','iframe','script','input','embed'));
$attribRegex = $this->tag_regex(array('img', 'table', 'td', 'tr', 'body', 'iframe', 'script', 'input', 'embed'));
// split the document by the beginning of the above tags
$codepieces = preg_split($attribRegex, $html_code);
......
$pieces = count($codepieces);
$reg = array();
for ($i = 1; $i < $pieces; $i++) {
$tag = strtolower(strtok(substr($html_code,$len+1,10),' '));
$tag = strtolower(strtok(substr($html_code, $len + 1, 10), ' '));
$len += strlen($tag)+strlen($codepieces[$i])+2;
$len += strlen($tag) + strlen($codepieces[$i]) + 2;
$dummy = preg_match('/[^>]*/', $codepieces[$i], $reg);
$attributes = $this->get_tag_attributes($reg[0]); // Fetches the attributes for the tag
$attributes = $this->get_tag_attributes($reg[0]); // Fetches the attributes for the tag
$imageData = array();
// Finds the src or background attribute
$imageData['ref'] = ($attributes['src'] ? $attributes['src'] : $attributes['background']);
if ($imageData['ref']) {
// find out if the value had quotes around it
$imageData['quotes'] = (substr($codepieces[$i], strpos($codepieces[$i], $imageData['ref'])-1,1) == '"') ? '"' : '';
$imageData['quotes'] = (substr($codepieces[$i], strpos($codepieces[$i], $imageData['ref']) - 1, 1) == '"') ? '"' : '';
// subst_str is the string to look for, when substituting lateron
$imageData['subst_str'] = $imageData['quotes'].$imageData['ref'].$imageData['quotes'];
$imageData['subst_str'] = $imageData['quotes'] . $imageData['ref'] . $imageData['quotes'];
if ($imageData['ref'] && !strstr($this->image_fullpath_list,"|".$imageData["subst_str"]."|")) {
if ($imageData['ref'] && !strstr($this->image_fullpath_list, "|" . $imageData["subst_str"] . "|")) {
$this->image_fullpath_list .= "|".$imageData['subst_str']."|";
$this->image_fullpath_list .= "|" . $imageData['subst_str'] . "|";
$imageData['absRef'] = $this->absRef($imageData['ref']);
$imageData['tag'] = $tag;
$imageData['use_jumpurl'] = $attributes['dmailerping']?1:0;
$imageData['use_jumpurl'] = $attributes['dmailerping'] ? 1 : 0;
$this->theParts['html']['media'][] = $imageData;
}
}
......
// Finds the src or background attribute
$imageData['ref'] = $attributes['href'];
// Finds out if the value had quotes around it
$imageData['quotes'] = (substr($codepieces[$i],strpos($codepieces[$i], $imageData['ref'])-1,1) == '"') ? '"' : '';
$imageData['quotes'] = (substr($codepieces[$i], strpos($codepieces[$i], $imageData['ref']) - 1, 1) == '"') ? '"' : '';
// subst_str is the string to look for, when substituting lateron
$imageData['subst_str'] = $imageData['quotes'].$imageData['ref'].$imageData['quotes'];
$imageData['subst_str'] = $imageData['quotes'] . $imageData['ref'] . $imageData['quotes'];
if ($imageData['ref'] && !strstr($this->image_fullpath_list,"|".$imageData["subst_str"]."|")) {
if ($imageData['ref'] && !strstr($this->image_fullpath_list, "|" . $imageData["subst_str"] . "|")) {
$this->image_fullpath_list .= "|".$imageData["subst_str"]."|";
$this->image_fullpath_list .= "|" . $imageData["subst_str"] . "|";
$imageData['absRef'] = $this->absRef($imageData["ref"]);
$this->theParts['html']['media'][] = $imageData;
}
......
// fixes javascript rollovers
$codepieces = explode('.src', $html_code);
$pieces = count($codepieces);
$expr = '/^[^'.quotemeta('"').quotemeta("'").']*/';
$expr = '/^[^' . quotemeta('"') . quotemeta("'") . ']*/';
for($i = 1; $i < $pieces; $i++) {
for ($i = 1; $i < $pieces; $i++) {
$temp = $codepieces[$i];
$temp = trim(str_replace('=','',trim($temp)));
$temp = trim(str_replace('=', '', trim($temp)));
preg_match($expr,substr($temp,1,strlen($temp)),$reg);
preg_match($expr, substr($temp, 1, strlen($temp)), $reg);
$imageData['ref'] = $reg[0];
$imageData['quotes'] = substr($temp,0,1);
$imageData['quotes'] = substr($temp, 0, 1);
// subst_str is the string to look for, when substituting lateron
$imageData['subst_str'] = $imageData['quotes'].$imageData['ref'].$imageData['quotes'];
$imageData['subst_str'] = $imageData['quotes'] . $imageData['ref'] . $imageData['quotes'];
$theInfo = $this->split_fileref($imageData['ref']);
switch ($theInfo['fileext']) {
case 'gif':
case 'jpeg':
case 'jpg':
if ($imageData['ref'] && !strstr($this->image_fullpath_list,"|".$imageData["subst_str"]."|")) {
if ($imageData['ref'] && !strstr($this->image_fullpath_list, "|" . $imageData["subst_str"] . "|")) {
$this->image_fullpath_list .= "|".$imageData['subst_str']."|";
$this->image_fullpath_list .= "|" . $imageData['subst_str'] . "|";
$imageData['absRef'] = $this->absRef($imageData['ref']);
$this->theParts['html']['media'][] = $imageData;
}
......
*
* @return void
*/
public function extractHyperLinks() {
public function extractHyperLinks()
{
$html_code = $this->theParts['html']['content'];
$attribRegex = $this->tag_regex(array('a','form','area'));
$attribRegex = $this->tag_regex(array('a', 'form', 'area'));
$codepieces = preg_split($attribRegex, $html_code); // Splits the document by the beginning of the above tags
$codepieces = preg_split($attribRegex, $html_code); // Splits the document by the beginning of the above tags
$len = strlen($codepieces[0]);
$pieces = count($codepieces);
for($i = 1; $i < $pieces; $i++) {
for ($i = 1; $i < $pieces; $i++) {
$tag = strtolower(strtok(substr($html_code,$len+1,10)," "));
$tag = strtolower(strtok(substr($html_code, $len + 1, 10), " "));
$len += strlen($tag) + strlen($codepieces[$i]) + 2;
$dummy = preg_match('/[^>]*/', $codepieces[$i], $reg);
......
$hrefData['ref'] = ($attributes['href'] ? $attributes['href'] : $hrefData['ref'] = $attributes['action']);
if ($hrefData['ref']) {
// Finds out if the value had quotes around it
$hrefData['quotes'] = (substr($codepieces[$i],strpos($codepieces[$i], $hrefData["ref"])-1,1) == '"') ? '"' : '';
$hrefData['quotes'] = (substr($codepieces[$i], strpos($codepieces[$i], $hrefData["ref"]) - 1, 1) == '"') ? '"' : '';
// subst_str is the string to look for, when substituting lateron
$hrefData['subst_str'] = $hrefData['quotes'].$hrefData['ref'].$hrefData['quotes'];
$hrefData['subst_str'] = $hrefData['quotes'] . $hrefData['ref'] . $hrefData['quotes'];
if ($hrefData['ref'] && substr(trim($hrefData['ref']),0,1) != "#" && !strstr($this->href_fullpath_list,"|".$hrefData['subst_str']."|")) {
if ($hrefData['ref'] && substr(trim($hrefData['ref']), 0, 1) != "#" && !strstr($this->href_fullpath_list, "|" . $hrefData['subst_str'] . "|")) {
$this->href_fullpath_list .= "|".$hrefData['subst_str']."|";
$this->href_fullpath_list .= "|" . $hrefData['subst_str'] . "|";
$hrefData['absRef'] = $this->absRef($hrefData['ref']);
$hrefData['tag'] = $tag;
$this->theParts['html']['hrefs'][] = $hrefData;
......
// Extracts TYPO3 specific links made by the openPic() JS function
$codepieces = explode("onClick=\"openPic('", $html_code);
$pieces = count($codepieces);
for($i = 1; $i < $pieces; $i++) {
for ($i = 1; $i < $pieces; $i++) {
$showpic_linkArr = explode("'",$codepieces[$i]);
$showpic_linkArr = explode("'", $codepieces[$i]);
$hrefData['ref'] = $showpic_linkArr[0];
if ($hrefData['ref']) {
$hrefData['quotes'] = "'";
// subst_str is the string to look for, when substituting lateron
$hrefData['subst_str'] = $hrefData['quotes'].$hrefData['ref'].$hrefData['quotes'];
$hrefData['subst_str'] = $hrefData['quotes'] . $hrefData['ref'] . $hrefData['quotes'];
if ($hrefData['ref'] && !strstr($this->href_fullpath_list,"|".$hrefData['subst_str']."|")) {
if ($hrefData['ref'] && !strstr($this->href_fullpath_list, "|" . $hrefData['subst_str'] . "|")) {
$this->href_fullpath_list .= "|".$hrefData['subst_str']."|";
$this->href_fullpath_list .= "|" . $hrefData['subst_str'] . "|";
$hrefData['absRef'] = $this->absRef($hrefData['ref']);
$this->theParts['html']['hrefs'][] = $hrefData;
}
......
*
* @return array two-dimensional array with information about each frame
*/
public function extractFramesInfo() {
public function extractFramesInfo()
{
$htmlCode = $this->theParts['html']['content'];
$info = array();
if (strpos(' '.$htmlCode,'<frame ')) {
if (strpos(' ' . $htmlCode, '<frame ')) {
$attribRegex = $this->tag_regex('frame');
// Splits the document by the beginning of the above tags
$codepieces = preg_split($attribRegex, $htmlCode, 1000000);
$pieces = count($codepieces);
for($i = 1; $i < $pieces; $i++) {
for ($i = 1; $i < $pieces; $i++) {
$dummy = preg_match('/[^>]*/', $codepieces[$i], $reg);
// Fetches the attributes for the tag
$attributes = $this->get_tag_attributes($reg[0]);
......
* @param boolean $absolute: If true, then the refs are substituted with http:// ref's indstead of Content-ID's (cid).
* @return void
*/
public function substMediaNamesInHTML($absolute) {
public function substMediaNamesInHTML($absolute)
{
if (is_array($this->theParts['html']['media'])) {
foreach ($this->theParts['html']['media'] as $key => $val) {
if ($val['use_jumpurl'] && $this->jumperURL_prefix) {
$subst = $this->jumperURL_prefix.t3lib_div::rawUrlEncodeFP($val['absRef']);
$subst = $this->jumperURL_prefix . t3lib_div::rawUrlEncodeFP($val['absRef']);
} else {
$subst = ($absolute) ? $val['absRef'] : 'cid:part'.$key.'.'.$this->messageid;
$subst = ($absolute) ? $val['absRef'] : 'cid:part' . $key . '.' . $this->messageid;
}
$this->theParts['html']['content'] = str_replace(
$val['subst_str'],
......
*
* @return void
*/
public function substHREFsInHTML() {
if (!is_array($this->theParts['html']['hrefs'])) return;
public function substHREFsInHTML()
{
if (!is_array($this->theParts['html']['hrefs'])) {
return;
}
foreach ($this->theParts['html']['hrefs'] as $key => $val) {
// Form elements cannot use jumpurl!
if ($this->jumperURL_prefix && $val['tag'] != 'form') {
if ($this->jumperURL_useId) {
$substVal = $this->jumperURL_prefix.$key;
$substVal = $this->jumperURL_prefix . $key;
} else {
$substVal = $this->jumperURL_prefix.t3lib_div::rawUrlEncodeFP($val['absRef']);
$substVal = $this->jumperURL_prefix . t3lib_div::rawUrlEncodeFP($val['absRef']);
}
} else {
$substVal = $val['absRef'];
......
* @param string $content: the content to use to substitute
* @return string the changed content
*/
public function substHTTPurlsInPlainText($content) {
if (!$this->jumperURL_prefix) return $content;
public function substHTTPurlsInPlainText($content)
{
if (!$this->jumperURL_prefix) {
return $content;
}
$textpieces = explode("http://", $content);
$pieces = count($textpieces);
$textstr = $textpieces[0];
for($i = 1; $i<$pieces; $i++) {
for ($i = 1; $i < $pieces; $i++) {
$len = strcspn($textpieces[$i],chr(32).TAB.CRLF);
$len = strcspn($textpieces[$i], chr(32) . TAB . CRLF);
if (trim(substr($textstr,-1)) == '' && $len) {
if (trim(substr($textstr, -1)) == '' && $len) {
$lastChar = substr($textpieces[$i],$len-1,1);
$lastChar = substr($textpieces[$i], $len - 1, 1);
if (!preg_match('/[A-Za-z0-9\/#]/',$lastChar)) {
if (!preg_match('/[A-Za-z0-9\/#]/', $lastChar)) {
$len--;
}
$parts = array();
$parts[0] = "http://".substr($textpieces[$i],0,$len);
$parts[0] = "http://" . substr($textpieces[$i], 0, $len);
$parts[1] = substr($textpieces[$i],$len);
$parts[1] = substr($textpieces[$i], $len);
if ($this->jumperURL_useId) {
$this->theParts['plain']['link_ids'][$i] = $parts[0];
$parts[0] = $this->jumperURL_prefix.'-'.$i;
$parts[0] = $this->jumperURL_prefix . '-' . $i;
} else {
$parts[0] = $this->jumperURL_prefix.t3lib_div::rawUrlEncodeFP($parts[0]);
$parts[0] = $this->jumperURL_prefix . t3lib_div::rawUrlEncodeFP($parts[0]);
}
$textstr .= $parts[0].$parts[1];
$textstr .= $parts[0] . $parts[1];
} else {
$textstr .= 'http://'.$textpieces[$i];
$textstr .= 'http://' . $textpieces[$i];
}
}
return $textstr;
......
*
* @return void
*/
public function fixRollOvers() {
public function fixRollOvers()
{
$newContent = '';
$items = explode('.src',$this->theParts['html']['content']);
$items = explode('.src', $this->theParts['html']['content']);
if (count($items) <= 1) return;
if (count($items) <= 1) {
return;
}
foreach($items as $key => $part) {
foreach ($items as $key => $part) {
$sub = substr($part, 0, 200);
if (preg_match('/cid:part[^ "\']*/',$sub,$reg)) {
if (preg_match('/cid:part[^ "\']*/', $sub, $reg)) {
// The position of the string
$thePos = strpos($part,$reg[0]);
$thePos = strpos($part, $reg[0]);
// Finds the id of the media...
preg_match('/cid:part([^\.]*).*/',$sub,$reg2);
preg_match('/cid:part([^\.]*).*/', $sub, $reg2);
$theSubStr = $this->theParts['html']['media'][intval($reg2[1])]['absRef'];
if ($thePos && $theSubStr) {
// ... and substitutes the javaScript rollover image with this instead
// If the path is NOT and url, the reference is set to nothing
// ... and substitutes the javaScript rollover image with this instead
// If the path is NOT and url, the reference is set to nothing
if (!strpos(' '.$theSubStr, 'http://')) {
if (!strpos(' ' . $theSubStr, 'http://')) {
$theSubStr = 'http://';
}
$part = substr($part, 0, $thePos) . $theSubStr . substr($part,$thePos+strlen($reg[0]),strlen($part));
$part = substr($part, 0, $thePos) . $theSubStr . substr($part, $thePos + strlen($reg[0]), strlen($part));
}
}
$newContent .= $part . ((($key+1) != count($items)) ? '.src' : '');
$newContent .= $part . ((($key + 1) != count($items)) ? '.src' : '');
}
$this->theParts['html']['content'] = $newContent;
}
/*******************************************
*
* File and URL-functions
......
* @param string $inputstr: the string to encode
* @return string the encoded string
*/
public function makeBase64($inputstr) {
public function makeBase64($inputstr)
{
return chunk_split(base64_encode($inputstr));
}
......
* @param string $url: the URL to get information of
* @return mixed either false or the array with information
*/
public function getExtendedURL($url) {
public function getExtendedURL($url)
{
$res = array();
$res['content'] = $this->getURL($url);
if (!$res['content']) return false;
if (!$res['content']) {
return FALSE;
}
$pathInfo = parse_url($url);
$fileInfo = $this->split_fileref($pathInfo['path']);
switch ($fileInfo['fileext']) {
case 'gif':
case 'png':
$res['content_type'] = 'image/'.$fileInfo['fileext'];
$res['content_type'] = 'image/' . $fileInfo['fileext'];
break;
break;
case 'jpg':
case 'jpeg':
$res['content_type'] = 'image/jpeg';
break;
break;
case 'html':
case 'htm':
$res['content_type'] = 'text/html';
break;
break;
case 'css':
$res['content_type'] = 'text/css';
break;
break;
case 'swf':
$res['content_type'] = 'application/x-shockwave-flash';
break;
break;
default:
$res['content_type'] = $this->getMimeType($url);
}
......
* @param string $url: the URL
* @return string the URL with the added values
*/
public function addUserPass($url) {
public function addUserPass($url)
{
$user = $this->http_username;
$pass = $this->http_password;
$matches = array();
if ($user && $pass && preg_match('/^(https?:\/\/)/', $url, $matches)) {
return $matches[1].$user.':'.$pass.'@'.substr($url,strlen($matches[1]));
return $matches[1] . $user . ':' . $pass . '@' . substr($url, strlen($matches[1]));
}
return $url;
}
......
* @param string $url: the URL to fetch
* @return string the content of the URL
*/
public function getURL($url) {
public function getURL($url)
{
$url = $this->addUserPass($url);
return t3lib_div::getURL($url);
}
......
* @param string $url: the URL to load
* @return the content
*/
public function getStrippedURL($url) {
public function getStrippedURL($url)
{
$content = '';
if ($fd = fopen($url, "rb")) {
while (!feof($fd)) {
......
* @param string $url: the url
* @return string $mimeType: the mime type found in the header
*/
public function getMimeType($url) {
public function getMimeType($url)
{
$mimeType = '';
$headers = trim(t3lib_div::getURL($url, 2));
if ($headers) {
......
* @param string $ref: address to use
* @return string the absolute address
*/
public function absRef($ref) {
public function absRef($ref)
{
$ref = trim($ref);
$info = parse_url($ref);
if ($info['scheme']) {
return $ref;
} elseif (preg_match('/^\//',$ref)) {
} elseif (preg_match('/^\//', $ref)) {
$addr = parse_url($this->theParts['html']['path']);
return $addr['scheme'].'://'.$addr['host'].($addr['port']?':'.$addr['port']:'').$ref;
return $addr['scheme'] . '://' . $addr['host'] . ($addr['port'] ? ':' . $addr['port'] : '') . $ref;
} else {
// If the reference is relative, the path is added, in order for us to fetch the content
// If the reference is relative, the path is added, in order for us to fetch the content
return $this->theParts['html']['path'] . $ref;
}
}
......
* @param string $fileref: the file to use
* @return array path, filename, filebody, fileext
*/
public function split_fileref($fileref) {
public function split_fileref($fileref)
{
$info = array();
if (preg_match('/(.*\/)(.*)$/', $fileref, $reg)) {
$info['path'] = $reg[1];
$info['file'] = $reg[2];
} else {
} else {
$info['path'] = '';
$info['file'] = $fileref;
}
......
$info['filebody'] = $reg[1];
$info['fileext'] = strtolower($reg[2]);
$info['realFileext'] = $reg[2];
} else {
} else {
$info['filebody'] = $info['file'];
$info['fileext'] = '';
}
......
* @param string $path: url to check
* @return array information about the path / URL
*/
public function extParseUrl($path) {
public function extParseUrl($path)
{
$res = parse_url($path);
preg_match('/(.*\/)([^\/]*)$/', $res['path'], $reg);
$res['filepath'] = $reg[1];
......
* @param mixed $tagArray: the list of tags (either as array or string if it is one tag)
* @return string the regular expression
*/
public function tag_regex($tags) {
public function tag_regex($tags)
{
$tags = (!is_array($tags) ? array($tags) : $tags);
$regexp = '/';
$c = count($tags);
foreach($tags as $tag) {
foreach ($tags as $tag) {
$c--;
$regexp .= '<' . $tag . '[[:space:]]' . (($c) ? '|' : '');
}
......
* If an attribute is empty (like OPTION) the value of that key is just empty. Check it with is_set();
*
* @param string $tag: is either like this "<TAG OPTION ATTRIB=VALUE>" or
* this " OPTION ATTRIB=VALUE>" which means you can omit the tag-name
* this " OPTION ATTRIB=VALUE>" which means you can omit the tag-name
* @return array array with attributes as keys in lower-case
*/
public function get_tag_attributes($tag) {
public function get_tag_attributes($tag)
{
$attributes = array();
$tag = ltrim(preg_replace('/^<[^ ]*/','',trim($tag)));
$tag = ltrim(preg_replace('/^<[^ ]*/', '', trim($tag)));
$tagLen = strlen($tag);
$safetyCounter = 100;
// Find attribute
......
$reg = preg_split('/[[:space:]=>]/', $tag, 2);
$attrib = $reg[0];
$tag = ltrim(substr($tag,strlen($attrib),$tagLen));
$tag = ltrim(substr($tag, strlen($attrib), $tagLen));
if (substr($tag,0,1) == '=') {
if (substr($tag, 0, 1) == '=') {
$tag = ltrim(substr($tag,1,$tagLen));
$tag = ltrim(substr($tag, 1, $tagLen));
if (substr($tag,0,1) == '"') {
if (substr($tag, 0, 1) == '"') {
// Quotes around the value
$reg = explode('"',substr($tag,1,$tagLen),2);
$reg = explode('"', substr($tag, 1, $tagLen), 2);
$tag = ltrim($reg[1]);
$value = $reg[0];
} else {
// No quotes around value
preg_match('/^([^[:space:]>]*)(.*)/',$tag,$reg);
preg_match('/^([^[:space:]>]*)(.*)/', $tag, $reg);
$value = trim($reg[1]);
$tag = ltrim($reg[2]);
if (substr($tag,0,1) == '>') {
if (substr($tag, 0, 1) == '>') {
$tag = '';
}
}
}
$attributes[strtolower($attrib)] = $value;
$safetyCounter--;
if ($safetyCounter < 0) break;
if ($safetyCounter < 0) {
break;
}
}
}
return $attributes;
}
......
*
* @param string Content to encode
* @return string The QP encoded string
* @deprecated since TYPO3 4.0, will be removed in TYPO3 4.6
* @deprecated since TYPO3 4.0, will be removed in TYPO3 4.6
*/
public function quoted_printable($string) {
public function quoted_printable($string)
{
t3lib_div::logDeprecatedFunction();
return t3lib_div::quoted_printable($string, 76);
......
*
* @param string $name: the name
* @return string the name
* @deprecated since TYPO3 4.0, will be removed in TYPO3 4.6
* @deprecated since TYPO3 4.0, will be removed in TYPO3 4.6
*/
public function convertName($name) {
public function convertName($name)
{
t3lib_div::logDeprecatedFunction();
return $name;
... This diff was truncated because it exceeds the maximum size that can be displayed.
(31-31/93)