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.

229 lines 19.5 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 * as tslib_1 from "tslib"; import { Injectable } from "@angular/core"; var NgxTruncateService = /** @class */ (function () { function NgxTruncateService() { } /** check the word cut */ /** * check the word cut * @param {?} number * @param {?} text * @return {?} */ NgxTruncateService.prototype.checkWordCut = /** * check the word cut * @param {?} number * @param {?} text * @return {?} */ function (number, text) { /** @type {?} */ var i = 0; for (i = number; i < text.length; i++) { if (text[i] == ' ') break; } return text.substring(0, i); }; /** find hashtag from text */ /** * find hashtag from text * @param {?} text * @return {?} */ NgxTruncateService.prototype.findHashtag = /** * find hashtag from text * @param {?} text * @return {?} */ function (text) { /** @type {?} */ var pattern = "^|[s](#[p{Pc}p{N}p{L}\u200C\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02B8(_)]+)"; //text = text.replace(new RegExp(pattern, 'ugmi'), match => { text = text.replace(/(^|\s)(#[\p{Pc}\p{N}\p{L}\u200cÀ-ÖØ-öø-ʸ(_)]+)/ugmi, (/** * @param {?} match * @return {?} */ function (match) { return "<span class=\"hashtag\" style=\"color:#1b95e0\">" + match + "</span>"; })); return text; }; /** check conditions and return text with them */ /** * check conditions and return text with them * @param {?} text * @param {?} number * @param {?=} completeWord * @param {?=} hashtag * @return {?} */ NgxTruncateService.prototype.applyCondition = /** * check conditions and return text with them * @param {?} text * @param {?} number * @param {?=} completeWord * @param {?=} hashtag * @return {?} */ function (text, number, completeWord, hashtag) { if (completeWord === void 0) { completeWord = false; } if (hashtag === void 0) { hashtag = false; } /** @type {?} */ var manipulatedText = ""; if (completeWord && hashtag) { /** @type {?} */ var temp = this.checkWordCut(number, text); manipulatedText = this.findHashtag(temp); } else if (completeWord) { manipulatedText = this.checkWordCut(number, text); } else if (hashtag) { /** @type {?} */ var temp = text.substring(0, number); manipulatedText = this.findHashtag(temp); } else { manipulatedText = text.substring(0, number); } return manipulatedText; }; /** * رنگ کردن کلمات داده شده در متن * @param content */ /** * رنگ کردن کلمات داده شده در متن * @param {?} content * @param {?} highlightCondition * @param {?} highlightQuery * @return {?} */ NgxTruncateService.prototype.highlight = /** * رنگ کردن کلمات داده شده در متن * @param {?} content * @param {?} highlightCondition * @param {?} highlightQuery * @return {?} */ function (content, highlightCondition, highlightQuery) { var e_1, _a, e_2, _b, e_3, _c, e_4, _d; //روی دایرکتیو تعریف نشود خود متن را بر می کرداند highlightList اگر ورودی if (!highlightQuery.length) { return content; } // دقیقا یافت می شود highlightList روی دایرکتیو تعریف نشود کلمات داده شده در highlightCondition اگر ورودی if (highlightCondition == "exactly") { var _loop_1 = function (q) { /** @type {?} */ var pattern = ''; //به صورت آبجکت باشند highlightList اگر کلمات داده شده در if (q.hasOwnProperty('name')) { pattern = "(^|(?<!\\p{L}))(" + q.name + ")(?!(\\p{L}))"; content = content.replace(new RegExp(pattern, 'gmu'), (/** * @param {?} match * @return {?} */ function (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 {?} */ function (match) { return "<span style=\"background:yellow\">" + match + "</span>"; })); } }; try { for (var highlightQuery_1 = tslib_1.__values(highlightQuery), highlightQuery_1_1 = highlightQuery_1.next(); !highlightQuery_1_1.done; highlightQuery_1_1 = highlightQuery_1.next()) { var q = highlightQuery_1_1.value; _loop_1(q); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (highlightQuery_1_1 && !highlightQuery_1_1.done && (_a = highlightQuery_1.return)) _a.call(highlightQuery_1); } finally { if (e_1) throw e_1.error; } } return content; } //هر مشابهی از کلمات در متن پیدا شده و رنگ می شوند else { try { for (var highlightQuery_2 = tslib_1.__values(highlightQuery), highlightQuery_2_1 = highlightQuery_2.next(); !highlightQuery_2_1.done; highlightQuery_2_1 = highlightQuery_2.next()) { var q = highlightQuery_2_1.value; /** @type {?} */ var pattern = ''; //به صورت آبجکت باشند highlightList اگر کلمات داده شده در if (q.hasOwnProperty('name')) { /** @type {?} */ var words = content.match(new RegExp(q.name, "gmi")); if (words) try { for (var words_1 = tslib_1.__values(words), words_1_1 = words_1.next(); !words_1_1.done; words_1_1 = words_1.next()) { var word = words_1_1.value; content = content.replace(new RegExp(q.name, "gmi"), "<span style=\"background-color:" + q.color + "\">" + word + "</span>"); } } catch (e_3_1) { e_3 = { error: e_3_1 }; } finally { try { if (words_1_1 && !words_1_1.done && (_c = words_1.return)) _c.call(words_1); } finally { if (e_3) throw e_3.error; } } } //به صورت رشته باشند highlightList اگر کلمات داده شده در else { /** @type {?} */ var words = content.match(new RegExp(q, "gmi")); if (words) try { for (var words_2 = tslib_1.__values(words), words_2_1 = words_2.next(); !words_2_1.done; words_2_1 = words_2.next()) { var word = words_2_1.value; content = content.replace(new RegExp(q, "gmi"), "<span style=\"background-color:yellow\">" + word + "</span>"); } } catch (e_4_1) { e_4 = { error: e_4_1 }; } finally { try { if (words_2_1 && !words_2_1.done && (_d = words_2.return)) _d.call(words_2); } finally { if (e_4) throw e_4.error; } } } } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (highlightQuery_2_1 && !highlightQuery_2_1.done && (_b = highlightQuery_2.return)) _b.call(highlightQuery_2); } finally { if (e_2) throw e_2.error; } } return content; } }; NgxTruncateService.decorators = [ { type: Injectable } ]; /** @nocollapse */ NgxTruncateService.ctorParameters = function () { return []; }; return NgxTruncateService; }()); export { NgxTruncateService }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXRydW5jYXRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtdHJ1bmNhdGUtdGV4dC8iLCJzb3VyY2VzIjpbImxpYi9uZ3gtdHJ1bmNhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDO0lBR0U7SUFBZ0IsQ0FBQztJQUVqQix5QkFBeUI7Ozs7Ozs7SUFDekIseUNBQVk7Ozs7OztJQUFaLFVBQWEsTUFBYyxFQUFFLElBQVk7O1lBQ25DLENBQUMsR0FBRyxDQUFDO1FBQ1QsS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3JDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUc7Z0JBQUUsTUFBTTtTQUMzQjtRQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELDZCQUE2Qjs7Ozs7O0lBQzdCLHdDQUFXOzs7OztJQUFYLFVBQVksSUFBSTs7WUFDUixPQUFPLEdBQUcsMEVBQWdEO1FBQ2hFLDZEQUE2RDtRQUM3RCxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxvREFBb0Q7Ozs7UUFBRSxVQUFDLEtBQUs7WUFDOUUsT0FBTyxxREFBK0MsS0FBSyxZQUFTLENBQUM7UUFDdkUsQ0FBQyxFQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxpREFBaUQ7Ozs7Ozs7OztJQUNqRCwyQ0FBYzs7Ozs7Ozs7SUFBZCxVQUFlLElBQVksRUFBRSxNQUFjLEVBQUUsWUFBNkIsRUFBRSxPQUF3QjtRQUF2RCw2QkFBQSxFQUFBLG9CQUE2QjtRQUFFLHdCQUFBLEVBQUEsZUFBd0I7O1lBQzlGLGVBQWUsR0FBVyxFQUFFO1FBQ2hDLElBQUksWUFBWSxJ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QUFDO2lDQUNsSDs7Ozs7Ozs7NkJBQUE7cUJBQ0o7b0JBQ0Qsd0RBQXdEO3lCQUNuRDs7NEJBQ0MsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO3dCQUMvQyxJQUFJLEtBQUs7O2dDQUNQLEtBQW1CLElBQUEsVUFBQSxpQkFBQSxLQUFLLENBQUEsNEJBQUEsK0NBQUU7b0NBQXJCLElBQU0sSUFBSSxrQkFBQTtvQ0FDYixPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsNkNBQXlDLElBQUksWUFBUyxDQUFDLENBQUM7aUNBQ3pHOzs7Ozs7Ozs2QkFBQTtxQkFDSjtpQkFDRjs7Ozs7Ozs7O1lBQ0QsT0FBTyxPQUFPLENBQUM7U0FDaEI7SUFDSCxDQUFDOztnQkFqR0YsVUFBVTs7OztJQWtHWCx5QkFBQztDQUFBLEFBbEdELElBa0dDO1NBakdZLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgTmd4VHJ1bmNhdGVTZXJ2aWNlIHtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7IH1cclxuXHJcbiAgLyoqIGNoZWNrIHRoZSB3b3JkIGN1dCAqL1xyXG4gIGNoZWNrV29yZEN1dChudW1iZXI6IG51bWJlciwgdGV4dDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCBpID0gMFxyXG4gICAgZm9yIChpID0gbnVtYmVyOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGV4dFtpXSA9PSAnICcpIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRleHQuc3Vic3RyaW5nKDAsIGkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIGZpbmQgaGFzaHRhZyBmcm9tIHRleHQgKi9cclxuICBmaW5kSGFzaHRhZyh0ZXh0KSB7XHJcbiAgICBjb25zdCBwYXR0ZXJuID0gYF58W1xcc10oI1tcXHB7UGN9XFxwe059XFxwe0x9XFx1MjAwY8OALcOWw5gtw7bDuC3KuChfKV0rKWA7XHJcbiAgICAvL3RleHQgPSB0ZXh0LnJlcGxhY2UobmV3IFJlZ0V4cChwYXR0ZXJuLCAndWdtaScpLCBtYXRjaCA9PiB7XHJcbiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC8oXnxcXHMpKCNbXFxwe1BjfVxccHtOfVxccHtMfVxcdTIwMGPDgC3DlsOYLcO2w7gtyrgoXyldKykvdWdtaSwgKG1hdGNoKSA9PiB7XHJcbiAgICAgIHJldHVybiBgPHNwYW4gY2xhc3M9XCJoYXNodGFnXCIgc3R5bGU9XCJjb2xvcjojMWI5NWUwXCI+JHttYXRjaH08L3NwYW4+YDtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRleHQ7XHJcbiAgfVxyXG5cclxuICAvKiogY2hlY2sgY29uZGl0aW9ucyBhbmQgcmV0dXJuIHRleHQgd2l0aCB0aGVtICovXHJcbiAgYXBwbHlDb25kaXRpb24odGV4dDogc3RyaW5nLCBudW1iZXI6IG51bWJlciwgY29tcGxldGVXb3JkOiBib29sZWFuID0gZmFsc2UsIGhhc2h0YWc6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XHJcbiAgICBsZXQgbWFuaXB1bGF0ZWRUZXh0OiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgaWYgKGNvbXBsZXRlV29yZCAmJiBoYXNodGFnKSB7XHJcbiAgICAgIGNvbnN0IHRlbXAgPSB0aGlzLmNoZWNrV29yZEN1dChudW1iZXIsIHRleHQpO1xyXG4gICAgICBtYW5pcHVsYXRlZFRleHQgPSB0aGlzLmZpbmRIYXNodGFnKHRlbXApO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoY29tcGxldGVXb3JkKSB7XHJcbiAgICAgIG1hbmlwdWxhdGVkVGV4dCA9IHRoaXMuY2hlY2tXb3JkQ3V0KG51bWJlciwgdGV4dCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChoYXNodGFnKSB7XHJcbiAgICAgIGNvbnN0IHRlbXAgPSB0ZXh0LnN1YnN0cmluZygwLCBudW1iZXIpO1xyXG4gICAgICBtYW5pcHVsYXRlZFRleHQgPSB0aGlzLmZpbmRIYXNodGFnKHRlbXApO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIG1hbmlwdWxhdGVkVGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIG51bWJlcik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWFuaXB1bGF0ZWRUZXh0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog2LHZhtqvINqp2LHYr9mGINqp2YTZhdin2Kog2K/Yp9iv2Ycg2LTYr9mHINiv2LEg2YXYqtmGXHJcbiAgICogQHBhcmFtIGNvbnRlbnRcclxuICAgKi9cclxuICBoaWdobGlnaHQoY29udGVudDogYW55LCBoaWdobGlnaHRDb25kaXRpb246IHN0cmluZyAsIGhpZ2hsaWdodFF1ZXJ5OiBhbnkpIHtcclxuICAgIC8v2LHZiNuMINiv2KfbjNix2qnYqtuM2Ygg2KrYudix24zZgSDZhti02YjYryDYrtmI2K8g2YXYqtmGINix2Kcg2KjYsSDZhduMINqp2LHYr9in2YbYryBoaWdobGlnaHRMaXN0INin2q/YsSDZiNix2YjYr9uMXHJcbiAgICBpZiAoIWhpZ2hsaWdodFF1ZXJ5Lmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gY29udGVudDtcclxuICAgIH1cclxuICAgIC8vINiv2YLbjNmC2Kcg24zYp9mB2Kog2YXbjCDYtNmI2K8gIGhpZ2hsaWdodExpc3Qg2LHZiNuMINiv2KfbjNix2qnYqtuM2Ygg2KrYudix24zZgSDZhti02YjYryDaqdmE2YXYp9iqINiv2KfYr9mHINi02K/ZhyDYr9ixIGhpZ2hsaWdodENvbmRpdGlvbiDYp9qv2LEg2YjYsdmI2K/bjFxyXG4gICAgaWYgKGhpZ2hsaWdodENvbmRpdGlvbiA9PSBcImV4YWN0bHlcIikge1xyXG4gICAgICBmb3IgKGxldCBxIG9mIGhpZ2hsaWdodFF1ZXJ5KSB7XHJcbiAgICAgICAgbGV0IHBhdHRlcm4gPSAnJztcclxuICAgICAgICAvL9io2Ycg2LXZiNix2Kog2KLYqNis2qnYqiDYqNin2LTZhtivIGhpZ2hsaWdodExpc3Qg2Kfar9ixINqp2YTZhdin2Kog2K/Yp9iv2Ycg2LTYr9mHINiv2LFcclxuICAgICAgICBpZiAocS5oYXNPd25Qcm9wZXJ0eSgnbmFtZScpKSB7XHJcbiAgICAgICAgICBwYXR0ZXJuID0gXCIoXnwoPzwhXFxcXHB7TH0pKShcIiArIHEubmFtZSArIFwiKSg/IShcXFxccHtMfSkpXCI7XHJcbiAgICAgICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKG5ldyBSZWdFeHAocGF0dGVybiwgJ2dtdScpLCBtYXRjaCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBgPHNwYW4gc3R5bGU9XCJiYWNrZ3JvdW5kOiR7cS5jb2xvcn1cIj4ke21hdGNofTwvc3Bhbj5gO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8v2KjZhyDYtdmI2LHYqiDYsdi02KrZhyDYqNin2LTZhtivIGhpZ2hsaWdodExpc3Qg2Kfar9ixINqp2YTZhdin2Kog2K/Yp9iv2Ycg2LTYr9mHINiv2LFcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHBhdHRlcm4gPSBcIihefCg/PCFcXFxccHtMfSkpKFwiICsgcSArIFwiKSg/IShcXFxccHtMfSkpXCI7XHJcbiAgICAgICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKG5ldyBSZWdFeHAocGF0dGVybiwgJ2dtdScpLCBtYXRjaCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBgPHNwYW4gc3R5bGU9XCJiYWNrZ3JvdW5kOnllbGxvd1wiPiR7bWF0Y2h9PC9zcGFuPmA7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XHJcbiAgICB9XHJcbiAgICAvL9mH2LEg2YXYtNin2KjZh9uMINin2LIg2qnZhNmF2KfYqiDYr9ixINmF2KrZhiDZvtuM2K/YpyDYtNiv2Ycg2Ygg2LHZhtqvINmF24wg2LTZiNmG2K9cclxuICAgIGVsc2Uge1xyXG4gICAgICBmb3IgKGxldCBxIG9mIGhpZ2hsaWdodFF1ZXJ5KSB7XHJcbiAgICAgICAgbGV0IHBhdHRlcm4gPSAnJztcclxuICAgICAgICAvL9io2Ycg2LXZiNix2Kog2KLYqNis2qnYqiDYqNin2LTZhtivIGhpZ2hsaWdodExpc3Qg2Kfar9ixINqp2YTZhdin2Kog2K/Yp9iv2Ycg2LTYr9mHINiv2LFcclxuICAgICAgICBpZiAocS5oYXNPd25Qcm9wZXJ0eSgnbmFtZScpKSB7XHJcbiAgICAgICAgICBsZXQgd29yZHMgPSBjb250ZW50Lm1hdGNoKG5ldyBSZWdFeHAocS5uYW1lLCBcImdtaVwiKSk7XHJcbiAgICAgICAgICBpZiAod29yZHMpXHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgd29yZCBvZiB3b3Jkcykge1xyXG4gICAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UobmV3IFJlZ0V4cChxLm5hbWUsIFwiZ21pXCIpLCBgPHNwYW4gc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiR7cS5jb2xvcn1cIj4ke3dvcmR9PC9zcGFuPmApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8v2KjZhyDYtdmI2LHYqiDYsdi02KrZhyDYqNin2LTZhtivIGhpZ2hsaWdodExpc3Qg2Kfar9ixINqp2YTZhdin2Kog2K/Yp9iv2Ycg2LTYr9mHINiv2LFcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGxldCB3b3JkcyA9IGNvbnRlbnQubWF0Y2gobmV3IFJlZ0V4cChxLCBcImdtaVwiKSk7XHJcbiAgICAgICAgICBpZiAod29yZHMpXHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgd29yZCBvZiB3b3Jkcykge1xyXG4gICAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UobmV3IFJlZ0V4cChxLCBcImdtaVwiKSwgYDxzcGFuIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjp5ZWxsb3dcIj4ke3dvcmR9PC9zcGFuPmApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBjb250ZW50O1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=