tag is currently not supported.
'
Drupal
Drupal
' => "DrupalDrupal\n",
'
Drupal' => "/Drupal/\n",
'
Drupal
' => "======== DRUPAL ==============================================================\n\n",
'
Drupal
Drupal
' => "======== DRUPAL ==============================================================\n\nDrupal\n\n",
'
Drupal
' => "-------- DRUPAL --------------------------------------------------------------\n\n",
'
Drupal
Drupal
' => "-------- DRUPAL --------------------------------------------------------------\n\nDrupal\n\n",
'
Drupal
' => ".... Drupal\n\n",
'
Drupal
Drupal
' => ".... Drupal\n\nDrupal\n\n",
'
Drupal
' => ".. Drupal\n\n",
'
Drupal
Drupal
' => ".. Drupal\n\nDrupal\n\n",
'
Drupal
' => "Drupal\n\n",
'
Drupal
Drupal
' => "Drupal\n\nDrupal\n\n",
'
Drupal
' => "Drupal\n\n",
'
Drupal
Drupal
' => "Drupal\n\nDrupal\n\n",
'
Drupal
' => "------------------------------------------------------------------------------\nDrupal\n------------------------------------------------------------------------------\n",
'
Drupal
' => "------------------------------------------------------------------------------\nDrupal\n------------------------------------------------------------------------------\n",
'
Drupal
Drupal
' => "------------------------------------------------------------------------------\nDrupal\n------------------------------------------------------------------------------\nDrupal\n\n",
'
Drupal' => "/Drupal/\n",
'
Drupal
' => "Drupal\n\n",
'
Drupal
Drupal
' => "Drupal\n\nDrupal\n\n",
'
Drupal' => "*Drupal*\n",
// @todo Tables are currently not supported.
'
' => "DrupalDrupalDrupalDrupal\n",
'
Drupal
' => "Drupal\nDrupal\n\n",
// @todo The
tag is currently not supported.
'Drupal' => "Drupal\n",
'' => " * Drupal\n\n",
'' => " * Drupal /Drupal/ Drupal\n\n",
// @todo Lines containing nothing but spaces should be trimmed.
'' => " * Drupal\n * 1) Drupal\n 2) Drupal\n \n\n",
'' => " * Drupal\n * 1) Drupal\n \n * Drupal\n\n",
'' => " * Drupal\n * Drupal\n\n",
'Drupal
' => " * Drupal\n\nDrupal\n\n",
'
- Drupal
' => " 1) Drupal\n\n",
'
- Drupal
' => " 1) Drupal\n 2) * Drupal\n * Drupal\n \n\n",
'
- Drupal
- Drupal
' => " 1) Drupal\n 2) Drupal\n\n",
'
Drupal
' => "Drupal\n\n",
'
- Drupal
Drupal
' => " 1) Drupal\n\nDrupal\n\n",
'
- Drupal
' => "Drupal\n\n",
'
- Drupal
- Drupal
' => "Drupal\n Drupal\n\n",
'
- Drupal
- Drupal
- Drupal
- Drupal
' => "Drupal\n Drupal\nDrupal\n Drupal\n\n",
'
- Drupal
- Drupal
Drupal
' => "Drupal\n Drupal\n\nDrupal\n\n",
'
- Drupal
- Drupal
' => "Drupal\n Drupal\n\n",
'
- Drupal
Drupal
' => "Drupal\n\nDrupal\n\n",
// @todo Again, lines containing only spaces should be trimmed.
'
- Drupal
- Drupal
- Drupal
- Drupal
- Drupal
- Drupal
' => " * Drupal\n * Drupal\n Drupal\n Drupal\n Drupal\n \n * Drupal\n\n",
// Tests malformed HTML tags.
'
Drupal
Drupal' => "Drupal\nDrupal\n",
'
Drupal
Drupal' => "------------------------------------------------------------------------------\nDrupal\n------------------------------------------------------------------------------\nDrupal\n",
'
- Drupal
- Drupal
' => " 1) Drupal\n 2) Drupal\n\n",
'
' => " * Drupal /Drupal/ Drupal\n\n",
'
- Drupal
- Drupal' => " * Drupal\n * Drupal\n\n",
'' => " * Drupal\n * Drupal\n\n",
'' => "Drupal\n\n",
'Drupal
Drupal' => "Drupal\n * Drupal\n",
'Drupal
' => "Drupal\n\n",
'Drupal
Drupal
' => "Drupal\n\nDrupal\n\n",
'Drupal' => "Drupal\n",
// Tests some unsupported HTML tags.
'Drupal' => "Drupal\n",
// @todo Perhaps the contents of ' => "Drupal\n",
// A couple of tests for Unicode characters.
'I will be back…
' => "I /will/ be back…\n",
'FrançAIS is ÜBER-åwesome' => "FrançAIS is ÜBER-åwesome\n",
];
foreach ($tests as $html => $text) {
$this->assertHtmlToText($html, $text, 'Supported tags');
}
}
/**
* Tests allowing tags in \Drupal\Core\Mail\MailFormatHelper::htmlToText().
*/
public function testDrupalHtmlToTextArgs() {
// The second parameter of \Drupal\Core\Mail\MailFormatHelper::htmlToText()
// overrules the allowed tags.
$this->assertHtmlToText(
'Drupal Drupal Drupal',
"Drupal *Drupal* Drupal\n",
'Allowed tag found',
['b']
);
$this->assertHtmlToText(
'Drupal Drupal
Drupal',
"Drupal Drupal Drupal\n",
'Disallowed tag not found',
['b']
);
$this->assertHtmlToText(
'Drupal
Drupal
Drupal',
"Drupal Drupal Drupal\n",
'Disallowed
, , and tags not found',
['a', 'br', 'h1']
);
$this->assertHtmlToText(
'Drupal',
"Drupal\n",
'Unsupported and tags not found',
['html', 'body']
);
}
/**
* Test that whitespace is collapsed.
*/
public function testDrupalHtmltoTextCollapsesWhitespace() {
$input = "Drupal Drupal\n\nDrupal
Drupal Drupal\n\nDrupal
Drupal Drupal\n\nDrupal
";
// @todo The whitespace should be collapsed.
$collapsed = "Drupal Drupal\n\nDrupalDrupal Drupal\n\nDrupalDrupal Drupal\n\nDrupal\n\n";
$this->assertHtmlToText(
$input,
$collapsed,
'Whitespace is collapsed',
['p']
);
}
/**
* Test that text separated by block-level tags in HTML get separated by
* (at least) a newline in the plaintext version.
*/
public function testDrupalHtmlToTextBlockTagToNewline() {
$input = '[text]'
. '[blockquote]
'
. '
[br]'
. '- [dl-dt]
'
. '- [dt]
'
. '- [dd]
'
. '- [dd-dl]
'
. '[h1]
'
. '[h2]
'
. '[h3]
'
. '[h4]
'
. '[h5]
'
. '[h6]
'
. '
[hr]'
. '- [ol-li]
'
. '- [li]
'
. '- [li-ol]
'
. '[p]
'
. ''
. '[text]';
$output = MailFormatHelper::htmlToText($input);
$pass = $this->assertFalse(
preg_match('/\][^\n]*\[/s', $output),
'Block-level HTML tags should force newlines'
);
if (!$pass) {
$this->verbose($this->stringToHtml($output));
}
$output_upper = Unicode::strtoupper($output);
$upper_input = Unicode::strtoupper($input);
$upper_output = MailFormatHelper::htmlToText($upper_input);
$pass = $this->assertEqual(
$upper_output,
$output_upper,
'Tag recognition should be case-insensitive'
);
if (!$pass) {
$this->verbose(
$upper_output
. '
should be equal to
'
. $output_upper
);
}
}
/**
* Test that headers are properly separated from surrounding text.
*/
public function testHeaderSeparation() {
$html = 'DrupalDrupal
Drupal';
// @todo There should be more space above the header than below it.
$text = "Drupal\n======== DRUPAL ==============================================================\n\nDrupal\n";
$this->assertHtmlToText($html, $text,
'Text before and after tag');
$html = '
Drupal
Drupal
Drupal';
// @todo There should be more space above the header than below it.
$text = "Drupal\n\n======== DRUPAL ==============================================================\n\nDrupal\n";
$this->assertHtmlToText($html, $text,
'Paragraph before and text after tag');
$html = 'DrupalDrupal
Drupal
';
// @todo There should be more space above the header than below it.
$text = "Drupal\n======== DRUPAL ==============================================================\n\nDrupal\n\n";
$this->assertHtmlToText($html, $text,
'Text before and paragraph after tag');
$html = '
Drupal
Drupal
Drupal
';
$text = "Drupal\n\n======== DRUPAL ==============================================================\n\nDrupal\n\n";
$this->assertHtmlToText($html, $text,
'Paragraph before and after tag');
}
/**
* Test that footnote references are properly generated.
*/
public function testFootnoteReferences() {
global $base_path, $base_url;
$source = 'Host and path'
. '
Host, no path'
. '
Path, no host'
. '
Relative path';
// @todo Footnote URLs should be absolute.
$tt = "Host and path [1]"
. "\nHost, no path [2]"
// @todo The following two references should be combined.
. "\nPath, no host [3]"
. "\nRelative path [4]"
. "\n"
. "\n[1] http://www.example.com/node/1"
. "\n[2] http://www.example.com"
// @todo The following two references should be combined.
. "\n[3] $base_url/node/1"
. "\n[4] node/1\n";
$this->assertHtmlToText($source, $tt, 'Footnotes');
}
/**
* Test that combinations of paragraph breaks, line breaks, linefeeds,
* and spaces are properly handled.
*/
public function testDrupalHtmlToTextParagraphs() {
$tests = [];
$tests[] = [
'html' => "
line 1
\nline 2
line 3\n
line 4
paragraph
",
// @todo Trailing line breaks should be trimmed.
'text' => "line 1\nline 2\nline 3\nline 4\n\nparagraph\n\n",
];
$tests[] = [
'html' => "line 1
line 2
line 4
line 5
0
",
// @todo Trailing line breaks should be trimmed.
'text' => "line 1\nline 2\n\nline 4\nline 5\n\n0\n\n",
];
foreach ($tests as $test) {
$this->assertHtmlToText($test['html'], $test['text'], 'Paragraph breaks');
}
}
/**
* Tests \Drupal\Core\Mail\MailFormatHelper::htmlToText() wrapping.
*
* RFC 3676 says, "The Text/Plain media type is the lowest common
* denominator of Internet email, with lines of no more than 998 characters."
*
* RFC 2046 says, "SMTP [RFC-821] allows a maximum of 998 octets before the
* next CRLF sequence."
*
* RFC 821 says, "The maximum total length of a text line including the
* is 1000 characters."
*/
public function testVeryLongLineWrap() {
$input = 'Drupal
' . str_repeat('x', 2100) . '
Drupal';
$output = MailFormatHelper::htmlToText($input);
$eol = Settings::get('mail_line_endings', PHP_EOL);
$maximum_line_length = 0;
foreach (explode($eol, $output) as $line) {
// We must use strlen() rather than Unicode::strlen() in order to count
// octets rather than characters.
$maximum_line_length = max($maximum_line_length, strlen($line . $eol));
}
$verbose = 'Maximum line length found was ' . $maximum_line_length . ' octets.';
$this->assertTrue($maximum_line_length <= 1000, $verbose);
}
/**
* Tests that trailing whitespace is removed before newlines.
*
* @see \Drupal\Core\Mail\MailFormatHelper::wrapMail()
*/
public function testRemoveTrailingWhitespace() {
$text = "Hi there! \nHerp Derp";
$mail_lines = explode("\n", MailFormatHelper::wrapMail($text));
$this->assertNotEqual(" ", substr($mail_lines[0], -1), 'Trailing whitespace removed.');
}
/**
* Tests that trailing whitespace from Usenet style signatures is not removed.
*
* RFC 3676 says, "This is a special case; an (optionally quoted or quoted and
* stuffed) line consisting of DASH DASH SP is neither fixed nor flowed."
*
* @see \Drupal\Core\Mail\MailFormatHelper::wrapMail()
*/
public function testUsenetSignature() {
$text = "Hi there!\n-- \nHerp Derp";
$mail_lines = explode("\n", MailFormatHelper::wrapMail($text));
$this->assertEqual("-- ", $mail_lines[1], 'Trailing whitespace not removed for dash-dash-space signatures.');
$text = "Hi there!\n-- \nHerp Derp";
$mail_lines = explode("\n", MailFormatHelper::wrapMail($text));
$this->assertEqual("--", $mail_lines[1], 'Trailing whitespace removed for incorrect dash-dash-space signatures.');
}
}