Browse Source

complete redesign because of emoji-length problem

Carsten Porth 5 years ago
parent
commit
64218202c8

+ 57 - 23
app/package-lock.json

@@ -355,6 +355,11 @@
       "resolved": "https://registry.npmjs.org/@types/localforage/-/localforage-0.0.30.tgz",
       "integrity": "sha1-PWCmv23aOOP4pGlhFZg3nx9klQk="
     },
+    "@types/twitter-text": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@types/twitter-text/-/twitter-text-2.0.0.tgz",
+      "integrity": "sha512-bRlURk6hHRMSm37Wc5MPswV5ZWFAt2DYJ50ERoB5kzu6u+qGmzE83sRP5gA55uBW52uBnsBrorK7yEsPUYQWHQ=="
+    },
     "abbrev": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -616,7 +621,7 @@
     },
     "autoprefixer": {
       "version": "7.2.6",
-      "resolved": "http://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz",
       "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==",
       "dev": true,
       "requires": {
@@ -657,7 +662,7 @@
         },
         "chalk": {
           "version": "1.1.3",
-          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
           "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
           "dev": true,
           "requires": {
@@ -676,6 +681,15 @@
         }
       }
     },
+    "babel-runtime": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+      "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+      "requires": {
+        "core-js": "^2.4.0",
+        "regenerator-runtime": "^0.11.0"
+      }
+    },
     "balanced-match": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
