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
JavaScript
/**
* @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=