1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005 |
- # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
- # frozen_string_literal: true
- require 'rails_helper'
- RSpec.describe String do
- describe '#strip' do
- context 'default behavior' do
- it 'removes leading/trailing spaces' do
- expect(' test '.strip).to eq('test')
- end
- it 'removes trailing newlines' do
- expect("test\n".strip).to eq('test')
- end
- it 'does not remove internal spaces / newlines' do
- expect("test \n test".strip).to eq("test \n test")
- end
- end
- context 'monkey-patched behavior' do
- it 'removes leading/trailing zero-width spaces, but not internal ones' do
- expect(" \r\n test \u{200B} \n test\u{200B} \u{200B}".strip)
- .to eq("test \u{200B} \n test")
- end
- it 'does not break on non-unicode strings' do
- expect(described_class.new("\xC2\xA92011 Z ", encoding: 'ASCII-8BIT').strip)
- .to eq(described_class.new("\xC2\xA92011 Z", encoding: 'ASCII-8BIT'))
- end
- end
- end
- describe '#strip!' do
- context 'default behavior' do
- it 'removes leading/trailing spaces (in place)' do
- str = +' test '
- expect(str.strip!).to be(str).and eq('test')
- end
- it 'removes trailing newlines (in place)' do
- str = +"test\n"
- expect(str.strip!).to be(str).and eq('test')
- end
- it 'does not remove internal spaces / newlines (in place)' do
- str = +"test \n test "
- expect(str.strip!).to be(str).and eq(str)
- end
- end
- context 'monkey-patched behavior' do
- it 'removes leading/trailing zero-width spaces, but not internal ones (in place)' do
- str = +" \r\n test \u{200B} \n test\u{200B} \u{200B}"
- expect(str.strip!).to be(str).and eq("test \u{200B} \n test")
- end
- it 'does not break on invalid-unicode strings (in place)' do
- str = described_class.new("\xC2\xA92011 Z ", encoding: 'ASCII-8BIT')
- expect(str.strip!)
- .to be(str).and eq(described_class.new("\xC2\xA92011 Z", encoding: 'ASCII-8BIT'))
- end
- end
- end
- describe '#to_filename' do
- it 'does not modify strings in place' do
- %w[test Some::File].each do |str|
- expect { str.to_filename }.not_to change { str }
- end
- end
- it 'leaves all-downcase strings as-is' do
- expect('test'.to_filename).to eq('test')
- end
- it 'converts camelcase Ruby constant paths to snakecase file paths' do
- expect('Some::File'.to_filename).to eq('some/file')
- end
- end
- describe '#to_classname' do
- it 'does not modify strings in place' do
- %w[test some/file].each do |str|
- expect { str.to_classname }.not_to change { str }
- end
- end
- it 'capitalizes all-downcase strings' do
- expect('test'.to_classname).to eq('Test')
- end
- it 'converts snakecase file paths to camelcase Ruby constant paths' do
- expect('some/file'.to_classname).to eq('Some::File')
- end
- context 'unlike ActiveSupport’s #classify' do
- it 'preserves pluralized names' do
- expect('some/files'.to_classname).to eq('Some::Files')
- expect('some_test/files'.to_classname).to eq('SomeTest::Files')
- end
- end
- end
- describe '#html2text' do
- it 'does not modify strings in place' do
- %w[test <div>test</div>].each do |str|
- expect { str.html2text }.not_to change { str }
- end
- end
- it 'leaves human-readable text as-is' do
- expect('test'.html2text).to eq('test')
- end
- it 'strips leading/trailing spaces' do
- expect(' test '.html2text).to eq('test')
- end
- it 'also strips leading/trailing newlines' do
- expect("\n\n test \n\n\n".html2text).to eq('test')
- end
- it 'strips HTML tags around text content' do
- expect('<div>test</div>'.html2text).to eq('test')
- end
- it 'strips trailing <br> inside last <div>' do
- expect('<div>test<br></div>'.html2text).to eq('test')
- end
- it 'strips trailing <br> and newlines inside last <div>' do
- expect("<div>test<br><br><br>\n<br>\n<br>\n</div>".html2text).to eq('test')
- end
- it 'strips trailing <br>, newlines, and spaces inside last <div>' do
- expect("<div>test<br><br> <br> \n<br> \n<br> \n</div>".html2text).to eq('test')
- end
- it 'strips trailing <br>, newlines, and inside last <div>' do
- expect("<div>test<br><br> <br> \n<br> \n<br> \n</div>".html2text).to eq('test')
- end
- it 'strips trailing whitespace (including & <br>) both inside and after last tag' do
- expect("<div>test<br><br> <br> \n<br> \n<br> \n</div> ".html2text).to eq('test')
- end
- it 'also strips nested HTML tags' do
- expect("<p><span>Was\nsoll verbessert werden:</span></p>".html2text)
- .to eq('Was soll verbessert werden:')
- end
- it 'in <pre> elements, collapses multiple newlines into one' do
- expect("<pre>test\n\ntest</pre>".html2text).to eq("test\ntest")
- end
- it 'in <code> elements, collapses multiple newlines into one' do
- expect("<code>test\n\ntest</code>".html2text).to eq("test\ntest")
- end
- it 'converts <table> cells and row to space-separated lines' do
- expect(<<~HTML.chomp.html2text).to eq(<<~TEXT.chomp)
- <table><tr><td>test</td><td>col</td></td></tr><tr><td>test</td><td>4711</td></tr></table>
- HTML
- test col
- test 4711
- TEXT
- end
- it 'strips HTML comments' do
- expect(<<~HTML.chomp.html2text).to eq(<<~TEXT.chomp)
- <!-- some comment -->
- <div>
- test<br><br><br>
- <br>
- <br>
- </div>
- HTML
- test
- TEXT
- end
- it 'converts <a> elements to plain text with numerical references' do
- expect(<<~HTML.chomp.html2text).to eq(<<~TEXT.chomp)
- <div><a href="https://zammad.org">Best Tool of the World</a>
- some other text</div>
- <div>
- HTML
- [1] Best Tool of the Worldsome other text
- [1] https://zammad.org
- TEXT
- end
- it 'converts <hr> elements to separate paragraphs containing only "___"' do
- expect(<<~HTML.chomp.html2text).to eq(<<~TEXT.chomp)
- <!-- some comment -->
- <div>
- test<br><br><br>
- <hr/>
- <br>
- </div>
- HTML
- test
- ___
- TEXT
- end
- it 'converts <br> elements to newlines (max. 2)' do
- expect(<<~HTML.chomp.html2text).to eq(<<~TEXT.chomp)
- test<br><br><br>--<br>abc</div>
- HTML
- test
- --
- abc
- TEXT
- end
- it 'strips Microsoft Outlook conditional comments' do
- expect(<<~HTML.chomp.html2text).to eq(<<~TEXT.chomp)
- Ihr RZ-Team<br />
- <br />
- <!--[if gte mso 9]><xml> <o:DocumentProperties> <o:Author>test</o:Author> =
- <o:Template>A75DB76E.dotm</o:Template> <o:LastAuthor>test</o:LastAuthor> =
- <o:Revision>5</o:Revision> <o:Created>2011-05-18T07:08:00Z</o:Created> <=
- o:LastSaved>2011-07-04T17:59:00Z</o:LastSaved> <o:Pages>1</o:Pages> <o:Wo=
- rds>189</o:Words> <o:Characters>1192</o:Characters> <o:Lines>9</o:Lines> =
- <o:Paragraphs>2</o:Paragraphs> <o:CharactersWithSpaces>1379</o:Characters=
- WithSpaces> <o:Version>11.5606</o:Version> </o:DocumentProperties></xml><!=
- [endif]-->
- HTML
- Ihr RZ-Team
- TEXT
- end
- it 'strips <img> elements' do
- expect(<<~HTML.chomp.html2text).to eq(<<~TEXT.chomp)
- <html>
- <head>
- <title>Neues Fax von 1234-93900</title>
- </head>
- <body style="margin: 0px;padding: 0px;font-family: Arial, sans-serif;font-size: 12px;">
- <table cellpadding="0" cellspacing="0" width="100%" height="100%" bgcolor="#d9e7f0" id="mailbg"
- style="empty-cells:show;font-size: 12px;line-height: 18px;color: #000000;font-family: Arial, sans-serif;width: 100%;height: 100%;background-color: #d9e7f0;padding: 0px;margin: 0px;">
- <tr>
- <td valign="top">
- <center>
- <br><br>
- <table width="560" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF" id="mailcontainer"
- style="empty-cells:show;font-size: 12px;line-height: 18px;color: #000000;font-family: Arial, sans-serif;width: 560px;margin: 0px auto;padding: 0px;background-color: #FFFFFF;">
- <tr>
- <td colspan="3" width="560" id="mail_header" valign="top" style="width: 560px;background-color: #FFFFFF;font-family: Arial, sans-serif;color: #000000;padding: 0px;margin: 0px;">
- <table width="560" cellpadding="0" cellspacing="0" style="empty-cells:show;font-size: 12px;line-height: 18px;color: #000000;font-family: Arial, sans-serif;">
- <tr>
- <td height="10" colspan="4" style="font-size:0px;line-height: 0px;padding:0px;height:10px;">
- <img src="http://www.example.docm/static/example.docm/mailtemplates/de_DE/team/img/tpl_header.gif" style="padding: 0px;margin: 0px;">
- </td>
- </tr>
- <tr>
- <td height="12" colspan="4"><span style="font-size:0px;line-height:0px;"> </span></td>
- </tr>
- <tr>
- <td height="27" width="30"> </td>
- <td height="27" width="397"><span class="mailtitle" style="font-family: Arial, sans-serif;color: #000000;font-size: 18px;line-height: 18px;font-weight: normal;">Neues Fax</span></td>
- <td height="27" width="103"><img src="http://www.example.docm/static/example.docm/mailtemplates/de_DE/team/img/tpl_logo-example.gif" style="padding: 0px;margin: 0px;"></td>
- <td height="27" width="30"></td>
- </tr>
- <tr>
- <td height="20" colspan="4"><span style="font-size:0px;line-height:0px;"> </span></td>
- </tr>
- <tr>
- <td height="1" colspan="4" style="font-size:0px;line-height: 0px;padding:0px;">
- <img src="http://www.example.docm/static/example.docm/mailtemplates/de_DE/team/img/tpl_line-grey.gif" style="padding: 0px;margin: 0px;">
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td colspan="3" width="560"> </td>
- </tr>
- <tr>
- <td width="30"> </td>
- <td width="500" height="30" valign="middle" align="right">
- <span class="accountno" style="font-family: Arial, sans-serif;font-size: 10px;color: #666666;">Ihre Kundennummer: 12345678</span>
- </td>
- <td width="30"> </td>
- </tr>
- HTML
- Neues Fax von 1234-93900
- Neues Fax
- Ihre Kundennummer: 12345678
- TEXT
- end
- it 'converts characters written in HTML ampersand code' do
- expect(<<~HTML.chomp.html2text).to eq(<<~TEXT.chomp)
- line 1<br>
- you<br/>
- -----&
- HTML
- line\u00A01
- you
- -----&
- TEXT
- end
- it 'converts <ul> to asterisk-demarcated list' do
- expect(<<~HTML.chomp.html2text).to eq(<<~TEXT.chomp)
- \u0020<ul><li>#1</li><li>#2</li></ul>
- HTML
- * #1
- * #2
- TEXT
- end
- it 'strips HTML frontmatter and <head> element' do
- expect(<<~HTML.chomp.html2text).to eq(<<~TEXT.chomp)
- <!DOCTYPE html>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
- <head>
- <body style="font-family:Geneva,Helvetica,Arial,sans-serif; font-size: 12px;">
- <div>> Welcome!</div><div>></div><div>> Thank you for installing Zammad.</div><div>></div>
- </body>
- </html>
- HTML
- > Welcome!
- >
- > Thank you for installing Zammad.
- >
- TEXT
- end
- it 'strips <style> elements' do
- expect(<<~HTML.chomp.html2text).to eq(<<~TEXT.chomp)
- \u0020 <style type="text/css">
- body {
- width:90% !important;
- -webkit-text-size-adjust:90%;
- -ms-text-size-adjust:90%;
- font-family:'helvetica neue', helvetica, arial, geneva, sans-serif; f=
- ont-size: 12px;;
- }
- img {
- outline:none; text-decoration:none; -ms-interpolation-mode: bicubic;
- }
- a img {
- border:none;
- }
- table td {
- border-collapse: collapse;
- }
- table {
- border-collapse: collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;
- }
- p, table, div, td {
- max-width: 600px;
- }
- p {
- margin: 0;
- }
- blockquote, pre {
- margin: 0px;
- padding: 8px 12px 8px 12px;
- }
- </style><p>some other content</p>
- HTML
- some other content
- TEXT
- end
- it 'strips <meta> elements' do
- expect(<<~HTML.chomp.html2text).to eq(<<~TEXT.chomp)
- \u0020 IT-Infrastruktur</span><br>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <meta name="Generator" content="Microsoft Word 14 (filtered
- medium)">
- <!--[if !mso]><style>v:* {behavior:url(#default#VML);}
- o:* {behavior:url(#default#VML);}
- w:* {behavior:url(#default#VML);}
- .shape {behavior:url(#default#VML);}
- </style><![endif]-->
- <style><!--
- @font-face
- {font-family:calibri;
- panose-1:2 15 5 2 2 2 4 3 2 4;}
- @font-face
- {font-family:tahoma;
- panose-1:2 11 6 4 3 5 4 4 2 4;}
- p.msonormal, li.msonormal, div.msonormal
- {margin:0cm;
- margin-bottom:.0001pt;
- font-size:11.0pt;
- font-family:"calibri","sans-serif";
- mso-fareast-language:en-us;}
- a:link, span.msohyperlink
- {mso-style-priority:99;
- color:blue;
- text-decoration:underline;}
- a:visited, span.msohyperlinkfollowed
- {mso-style-priority:99;
- color:purple;
- text-decoration:underline;}
- p.msoacetate, li.msoacetate, div.msoacetate
- {mso-style-priority:99;
- mso-style-link:"sprechblasentext zchn";
- margin:0cm;
- margin-bottom:.0001pt;
- font-size:8.0pt;
- font-family:"tahoma","sans-serif";
- mso-fareast-language:en-us;}
- span.e-mailformatvorlage17
- {mso-style-type:personal;
- font-family:"calibri","sans-serif";
- color:windowtext;}
- span.sprechblasentextzchn
- {mso-style-name:"sprechblasentext zchn";
- mso-style-priority:99;
- mso-style-link:sprechblasentext;
- font-family:"tahoma","sans-serif";}
- .msochpdefault
- {mso-style-type:export-only;
- font-family:"calibri","sans-serif";
- mso-fareast-language:en-us;}
- @page wordsection1
- {size:612.0pt 792.0pt;
- margin:70.85pt 70.85pt 2.0cm 70.85pt;}
- div.wordsection1
- {page:wordsection1;}
- --></style><!--[if gte mso 9]><xml>
- <o:shapedefaults v:ext="edit" spidmax="1026" />
- </xml><![endif]--><!--[if gte mso 9]><xml>
- <o:shapelayout v:ext="edit">
- <o:idmap v:ext="edit" data="1" />
- </o:shapelayout></xml><![endif]-->
- HTML
- IT-Infrastruktur
- TEXT
- end
- it 'separates block-level elements by one newline (<p> following a non-<p> block gets two)' do
- expect(<<~HTML.chomp.html2text).to eq(<<~TEXT.chomp)
- <h1>some head</h1>
- some content
- <blockquote>
- <p>line 1</p>
- <p>line 2</p>
- </blockquote>
- <p>some text later</p>
- HTML
- some head
- some content
- > line 1
- > line 2
- some text later
- TEXT
- end
- it 'formats <blockquote> contents with leading "> "' do
- expect(<<~HTML.chomp.html2text).to eq(<<~TEXT.chomp)
- <h1>some head</h1>
- some content
- <blockquote>
- line 1<br/>
- line 2<br>
- </blockquote>
- <p>some text later</p>
- HTML
- some head
- some content
- > line 1
- > line 2
- some text later
- TEXT
- end
- it 'adds max. 2 newlines between block-level <blockquote> contents' do
- expect(<<~HTML.chomp.html2text).to eq(<<~TEXT.chomp)
- <h1>some head</h1>
- some content
- <blockquote>
- <div><div>line 1</div><br></div>
- <div><div>line 2</div><br></div>
- </blockquote>
- some text later
- HTML
- some head
- some content
- > line 1
- >
- > line 2
- some text later
- TEXT
- end
- it 'places numerical <a> references at end of text string' do
- expect(<<~HTML.chomp.html2text).to eq(<<~TEXT.chomp)
- <p>Best regards,</p>
- <p><i>Your Team Team</i></p>
- <p>P.S.: You receive this e-mail because you are listed in our database as person who ordered a Team license. Please click
- <a href="http://www.teamviewer.example/en/company/unsubscribe.aspx?id=1009645&ident=xxx">here</a> to unsubscribe from further e-mails.</p>
- -----------------------------
- <br />
- HTML
- Best regards,
- Your Team Team
- P.S.: You receive this e-mail because you are listed in our database as person who ordered a Team license. Please click [1] here to unsubscribe from further e-mails.
- -----------------------------
- [1] http://www.teamviewer.example/en/company/unsubscribe.aspx?id=1009645&ident=xxx
- TEXT
- end
- it 'handles elements with missing closing tags' do
- expect(<<~HTML.chomp.html2text).to eq(<<~TEXT.chomp)
- <div><br>Dave and leaned her
- days adam.</div><span style="color:#F7F3FF; font-size:8px">Maybe we
- want any help me that.<br>Next morning charlie saw at their
- father.<br>Well as though adam took out here. Melvin will be more money.\u0020
- Called him into this one last thing.<br>Men-----------------------
- <br />
- HTML
- Dave and leaned her days adam.
- Maybe we want any help me that.
- Next morning charlie saw at their father.
- Well as though adam took out here. Melvin will be more money. Called him into this one last thing.
- Men-----------------------
- TEXT
- end
- context 'html encoding' do
- it 'converts Ä in Ä' do
- expect('<div>test something.Ä</div>'.html2text)
- .to eq('test something.Ä')
- end
- it 'strips invalid html encoding chars' do
- expect('<div>test something.�</div>'.html2text)
- .to eq('test something.í ˝')
- end
- end
- context 'performance tests' do
- let(:filler) do
- %(#{%(<p>some word <a href="http://example.com?domain?example.com">some url</a> and the end.</p>\n) * 11}\n)
- end
- it 'converts a 1076-byte unicode file in under 2s' do
- expect { Timeout.timeout(2) { <<~HTML.chomp.html2text } }.not_to raise_error
- <html>
- <title>some title</title>
- <body>
- <div>hello</div>
- #{filler}
- </body>
- </html>
- HTML
- end
- it 'converts a 2.21 MiB unicode file in under 2s' do
- expect { Timeout.timeout(2) { <<~HTML.chomp.html2text } }.not_to raise_error
- <html>
- <title>some title</title>
- <body>
- <div>hello</div>
- #{filler * 2312}
- </body>
- </html>
- HTML
- end
- end
- end
- describe '#html2html_strict' do
- it 'leaves human-readable text as-is' do
- expect('test'.html2html_strict.first).to eq('test')
- end
- it 'strips leading/trailing spaces' do
- expect(' test '.html2html_strict.first).to eq('test')
- end
- it 'also strips leading/trailing newlines' do
- expect("\n\n test \n\n\n".html2html_strict.first).to eq('test')
- end
- it 'also strips leading <br>' do
- expect('<br><br><div>abc</div>'.html2html_strict.first).to eq('<div>abc</div>')
- end
- it 'also strips trailing <br> & spaces' do
- expect('<div>abc</div><br> <br>'.html2html_strict.first).to eq('<div>abc</div>')
- end
- it 'leaves <b> as-is' do
- expect('<b>test</b>'.html2html_strict.first).to eq('<b>test</b>')
- end
- it 'downcases tag names' do
- expect('<B>test</B>'.html2html_strict.first).to eq('<b>test</b>')
- end
- it 'leaves <i> as-is' do
- expect('<i>test</i>'.html2html_strict.first).to eq('<i>test</i>')
- end
- it 'leaves <h1> as-is' do
- expect('<h1>test</h1>'.html2html_strict.first).to eq('<h1>test</h1>')
- end
- it 'leaves <h2> as-is' do
- expect('<h2>test</h2>'.html2html_strict.first).to eq('<h2>test</h2>')
- end
- it 'leaves <h3> as-is' do
- expect('<h3>test</h3>'.html2html_strict.first).to eq('<h3>test</h3>')
- end
- it 'leaves <pre> as-is' do
- expect("<pre>a\nb\nc</pre>".html2html_strict.first).to eq("<pre>a\nb\nc</pre>")
- end
- it 'leaves <pre> nested inside <div> as-is' do
- expect("<div><pre>a\nb\nc</pre></div>".html2html_strict.first).to eq("<div><pre>a\nb\nc</pre></div>")
- end
- it 'strips HTML comments' do
- expect('<h3>test</h3><!-- some comment -->'.html2html_strict.first).to eq('<h3>test</h3>')
- end
- it 'strips <html>/<body> tags & <head> elements' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <html><head><base href="x-msg://2849/"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><div lang="DE" link="blue" vlink="purple"><div class="Section1" style="page: Section1; "><div style="margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; margin-bottom: 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif; "><span style="font-size: 10pt; font-family: Arial, sans-serif; ">Hello Martin,<o:p></o:p></span></div>
- HTML
- <div lang="DE">Hello Martin,</div>
- TEXT
- end
- it 'strips <span> tags' do
- expect('<span></span>'.html2html_strict.first).to eq('')
- end
- it 'keeps style with color in <span>' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <span style="color: red; bgcolor: red">Hello Martin,</span>
- HTML
- <span style="color: red;">Hello Martin,</span>
- TEXT
- end
- it 'remove style=#ffffff with color in <span>' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <span style="color: #ffffff; bgcolor: red">Hello Martin,</span>
- HTML
- Hello Martin,
- TEXT
- end
- it 'strips <span> tags, id/class attrs, and <o:*> (MS Office) tags' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div id="123" class="WordSection1">
- <p class="MsoNormal"><span style="color:#1F497D">Guten Morgen, Frau Koppenhagen,<o:p></o:p></span></p>
- <p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
- <p class="MsoNormal"><span style="color:#1F497D">vielen Dank für die Reservierung. Dabei allerdings die Sprache (Niederländisch) nicht erwähnt. Können Sie bitte dieses in Ihrer Reservierung vormerken?<o:p></o:p></span></p>
- <p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
- <p class="MsoNormal"><span style="color:#1F497D">Nochmals vielen Dank und herzliche Grüße
- <o:p></o:p></span></p>
- <div>
- HTML
- <div>
- <p><span style="color:#1f497d;">Guten Morgen, Frau Koppenhagen,</span></p><p><span style="color:#1f497d;"> </span></p><p><span style="color:#1f497d;">vielen Dank für die Reservierung. Dabei allerdings die Sprache (Niederländisch) nicht erwähnt. Können Sie bitte dieses in Ihrer Reservierung vormerken?</span></p><p><span style="color:#1f497d;"> </span></p><p><span style="color:#1f497d;">Nochmals vielen Dank und herzliche Grüße </span></p></div>
- TEXT
- end
- it 'strips <font> tags' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <p><font size="2"><a style="color: " href="http://www.example.com/?wm=mail"><img border="0" src="cid:example_new.png@8B201D8C.000B" width="101" height="30"></a></font></p>
- HTML
- <p><a href="http://www.example.com/?wm=mail" rel="nofollow noreferrer noopener" target="_blank" title="http://www.example.com/?wm=mail"><img border="0" src="cid:example_new.png@8B201D8C.000B" style="width:101px;height:30px;"></a></p>
- TEXT
- end
- it 'strips extraneous whitespace from end of opening tag' do
- expect('<b >test</b>'.html2html_strict.first).to eq('<b>test</b>')
- end
- it 'strips extraneous whitespace from closing tag' do
- expect('<b >test</b >'.html2html_strict.first).to eq('<b>test</b>')
- end
- it 'does not detect < /b > as closing tag; converts chars and auto-closes tag' do
- expect('<b >test< /b >'.html2html_strict.first).to eq('<b>test< /b ></b>')
- end
- it 'does not detect <\n/b> as closing tag; converts chars and auto-closes tag' do
- expect("<b\n>test<\n/b>".html2html_strict.first).to eq('<b>test< /b></b>')
- end
- it 'collapses multiple whitespace-only <p> into one with ' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <p> </p><p> </p><p> </p>
- HTML
- <p> </p>
- TEXT
- end
- it 'keeps lang attr on <p>' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <p lang="DE"><b><span></span></b></p>
- HTML
- <p lang="DE"></p>
- TEXT
- end
- it 'strips <span> inside <p>' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <p lang="DE"><b><span>Hello Martin,</span></b></p>
- HTML
- <p lang="DE"><b>Hello Martin,</b></p>
- TEXT
- end
- it 'strips empty <p> keep <p>s with content' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <p> </p><p>123</p><p></p>
- HTML
- <p> </p><p>123</p>
- TEXT
- end
- it 'strips <br> between <p>' do
- expect('<p> </p><br><br><p> </p>'.html2html_strict.first).to eq('<p> </p><p> </p>')
- end
- it 'auto-adds missing closing brackets on tags, but not opening brackets' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <b id=123 classs="
- some_class"
- >test<
- /b>
- HTML
- <b>test< /b></b>
- TEXT
- end
- it 'auto-adds missing closing tags' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <ul id=123 classs="
- some_class"
- ><li>test</li>
- <li class="asasd">test</li><
- /ul>
- HTML
- <ul>
- <li>test</li>
- <li>test</li>< /ul></ul>
- TEXT
- end
- it 'auto-closes <div> with missing closing tag; removes </p> with missing opening tag' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- Damit Sie keinen Tag versäumen, empfehlen wir Ihnen den <a href="http://newsletters.cylex.de/" class="">Link des Adventkalenders</a> in<br class=""> Ihrer Lesezeichen-Symbolleiste zu ergänzen.</p><div class="">
- HTML
- Damit Sie keinen Tag versäumen, empfehlen wir Ihnen den <a href="http://newsletters.cylex.de/" rel="nofollow noreferrer noopener" target="_blank" title="http://newsletters.cylex.de/">Link des Adventkalenders</a> in<br> Ihrer Lesezeichen-Symbolleiste zu ergänzen.<div> </div>
- TEXT
- end
- it 'intelligently inserts missing </td> & </tr> tags (and ignores misplaced </table> tags)' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <table>
- <tr>
- <td bgcolor=white><font size=2 face="sans-serif"><b>Franz Schäfer</b></font>
- <tr>
- <td bgcolor=white><font size=2 face="sans-serif">Manager Information Systems</font></table>
- <br>
- <table>
- <tr>
- <td bgcolor=white><font size=2 face="sans-serif">Telefon </font>
- <td bgcolor=white><font size=2 face="sans-serif">+49 000 000 8565</font>
- <tr>
- <td colspan=2 bgcolor=white><font size=2 face="sans-serif">christian.schaefer@example.com</font></table>
- <br>
- <table>
- HTML
- <table>
- <tr>
- <td>
- <b>Franz Schäfer</b>
- </td>
- </tr>
- <tr>
- <td>Manager Information Systems</td>
- </tr>
- </table>
- <br>
- <table>
- <tr>
- <td> Telefon </td>
- <td> +49 000 000 8565 </td>
- </tr>
- <tr>
- <td colspan="2">christian.schaefer@example.com</td>
- </tr>
- </table>
- TEXT
- end
- it 'ignores invalid (misspelled) attrs' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <b id=123 classs="
- some_class">test</b>
- HTML
- <b>test</b>
- TEXT
- end
- it 'strips incomplete CSS rules' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <p><a style="color: " href="http://www.example.com/?wm=mail"><img border="0" src="cid:example_new.png@8B201D8C.000B" width="101" height="30"></a></p>
- HTML
- <p><a href="http://www.example.com/?wm=mail" rel="nofollow noreferrer noopener" target="_blank" title="http://www.example.com/?wm=mail"><img border="0" src="cid:example_new.png@8B201D8C.000B" style="width:101px;height:30px;"></a></p>
- TEXT
- end
- context 'for whitespace-only <div>' do
- it 'preserves a single space' do
- expect('<div> </div>'.html2html_strict.first).to eq('<div> </div>')
- end
- it 'converts a lone <br> to ' do
- expect('<div><br></div>'.html2html_strict.first).to eq('<div> </div>')
- end
- it 'converts three <br> to one ' do
- expect('<div style="max-width: 600px;"><br><br><br></div>'.html2html_strict.first).to eq('<div> </div>')
- end
- it 'collapses two nested, whitespace-only <div> into a single ' do
- expect('<div><div> </div><div> </div></div>'.html2html_strict.first).to eq('<div> </div>')
- end
- it 'collapses three nested, whitespace-only <div> into a single ' do
- expect('<div><div> </div><div> </div><div> </div></div>'.html2html_strict.first).to eq('<div> </div>')
- end
- it 'collapses 2+ nested, whitespace-only <p> into \n<p> </p>' do
- expect('<div><p> </p><p> </p></div>'.html2html_strict.first).to eq("<div>\n<p> </p></div>")
- end
- end
- context 'for <div> with content' do
- it 'also strips trailing/leading newlines inside <div>' do
- expect("<div>\n\n\ntest\n\n\n</div>".html2html_strict.first).to eq('<div>test</div>')
- end
- it 'also strips trailing/leading newlines & tabs inside <div>' do
- expect("<div>\n\t\ntest\n\t\n</div>".html2html_strict.first).to eq('<div>test</div>')
- end
- it 'also strips trailing/leading newlines & tabs inside <div>, but not internal spaces' do
- expect("<div>\n\t\ntest 123\n\t\n</div>".html2html_strict.first).to eq('<div>test 123</div>')
- end
- it 'strips newlines from trailing whitespace; leaves up to two <br> (with spaces) as-is' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div>
- <br> <p><b>Description</b></p>
- <br> <br> </div>
- HTML
- <div>
- <br> <p><b>Description</b></p><br> <br> </div>
- TEXT
- end
- it 'strips newlines from trailing whitespace; collapses 3+ <br> into two' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div>
- <br> <p><b>Description</b></p>
- <br> <br> <br> </div>
- HTML
- <div>
- <br> <p><b>Description</b></p><br><br></div>
- TEXT
- end
- it 'removes unnecessary <div> nesting' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div><div>Hello Martin,</div></div>
- HTML
- <div>Hello Martin,</div>
- TEXT
- end
- it 'keeps innermost <div> when removing nesting' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div lang="DE"><div><div>Hello Martin,</div></div></div>
- HTML
- <div lang="DE">Hello Martin,</div>
- TEXT
- end
- it 'keeps style with color in <div>' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div style="color: red; bgcolor: red">Hello Martin,</div>
- HTML
- <div style="color: red;">Hello Martin,</div>
- TEXT
- end
- it 'remove style=#ffffff with color in <div>' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div style="color: #ffffff; bgcolor: red">Hello Martin,</div>
- HTML
- <div>Hello Martin,</div>
- TEXT
- end
- it 'rearranges whitespace in nested <div>' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div lang="DE"><div><div>Hello Martin,</div> </div></div>
- HTML
- <div lang="DE">
- <div>Hello Martin,</div></div>
- TEXT
- end
- it 'adds newline where <br> starts or ends <div> content' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div style="max-width: 600px;"><br>abc<br><br></div>
- HTML
- <div>
- <br>abc<br><br>
- </div>
- TEXT
- end
- it 'leaves <s> nested in <div> as-is (?)' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div><s>abc</s></div>
- HTML
- <div><s>abc</s></div>
- TEXT
- end
- it 'collapses multiple whitespace-only <p> into one with ' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div><p> </p>
- <p> </p>
- <p> </p>
- </div>
- HTML
- <div>
- <p> </p></div>
- TEXT
- end
- it 'strips <div> tags when they contain only <p>' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div>lala<div lang="DE"><p><span>Hello Martin,</span></p></div></div>
- HTML
- <div>lala<div lang="DE"><p>Hello Martin,</p></div></div>
- TEXT
- end
- end
- context 'link handling' do
- it 'adds rel & target attrs to <a> tags' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <a href="http://web.de">web.de</a>
- HTML
- <a href="http://web.de" rel="nofollow noreferrer noopener" target="_blank">web.de</a>
- TEXT
- end
- it 'removes id attrs' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <a id="123" href="http://web.de">web.de</a>
- HTML
- <a href="http://web.de" rel="nofollow noreferrer noopener" target="_blank">web.de</a>
- TEXT
- end
- it 'removes class/id attrs' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <a href="http://example.com" class="abc" id="123">http://example.com</a>
- HTML
- <a href="http://example.com" rel="nofollow noreferrer noopener" target="_blank">http://example.com</a>
- TEXT
- end
- it 'downcases <a> tags' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <A href="http://example.com?a=1;">http://example.com?a=1;</A>
- HTML
- <a href="http://example.com?a=1;" rel="nofollow noreferrer noopener" target="_blank">http://example.com?a=1;</a>
- TEXT
- end
- it 'doesn’t downcase href attr or inner text' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <A href="http://example.com/withSoMeUpper/And/downCase">http://example.com/withSoMeUpper/And/downCase</A>
- HTML
- <a href="http://example.com/withSoMeUpper/And/downCase" rel="nofollow noreferrer noopener" target="_blank">http://example.com/withSoMeUpper/And/downCase</a>
- TEXT
- end
- it 'automatically wraps <a> tags around valid URLs' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div>https://www.facebook.com/test</div>
- HTML
- <div>\n<a href="https://www.facebook.com/test" rel="nofollow noreferrer noopener" target="_blank">https://www.facebook.com/test</a>\n</div>
- TEXT
- end
- it 'does not wrap URLs if leading https?:// is missing' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- some text www.example.com some other text
- HTML
- some text www.example.com some other text
- TEXT
- end
- it 'adds missing http:// to href attr (but not inner text)' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- web <a href="www.example.com"><span style="color:blue">www.example.com</span></a>
- HTML
- web <a href="http://www.example.com" rel="nofollow noreferrer noopener" target="_blank"><span style="color:blue;">www.example.com</span></a>
- TEXT
- end
- it 'includes URL parameters when wrapping URL in <a> tag' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <p>https://wiki.lab.example.com/doku.php?id=xxxx:start&a=1;#ldap</p>
- HTML
- <p><a href="https://wiki.lab.example.com/doku.php?id=xxxx:start&a=1;#ldap" rel="nofollow noreferrer noopener" target="_blank">https://wiki.lab.example.com/doku.php?id=xxxx:start&a=1;#ldap</a></p>
- TEXT
- end
- it 'does not rewrap valid URLs that already have <a> tags' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <a href="http://example.com">http://example.com</a>
- HTML
- <a href="http://example.com" rel="nofollow noreferrer noopener" target="_blank">http://example.com</a>
- TEXT
- end
- it 'recognizes URL parameters when matching href to inner text' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <p><a href="https://wiki.lab.example.com/doku.php?id=xxxx:start&#ldap">https://wiki.lab.example.com/doku.php?id=xxxx:start&#ldap</a></p>
- HTML
- <p><a href="https://wiki.lab.example.com/doku.php?id=xxxx:start&#ldap" rel="nofollow noreferrer noopener" target="_blank">https://wiki.lab.example.com/doku.php?id=xxxx:start&#ldap</a></p>
- TEXT
- end
- it 'recognizes <br> as URL boundary' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div><br>https://www.facebook.com/test<br></div>
- HTML
- <div>
- <br><a href="https://www.facebook.com/test" rel="nofollow noreferrer noopener" target="_blank">https://www.facebook.com/test</a><br>\n</div>
- TEXT
- end
- it 'recognizes space as URL boundary' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- some text http://example.com some other text
- HTML
- some text <a href="http://example.com" rel="nofollow noreferrer noopener" target="_blank">http://example.com</a> some other text
- TEXT
- end
- it 'wraps valid URLs from <div> elements in <a> tags' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div>http://example.com</div>
- HTML
- <div>
- <a href="http://example.com" rel="nofollow noreferrer noopener" target="_blank">http://example.com</a>
- </div>
- TEXT
- end
- it 'recognizes trailing dot as URL boundary' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div>http://example.com.</div>
- HTML
- <div>
- <a href="http://example.com" rel="nofollow noreferrer noopener" target="_blank">http://example.com</a>.</div>
- TEXT
- end
- it 'does not add a leading newline if <div> begins with non-URL text' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div>lala http://example.com.</div>
- HTML
- <div>lala <a href="http://example.com" rel="nofollow noreferrer noopener" target="_blank">http://example.com</a>.</div>
- TEXT
- end
- it 'recognizes trailing comma as URL boundary' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div>http://example.com, and so on</div>
- HTML
- <div>
- <a href="http://example.com" rel="nofollow noreferrer noopener" target="_blank">http://example.com</a>, and so on</div>
- TEXT
- end
- it 'recognizes trailing comma as URL boundary (immediately following URL parameters)' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div>http://example.com?lala=me, and so on</div>
- HTML
- <div>
- <a href="http://example.com?lala=me" rel="nofollow noreferrer noopener" target="_blank">http://example.com?lala=me</a>, and so on</div>
- TEXT
- end
- it 'strips <a> tags when no href is present' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <a name="_MailEndCompose"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#44546A">Hello Mr Smith,<o:p></o:p></span></a>
- HTML
- <span style="color:#44546a;">Hello Mr Smith,</span>
- TEXT
- end
- context 'when <a> inner text is HTML elements' do
- it 'leaves <img> elements as-is' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <a href="http://example.com/?abc=123&123=abc" class="abc\n"\n><img src="cid:123"></a>
- HTML
- <a href="http://example.com/?abc=123&123=abc" rel="nofollow noreferrer noopener" target="_blank" title="http://example.com/?abc=123&123=abc"><img src="cid:123"></a>
- TEXT
- end
- it 'strips <span> tags, but not content' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <a href="http://facebook.de/examplesrbog"><span lang="EN-US" style='color:blue'>http://facebook.de/examplesrbog</span></a>
- HTML
- <a href="http://facebook.de/examplesrbog" rel="nofollow noreferrer noopener" target="_blank"><span lang="EN-US" style="color:blue;">http://facebook.de/examplesrbog</span></a>
- TEXT
- end
- it 'also strips surrounding <span> and <o:p> tags' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <span style="font-size:10.0pt;font-family:"Cambria",serif;color:#1F497D;mso-fareast-language:DE">web
- <a href="http://www.example.com"><span style="color:blue">www.example.com</span></a><o:p></o:p></span>
- HTML
- <span style="color:#1f497d;">web <a href="http://www.example.com" rel="nofollow noreferrer noopener" target="_blank"><span style="color:blue;">www.example.com</span></a></span>
- TEXT
- end
- end
- context 'when <a> inner text and href do not match' do
- it 'adds title attr' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <a href="http://example.com">http://what-different.example.com</a>
- HTML
- <a href="http://example.com" rel="nofollow noreferrer noopener" target="_blank" title="http://example.com">http://what-different.example.com</a>
- TEXT
- end
- it 'converts unsafe characters in href attr and title' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <a href="http://example.com %22test%22">http://what-different.example.com</a>
- HTML
- <a href="http://example.com%20%22test%22" rel="nofollow noreferrer noopener" target="_blank" title="http://example.com%20%22test%22">http://what-different.example.com</a>
- TEXT
- end
- it 'does not add title attr (for different capitalization)' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <a href="http://example.com">http://EXAMPLE.com</a>
- HTML
- <a href="http://example.com" rel="nofollow noreferrer noopener" target="_blank">http://EXAMPLE.com</a>
- TEXT
- end
- it 'does not add title attr (for URL-safe/unsafe characters)' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <a href="http://example.com/?abc=123&123=abc">http://example.com?abc=123&123=abc</a>
- HTML
- <a href="http://example.com/?abc=123&123=abc" rel="nofollow noreferrer noopener" target="_blank">http://example.com?abc=123&123=abc</a>
- TEXT
- end
- end
- context 'for email links' do
- it 'strips <a> tags' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <a href="mailto:john.smith@example.com" style="color: blue; text-decoration: underline; ">john.smith@example.com</a>
- HTML
- <a href="mailto:john.smith@example.com">john.smith@example.com</a>
- TEXT
- end
- it 'strips <a> tags (even with upcased "MAILTO:")' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <a href="MAILTO:john.smith@example.com" style="color: blue; text-decoration: underline; ">john.smith@example.com</a>
- HTML
- <a href="MAILTO:john.smith@example.com">john.smith@example.com</a>
- TEXT
- end
- it 'extracts destination address when it differs from <a> innertext' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <a href="MAILTO:john.smith2@example.com" style="color: blue; text-decoration: underline; ">john.smith@example.com</a>
- HTML
- <a href="MAILTO:john.smith2@example.com">john.smith@example.com</a>
- TEXT
- end
- end
- end
- context 'for <img> tags' do
- it 'removes color CSS rule from style attr' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <img src="/some.png" style="color: blue; width: 30px; height: 50px">
- HTML
- <img src="/some.png" style=" width: 30px; height: 50px;">
- TEXT
- end
- it 'converts width/height attrs to CSS rules' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <img src="/some.png" width="30px" height="50px">
- HTML
- <img src="/some.png" style="width:30px;height:50px;">
- TEXT
- end
- it 'automatically adds terminal semicolons to CSS rules' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <img style="width: 181px; height: 125px" src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/...">
- HTML
- <img style="width: 181px; height: 125px;" src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/...">
- TEXT
- end
- context 'when <img> nested in <a>, nested in <p>' do
- it 'sanitizes those elements as normal' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <p class="MsoNormal"><a href="http://www.example.com/"><span style="color:blue;text-decoration:none"><img border="0" width="30" height="30" id="_x0000_i1030" src="cid:image001.png@01D172FC.F323CDB0"></span></a><o:p></o:p></p>
- HTML
- <p><a href="http://www.example.com/" rel="nofollow noreferrer noopener" target="_blank" title="http://www.example.com/"><span style="color:blue;"><img border="0" src="cid:image001.png@01D172FC.F323CDB0" style="width:30px;height:30px;"></span></a></p>
- TEXT
- end
- end
- end
- context 'sample email input' do
- it 'handles sample input 1' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div>
- abc<p><b>Von:</b> Fritz Bauer [mailto:me@example.com] <br><b>Gesendet:</b> Donnerstag, 3. Mai 2012 11:51<br><b>An:</b> John Smith<br><b>Cc:</b> Smith, John Marian; johnel.fratczak@example.com; ole.brei@example.com; Günther John | Example GmbH; bkopon@example.com; john.heisterhagen@team.example.com; sven.rocked@example.com; michael.house@example.com; tgutzeit@example.com<br><b>Betreff:</b> Re: OTRS::XXX Erweiterung - Anhänge an CI's </p></div>
- HTML
- <div>abc<span class="js-signatureMarker"></span><p><b>Von:</b> Fritz Bauer [mailto:me@example.com] <br><b>Gesendet:</b> Donnerstag, 3. Mai 2012 11:51<br><b>An:</b> John Smith<br><b>Cc:</b> Smith, John Marian; johnel.fratczak@example.com; ole.brei@example.com; Günther John | Example GmbH; bkopon@example.com; john.heisterhagen@team.example.com; sven.rocked@example.com; michael.house@example.com; tgutzeit@example.com<br><b>Betreff:</b> Re: OTRS::XXX Erweiterung - Anhänge an CI's </p></div>
- TEXT
- end
- it 'handles sample input 2' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div> abc<p> <b>Von:</b> Fritz Bauer [mailto:me@example.com] <br><b>Gesendet:</b> Donnerstag, 3. Mai 2012 11:51<br><b>An:</b> John Smith<br><b>Cc:</b> Smith, John Marian; johnel.fratczak@example.com; ole.brei@example.com; Günther John | Example GmbH; bkopon@example.com; john.heisterhagen@team.example.com; sven.rocked@example.com; michael.house@example.com; tgutzeit@example.com<br><b>Betreff:</b> Re: OTRS::XXX Erweiterung - Anhänge an CI's </p></div>
- HTML
- <div>abc<span class="js-signatureMarker"></span><p> <b>Von:</b> Fritz Bauer [mailto:me@example.com] <br><b>Gesendet:</b> Donnerstag, 3. Mai 2012 11:51<br><b>An:</b> John Smith<br><b>Cc:</b> Smith, John Marian; johnel.fratczak@example.com; ole.brei@example.com; Günther John | Example GmbH; bkopon@example.com; john.heisterhagen@team.example.com; sven.rocked@example.com; michael.house@example.com; tgutzeit@example.com<br><b>Betreff:</b> Re: OTRS::XXX Erweiterung - Anhänge an CI's </p></div>
- TEXT
- end
- it 'handles sample input 3' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div> abc<p> <b>Von:</b> Fritz Bauer [mailto:me@example.com] <br><b>Gesendet:</b> Donnerstag, 3. Mai 2012 11:51<br><b>An:</b> John Smith<br><b>Cc:</b> Smith, John Marian; johnel.fratczak@example.com; ole.brei@example.com; Günther John | Example GmbH; bkopon@example.com; john.heisterhagen@team.example.com; sven.rocked@example.com; michael.house@example.com; tgutzeit@example.com<br><b>Betreff:</b> Re: OTRS::XXX Erweiterung - Anhänge an CI's </p> </div>
- HTML
- <div>abc<span class="js-signatureMarker"></span><p> <b>Von:</b> Fritz Bauer [mailto:me@example.com] <br><b>Gesendet:</b> Donnerstag, 3. Mai 2012 11:51<br><b>An:</b> John Smith<br><b>Cc:</b> Smith, John Marian; johnel.fratczak@example.com; ole.brei@example.com; Günther John | Example GmbH; bkopon@example.com; john.heisterhagen@team.example.com; sven.rocked@example.com; michael.house@example.com; tgutzeit@example.com<br><b>Betreff:</b> Re: OTRS::XXX Erweiterung - Anhänge an CI's </p></div>
- TEXT
- end
- it 'handles sample input 4' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div style="margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; margin-bottom: 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif; "><span style="font-size: 10pt; font-family: Arial, sans-serif; ">Mit freundlichem Gruß<span class="Apple-converted-space"> </span><br><br>John Smith<br>Service und Support<br><br>Example Service AG & Co.<o:p></o:p></span></div><div style="margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; margin-bottom: 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif; "><span style="font-size: 10pt; font-family: Arial, sans-serif; ">Management OHG<br>Someware-Str. 4<br>xxxxx Someware<br><br></span><span style="font-size: 10pt; font-family: Arial, sans-serif; "><o:p></o:p></span></div><div style="margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; margin-bottom: 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif; "><span style="font-size: 10pt; font-family: Arial, sans-serif; ">Tel.: +49 001 7601 462<br>Fax: +49 001 7601 472</span><span style="font-size: 10pt; font-family: Arial, sans-serif; "><o:p></o:p></span></div><div style="margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; margin-bottom: 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif; "><span style="font-size: 10pt; font-family: Arial, sans-serif; "><a href="mailto:john.smith@example.com" style=color: blue; text-decoration: underline; ">john.smith@example.com</a></span><span style="font-size: 10pt; font-family: Arial, sans-serif; "><o:p></o:p></span></div><div style="margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; margin-bottom: 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif; "><span style="font-size: 10pt; font-family: Arial, sans-serif; "><a href="http://www.example.com" style="color: blue; text-decoration: underline; ">www.example.com</a></span><span style="font-size: 10pt; font-family: Arial, sans-serif; "><o:p></o:p></span></div>
- HTML
- <div><span>Mit freundlichem Gruß <br><br>John Smith<br>Service und Support<br><br>Example Service AG & Co.</span></div><div>
- <span>Management OHG<br>Someware-Str. 4<br>xxxxx Someware<br><br></span>
- </div><div>
- <span>Tel.: +49 001 7601 462<br>Fax: +49 001 7601 472</span>
- </div><div>
- <a href="mailto:john.smith@example.com">john.smith@example.com</a>
- </div><div>
- <a href="http://www.example.com" rel="nofollow noreferrer noopener" target="_blank">www.example.com</a>
- </div>
- TEXT
- end
- it 'handles sample input 5' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <body lang="DE" link="blue" vlink="purple"><div class="WordSection1">
- <p class="MsoNormal"><span style="color:#1F497D">Guten Morgen, Frau ABC,<o:p></o:p></span></p>
- <p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
- <p class="MsoNormal"><span style="color:#1F497D">vielen Dank für die Reservierung. Dabei allerdings die Sprache (Niederländisch) nicht erwähnt. Können Sie bitte dieses in Ihrer Reservierung vormerken?<o:p></o:p></span></p>
- <p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
- <p class="MsoNormal"><span style="color:#1F497D">Nochmals vielen Dank und herzliche Grüße
- <o:p></o:p></span></p>
- <div>
- <p class="MsoNormal"><b><span style="font-size:10.0pt;color:#1F497D"><o:p> </o:p></span></b></p>
- <p class="MsoNormal"><b><span style="font-size:10.0pt;color:#1F497D">Anna Smith<o:p></o:p></span></b></p>
- <p class="MsoNormal"><b><span style="font-size:10.0pt;color:#1F497D">art abc SEV GmbH<o:p></o:p></span></b></p>
- <p class="MsoNormal"><b><span style="font-size:10.0pt;color:#1F497D">art abc TRAV<o:p></o:p></span></b></p>
- <p class="MsoNormal"><span style="font-size:9.0pt;color:#1F497D">Marktstätte 123<o:p></o:p></span></p>
- <p class="MsoNormal"><span style="font-size:9.0pt;color:#1F497D">123456 Dorten<o:p></o:p></span></p>
- <p class="MsoNormal"><span style="font-size:9.0pt;color:#1F497D">T: +49 (0) 12345/1234560-1<o:p></o:p></span></p>
- <p class="MsoNormal"><span style="font-size:9.0pt;color:#1F497D">T: +49 (0) 12345/1234560-0<o:p></o:p></span></p>
- <p class="MsoNormal"><span style="font-size:9.0pt;color:#1F497D">F: +49 (0) 12345/1234560-2<o:p></o:p></span></p>
- <p class="MsoNormal"><a href="mailto:annad@example.com"><span style="font-size:9.0pt">annad@example.com</span></a><span style="font-size:9.0pt;color:#C00000"><o:p></o:p></span></p>
- <p class="MsoNormal"><a href="http://www.example.com/"><span style="font-size:9.0pt">www.example.com</span></a><span style="font-size:9.0pt;color:#1F497D">
- </span><a href="http://www.ABC.com/"><span style="font-size:9.0pt">www.ABC.com</span></a><span style="font-size:9.0pt;color:#1F497D"><o:p></o:p></span></p>
- <p class="MsoNormal"><span style="font-size:8.0pt;color:#1F497D">Geschäftsführer Vor Nach, VorUndZu Nach - Amtsgericht Dort HRB 12345 - Ein Unternehmer der ABC Gruppe<o:p></o:p></span></p>
- HTML
- <div>
- <p><span style="color:#1f497d;">Guten Morgen, Frau ABC,</span></p><p><span style="color:#1f497d;"> </span></p><p><span style="color:#1f497d;">vielen Dank für die Reservierung. Dabei allerdings die Sprache (Niederländisch) nicht erwähnt. Können Sie bitte dieses in Ihrer Reservierung vormerken?</span></p><p><span style="color:#1f497d;"> </span></p><p><span style="color:#1f497d;">Nochmals vielen Dank und herzliche Grüße </span></p><div>
- <p><b><span style="color:#1f497d;"> </span></b></p><p><b><span style="color:#1f497d;">Anna Smith</span></b></p><p><b><span style="color:#1f497d;">art abc SEV GmbH</span></b></p><p><b><span style="color:#1f497d;">art abc TRAV</span></b></p><p><span style="color:#1f497d;">Marktstätte 123</span></p><p><span style="color:#1f497d;">123456 Dorten</span></p><p><span style="color:#1f497d;">T: +49 (0) 12345/1234560-1</span></p><p><span style="color:#1f497d;">T: +49 (0) 12345/1234560-0</span></p><p><span style="color:#1f497d;">F: +49 (0) 12345/1234560-2</span></p><p><a href="mailto:annad@example.com">annad@example.com</a><span style="color:#c00000;"></span></p><p><a href="http://www.example.com/" rel="nofollow noreferrer noopener" target="_blank">www.example.com</a><span style="color:#1f497d;"> </span><a href="http://www.ABC.com/" rel="nofollow noreferrer noopener" target="_blank">www.ABC.com</a><span style="color:#1f497d;"></span></p><p><span style="color:#1f497d;">Geschäftsführer Vor Nach, VorUndZu Nach - Amtsgericht Dort HRB 12345 - Ein Unternehmer der ABC Gruppe</span></p></div></div>
- TEXT
- end
- it 'handles sample input 6' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
- <div>
- <div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm">
- <p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">Von:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> Besucherbüro, MKuk [<a href="mailto:besucherbuero@example.com">mailto:besucherbuero@example.com</a>] <br>
- <b>Gesendet:</b> Freitag, 16. Dezember 2016 08:05<br>
- <b>An:</b> 'Amaia Epalza'<br>
- <b>Betreff:</b> AW: Gruppe vtb Kultuur // 28.06.2017<o:p></o:p></span></p>
- </div>
- </div>
- <p class="MsoNormal"><o:p> </o:p></p>
- <p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Segoe UI","sans-serif";color:#1F497D">Reservierungsbestätigung Führung Skulptur-Projekte 2017 am
- </span></b><o:p></o:p></p>
- <p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Segoe UI","sans-serif";color:#1F497D"> </span><o:p></o:p></p>
- <p class="MsoNormal">Guten Morgen Frau Epalza,<o:p></o:p></p>
- HTML
- <p><span style="color:#1f497d;"> </span></p><div>
- <div>
- <span class="js-signatureMarker"></span><p><b>Von:</b><span> Besucherbüro, MKuk [<a href="mailto:besucherbuero@example.com">mailto:besucherbuero@example.com</a>] <br>
- <b>Gesendet:</b> Freitag, 16. Dezember 2016 08:05<br>
- <b>An:</b> 'Amaia Epalza'<br>
- <b>Betreff:</b> AW: Gruppe vtb Kultuur // 28.06.2017</span></p></div></div><p> </p><p><b><span style="color:#1f497d;">Reservierungsbestätigung Führung Skulptur-Projekte 2017 am </span></b></p><p><span style="color:#1f497d;"> </span></p><p>Guten Morgen Frau Epalza,</p>
- TEXT
- end
- it 'handles sample input 7' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div class="">Wir brauchen also die Instanz <a href="http://example.zammad.com" class="">example.zammad.com</a>, kann die aber nicht mehr nutzen.</div><div class=""><br class=""></div><div class="">Bitte um Freischaltung.</div><div class=""><br class=""></div><div class=""><br class=""><div class="">
- HTML
- <div>Wir brauchen also die Instanz <a href="http://example.zammad.com" rel="nofollow noreferrer noopener" target="_blank">example.zammad.com</a>, kann die aber nicht mehr nutzen.</div><div> </div><div>Bitte um Freischaltung.</div><div> </div>
- TEXT
- end
- it 'handles sample input 8' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US">oh jeee … Zauberwort vergessen ;-) Können Sie mir
- <b>bitte</b> noch meine Testphase verlängern?<o:p></o:p></span></p>
- <p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
- HTML
- <p><span style="color:#1f497d;">oh jeee … Zauberwort vergessen ;-) Können Sie mir <b>bitte</b> noch meine Testphase verlängern?</span></p><p><span style="color:#1f497d;"> </span></p>
- TEXT
- end
- it 'handles sample input 9' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div><a href="http://www.example.com/Community/Passwort-Vergessen/?module_fnc=ChangeForgotPassword&pwchangekey=secret_key" title="http://www.example.com/Community/Passwort-Vergessen/?module_fnc%5BextranetHandler%5D=ChangeForgotPassword&pwchangekey=secret_key" rel="nofollow" target="_blank">http://www.example.com/Community/Passwort-Vergessen/?module_fnc%5BextranetHandler%5D=ChangeForgotPassword&pwchangekey=secret_key</a></div>
- HTML
- <div><a href="http://www.example.com/Community/Passwort-Vergessen/?module_fnc=ChangeForgotPassword&pwchangekey=secret_key" title="http://www.example.com/Community/Passwort-Vergessen/?module_fnc%5BextranetHandler%5D=ChangeForgotPassword&pwchangekey=secret_key" rel="nofollow noreferrer noopener" target="_blank">http://www.example.com/Community/Passwort-Vergessen/?module_fnc%5BextranetHandler%5D=ChangeForgotPassword&pwchangekey=secret_key</a></div>
- TEXT
- end
- it 'handles sample input 10' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <tr style="height: 15pt;" class=""><td width="170" nowrap="" valign="bottom" style="width: 127.5pt; border-style: none none none solid; border-left-width: 1pt; border-left-color: windowtext; padding: 0cm 5.4pt; height: 15pt;" class=""><p class="MsoNormal" align="center" style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; text-align: center;"><span style="" class=""> </span></p></td><td width="58" nowrap="" valign="bottom" style="width: 43.5pt; padding: 0cm 5.4pt; height: 15pt;" class=""><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; text-align: center;" class=""><span style="" class="">20-29</span></div></td><td width="47" nowrap="" valign="bottom" style="width: 35pt; background-color: rgb(255, 199, 206); padding: 0cm 5.4pt; height: 15pt; background-position: initial initial; background-repeat: initial initial;" class=""><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; text-align: center;" class=""><span style="color: rgb(156, 0, 6);" class="">200</span></div></td><td width="76" nowrap="" valign="bottom" style="width: 57pt; background-color: rgb(255, 199, 206); padding: 0cm 5.4pt; height: 15pt; background-position: initial initial; background-repeat: initial initial;" class=""><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; text-align: center;" class=""><span style="color: rgb(156, 0, 6);" class="">-1</span></div></td><td width="76" nowrap="" valign="bottom" style="width: 57pt; border-style: none solid none none; border-right-width: 1pt; border-right-color: windowtext; background-color: rgb(255, 199, 206); padding: 0cm 5.4pt; height: 15pt; background-position: initial initial; background-repeat: initial initial;" class=""><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; text-align: center;" class=""><span style="color: rgb(156, 0, 6);" class="">201</span></div></td><td width="107" nowrap="" valign="bottom" style="width: 80pt; padding: 0cm 5.4pt; height: 15pt;" class=""></td><td width="85" nowrap="" valign="bottom" style="width: 64pt; padding: 0cm 5.4pt; height: 15pt;" class=""></td><td width="101" nowrap="" valign="bottom" style="width: 76pt; border-style: none solid solid; border-left-width: 1pt; border-left-color: windowtext; border-bottom-width: 1pt; border-bottom-color: gray; border-right-width: 1pt; border-right-color: gray; background-color: rgb(242, 242, 242); padding: 0cm 5.4pt; height: 15pt; background-position: initial initial; background-repeat: initial initial;" class=""><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; text-align: center;" class=""><b class=""><span style="font-size: 10pt; font-family: Arial, sans-serif;" class="">country</span></b><span style="font-size: 11pt; font-family: Calibri, sans-serif;" class=""></span></div></td><td width="87" nowrap="" valign="bottom" style="width: 65pt; border-style: none solid solid none; border-bottom-width: 1pt; border-bottom-color: gray; border-right-width: 1pt; border-right-color: gray; background-color: rgb(242, 242, 242); padding: 0cm 5.4pt; height: 15pt; background-position: initial initial; background-repeat: initial initial;" class=""><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; text-align: center;" class=""><span style="font-size: 10pt; font-family: Arial, sans-serif;" class="">Target (gross)</span></div></td><td width="123" nowrap="" valign="bottom" style="width: 92pt; border-style: none solid solid none; border-bottom-width: 1pt; border-bottom-color: gray; border-right-width: 1pt; border-right-color: gray; background-color: rgb(242, 242, 242); padding: 0cm 5.4pt; height: 15pt; background-position: initial initial; background-repeat: initial initial;" class=""><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; text-align: center;" class=""><span style="font-size: 10pt; font-family: Arial, sans-serif;" class="">Remaining Recruits</span></div></td><td width="87" nowrap="" valign="bottom" style="width: 65pt; border-style: none solid solid none; border-bottom-width: 1pt; border-bottom-color: gray; border-right-width: 1pt; border-right-color: windowtext; background-color: rgb(242, 242, 242); padding: 0cm 5.4pt; height: 15pt; background-position: initial initial; background-repeat: initial initial;" class=""><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; text-align: center;" class=""><span style="font-size: 10pt; font-family: Arial, sans-serif;" class="">Total Recruits</span></div></td></tr>
- HTML
- <tr>
- <td valign="bottom" style="width: 127.5pt; border-style: none none none solid; border-left-width: 1pt; border-left-color: windowtext; padding: 0cm 5.4pt;"><p> </p></td>
- <td valign="bottom" style="width: 43.5pt; padding: 0cm 5.4pt;"><div>20-29</div></td>
- <td valign="bottom" style="width: 35pt; background-color: rgb(255, 199, 206); padding: 0cm 5.4pt;"><div><span style="color: rgb(156, 0, 6);">200</span></div></td>
- <td valign="bottom" style="width: 57pt; background-color: rgb(255, 199, 206); padding: 0cm 5.4pt;"><div><span style="color: rgb(156, 0, 6);">-1</span></div></td>
- <td valign="bottom" style="width: 57pt; border-style: none solid none none; border-right-width: 1pt; border-right-color: windowtext; background-color: rgb(255, 199, 206); padding: 0cm 5.4pt;"><div><span style="color: rgb(156, 0, 6);">201</span></div></td>
- <td valign="bottom" style="width: 80pt; padding: 0cm 5.4pt;"></td>
- <td valign="bottom" style="width: 64pt; padding: 0cm 5.4pt;"></td>
- <td valign="bottom" style="width: 76pt; border-style: none solid solid; border-left-width: 1pt; border-left-color: windowtext; border-bottom-width: 1pt; border-bottom-color: gray; border-right-width: 1pt; border-right-color: gray; background-color: rgb(242, 242, 242); padding: 0cm 5.4pt;"><div>
- <b>country</b>
- </div></td>
- <td valign="bottom" style="width: 65pt; border-style: none solid solid none; border-bottom-width: 1pt; border-bottom-color: gray; border-right-width: 1pt; border-right-color: gray; background-color: rgb(242, 242, 242); padding: 0cm 5.4pt;"><div>Target (gross)</div></td>
- <td valign="bottom" style="width: 92pt; border-style: none solid solid none; border-bottom-width: 1pt; border-bottom-color: gray; border-right-width: 1pt; border-right-color: gray; background-color: rgb(242, 242, 242); padding: 0cm 5.4pt;"><div>Remaining Recruits</div></td>
- <td valign="bottom" style="width: 65pt; border-style: none solid solid none; border-bottom-width: 1pt; border-bottom-color: gray; border-right-width: 1pt; border-right-color: windowtext; background-color: rgb(242, 242, 242); padding: 0cm 5.4pt;"><div>Total Recruits</div></td>
- </tr>
- TEXT
- end
- it 'handles sample input 11' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div>Dear Bob<span style="line-height: 23.8px;">:</span><span style="color: rgb(255, 255, 255); line-height: 1.7;">Mr/Mrs</span></div><div><br></div><div><span style="line-height: 1.7;">We are one of the leading manufacturer and supplier of </span>conduits and cars since 3000.</div><div><br></div><div>Could you inform me the specification you need?</div><div><br></div><div>May I sent you our products catalogues for your reference?</div><div><br></div><div><img src="cid:5cb2783c$1$15ae9b384c8$Coremail$zhanabcdzhao$example.com" orgwidth="1101" orgheight="637" data-image="1" style="width: 722.7px; height: 418px; border: none;"></div><div>Best regards!</div><div><br></div><div><b style="line-height: 1.7;"><i><u><span lang="EL" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#17365D;\nmso-ansi-language:EL">Welcome to our booth B11/1 Hall 13 during SOMEWHERE\n9999.</span></u></i></b></div><div style="position:relative;zoom:1"><div>Bob Smith</div><div><div>Exp. & Imp.</div><div>Town Example Electric Co., Ltd.</div><div>Tel: 0000-11-12345678 (Ext-220) Fax: 0000-11-12345678 </div><div><span style="color:#17365d;">Room1234, NO. 638, Smith Road, Town, 200000, Somewhere</span></div><div>Web: www.example.com</div></div><div style="clear:both"></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div>
- HTML
- <div>\n<div>Dear Bob:<span style="color: rgb(255, 255, 255);">Mr/Mrs</span>
- </div><div> </div><div>We are one of the leading manufacturer and supplier of conduits and cars since 3000.</div><div> </div><div>Could you inform me the specification you need?</div><div> </div><div>May I sent you our products catalogues for your reference?</div><div> </div><div><img src="cid:5cb2783c$1$15ae9b384c8$Coremail$zhanabcdzhao$example.com" style="width: 722.7px; height: 418px;"></div><div>Best regards!</div><div> </div><div><b><i><u><span lang="EL" style="color:#17365d;">Welcome to our booth B11/1 Hall 13 during SOMEWHERE 9999.</span></u></i></b></div><div>\n<div>Bob Smith</div><div>\n<div>Exp. & Imp.</div><div>Town Example Electric Co., Ltd.</div><div>Tel: 0000-11-12345678 (Ext-220) Fax: 0000-11-12345678</div><div><span style="color:#17365d;">Room1234, NO. 638, Smith Road, Town, 200000, Somewhere</span></div><div>Web: www.example.com</div></div></div></div>
- TEXT
- end
- it 'handles sample input 12' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <li><a style="font-size:15px; font-family:Arial;color:#0f7246" class="text_link" href="http://business-catalogs.example.com/ODtpbGs5MWIzbjUyYzExLTA4Yy06Mmg7N3AvL3R0bmFvY3B0LXlhbW9sc2Nhb3NnYy5lL3RpbXJlZi9lbS9ycnJuaWFpZXMsdGxnY25pLGUsdXJ0b3NVTGVpNWZ8fGZh"><span style="color: rgb(0, 0, 0);">Luxemburg</span></a></li>
- HTML
- <li><a href="http://business-catalogs.example.com/ODtpbGs5MWIzbjUyYzExLTA4Yy06Mmg7N3AvL3R0bmFvY3B0LXlhbW9sc2Nhb3NnYy5lL3RpbXJlZi9lbS9ycnJuaWFpZXMsdGxnY25pLGUsdXJ0b3NVTGVpNWZ8fGZh" rel="nofollow noreferrer noopener" target="_blank" title="http://business-catalogs.example.com/ODtpbGs5MWIzbjUyYzExLTA4Yy06Mmg7N3AvL3R0bmFvY3B0LXlhbW9sc2Nhb3NnYy5lL3RpbXJlZi9lbS9ycnJuaWFpZXMsdGxnY25pLGUsdXJ0b3NVTGVpNWZ8fGZh">Luxemburg</a></li>
- TEXT
- end
- # https://github.com/zammad/zammad/issues/4112
- it 'converts lists from MS Outlook correctly' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <p class="MsoPlainText" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l0 level1 lfo1">
- <![if !supportLists]><span style="font-family:Symbol;mso-fareast-language:EN-US"><span style="mso-list:Ignore">·<span style="font:7.0pt "Times New Roman"">
- </span></span></span><![endif]><span style="mso-fareast-language:EN-US">1<o:p></o:p></span></p>
- <p class="MsoPlainText" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l0 level1 lfo1">
- <![if !supportLists]><span style="font-family:Symbol;mso-fareast-language:EN-US"><span style="mso-list:Ignore">·<span style="font:7.0pt "Times New Roman"">
- </span></span></span><![endif]><span style="mso-fareast-language:EN-US">2<o:p></o:p></span></p>
- HTML
- <p>• 1</p><p>• 2</p>
- TEXT
- end
- # https://github.com/zammad/zammad/issues/4184
- it 'deletes downlevel revealed conditional comments' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <p class="MsoPlainText" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l0 level1 lfo1">
- <![if !vml]><img width="52" height="52" src="cid:image001.png@01D8AC0A.08251CD0" v:shapes="Picture_x0020_1"><![endif]>
- <span style="font-size:9.0pt;font-family:"Arial",sans-serif;color:black;mso-fareast-language:EN-AU">dummy1</span>
- <![if !vml]><img width="52" height="52" src="cid:image002.png@01D8AC0A.08251CD1" v:shapes="Picture_x0020_2"><![endif]>
- <span style="font-size:9.0pt;font-family:"Arial",sans-serif;color:black;mso-fareast-language:EN-AU">dummy2</span>
- </p>
- HTML
- <p>
- <img src="cid:image001.png@01D8AC0A.08251CD0" style="width:52px;height:52px;"> dummy1 <img src="cid:image002.png@01D8AC0A.08251CD1" style="width:52px;height:52px;"> dummy2 </p>
- TEXT
- end
- end
- context 'signature recognition' do
- let(:marker) { '<span class="js-signatureMarker"></span>' }
- it 'does not trim trailing whitespace and keeps the signature block working' do
- expect('Hello<br><br>-- <br>This is the signature'.html2html_strict.first).to eq("Hello<br>#{marker}<br>-- <br>This is the signature")
- end
- it 'places marker before "--" line (surrounded by <br>)' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- lalala<br>--<br>Max Mix
- HTML
- lalala#{marker}<br>--<br>Max Mix
- TEXT
- end
- it 'places marker before "--" line (surrounded by <br/>)' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- lalala<br/>--<br/>Max Mix
- HTML
- lalala#{marker}<br>--<br>Max Mix
- TEXT
- end
- it 'places marker before "--" line (preceded by <br/>\n)' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- lalala<br/>
- --<br/>Max Mix
- HTML
- lalala#{marker}<br> --<br>Max Mix
- TEXT
- end
- it 'places marker before "--" line (surrounded by <p>)' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- lalala<p>--</p>Max Mix
- HTML
- lalala#{marker}<p>--</p>Max Mix
- TEXT
- end
- it 'places marker before "__" line (surrounded by <br>)' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- lalala<br>__<br>Max Mix
- HTML
- lalala#{marker}<br>__<br>Max Mix
- TEXT
- end
- it 'places marker before quoted reply’s "Von:" header (in German)' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- den.<br><br><b>Von:</b> Fritz Bauer [mailto:me@example.com]<br><b>Gesendet:</b> Donnerstag, 3. Mai 2012 11:51<br><b>An:</b> John Smith<br><b>Cc:</b> Smith, John Marian; johnel.fratczak@example.com; ole.brei@example.com; Günther John | Example GmbH; bkopon@example.com; john.heisterhagen@team.example.com; sven.rocked@example.com; michael.house@example.com; tgutzeit@example.com<br><b>Betreff:</b> Re: OTRS::XXX Erweiterung - Anhänge an CI's<br><br>Hello,<br><br>ich versuche an den Punkten
- HTML
- den.<br>#{marker}<br><b>Von:</b> Fritz Bauer [mailto:me@example.com]<br><b>Gesendet:</b> Donnerstag, 3. Mai 2012 11:51<br><b>An:</b> John Smith<br><b>Cc:</b> Smith, John Marian; johnel.fratczak@example.com; ole.brei@example.com; Günther John | Example GmbH; bkopon@example.com; john.heisterhagen@team.example.com; sven.rocked@example.com; michael.house@example.com; tgutzeit@example.com<br><b>Betreff:</b> Re: OTRS::XXX Erweiterung - Anhänge an CI's<br><br>Hello,<br><br>ich versuche an den Punkten
- TEXT
- end
- it 'places marker before quoted reply’s "Von:" header (as <p> with stripped parent <div>)' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div><div style="border:none;border-top:solid #e1e1e1 1.0pt;padding:3.0pt 0cm 0cm 0cm"><p class="MsoNormal"><b><span lang="DE" style="font-size:11.0pt;font-family:"Calibri",sans-serif">Von:</span></b><span lang="DE" style="font-size:11.0pt;font-family:"Calibri",sans-serif"> Martin Edenhofer via Zammad Helpdesk [mailto:<a href="mailto:support@example.com">support@zammad.com</a>] <br><b>Gesendet:</b>\u0020
- HTML
- <div>#{marker}<p><b><span lang="DE">Von:</span></b><span lang="DE"> Martin Edenhofer via Zammad Helpdesk [mailto:<a href="mailto:support@example.com">support@zammad.com</a>] <br><b>Gesendet:</b> </span></p></div>
- TEXT
- end
- it 'places marker before quoted reply’s "Von:" header (as <p> with parent <div>)' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm">
- <p class="MsoNormal" style="margin-left:35.4pt"><b><span style="font-family:Calibri;color:black">Von:
- </span></b><span style="font-family:Calibri;color:black">Johanna Kiefer via Zammad Projects <projects@example.com><br>
- <b>Organisation: </b>Zammad GmbH<br>
- <b>Datum: </b>Montag, 6. März 2017 um 13:32<br>
- HTML
- <div>
- #{marker}<p><b>Von: </b><span>Johanna Kiefer via Zammad Projects <projects@example.com><br>
- <b>Organisation: </b>Zammad GmbH<br>
- <b>Datum: </b>Montag, 6. März 2017 um 13:32<br></span></p></div>
- TEXT
- end
- it 'places marker before quoted reply’s "Von:" header (as <div>)' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div><br>
- <br>
- <br><font size=1 color=#5f5f5f face="sans-serif">Von:
- </font><font size=1 face="sans-serif">Hotel <info@example.com></font>
- <br><font size=1 color=#5f5f5f face="sans-serif">An:
- </font></div>
- HTML
- #{marker}<div><br>Von: Hotel <info@example.com> <br>An: </div>
- TEXT
- end
- it 'places marker before English quoted text intro (as <blockquote>)' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <br class=""><div><blockquote type="cite" class=""><div class="">On 04 Mar 2017, at 14:47, Oliver Ruhm <<a href="mailto:oliver@example.com" class="">oliver@example.com</a>> wrote:</div><br class="Apple-interchange-newline">
- HTML
- <div>#{marker}<blockquote type="cite">
- <div>On 04 Mar 2017, at 14:47, Oliver Ruhm <<a href="mailto:oliver@example.com">oliver@example.com</a>> wrote:</div><br>
- </blockquote></div>
- TEXT
- end
- it 'does not place marker if blockquote doesn’t contain a quoted text intro' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <br class=""><div><blockquote type="cite" class=""><div class="">some note</div><br class="Apple-interchange-newline">
- HTML
- <div><blockquote type="cite">
- <div>some note</div><br>
- </blockquote></div>
- TEXT
- end
- it 'does not place marker if quoted text intro isn’t followed by a <blockquote>' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div>
- <br> Am 17.03.2017 um 17:03 schrieb Martin Edenhofer via Zammad Helpdesk <support@example.com>:<br>
- <br>
- </div>
- HTML
- <div>
- <br> Am 17.03.2017 um 17:03 schrieb Martin Edenhofer via Zammad Helpdesk <support@example.com>:<br>
- <br>
- </div>
- TEXT
- end
- it 'places marker before German quoted text intro (before <blockquote>)' do
- expect(<<~HTML.chomp.html2html_strict.first).to eq(<<~TEXT.chomp)
- <div>
- <br> Am 17.03.2017 um 17:03 schrieb Martin Edenhofer via Zammad Helpdesk <support@example.com>:<br>
- <br>
- </div>
- <blockquote type="cite">
- <div>Dear Mr. Smith,<br></div>
- </blockquote>
- HTML
- #{marker}<div>
- <br> Am 17.03.2017 um 17:03 schrieb Martin Edenhofer via Zammad Helpdesk <support@example.com>:<br>
- <br>
- </div><blockquote type="cite">
- <div>Dear Mr. Smith,<br>
- </div></blockquote>
- TEXT
- end
- end
- end
- describe '#signature_identify' do
- let(:marker) { '######SIGNATURE_MARKER######' }
- context 'with no signature present' do
- it 'leaves string as-is' do
- expect((+'foo').signature_identify('text', true)).to eq('foo')
- end
- end
- context 'with signature present' do
- it 'places marker at start of "--" line' do
- expect(<<~SRC.chomp.signature_identify('text', true)).to eq(<<~MARKED.chomp)
- foo
- --
- bar
- SRC
- foo
- #{marker}--
- bar
- MARKED
- end
- it 'places marker before English quoted text intro' do
- expect(<<~SRC.chomp.signature_identify('text', true)).to eq(<<~MARKED.chomp)
- On 01/04/15 10:55, Bob Smith wrote:
- SRC
- #{marker}On 01/04/15 10:55, Bob Smith wrote:
- MARKED
- end
- it 'places marker before German quoted text intro' do
- expect(<<~SRC.chomp.signature_identify('text', true)).to eq(<<~MARKED.chomp)
- Am 03.04.2015 um 20:58 schrieb Martin Edenhofer <me@zammad.ink>:
- SRC
- #{marker}Am 03.04.2015 um 20:58 schrieb Martin Edenhofer <me@zammad.ink>:
- MARKED
- end
- it 'ignores trailing empty line' do
- expect(<<~SRC.chomp.signature_identify('text', true)).to eq(<<~MARKED.chomp)
- test 123
- test 123
- --
- Bob Smith
- SRC
- test 123
- test 123
- #{marker}--
- Bob Smith
- MARKED
- end
- it 'ignores trailing double empty lines' do
- expect(<<~SRC.chomp.signature_identify('text', true)).to eq(<<~MARKED.chomp)
- test 123
- test 123
- --
- Bob Smith
- SRC
- test 123
- test 123
- #{marker}--
- Bob Smith
- MARKED
- end
- it 'ignores leading/trailing empty lines' do
- expect(<<~SRC.chomp.signature_identify('text', true)).to eq(<<~MARKED.chomp)
- test 123\u0020
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- --
- Bob Smith
- SRC
- test 123\u0020
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- #{marker}--
- Bob Smith
- MARKED
- end
- it 'ignores lines starting with "--" but containing more text' do
- expect(<<~SRC.chomp.signature_identify('text', true)).to eq(<<~MARKED.chomp)
- test 123\u0020
- --no not match--
- --
- Bob Smith
- SRC
- test 123\u0020
- --no not match--
- #{marker}--
- Bob Smith
- MARKED
- end
- it 'places marker at start of " -- " line' do
- expect(<<~SRC.chomp.signature_identify('text', true)).to eq(<<~MARKED.chomp)
- test 123\u0020
- --no not match--
- --\u0020
- Bob Smith
- SRC
- test 123\u0020
- --no not match--
- #{marker} --\u0020
- Bob Smith
- MARKED
- end
- it 'places marker on empty line if possible / only places one marker' do
- expect(<<~SRC.chomp.signature_identify('text', true)).to eq(<<~MARKED.chomp)
- test 123\u0020
- --
- Bob Smith
- --
- Bob Smith
- SRC
- test 123\u0020
- #{marker}
- --
- Bob Smith
- --
- Bob Smith
- MARKED
- end
- context 'for Apple email quote text' do
- context 'in English' do
- it 'places two markers, one before quoted text intro and one at start of "--" line' do
- expect(<<~SRC.chomp.signature_identify('text', true)).to eq(<<~MARKED.chomp)
- test 123\u0020
- --no not match--
- Bob Smith
- On 01/04/15 10:55, Bob Smith wrote:
- lalala
- --
- some test
- SRC
- test 123\u0020
- --no not match--
- Bob Smith
- #{marker}On 01/04/15 10:55, Bob Smith wrote:
- lalala
- #{marker}--
- some test
- MARKED
- end
- end
- context 'auf Deutsch' do
- it 'places marker before quoted text intro' do
- expect(<<~SRC.chomp.signature_identify('text', true)).to eq(<<~MARKED.chomp)
- test 123\u0020
- --no not match--
- Bob Smith
- Am 03.04.2015 um 20:58 schrieb Bob Smith <bob@example.com>:
- lalala
- SRC
- test 123\u0020
- --no not match--
- Bob Smith
- #{marker}Am 03.04.2015 um 20:58 schrieb Bob Smith <bob@example.com>:
- lalala
- MARKED
- end
- end
- end
- context 'for MS email quote text' do
- context 'in English' do
- it 'places marker before quoted text intro' do
- expect(<<~SRC.chomp.signature_identify('text', true)).to eq(<<~MARKED.chomp)
- test 123test 123\u0020
- --no not match--
- Bob Smith
- From: Martin Edenhofer via Zammad Support [mailto:support@zammad.inc]
- Sent: Donnerstag, 2. April 2015 10:00
- lalala</div>
- SRC
- test 123test 123\u0020
- --no not match--
- Bob Smith
- #{marker}From: Martin Edenhofer via Zammad Support [mailto:support@zammad.inc]
- Sent: Donnerstag, 2. April 2015 10:00
- lalala</div>
- MARKED
- end
- end
- context 'auf Deutsch' do
- it 'places marker before quoted text intro' do
- expect(<<~SRC.chomp.signature_identify('text', true)).to eq(<<~MARKED.chomp)
- test 123\u0020
- --no not match--
- Bob Smith
- Von: Martin Edenhofer via Zammad Support [mailto:support@zammad.inc]
- Gesendet: Donnerstag, 2. April 2015 10:00
- Betreff: lalala
- SRC
- test 123\u0020
- --no not match--
- Bob Smith
- #{marker}Von: Martin Edenhofer via Zammad Support [mailto:support@zammad.inc]
- Gesendet: Donnerstag, 2. April 2015 10:00
- Betreff: lalala
- MARKED
- end
- end
- context 'en francais' do
- it 'places marker before quoted text intro' do
- expect(<<~SRC.chomp.signature_identify('text', true)).to eq(<<~MARKED.chomp)
- test 123\u0020
- --no not match--
- Bob Smith
- De : Martin Edenhofer via Zammad Support [mailto:support@zammad.inc]
- Envoyé : mercredi 29 avril 2015 17:31
- Objet : lalala
- SRC
- test 123\u0020
- --no not match--
- Bob Smith
- #{marker}De : Martin Edenhofer via Zammad Support [mailto:support@zammad.inc]
- Envoyé : mercredi 29 avril 2015 17:31
- Objet : lalala
- MARKED
- end
- end
- end
- end
- end
- describe '#utf8_encode' do
- context 'on valid, UTF-8-encoded strings' do
- subject(:string) { 'hello' }
- it 'returns an identical copy' do
- expect(string.utf8_encode).to eq(string)
- expect(string.utf8_encode.encoding).to be(string.encoding)
- expect(string.utf8_encode).not_to be(string)
- end
- context 'which are incorrectly set to other, technically valid encodings' do
- subject(:string) { described_class.new('ö', encoding: 'tis-620') }
- it 'sets input encoding to UTF-8 instead of attempting conversion' do
- expect(string.utf8_encode).to eq(string.dup.force_encoding('utf-8'))
- end
- end
- end
- context 'on strings in other encodings' do
- subject(:string) { original_string.encode(input_encoding) }
- context 'with no from: option' do
- let(:original_string) { 'Tschüss!' }
- let(:input_encoding) { Encoding::ISO_8859_2 }
- it 'detects the input encoding' do
- expect(string.utf8_encode).to eq(original_string)
- end
- end
- context 'with a valid from: option' do
- let(:original_string) { 'Tschüss!' }
- let(:input_encoding) { Encoding::ISO_8859_2 }
- it 'uses the specified input encoding' do
- expect(string.utf8_encode(from: 'iso-8859-2')).to eq(original_string)
- end
- it 'uses any valid input encoding, even if not correct' do
- expect(string.utf8_encode(from: 'gb18030')).to eq('Tsch黶s!')
- end
- end
- context 'with an invalid from: option' do
- let(:original_string) { '―陈志' }
- let(:input_encoding) { Encoding::GB18030 }
- it 'does not try it' do
- expect { string.encode('utf-8', 'gb2312') }
- .to raise_error(Encoding::InvalidByteSequenceError)
- expect { string.utf8_encode(from: 'gb2312') }
- .not_to raise_error
- end
- it 'uses the detected input encoding instead' do
- expect(string.utf8_encode(from: 'gb2312')).to eq(original_string)
- end
- end
- end
- context 'performance' do
- subject(:string) { original_string.encode(input_encoding) }
- context 'with utf8_encode in iso-8859-1' do
- let(:original_string) { 'äöü0' * 999_999 }
- let(:input_encoding) { Encoding::ISO_8859_1 }
- it 'detects the input encoding' do
- Timeout.timeout(1) do
- expect(string.utf8_encode(from: 'iso-8859-1')).to eq(original_string)
- end
- end
- end
- context 'with utf8_encode in utf-8' do
- let(:original_string) { 'äöü0' * 999_999 }
- let(:input_encoding) { Encoding::UTF_8 }
- it 'detects the input encoding' do
- Timeout.timeout(1) do
- expect(string.utf8_encode(from: 'utf-8')).to eq(original_string)
- end
- end
- end
- context 'with utf8_encode in iso-8859-1 and charset detection' do
- let(:original_string) { 'äöü0' * 199_999 }
- let(:input_encoding) { Encoding::ISO_8859_1 }
- it 'detects the input encoding' do
- Timeout.timeout(18) do
- expect(string.utf8_encode(from: 'utf-8')).to eq(original_string)
- end
- end
- end
- end
- end
- end
|