UNPKG

ngx-truncate-text

Version:

This module is for shortening the text and also includes some useful features for text manipulation like finding hashtags, highlight words with favorite color and so on after version 1.0.0.

146 lines 15 kB
/** * @fileoverview added by tsickle * Generated from: lib/ngx-truncate.service.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Injectable } from "@angular/core"; export class NgxTruncateService { constructor() { } /** * check the word cut * @param {?} number * @param {?} text * @return {?} */ checkWordCut(number, text) { /** @type {?} */ let i = 0; for (i = number; i < text.length; i++) { if (text[i] == ' ') break; } return text.substring(0, i); } /** * find hashtag from text * @param {?} text * @return {?} */ findHashtag(text) { /** @type {?} */ const pattern = `^|[\s](#[\p{Pc}\p{N}\p{L}\u200cÀ-ÖØ-öø-ʸ(_)]+)`; //text = text.replace(new RegExp(pattern, 'ugmi'), match => { text = text.replace(/(^|\s)(#[\p{Pc}\p{N}\p{L}\u200cÀ-ÖØ-öø-ʸ(_)]+)/ugmi, (/** * @param {?} match * @return {?} */ (match) => { return `<span class="hashtag" style="color:#1b95e0">${match}</span>`; })); return text; } /** * check conditions and return text with them * @param {?} text * @param {?} number * @param {?=} completeWord * @param {?=} hashtag * @return {?} */ applyCondition(text, number, completeWord = false, hashtag = false) { /** @type {?} */ let manipulatedText = ""; if (completeWord && hashtag) { /** @type {?} */ const temp = this.checkWordCut(number, text); manipulatedText = this.findHashtag(temp); } else if (completeWord) { manipulatedText = this.checkWordCut(number, text); } else if (hashtag) { /** @type {?} */ const temp = text.substring(0, number); manipulatedText = this.findHashtag(temp); } else { manipulatedText = text.substring(0, number); } return manipulatedText; } /** * رنگ کردن کلمات داده شده در متن * @param {?} content * @param {?} highlightCondition * @param {?} highlightQuery * @return {?} */ highlight(content, highlightCondition, highlightQuery) { //روی دایرکتیو تعریف نشود خود متن را بر می کرداند highlightList اگر ورودی if (!highlightQuery.length) { return content; } // دقیقا یافت می شود highlightList روی دایرکتیو تعریف نشود کلمات داده شده در highlightCondition اگر ورودی if (highlightCondition == "exactly") { for (let q of highlightQuery) { /** @type {?} */ let pattern = ''; //به صورت آبجکت باشند highlightList اگر کلمات داده شده در if (q.hasOwnProperty('name')) { pattern = "(^|(?<!\\p{L}))(" + q.name + ")(?!(\\p{L}))"; content = content.replace(new RegExp(pattern, 'gmu'), (/** * @param {?} match * @return {?} */ match => { return `<span style="background:${q.color}">${match}</span>`; })); } //به صورت رشته باشند highlightList اگر کلمات داده شده در else { pattern = "(^|(?<!\\p{L}))(" + q + ")(?!(\\p{L}))"; content = content.replace(new RegExp(pattern, 'gmu'), (/** * @param {?} match * @return {?} */ match => { return `<span style="background:yellow">${match}</span>`; })); } } return content; } //هر مشابهی از کلمات در متن پیدا شده و رنگ می شوند else { for (let q of highlightQuery) { /** @type {?} */ let pattern = ''; //به صورت آبجکت باشند highlightList اگر کلمات داده شده در if (q.hasOwnProperty('name')) { /** @type {?} */ let words = content.match(new RegExp(q.name, "gmi")); if (words) for (const word of words) { content = content.replace(new RegExp(q.name, "gmi"), `<span style="background-color:${q.color}">${word}</span>`); } } //به صورت رشته باشند highlightList اگر کلمات داده شده در else { /** @type {?} */ let words = content.match(new RegExp(q, "gmi")); if (words) for (const word of words) { content = content.replace(new RegExp(q, "gmi"), `<span style="background-color:yellow">${word}</span>`); } } } return content; } } } NgxTruncateService.decorators = [ { type: Injectable } ]; /** @nocollapse */ NgxTruncateService.ctorParameters = () => []; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXRydW5jYXRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtdHJ1bmNhdGUtdGV4dC8iLCJzb3VyY2VzIjpbImxpYi9uZ3gtdHJ1bmNhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0MsTUFBTSxPQUFPLGtCQUFrQjtJQUU3QixnQkFBZ0IsQ0FBQzs7Ozs7OztJQUdqQixZQUFZLENBQUMsTUFBYyxFQUFFLElBQVk7O1lBQ25DLENBQUMsR0FBRyxDQUFDO1FBQ1QsS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3JDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUc7Z0JBQUUsTUFBTTtTQUMzQjtRQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUIsQ0FBQzs7Ozs7O0lBR0QsV0FBVyxDQUFDLElBQUk7O2NBQ1IsT0FBTyxHQUFHLGdEQUFnRDtRQUNoRSw2REFBNkQ7UUFDN0QsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsb0RBQW9EOzs7O1FBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNsRixPQUFPLCtDQUErQyxLQUFLLFNBQVMsQ0FBQztRQUN2RSxDQUFDLEVBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7Ozs7Ozs7O0lBR0QsY0FBYyxDQUFDLElBQVksRUFBRSxNQUFjLEVBQUUsZUFBd0IsS0FBSyxFQUFFLFVBQW1CLEtBQUs7O1lBQzlGLGVBQWUsR0FBVyxFQUFFO1FBQ2hDLElBQUksWUFBWSxJQUFJLE9BQU8sRUFBRTs7a0JBQ3JCLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7WUFDNUMsZUFB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QUMsRUFBRSx5Q0FBeUMsSUFBSSxTQUFTLENBQUMsQ0FBQzt5QkFDekc7aUJBQ0o7YUFDRjtZQUNELE9BQU8sT0FBTyxDQUFDO1NBQ2hCO0lBQ0gsQ0FBQzs7O1lBakdGLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIE5neFRydW5jYXRlU2VydmljZSB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gIC8qKiBjaGVjayB0aGUgd29yZCBjdXQgKi9cclxuICBjaGVja1dvcmRDdXQobnVtYmVyOiBudW1iZXIsIHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgaSA9IDBcclxuICAgIGZvciAoaSA9IG51bWJlcjsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHRleHRbaV0gPT0gJyAnKSBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiB0ZXh0LnN1YnN0cmluZygwLCBpKTtcclxuICB9XHJcblxyXG4gIC8qKiBmaW5kIGhhc2h0YWcgZnJvbSB0ZXh0ICovXHJcbiAgZmluZEhhc2h0YWcodGV4dCkge1xyXG4gICAgY29uc3QgcGF0dGVybiA9IGBefFtcXHNdKCNbXFxwe1BjfVxccHtOfVxccHtMfVxcdTIwMGPDgC3DlsOYLcO2w7gtyrgoXyldKylgO1xyXG4gICAgLy90ZXh0ID0gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAocGF0dGVybiwgJ3VnbWknKSwgbWF0Y2ggPT4ge1xyXG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvKF58XFxzKSgjW1xccHtQY31cXHB7Tn1cXHB7TH1cXHUyMDBjw4Atw5bDmC3DtsO4Lcq4KF8pXSspL3VnbWksIChtYXRjaCkgPT4ge1xyXG4gICAgICByZXR1cm4gYDxzcGFuIGNsYXNzPVwiaGFzaHRhZ1wiIHN0eWxlPVwiY29sb3I6IzFiOTVlMFwiPiR7bWF0Y2h9PC9zcGFuPmA7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0ZXh0O1xyXG4gIH1cclxuXHJcbiAgLyoqIGNoZWNrIGNvbmRpdGlvbnMgYW5kIHJldHVybiB0ZXh0IHdpdGggdGhlbSAqL1xyXG4gIGFwcGx5Q29uZGl0aW9uKHRleHQ6IHN0cmluZywgbnVtYmVyOiBudW1iZXIsIGNvbXBsZXRlV29yZDogYm9vbGVhbiA9IGZhbHNlLCBoYXNodGFnOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xyXG4gICAgbGV0IG1hbmlwdWxhdGVkVGV4dDogc3RyaW5nID0gXCJcIjtcclxuICAgIGlmIChjb21wbGV0ZVdvcmQgJiYgaGFzaHRhZykge1xyXG4gICAgICBjb25zdCB0ZW1wID0gdGhpcy5jaGVja1dvcmRDdXQobnVtYmVyLCB0ZXh0KTtcclxuICAgICAgbWFuaXB1bGF0ZWRUZXh0ID0gdGhpcy5maW5kSGFzaHRhZyh0ZW1wKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGNvbXBsZXRlV29yZCkge1xyXG4gICAgICBtYW5pcHVsYXRlZFRleHQgPSB0aGlzLmNoZWNrV29yZEN1dChudW1iZXIsIHRleHQpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoaGFzaHRhZykge1xyXG4gICAgICBjb25zdCB0ZW1wID0gdGV4dC5zdWJzdHJpbmcoMCwgbnVtYmVyKTtcclxuICAgICAgbWFuaXB1bGF0ZWRUZXh0ID0gdGhpcy5maW5kSGFzaHRhZyh0ZW1wKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBtYW5pcHVsYXRlZFRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCBudW1iZXIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1hbmlwdWxhdGVkVGV4dDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqINix2YbaryDaqdix2K/ZhiDaqdmE2YXYp9iqINiv2KfYr9mHINi02K/ZhyDYr9ixINmF2KrZhlxyXG4gICAqIEBwYXJhbSBjb250ZW50XHJcbiAgICovXHJcbiAgaGlnaGxpZ2h0KGNvbnRlbnQ6IGFueSwgaGlnaGxpZ2h0Q29uZGl0aW9uOiBzdHJpbmcgLCBoaWdobGlnaHRRdWVyeTogYW55KSB7XHJcbiAgICAvL9ix2YjbjCDYr9in24zYsdqp2KrbjNmIINiq2LnYsduM2YEg2YbYtNmI2K8g2K7ZiNivINmF2KrZhiDYsdinINio2LEg2YXbjCDaqdix2K/Yp9mG2K8gaGlnaGxpZ2h0TGlzdCDYp9qv2LEg2YjYsdmI2K/bjFxyXG4gICAgaWYgKCFoaWdobGlnaHRRdWVyeS5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XHJcbiAgICB9XHJcbiAgICAvLyDYr9mC24zZgtinINuM2KfZgdiqINmF24wg2LTZiNivICBoaWdobGlnaHRMaXN0INix2YjbjCDYr9in24zYsdqp2KrbjNmIINiq2LnYsduM2YEg2YbYtNmI2K8g2qnZhNmF2KfYqiDYr9in2K/ZhyDYtNiv2Ycg2K/YsSBoaWdobGlnaHRDb25kaXRpb24g2Kfar9ixINmI2LHZiNiv24xcclxuICAgIGlmIChoaWdobGlnaHRDb25kaXRpb24gPT0gXCJleGFjdGx5XCIpIHtcclxuICAgICAgZm9yIChsZXQgcSBvZiBoaWdobGlnaHRRdWVyeSkge1xyXG4gICAgICAgIGxldCBwYXR0ZXJuID0gJyc7XHJcbiAgICAgICAgLy/YqNmHINi12YjYsdiqINii2KjYrNqp2Kog2KjYp9i02YbYryBoaWdobGlnaHRMaXN0INin2q/YsSDaqdmE2YXYp9iqINiv2KfYr9mHINi02K/ZhyDYr9ixXHJcbiAgICAgICAgaWYgKHEuaGFzT3duUHJvcGVydHkoJ25hbWUnKSkge1xyXG4gICAgICAgICAgcGF0dGVybiA9IFwiKF58KD88IVxcXFxwe0x9KSkoXCIgKyBxLm5hbWUgKyBcIikoPyEoXFxcXHB7TH0pKVwiO1xyXG4gICAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShuZXcgUmVnRXhwKHBhdHRlcm4sICdnbXUnKSwgbWF0Y2ggPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gYDxzcGFuIHN0eWxlPVwiYmFja2dyb3VuZDoke3EuY29sb3J9XCI+JHttYXRjaH08L3NwYW4+YDtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL9io2Ycg2LXZiNix2Kog2LHYtNiq2Ycg2KjYp9i02YbYryBoaWdobGlnaHRMaXN0INin2q/YsSDaqdmE2YXYp9iqINiv2KfYr9mHINi02K/ZhyDYr9ixXHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBwYXR0ZXJuID0gXCIoXnwoPzwhXFxcXHB7TH0pKShcIiArIHEgKyBcIikoPyEoXFxcXHB7TH0pKVwiO1xyXG4gICAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShuZXcgUmVnRXhwKHBhdHRlcm4sICdnbXUnKSwgbWF0Y2ggPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gYDxzcGFuIHN0eWxlPVwiYmFja2dyb3VuZDp5ZWxsb3dcIj4ke21hdGNofTwvc3Bhbj5gO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBjb250ZW50O1xyXG4gICAgfVxyXG4gICAgLy/Zh9ixINmF2LTYp9io2YfbjCDYp9iyINqp2YTZhdin2Kog2K/YsSDZhdiq2YYg2b7bjNiv2Kcg2LTYr9mHINmIINix2YbaryDZhduMINi02YjZhtivXHJcbiAgICBlbHNlIHtcclxuICAgICAgZm9yIChsZXQgcSBvZiBoaWdobGlnaHRRdWVyeSkge1xyXG4gICAgICAgIGxldCBwYXR0ZXJuID0gJyc7XHJcbiAgICAgICAgLy/YqNmHINi12YjYsdiqINii2KjYrNqp2Kog2KjYp9i02YbYryBoaWdobGlnaHRMaXN0INin2q/YsSDaqdmE2YXYp9iqINiv2KfYr9mHINi02K/ZhyDYr9ixXHJcbiAgICAgICAgaWYgKHEuaGFzT3duUHJvcGVydHkoJ25hbWUnKSkge1xyXG4gICAgICAgICAgbGV0IHdvcmRzID0gY29udGVudC5tYXRjaChuZXcgUmVnRXhwKHEubmFtZSwgXCJnbWlcIikpO1xyXG4gICAgICAgICAgaWYgKHdvcmRzKVxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHdvcmQgb2Ygd29yZHMpIHtcclxuICAgICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKG5ldyBSZWdFeHAocS5uYW1lLCBcImdtaVwiKSwgYDxzcGFuIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjoke3EuY29sb3J9XCI+JHt3b3JkfTwvc3Bhbj5gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvL9io2Ycg2LXZiNix2Kog2LHYtNiq2Ycg2KjYp9i02YbYryBoaWdobGlnaHRMaXN0INin2q/YsSDaqdmE2YXYp9iqINiv2KfYr9mHINi02K/ZhyDYr9ixXHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBsZXQgd29yZHMgPSBjb250ZW50Lm1hdGNoKG5ldyBSZWdFeHAocSwgXCJnbWlcIikpO1xyXG4gICAgICAgICAgaWYgKHdvcmRzKVxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHdvcmQgb2Ygd29yZHMpIHtcclxuICAgICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKG5ldyBSZWdFeHAocSwgXCJnbWlcIiksIGA8c3BhbiBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6eWVsbG93XCI+JHt3b3JkfTwvc3Bhbj5gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gY29udGVudDtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19