@@ -904,7 +918,7 @@
     },
     "browserify-aes": {
       "version": "1.2.0",
-      "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+      "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
       "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
       "dev": true,
       "requires": {
@@ -941,7 +955,7 @@
     },
     "browserify-rsa": {
       "version": "4.0.1",
-      "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
+      "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
       "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
       "dev": true,
       "requires": {
@@ -985,7 +999,7 @@
     },
     "buffer": {
       "version": "4.9.1",
-      "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
       "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
       "dev": true,
       "requires": {
@@ -1063,7 +1077,7 @@
     },
     "camelcase-keys": {
       "version": "2.1.0",
-      "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
       "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
       "dev": true,
       "requires": {
@@ -1606,7 +1620,7 @@
     },
     "create-hash": {
       "version": "1.2.0",
-      "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+      "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
       "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
       "dev": true,
       "requires": {
@@ -1619,7 +1633,7 @@
     },
     "create-hmac": {
       "version": "1.1.7",
-      "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+      "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
       "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
       "dev": true,
       "requires": {
@@ -1822,7 +1836,7 @@
     },
     "diffie-hellman": {
       "version": "5.0.3",
-      "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+      "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
       "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
       "dev": true,
       "requires": {
@@ -2136,7 +2150,7 @@
     },
     "events": {
       "version": "1.1.1",
-      "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz",
+      "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
       "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=",
       "dev": true
     },
@@ -2323,7 +2337,7 @@
     },
     "finalhandler": {
       "version": "1.1.1",
-      "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
+      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
       "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
       "dev": true,
       "requires": {
@@ -2957,7 +2971,7 @@
     },
     "get-stream": {
       "version": "3.0.0",
-      "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
       "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
       "dev": true
     },
@@ -3637,7 +3651,7 @@
     },
     "http-errors": {
       "version": "1.6.3",
-      "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
       "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
       "dev": true,
       "requires": {
@@ -3788,7 +3802,7 @@
     },
     "is-builtin-module": {
       "version": "1.0.0",
-      "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+      "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
       "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
       "dev": true,
       "requires": {
@@ -4054,7 +4068,7 @@
     },
     "json5": {
       "version": "0.5.1",
-      "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
       "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
       "dev": true
     },
@@ -4151,7 +4165,7 @@
     },
     "load-json-file": {
       "version": "1.1.0",
-      "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
       "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
       "dev": true,
       "requires": {
@@ -4282,7 +4296,7 @@
     },
     "magic-string": {
       "version": "0.22.5",
-      "resolved": "http://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz",
       "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==",
       "dev": true,
       "requires": {
@@ -4711,7 +4725,7 @@
         },
         "semver": {
           "version": "5.3.0",
-          "resolved": "http://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
           "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
           "dev": true
         },
@@ -4802,7 +4816,7 @@
         },
         "chalk": {
           "version": "1.1.3",
-          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
           "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
           "dev": true,
           "requires": {
@@ -5090,7 +5104,7 @@
     },
     "parse-asn1": {
       "version": "5.1.1",
-      "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz",
+      "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz",
       "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==",
       "dev": true,
       "requires": {
@@ -5519,6 +5533,11 @@
       "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.12.tgz",
       "integrity": "sha512-n+IyV+nGz3+0q3/Yf1ra12KpCyi001bi4XFxSjbiWWjfqb52iTTtpGXmCCAOWWIAn9KEuFZKGqBERHmrtScZ3A=="
     },
+    "regenerator-runtime": {
+      "version": "0.11.1",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+      "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+    },
     "regex-cache": {
       "version": "0.4.4",
       "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
@@ -5896,7 +5915,7 @@
     },
     "sha.js": {
       "version": "2.4.11",
-      "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+      "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
       "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
       "dev": true,
       "requires": {
@@ -6554,6 +6573,11 @@
       "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
       "optional": true
     },
+    "twemoji-parser": {
+      "version": "11.0.2",
+      "resolved": "https://registry.npmjs.org/twemoji-parser/-/twemoji-parser-11.0.2.tgz",
+      "integrity": "sha512-5kO2XCcpAql6zjdLwRwJjYvAZyDy3+Uj7v1ipBzLthQmDL7Ce19bEqHr3ImSNeoSW2OA8u02XmARbXHaNO8GhA=="
+    },
     "twit": {
       "version": "2.2.11",
       "resolved": "https://registry.npmjs.org/twit/-/twit-2.2.11.tgz",
@@ -6564,6 +6588,16 @@
         "request": "^2.68.0"
       }
     },
+    "twitter-text": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/twitter-text/-/twitter-text-3.0.0.tgz",
+      "integrity": "sha512-p5/mAvsYp0ESSgKjpaytWNJxrRqM04FnF5wLtc9+U1hXBrQujh/oz+4yR45JHIJfWOKSFZ/aLGaCasNwrqkkcw==",
+      "requires": {
+        "babel-runtime": "^6.26.0",
+        "punycode": "1.4.1",
+        "twemoji-parser": "^11.0.2"
+      }
+    },
     "type-is": {
       "version": "1.6.16",
       "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
@@ -6658,7 +6692,7 @@
         },
         "yargs": {
           "version": "3.10.0",
-          "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
           "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
           "dev": true,
           "requires": {
@@ -7313,7 +7347,7 @@
         },
         "load-json-file": {
           "version": "2.0.0",
-          "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+          "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
           "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
           "dev": true,
           "requires": {

+ 3 - 1
app/package.json

@@ -26,6 +26,7 @@
     "@ionic-native/splash-screen": "4.8.0",
     "@ionic-native/status-bar": "4.8.0",
     "@ionic/storage": "2.1.3",
+    "@types/twitter-text": "^2.0.0",
     "cordova-android": "7.0.0",
     "cordova-plugin-browsertab": "^0.2.0",
     "cordova-plugin-buildinfo": "^2.0.1",
@@ -48,6 +49,7 @@
     "rxjs": "5.5.11",
     "sw-toolbox": "3.6.0",
     "twit": "^2.2.11",
+    "twitter-text": "^3.0.0",
     "zone.js": "0.8.26"
   },
   "devDependencies": {
@@ -72,4 +74,4 @@
       "android"
     ]
   }
-}
+}

+ 7 - 5
app/src/components/tweet-body/tweet-body.html

@@ -1,10 +1,12 @@
 <!-- Generated template for the TweetBodyComponent component -->
 <div>
-  <div class="tweet-array" *ngFor="let part of tweetArray">
-    <span *ngIf="part.type =='text'" class="text">{{ part.text }}</span>
-    <a *ngIf="part.type == 'url'" href="{{ part.url }}">{{ part.text }}</a>
-    <mention *ngIf="part.type == 'user_mention'" [username]="part.text" [userId]="part.userId"></mention>
-    <hashtag *ngIf="part.type == 'hashtag'" [hashtag]="part.text"></hashtag>
+  <div class="tweet-array">
+    <span class="tweet-array-part" *ngFor="let part of tweetArray">
+      <span *ngIf="part.type =='text'" class="text">{{ part.text }}</span>
+      <a *ngIf="part.type == 'url'" href="{{ part.url }}">{{ part.text }}</a>
+      <mention *ngIf="part.type == 'user_mention'" [username]="part.text" [userId]="part.userId"></mention>
+      <hashtag *ngIf="part.type == 'hashtag'" [hashtag]="part.text"></hashtag>
+    </span>
   </div>
   <img *ngIf="hasPhoto" src="{{ entities.media[0]['media_url_https'] }}" alt="Photo" class="photo">
   <video *ngIf="isGif" src="{{ extended_entities.media[0]['video_info']['variants'][0]['url'] }}" autoplay loop></video>

+ 0 - 3
app/src/components/tweet-body/tweet-body.scss

@@ -2,9 +2,6 @@ tweet-body {
   span.text {
     white-space: pre-wrap;
   }
-  .tweet-array {
-    display: inline;
-  }
   .photo {
     margin-top: 5px;
     padding: 2px;

+ 117 - 130
app/src/components/tweet-body/tweet-body.ts

@@ -1,11 +1,6 @@
 import { Component, Input } from "@angular/core";
+import twittertext from "twitter-text";
 
-/**
- * Generated class for the TweetBodyComponent component.
- *
- * See https://angular.io/api/core/Component for more info on Angular
- * Components.
- */
 @Component({
   selector: "tweet-body",
   templateUrl: "tweet-body.html"
@@ -16,7 +11,7 @@ export class TweetBodyComponent {
 
   constructor() {}
 
-  get status(): string {
+  get full_text(): string {
     if (this.data["retweeted_status"]) {
       return this.data["retweeted_status"]["full_text"];
     } else {
@@ -64,148 +59,140 @@ export class TweetBodyComponent {
     );
   }
 
+  get status() {
+    // Cut off beginning
+    let status = this.full_text.substring(this.range[0]);
+
+    // Cut off end (URLs)
+    this.urlsToRemoveFromStatus().forEach(
+      url => (status = status.replace(url, ""))
+    );
+
+    return status.trim();
+  }
+
   get tweetArray() {
+    const extractedEntites = twittertext.extractEntitiesWithIndices(
+      this.status
+    );
+
+    console.log(this.entities);
+
     let tweetArray = [];
-    tweetArray = tweetArray.concat(this.getUserMentionsForTweetArray());
-    tweetArray = tweetArray.concat(this.getHashtagsForTweetArray());
-    tweetArray = tweetArray.concat(this.getUrlsForTweetArray());
     tweetArray = tweetArray.concat(
-      this.getTextPartsForTweetArray(
-        tweetArray.sort((a, b) => a["start"] - b["start"])
+      this.getHashtagsForTweetArray(
+        extractedEntites.filter(element => element["hashtag"])
+      )
+    );
+    tweetArray = tweetArray.concat(
+      this.getMentionsForTweetArray(
+        extractedEntites.filter(element => element["screenName"])
       )
     );
-    tweetArray = this.cutToTextRange(tweetArray);
+    tweetArray = tweetArray.concat(
+      this.getUrlsForTweetArray(
+        extractedEntites.filter(element => element["url"])
+      )
+    );
+    tweetArray = tweetArray.concat(this.getTextParts(tweetArray));
+
     return tweetArray.sort((a, b) => a["start"] - b["start"]);
   }
 
-  private getUserMentionsForTweetArray() {
-    return this.entities["user_mentions"].map(mention => ({
-      start: mention["indices"][0],
-      stop: mention["indices"][1],
-      type: "user_mention",
-      text: "@" + mention["screen_name"],
-      userId: mention["id_str"]
-    }));
+  private urlsToRemoveFromStatus(): string[] {
+    const res = [];
+
+    if (this.data["quoted_status_permalink"]) {
+      res.push(this.data["quoted_status_permalink"]["url"]);
+    }
+
+    if (this.extended_entities) {
+      this.extended_entities["media"].forEach(element => {
+        res.push(element["url"]);
+      });
+    }
+    return res.filter(entry => entry.length);
+  }
+
+  private getHashtagsForTweetArray(hashtags) {
+    const res = [];
+    hashtags.forEach(element => {
+      res.push({
+        start: element.indices[0],
+        stop: element.indices[1],
+        type: "hashtag",
+        text: "#" + element["hashtag"]
+      });
+    });
+    return res;
   }
 
-  private getHashtagsForTweetArray() {
-    return this.entities["hashtags"].map(hashtag => ({
-      start: hashtag["indices"][0],
-      stop: hashtag["indices"][1],
-      type: "hashtag",
-      text: "#" + hashtag["text"]
-    }));
+  private getMentionsForTweetArray(mentions) {
+    const res = [];
+    mentions.forEach(element => {
+      const apiEntity = this.entities.user_mentions.filter(
+        el => el.screen_name === element["screenName"]
+      )[0];
+      res.push({
+        start: element.indices[0],
+        stop: element.indices[1],
+        type: "user_mention",
+        text: "@" + element["screenName"],
+        userId: apiEntity["id_str"] || ""
+      });
+    });
+    return res;
   }
 
-  private getUrlsForTweetArray() {
-    return this.entities["urls"].map(url => ({
-      start: url["indices"][0],
-      stop: url["indices"][1],
-      type: "url",
-      text: url["display_url"],
-      url: url["url"]
-    }));
+  private getUrlsForTweetArray(urls) {
+    const res = [];
+    urls.forEach(element => {
+      const apiEntity = this.entities.urls.filter(
+        el => el.url === element["url"]
+      )[0];
+      res.push({
+        start: element.indices[0],
+        stop: element.indices[1],
+        type: "url",
+        url: element["url"],
+        text: apiEntity["display_url"] || element["url"]
+      });
+    });
+    return res;
   }
 
-  private getTextPartsForTweetArray(specialParts) {
-    if (!specialParts.length) {
-      // text only
-      return [
-        {
-          start: 0,
-          stop: this.status.length,
-          type: "text",
-          text: this.status
-        }
-      ];
-    } else {
-      let res = [];
-      let start = 0;
-      for (let i = 0; i < specialParts.length; i++) {
-        if (start != specialParts[i].start) {
-          res.push({
-            start: start,
-            stop: specialParts[i]["start"],
-            type: "text",
-            text: this.status.substring(start, specialParts[i]["start"])
-          });
-        }
-        start = specialParts[i]["stop"];
-      }
-      const stopOfLastSpecialPart =
-        specialParts[specialParts.length - 1]["stop"];
-      const textUntilEnd = this.status.substring(
-        stopOfLastSpecialPart,
-        this.status.length
-      );
-      if (textUntilEnd.length) {
-        res.push({
-          start: stopOfLastSpecialPart,
-          stop: this.status.length,
+  private getTextParts(tweetArray) {
+    const sortedTweetArray = tweetArray.sort((a, b) => a["start"] - b["start"]);
+
+    const textParts = [];
+
+    let prevEnd = 0;
+    for (let i = 0; i < sortedTweetArray.length; i++) {
+      if (sortedTweetArray[i]["start"] !== prevEnd) {
+        const text = this.status.substring(
+          prevEnd,
+          sortedTweetArray[i]["start"]
+        );
+
+        textParts.push({
+          start: prevEnd,
+          stop: sortedTweetArray[i]["start"],
           type: "text",
-          text: textUntilEnd
+          text: text
         });
       }
-
-      return res;
+      prevEnd = sortedTweetArray[i]["stop"];
     }
-  }
 
-  private cutToTextRange(tweetArray) {
-    const res = [];
-    for (let i = 0; i < tweetArray.length; i++) {
-      if (
-        tweetArray[i]["start"] >= this.range[0] &&
-        tweetArray[i]["stop"] <= this.range[1]
-      ) {
-        // Inside the range
-        res.push(tweetArray[i]);
-      } else if (
-        tweetArray[i]["start"] < this.range[0] &&
-        tweetArray[i]["stop"] <= this.range[1]
-      ) {
-        // Beginning needs to be cut
-        res.push({
-          start: this.range[0],
-          stop: tweetArray[i]["stop"],
-          type: tweetArray[i]["type"],
-          text: tweetArray[i]["text"].substring(
-            this.range[0],
-            tweetArray[i]["stop"]
-          )
-        });
-      } else if (
-        tweetArray[i]["start"] >= this.range[0] &&
-        tweetArray[i]["stop"] > this.range[1]
-      ) {
-        // End needs to be cut
-        if (this.range[1] - tweetArray[i]["start"] > 0) {
-          res.push({
-            start: tweetArray[i]["start"],
-            stop: this.range[1],
-            type: tweetArray[i]["type"],
-            text: tweetArray[i]["text"].substring(
-              0,
-              this.range[1] - tweetArray[i]["start"]
-            )
-          });
-        }
-      } else if (
-        tweetArray[i]["start"] < this.range[0] &&
-        tweetArray[i]["stop"] > this.range[1]
-      ) {
-        // Start and end needs to be cut
-        res.push({
-          start: this.range[0],
-          stop: this.range[1],
-          type: tweetArray[i]["type"],
-          text: tweetArray[i]["text"].substring(
-            this.range[1] - tweetArray[i]["stop"],
-            tweetArray[i]["stop"] - this.range[1]
-          )
-        });
-      }
+    if (prevEnd != this.status.length) {
+      textParts.push({
+        start: prevEnd,
+        stop: this.status.length,
+        type: "text",
+        text: this.status.substring(prevEnd, this.status.length)
+      });
     }
-    return res;
+
+    return textParts;
   }
 }