diff --git a/lib/XRay/Formats/Twitter.php b/lib/XRay/Formats/Twitter.php
index 1e10a29..9be9a42 100644
--- a/lib/XRay/Formats/Twitter.php
+++ b/lib/XRay/Formats/Twitter.php
@@ -271,7 +271,7 @@ class Twitter extends Format {
// Twitter escapes & as & in the text
$text = html_entity_decode($text);
- $html = $text;
+ $html = str_replace("\n", "
\n", $text);
if(property_exists($entities, 'user_mentions')) {
foreach($entities->user_mentions as $user) {
diff --git a/tests/TwitterTest.php b/tests/TwitterTest.php
index 0a4b6c6..1814a08 100644
--- a/tests/TwitterTest.php
+++ b/tests/TwitterTest.php
@@ -222,7 +222,7 @@ Feel like I could (maybe) rewrite previous open code to do some of this :)', $da
$this->assertEquals('https://pbs.twimg.com/media/DWaAhZ2UQAAIEoS.jpg', $data['data']['photo'][3]);
}
- public function testStreamingTweetTruncatedWithVidoe() {
+ public function testStreamingTweetTruncatedWithVideo() {
list($url, $json) = $this->loadTweet('streaming-tweet-truncated-with-video');
$data = $this->parse(['url' => $url, 'body' => $json]);
@@ -231,4 +231,17 @@ Feel like I could (maybe) rewrite previous open code to do some of this :)', $da
$this->assertEquals('https://video.twimg.com/ext_tw_video/965608338917548032/pu/vid/720x720/kreAfCMf-B1dLqBH.mp4', $data['data']['video'][0]);
}
+ public function testTweetWithNewlines() {
+ list($url, $json) = $this->loadTweet('tweet-with-newlines');
+ $data = $this->parse(['url' => $url, 'body' => $json]);
+
+ $this->assertEquals(4, substr_count($data['data']['content']['text'], "\n"));
+ $this->assertEquals(4, substr_count($data['data']['content']['html'], "
\n"));
+ $this->assertEquals("🌈🌈 I’ve watched the sun rise at Corona Heights countless times, but never before have I seen a #rainbow at #sunrise.
+
+#CoronaHeights #SanFrancisco #SF #wakeupthesun #fromwhereirun #nofilter
+
+Woke up this morning feeling compelled to run to Corona… http://tantek.com/2018/049/t3/rainbow-at-sunrise", $data['data']['content']['text']);
+ }
+
}
diff --git a/tests/data/api.twitter.com/tweet-with-newlines.json b/tests/data/api.twitter.com/tweet-with-newlines.json
new file mode 100644
index 0000000..9da133a
--- /dev/null
+++ b/tests/data/api.twitter.com/tweet-with-newlines.json
@@ -0,0 +1,318 @@
+{
+ "created_at": "Mon Feb 19 07:53:50 +0000 2018",
+ "id": 965494622209363968,
+ "id_str": "965494622209363968",
+ "full_text": "🌈🌈 I’ve watched the sun rise at Corona Heights countless times, but never before have I seen a #rainbow at #sunrise.\n\n#CoronaHeights #SanFrancisco #SF #wakeupthesun #fromwhereirun #nofilter\n\nWoke up this morning feeling compelled to run to Corona… https://t.co/0otP3aLZo2 https://t.co/0Q5kNFZO9D",
+ "truncated": false,
+ "display_text_range": [
+ 0,
+ 271
+ ],
+ "entities": {
+ "hashtags": [
+ {
+ "text": "rainbow",
+ "indices": [
+ 95,
+ 103
+ ]
+ },
+ {
+ "text": "sunrise",
+ "indices": [
+ 107,
+ 115
+ ]
+ },
+ {
+ "text": "CoronaHeights",
+ "indices": [
+ 118,
+ 132
+ ]
+ },
+ {
+ "text": "SanFrancisco",
+ "indices": [
+ 133,
+ 146
+ ]
+ },
+ {
+ "text": "SF",
+ "indices": [
+ 147,
+ 150
+ ]
+ },
+ {
+ "text": "wakeupthesun",
+ "indices": [
+ 151,
+ 164
+ ]
+ },
+ {
+ "text": "fromwhereirun",
+ "indices": [
+ 165,
+ 179
+ ]
+ },
+ {
+ "text": "nofilter",
+ "indices": [
+ 180,
+ 189
+ ]
+ }
+ ],
+ "symbols": [
+
+ ],
+ "user_mentions": [
+
+ ],
+ "urls": [
+ {
+ "url": "https://t.co/0otP3aLZo2",
+ "expanded_url": "http://tantek.com/2018/049/t3/rainbow-at-sunrise",
+ "display_url": "tantek.com/2018/049/t3/ra…",
+ "indices": [
+ 248,
+ 271
+ ]
+ }
+ ],
+ "media": [
+ {
+ "id": 965494609689288705,
+ "id_str": "965494609689288705",
+ "indices": [
+ 272,
+ 295
+ ],
+ "media_url": "http://pbs.twimg.com/media/DWYgO2sVoAEeRK0.jpg",
+ "media_url_https": "https://pbs.twimg.com/media/DWYgO2sVoAEeRK0.jpg",
+ "url": "https://t.co/0Q5kNFZO9D",
+ "display_url": "pic.twitter.com/0Q5kNFZO9D",
+ "expanded_url": "https://twitter.com/t/status/965494622209363968/photo/1",
+ "type": "photo",
+ "sizes": {
+ "medium": {
+ "w": 1200,
+ "h": 667,
+ "resize": "fit"
+ },
+ "thumb": {
+ "w": 150,
+ "h": 150,
+ "resize": "crop"
+ },
+ "small": {
+ "w": 680,
+ "h": 378,
+ "resize": "fit"
+ },
+ "large": {
+ "w": 1920,
+ "h": 1067,
+ "resize": "fit"
+ }
+ }
+ }
+ ]
+ },
+ "extended_entities": {
+ "media": [
+ {
+ "id": 965494609689288705,
+ "id_str": "965494609689288705",
+ "indices": [
+ 272,
+ 295
+ ],
+ "media_url": "http://pbs.twimg.com/media/DWYgO2sVoAEeRK0.jpg",
+ "media_url_https": "https://pbs.twimg.com/media/DWYgO2sVoAEeRK0.jpg",
+ "url": "https://t.co/0Q5kNFZO9D",
+ "display_url": "pic.twitter.com/0Q5kNFZO9D",
+ "expanded_url": "https://twitter.com/t/status/965494622209363968/photo/1",
+ "type": "photo",
+ "sizes": {
+ "medium": {
+ "w": 1200,
+ "h": 667,
+ "resize": "fit"
+ },
+ "thumb": {
+ "w": 150,
+ "h": 150,
+ "resize": "crop"
+ },
+ "small": {
+ "w": 680,
+ "h": 378,
+ "resize": "fit"
+ },
+ "large": {
+ "w": 1920,
+ "h": 1067,
+ "resize": "fit"
+ }
+ }
+ },
+ {
+ "id": 965494615313858560,
+ "id_str": "965494615313858560",
+ "indices": [
+ 272,
+ 295
+ ],
+ "media_url": "http://pbs.twimg.com/media/DWYgPLpVwAAjpFL.jpg",
+ "media_url_https": "https://pbs.twimg.com/media/DWYgPLpVwAAjpFL.jpg",
+ "url": "https://t.co/0Q5kNFZO9D",
+ "display_url": "pic.twitter.com/0Q5kNFZO9D",
+ "expanded_url": "https://twitter.com/t/status/965494622209363968/photo/1",
+ "type": "photo",
+ "sizes": {
+ "thumb": {
+ "w": 150,
+ "h": 150,
+ "resize": "crop"
+ },
+ "medium": {
+ "w": 900,
+ "h": 1200,
+ "resize": "fit"
+ },
+ "large": {
+ "w": 1440,
+ "h": 1920,
+ "resize": "fit"
+ },
+ "small": {
+ "w": 510,
+ "h": 680,
+ "resize": "fit"
+ }
+ }
+ },
+ {
+ "id": 965494620024053760,
+ "id_str": "965494620024053760",
+ "indices": [
+ 272,
+ 295
+ ],
+ "media_url": "http://pbs.twimg.com/media/DWYgPdMVoAAMUbb.jpg",
+ "media_url_https": "https://pbs.twimg.com/media/DWYgPdMVoAAMUbb.jpg",
+ "url": "https://t.co/0Q5kNFZO9D",
+ "display_url": "pic.twitter.com/0Q5kNFZO9D",
+ "expanded_url": "https://twitter.com/t/status/965494622209363968/photo/1",
+ "type": "photo",
+ "sizes": {
+ "small": {
+ "w": 680,
+ "h": 510,
+ "resize": "fit"
+ },
+ "thumb": {
+ "w": 150,
+ "h": 150,
+ "resize": "crop"
+ },
+ "medium": {
+ "w": 1200,
+ "h": 900,
+ "resize": "fit"
+ },
+ "large": {
+ "w": 1920,
+ "h": 1440,
+ "resize": "fit"
+ }
+ }
+ }
+ ]
+ },
+ "source": "Bridgy",
+ "in_reply_to_status_id": null,
+ "in_reply_to_status_id_str": null,
+ "in_reply_to_user_id": null,
+ "in_reply_to_user_id_str": null,
+ "in_reply_to_screen_name": null,
+ "user": {
+ "id": 11628,
+ "id_str": "11628",
+ "name": "🌈",
+ "screen_name": "t",
+ "location": "Pacific Time Zone",
+ "description": "Cofounder #indieweb #barcamp @IndieWebCamp @microformats. Working @Mozilla @w3cab @csswg @socialwebwg. Code @Falcon @cassisjs. #write #climb #run #yoga #RESIST",
+ "url": "https://t.co/imeZHaJsth",
+ "entities": {
+ "url": {
+ "urls": [
+ {
+ "url": "https://t.co/imeZHaJsth",
+ "expanded_url": "http://tantek.com/",
+ "display_url": "tantek.com",
+ "indices": [
+ 0,
+ 23
+ ]
+ }
+ ]
+ },
+ "description": {
+ "urls": [
+
+ ]
+ }
+ },
+ "protected": false,
+ "followers_count": 73397,
+ "friends_count": 1614,
+ "listed_count": 2020,
+ "created_at": "Tue Nov 07 02:26:19 +0000 2006",
+ "favourites_count": 0,
+ "utc_offset": -28800,
+ "time_zone": "Pacific Time (US & Canada)",
+ "geo_enabled": true,
+ "verified": false,
+ "statuses_count": 9252,
+ "lang": "en",
+ "contributors_enabled": false,
+ "is_translator": false,
+ "is_translation_enabled": false,
+ "profile_background_color": "C0DEED",
+ "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png",
+ "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png",
+ "profile_background_tile": false,
+ "profile_image_url": "http://pbs.twimg.com/profile_images/423350922408767488/nlA_m2WH_normal.jpeg",
+ "profile_image_url_https": "https://pbs.twimg.com/profile_images/423350922408767488/nlA_m2WH_normal.jpeg",
+ "profile_link_color": "1DA1F2",
+ "profile_sidebar_border_color": "C0DEED",
+ "profile_sidebar_fill_color": "DDEEF6",
+ "profile_text_color": "333333",
+ "profile_use_background_image": true,
+ "has_extended_profile": false,
+ "default_profile": true,
+ "default_profile_image": false,
+ "following": true,
+ "follow_request_sent": false,
+ "notifications": false,
+ "translator_type": "regular"
+ },
+ "geo": null,
+ "coordinates": null,
+ "place": null,
+ "contributors": null,
+ "is_quote_status": false,
+ "retweet_count": 2,
+ "favorite_count": 8,
+ "favorited": false,
+ "retweeted": false,
+ "possibly_sensitive": false,
+ "possibly_sensitive_appealable": false,
+ "lang": "en"
+}