assertEqual($result, $text, Html::escape($message)); $verbose = 'html =
' . $this->stringToHtml($html)
      . '

' . 'result =
' . $this->stringToHtml($result)
      . '

' . 'expected =
' . $this->stringToHtml($text)
      . '
'; $this->verbose($verbose); if (!$pass) { $this->pass("Previous test verbose info:
$verbose"); } } /** * Test supported tags of \Drupal\Core\Mail\MailFormatHelper::htmlToText(). */ public function testTags() { global $base_path, $base_url; $tests = [ // @todo Trailing linefeeds should be trimmed. 'Drupal.org' => "Drupal.org [1]\n\n[1] https://www.drupal.org\n", // @todo Footer URLs should be absolute. "Homepage" => "Homepage [1]\n\n[1] $base_url/\n", '
Drupal
' => "Drupal\n", // @todo The
tag is currently not supported. '
Drupal
Drupal
' => "DrupalDrupal\n", 'Drupal' => "*Drupal*\n", // @todo There should be a space between the '>' and the text. '
Drupal
' => ">Drupal\n", '
Drupal
Drupal
' => ">Drupal\n>Drupal\n", '
Drupal
Drupal

Drupal' => "Drupal\nDrupal\nDrupal\n", '
Drupal
Drupal

Drupal' => "Drupal\nDrupal\nDrupal\n", // @todo There should be two line breaks before the paragraph. '
Drupal
Drupal

Drupal

Drupal

' => "Drupal\nDrupal\nDrupal\nDrupal\n\n", '
Drupal
' => "Drupal\n", // @todo The
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. '
DrupalDrupal
DrupalDrupal
' => "DrupalDrupalDrupalDrupal\n", '
Drupal

Drupal

' => "Drupal\nDrupal\n\n", // @todo The tag is currently not supported. 'Drupal' => "Drupal\n", '
  • Drupal
' => " * Drupal\n\n", '
  • Drupal Drupal Drupal
' => " * Drupal /Drupal/ Drupal\n\n", // @todo Lines containing nothing but spaces should be trimmed. '
  • Drupal
    1. Drupal
    2. Drupal
' => " * Drupal\n * 1) Drupal\n 2) Drupal\n \n\n", '
  • Drupal
    1. Drupal
  • Drupal
' => " * Drupal\n * 1) Drupal\n \n * Drupal\n\n", '
  • Drupal
  • Drupal
' => " * Drupal\n * Drupal\n\n", '
  • Drupal

Drupal

' => " * Drupal\n\nDrupal\n\n", '
  1. Drupal
' => " 1) Drupal\n\n", '
  1. Drupal
    • Drupal
    • Drupal
' => " 1) Drupal\n 2) * Drupal\n * Drupal\n \n\n", '
  1. Drupal
  2. Drupal
' => " 1) Drupal\n 2) Drupal\n\n", '
    Drupal
' => "Drupal\n\n", '
  1. 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", '
  1. Drupal
  2. Drupal
' => " 1) Drupal\n 2) Drupal\n\n", '
  • Drupal Drupal Drupal
' => " * Drupal /Drupal/ Drupal\n\n", '
  • Drupal
  • Drupal' => " * Drupal\n * Drupal\n\n", '
    • Drupal
    • Drupal
    ' => " * Drupal\n * Drupal\n\n", '
      Drupal
    ' => "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]' . '
    1. [ol-li]
    2. ' . '
    3. [li]
    4. ' . '
    5. [li-ol]
    ' . '

    [p]

    ' . '
    • [ul-li]
    • ' . '
    • [li-ul]
    ' . '[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 = 'Drupal

    Drupal

    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 = 'Drupal

    Drupal

    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.'); } }