653 lines
21 KiB
JavaScript
653 lines
21 KiB
JavaScript
![]() |
// import Vue from "vue";
|
|||
|
// const crypto = require("crypto");
|
|||
|
// import router from "@routes/router";
|
|||
|
// import store from '../store/store';
|
|||
|
import exportFromJSON from "export-from-json";
|
|||
|
|
|||
|
// util to export to excel file using plugin
|
|||
|
// https://github.com/zheeeng/export-from-json
|
|||
|
export const convertJsonToExcelUsingPlugin = async (
|
|||
|
data,
|
|||
|
fileName = "download"
|
|||
|
) => {
|
|||
|
// 'txt'(default), 'css', 'html', 'json', 'csv', 'xls', 'xml'
|
|||
|
const exportType = exportFromJSON.types.xls;
|
|||
|
const withBOM = true;
|
|||
|
|
|||
|
return await exportFromJSON({ data, fileName, exportType, withBOM });
|
|||
|
};
|
|||
|
|
|||
|
// util to export to excel file manually
|
|||
|
export const exportJsonToExcelManually = (JSONData, FileTitle, ShowLabel) => {
|
|||
|
//If JSONData is not an object then JSON.parse will parse the JSON string in an Object
|
|||
|
var arrData = typeof JSONData != "object" ? JSON.parse(JSONData) : JSONData;
|
|||
|
var CSV = "";
|
|||
|
//This condition will generate the Label/Header
|
|||
|
if (ShowLabel) {
|
|||
|
var row = "";
|
|||
|
//This loop will extract the label from 1st index of on array
|
|||
|
for (var index in arrData[0]) {
|
|||
|
//Now convert each value to string and comma-seprated
|
|||
|
row += encodeURI(index) + ",";
|
|||
|
}
|
|||
|
row = row.slice(0, -1);
|
|||
|
//append Label row with line break
|
|||
|
CSV += row + "\r\n";
|
|||
|
}
|
|||
|
//1st loop is to extract each row
|
|||
|
for (var i = 0; i < arrData.length; i++) {
|
|||
|
var row = "";
|
|||
|
//2nd loop will extract each column and convert it in string comma-seprated
|
|||
|
for (var index in arrData[i]) {
|
|||
|
row += '"' + arrData[i][index] + '",';
|
|||
|
}
|
|||
|
row.slice(0, row.length - 1);
|
|||
|
//add a line break after each row
|
|||
|
CSV += row + "\r\n";
|
|||
|
}
|
|||
|
if (CSV == "") {
|
|||
|
alert("Invalid data");
|
|||
|
return;
|
|||
|
}
|
|||
|
//Generate a file name
|
|||
|
// application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8;
|
|||
|
// text/csv;charset=utf-8;
|
|||
|
// var csvContent = "data:text/csv;charset=utf-8,%EF%BB%BF" + encodeURI(csvContent);
|
|||
|
|
|||
|
var filename = FileTitle;
|
|||
|
var blob = new Blob([CSV], {
|
|||
|
type: "text/csv;charset=utf-8,BOM",
|
|||
|
});
|
|||
|
|
|||
|
if (navigator.msSaveBlob) {
|
|||
|
// IE 10+
|
|||
|
navigator.msSaveBlob(blob, filename);
|
|||
|
} else {
|
|||
|
var link = document.createElement("a");
|
|||
|
if (link.download !== undefined) {
|
|||
|
// feature detection
|
|||
|
// Browsers that support HTML5 download attribute
|
|||
|
var url = URL.createObjectURL(blob);
|
|||
|
link.setAttribute("href", url);
|
|||
|
link.style = "visibility:hidden";
|
|||
|
link.download = filename + ".csv";
|
|||
|
document.body.appendChild(link);
|
|||
|
link.click();
|
|||
|
document.body.removeChild(link);
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
// util to delay promise
|
|||
|
export const wait = (ms) => {
|
|||
|
return (x) => {
|
|||
|
return new Promise((resolve) => setTimeout(() => resolve(x), ms));
|
|||
|
};
|
|||
|
};
|
|||
|
// util to createObjectByNewProperties
|
|||
|
export const createObjectByNewProperties = (list, allowedProperties) => {
|
|||
|
const properties = [];
|
|||
|
|
|||
|
list.forEach((item, index) => {
|
|||
|
const filtered = Object.keys(item)
|
|||
|
.filter((key) => allowedProperties.includes(key))
|
|||
|
.reduce((obj, key) => {
|
|||
|
obj[key] = item[key];
|
|||
|
return obj;
|
|||
|
}, {});
|
|||
|
|
|||
|
properties[index] = filtered;
|
|||
|
});
|
|||
|
return properties;
|
|||
|
};
|
|||
|
// util to convert digits to character
|
|||
|
export const toNumbersInCharacters = (number) => {
|
|||
|
const persianNumbers = ["۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹", "۰"];
|
|||
|
const arabicNumbers = ["١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩", "٠"];
|
|||
|
const englishNumbers = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"];
|
|||
|
const persianNumbersInCharacters = [
|
|||
|
"یک",
|
|||
|
"دو",
|
|||
|
"سه",
|
|||
|
"چهار",
|
|||
|
"پنج",
|
|||
|
"شش",
|
|||
|
"هفت",
|
|||
|
"هشت",
|
|||
|
"نه",
|
|||
|
"صفر",
|
|||
|
];
|
|||
|
|
|||
|
// only replace english number with persian number character
|
|||
|
return persianNumbersInCharacters[englishNumbers.indexOf(number)];
|
|||
|
|
|||
|
// convert all numbers to persian digits
|
|||
|
// return str.split("").map(c =>
|
|||
|
// persianNumbersInCharacters[englishNumbers.indexOf(c)] ||
|
|||
|
// persianNumbersInCharacters[englishNumbers.indexOf(c)] || c).join("")
|
|||
|
};
|
|||
|
// util to handle if img src is not valid
|
|||
|
export const handleImageSrcOnError = ({ target }, isUserAvatar = true) => {
|
|||
|
if (isUserAvatar) target.classList.add("human-avatar");
|
|||
|
target.classList.add("error");
|
|||
|
};
|
|||
|
// util to convert date to local date and time strng;
|
|||
|
export const persianDateAndTime = (stringDate, local = "fa-IR") => {
|
|||
|
let date = new Date(stringDate);
|
|||
|
let jsonDate = {
|
|||
|
weekday: {
|
|||
|
long: date.toLocaleDateString(local, { weekday: "long" }),
|
|||
|
short: date.toLocaleDateString(local, { weekday: "short" }),
|
|||
|
narrow: date.toLocaleDateString(local, { weekday: "narrow" }),
|
|||
|
},
|
|||
|
era: {
|
|||
|
long: date.toLocaleDateString(local, { era: "long" }),
|
|||
|
short: date.toLocaleDateString(local, { era: "short" }),
|
|||
|
narrow: date.toLocaleDateString(local, { era: "narrow" }),
|
|||
|
},
|
|||
|
timeZoneName: {
|
|||
|
long: date.toLocaleDateString(local, { timeZoneName: "long" }),
|
|||
|
short: date.toLocaleDateString(local, { timeZoneName: "short" }),
|
|||
|
},
|
|||
|
year: {
|
|||
|
numeric: date.toLocaleDateString(local, { year: "numeric" }),
|
|||
|
"2-digit": date.toLocaleDateString(local, { year: "2-digit" }),
|
|||
|
},
|
|||
|
month: {
|
|||
|
numeric: date.toLocaleDateString(local, { month: "numeric" }),
|
|||
|
"2-digit": date.toLocaleDateString(local, { month: "2-digit" }),
|
|||
|
long: date.toLocaleDateString(local, { month: "long" }),
|
|||
|
short: date.toLocaleDateString(local, { month: "short" }),
|
|||
|
narrow: date.toLocaleDateString(local, { month: "narrow" }),
|
|||
|
},
|
|||
|
day: {
|
|||
|
numeric: date.toLocaleDateString(local, { day: "numeric" }),
|
|||
|
"2-digit": date.toLocaleDateString(local, { day: "2-digit" }),
|
|||
|
},
|
|||
|
hour: {
|
|||
|
numeric: date.toLocaleTimeString(local, { hour: "numeric" }),
|
|||
|
"2-digit": date.toLocaleTimeString(local, { hour: "2-digit" }),
|
|||
|
},
|
|||
|
minute: {
|
|||
|
numeric: date.toLocaleTimeString(local, { minute: "numeric" }),
|
|||
|
"2-digit": date.toLocaleTimeString(local, { minute: "2-digit" }),
|
|||
|
},
|
|||
|
second: {
|
|||
|
numeric: date.toLocaleTimeString(local, { second: "numeric" }),
|
|||
|
"2-digit": date.toLocaleTimeString(local, { second: "2-digit" }),
|
|||
|
},
|
|||
|
};
|
|||
|
return jsonDate;
|
|||
|
};
|
|||
|
// util to format numbers to local curency
|
|||
|
export const formatNumber = (price = "") => {
|
|||
|
return new Intl.NumberFormat("fa-IR").format(price);
|
|||
|
};
|
|||
|
|
|||
|
export const isValidHttpUrl = (string) => {
|
|||
|
let url;
|
|||
|
|
|||
|
try {
|
|||
|
url = new URL(string);
|
|||
|
} catch (_) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
return url.protocol === "http:" || url.protocol === "https:";
|
|||
|
};
|
|||
|
export const addJsCssFileToDom = (fileUrl, fileType, uuid) => {
|
|||
|
let targetElement =
|
|||
|
fileType == "js" ? "script" : fileType == "css" ? "link" : "none";
|
|||
|
let targetAttr =
|
|||
|
fileType == "js" ? "src" : fileType == "css" ? "href" : "none";
|
|||
|
|
|||
|
let node = document.createElement(targetElement);
|
|||
|
node.setAttribute(targetAttr, fileUrl);
|
|||
|
node.setAttribute("id", targetElement + "-" + uuid);
|
|||
|
|
|||
|
document.head.appendChild(node);
|
|||
|
};
|
|||
|
export const removeJsCssFileFromDom = (fileType, uuid) => {
|
|||
|
let targetElement =
|
|||
|
fileType == "js" ? "script" : fileType == "css" ? "link" : "none";
|
|||
|
document.getElementById(targetElement + "-" + uuid)?.remove();
|
|||
|
};
|
|||
|
export const clearBodyClass = (className = undefined) => {
|
|||
|
if (className) document.querySelector("body").replace(className, "");
|
|||
|
else document.querySelector("body").removeAttribute("class");
|
|||
|
};
|
|||
|
export const redirectToExternalLink = (href, openInNewTab) => {
|
|||
|
if (href) {
|
|||
|
if (isValidHttpUrl(href) && openInNewTab) window.open(href, "_blank");
|
|||
|
else if (isValidHttpUrl(href) && !openInNewTab) window.location.href = href;
|
|||
|
else if (!isValidHttpUrl(href) && openInNewTab) {
|
|||
|
if (href.includes("www.")) window.open("http://" + href, "_blank");
|
|||
|
} else if (!isValidHttpUrl(href) && !openInNewTab) {
|
|||
|
if (href.includes("www.")) window.location.href = "http://" + href;
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
export const extractAllQueryParams = (href) => {
|
|||
|
return new URLSearchParams(href);
|
|||
|
|
|||
|
// return new Proxy(new URLSearchParams(href), {
|
|||
|
// get: (searchParams, prop) => searchParams.get(prop),
|
|||
|
// });
|
|||
|
};
|
|||
|
export const makeQueryParams = (url, searchParams) => {
|
|||
|
var query = new URLSearchParams();
|
|||
|
|
|||
|
// (A) URL SEARCH PARAMS OBJECT TO QUICKLY BUILD QUERY STRING
|
|||
|
Object.keys(searchParams).forEach((key) =>
|
|||
|
query.append(key, searchParams[key])
|
|||
|
);
|
|||
|
|
|||
|
// (B) CONVERT TO STRING, APPEND TO URL
|
|||
|
url += "?" + query.toString();
|
|||
|
return url;
|
|||
|
};
|
|||
|
|
|||
|
// export const decryptData = (
|
|||
|
// data,
|
|||
|
// key = "fTjWnZr4u7x!A%D*G-KaNdRgUkXp3s6v",
|
|||
|
// method = "AES-256-CBC",
|
|||
|
// iv = "poaskq2234??@35."
|
|||
|
// ) => {
|
|||
|
// let decipher = crypto.createDecipheriv(method, key, iv);
|
|||
|
// let decrypted = decipher.update(data, "base64", "utf8");
|
|||
|
// let dd = decrypted + decipher.final("utf8");
|
|||
|
// return JSON.parse(dd);
|
|||
|
// };
|
|||
|
|
|||
|
// util to handle response errors
|
|||
|
|
|||
|
export const handleErrors = (error) => {
|
|||
|
return new Promise((resolve, reject) => {
|
|||
|
/*
|
|||
|
401: The HTTP 401 Unauthorized response status code indicates that
|
|||
|
the client request has not been completed because it lacks
|
|||
|
valid authentication credentials for the requested resource.
|
|||
|
|
|||
|
403: The HTTP 403 Forbidden response status code indicates that
|
|||
|
the server understands the request but refuses to authorize it.
|
|||
|
|
|||
|
404: The HTTP 404 Not Found response status code indicates that
|
|||
|
the server cannot find the requested resource
|
|||
|
|
|||
|
405: The HyperText Transfer Protocol (HTTP) 405 Method Not Allowed
|
|||
|
response status code indicates that the server knows the
|
|||
|
request method, but the target resource doesn't support this method
|
|||
|
|
|||
|
406: Not Acceptable
|
|||
|
*/
|
|||
|
try {
|
|||
|
let res = error.response;
|
|||
|
|
|||
|
if (res) {
|
|||
|
if (res.status === 401) {
|
|||
|
mySwalToast({
|
|||
|
title: "خطا!",
|
|||
|
text: res.data.message,
|
|||
|
});
|
|||
|
|
|||
|
// router.push({ name: 'login' })
|
|||
|
} else if (res.status === 403) {
|
|||
|
mySwalToast({
|
|||
|
title: "خطا!",
|
|||
|
text: res.data.message,
|
|||
|
});
|
|||
|
} else if (res.status === 404) {
|
|||
|
mySwalToast({
|
|||
|
title: "خطا!",
|
|||
|
text: res.data.message,
|
|||
|
});
|
|||
|
|
|||
|
// router.push('/404')
|
|||
|
} else if (res.status === 405) {
|
|||
|
mySwalToast({
|
|||
|
title: "خطا!",
|
|||
|
text: res.data.message,
|
|||
|
});
|
|||
|
|
|||
|
// router.push('/404')
|
|||
|
} else if (res.status === 406) {
|
|||
|
mySwalToast({
|
|||
|
title: "خطا!",
|
|||
|
text: res.data.message,
|
|||
|
});
|
|||
|
|
|||
|
// router.push('/404')
|
|||
|
} else if (res.status === 500) {
|
|||
|
mySwalToast({
|
|||
|
title: "خطا!",
|
|||
|
text: res.data.message ?? res.data,
|
|||
|
});
|
|||
|
} else {
|
|||
|
mySwalToast({
|
|||
|
title: "خطا!",
|
|||
|
text: res.data.message,
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
resolve(error.response);
|
|||
|
} else {
|
|||
|
console.info(error);
|
|||
|
let message = "خطا!!!";
|
|||
|
|
|||
|
// if (error) {
|
|||
|
// message = error.message ?? error;
|
|||
|
// }
|
|||
|
// else
|
|||
|
// {
|
|||
|
// message = "خطا!!!"
|
|||
|
// }
|
|||
|
|
|||
|
reject(new Error(message));
|
|||
|
|
|||
|
// text: error.stack,
|
|||
|
mySwalToast({
|
|||
|
title: message,
|
|||
|
});
|
|||
|
}
|
|||
|
} catch (error) {
|
|||
|
let message = "خطا!!!";
|
|||
|
message = error?.message ?? message;
|
|||
|
|
|||
|
return reject(new Error(message));
|
|||
|
}
|
|||
|
});
|
|||
|
};
|
|||
|
|
|||
|
export const routeHandleErrors = (error, next) => {
|
|||
|
try {
|
|||
|
if (error) {
|
|||
|
if (error.status === 401) {
|
|||
|
mySwalToast({
|
|||
|
title: "خطا!",
|
|||
|
text: error.data.message,
|
|||
|
});
|
|||
|
|
|||
|
if (isLoginRemoved) {
|
|||
|
store.dispatch("loginAsGuest2").then(() => next("/"));
|
|||
|
} else {
|
|||
|
store.dispatch("logout").then(() =>
|
|||
|
next({
|
|||
|
name: "login",
|
|||
|
})
|
|||
|
);
|
|||
|
}
|
|||
|
} else if (error.status === 403) {
|
|||
|
mySwalToast({
|
|||
|
title: "خطا!",
|
|||
|
text: error.data.message,
|
|||
|
});
|
|||
|
} else if (error.status === 404) {
|
|||
|
mySwalToast({
|
|||
|
title: "خطا!",
|
|||
|
text: error.data.message,
|
|||
|
});
|
|||
|
|
|||
|
// router.push('/404')
|
|||
|
} else if (error.status === 405) {
|
|||
|
mySwalToast({
|
|||
|
title: "خطا!",
|
|||
|
text: error.data.message,
|
|||
|
});
|
|||
|
|
|||
|
// router.push('/404')
|
|||
|
} else if (error.status === 406) {
|
|||
|
mySwalToast({
|
|||
|
title: "خطا!",
|
|||
|
text: error.data.message,
|
|||
|
});
|
|||
|
|
|||
|
// router.push('/404')
|
|||
|
} else if (error.status === 500) {
|
|||
|
mySwalToast({
|
|||
|
title: "خطا!",
|
|||
|
text: error.data.message ?? error.data,
|
|||
|
});
|
|||
|
} else {
|
|||
|
mySwalToast({
|
|||
|
title: "خطا!",
|
|||
|
text: error.data.message,
|
|||
|
});
|
|||
|
}
|
|||
|
} else {
|
|||
|
console.info(error);
|
|||
|
let message = "خطا!!!";
|
|||
|
|
|||
|
mySwalToast({
|
|||
|
title: message,
|
|||
|
});
|
|||
|
}
|
|||
|
} catch (exeption) {
|
|||
|
console.info(exeption);
|
|||
|
|
|||
|
let message = "خطا!!!";
|
|||
|
message = exeption?.message ?? message;
|
|||
|
}
|
|||
|
};
|
|||
|
function mySwalToast(options) {
|
|||
|
Vue.swal({
|
|||
|
// width: '37em',
|
|||
|
imageWidth: "3em",
|
|||
|
imageHeight: "3em",
|
|||
|
showConfirmButton: false,
|
|||
|
|
|||
|
icon: "error",
|
|||
|
toast: true,
|
|||
|
position: "bottom-end",
|
|||
|
timerProgressBar: true,
|
|||
|
timer: 5000,
|
|||
|
confirmButtonColor: "unset",
|
|||
|
cancelButtonColor: "unset",
|
|||
|
...options,
|
|||
|
});
|
|||
|
}
|
|||
|
function mySwalConfirmModal(options) {
|
|||
|
Vue.swal({
|
|||
|
title: "خطا!",
|
|||
|
icon: "error",
|
|||
|
confirmButtonText: "بستن",
|
|||
|
...options,
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
function countDownTimer(timeInSecond = 120) {
|
|||
|
var timeleft = timeInSecond;
|
|||
|
var downloadTimer = setInterval(function () {
|
|||
|
if (timeleft <= 0) {
|
|||
|
clearInterval(downloadTimer);
|
|||
|
// document.getElementById("countdown").innerHTML = "Finished";
|
|||
|
} else {
|
|||
|
// document.getElementById("countdown").innerHTML =
|
|||
|
// timeleft + " seconds remaining";
|
|||
|
}
|
|||
|
timeleft -= 1;
|
|||
|
}, 1000);
|
|||
|
|
|||
|
return timeleft;
|
|||
|
}
|
|||
|
|
|||
|
///////////////////////////////////////
|
|||
|
export function normalizeText(
|
|||
|
text,
|
|||
|
options = { charArNormal: true, errorLine: true }
|
|||
|
) {
|
|||
|
// //defualt
|
|||
|
// options = {
|
|||
|
// charArNormal: true,
|
|||
|
// errorLine: true,
|
|||
|
// alphabetsNormal: false,
|
|||
|
// emptylinesNormal: false,
|
|||
|
// hamzehNormal: false,
|
|||
|
// spaceCorrection: false,
|
|||
|
// trimLine: false
|
|||
|
// };
|
|||
|
|
|||
|
// console.log(text)
|
|||
|
|
|||
|
text = text.trim();
|
|||
|
|
|||
|
//اصلاح خطاهای متن در کد خط
|
|||
|
if (options?.errorLine) {
|
|||
|
text = text.replaceAll("\\n", "\n");
|
|||
|
text = text.replaceAll("\\r", "\r");
|
|||
|
text = replaceRegText("(\r\n)+", "\n", text);
|
|||
|
text = text.replaceAll("\r", "\n");
|
|||
|
|
|||
|
//شنبهها ==> شنبهها
|
|||
|
//رسیدگیهای ==> رسیدگیهای
|
|||
|
// text = replaceRegText("(ه)(ها)", /\1\2/gm, text);
|
|||
|
}
|
|||
|
// یکسان سازی اختلاف حروف کیبوردهای مختلف - کدهای مختلف ولی نمایش یکسان
|
|||
|
if (options?.alphabetsNormal) {
|
|||
|
text = replaceAlphabets(text);
|
|||
|
}
|
|||
|
|
|||
|
//حذف خطوط و فاصلههای خالی
|
|||
|
if (options?.emptylinesNormal) {
|
|||
|
text = replaceRegText("( )+", " ", text);
|
|||
|
text = replaceRegText("(\n)+", "\n", text);
|
|||
|
}
|
|||
|
|
|||
|
// نرمال کردن حروف اختلافی عربی و فارسی
|
|||
|
if (options?.charArNormal) {
|
|||
|
text = text.replaceAll("ي", "ی");
|
|||
|
text = text.replaceAll("ك", "ک");
|
|||
|
}
|
|||
|
|
|||
|
// پرش از اختلافات همزهای
|
|||
|
if (options?.hamzehNormal) {
|
|||
|
text = replaceRegText("ئ|ﺋ", "ی", text);
|
|||
|
text = replaceRegText("ؤ|ﺅ", "و", text);
|
|||
|
text = replaceRegText("ﺔ|ۀ|ة", "ه", text);
|
|||
|
text = replaceRegText("إ|أ", "ا", text);
|
|||
|
}
|
|||
|
if (options?.dateNormal) {
|
|||
|
// فرمت YYYY/MM/DD یا YYYY-MM-DD
|
|||
|
text = replaceRegText(
|
|||
|
/(\d{4})[\/\-](\d{1,2})[\/\-](\d{1,2})/,
|
|||
|
(_, year, month, day) =>
|
|||
|
`${year}/${month.padStart(2, "0")}/${day.padStart(2, "0")}`,
|
|||
|
text
|
|||
|
);
|
|||
|
|
|||
|
// فرمت DD/MM/YYYY یا DD-MM-YYYY
|
|||
|
text = replaceRegText(
|
|||
|
/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,
|
|||
|
(_, day, month, year) =>
|
|||
|
`${year}/${month.padStart(2, "0")}/${day.padStart(2, "0")}`,
|
|||
|
text
|
|||
|
);
|
|||
|
|
|||
|
// فرمت MM/DD/YYYY
|
|||
|
text = replaceRegText(
|
|||
|
/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,
|
|||
|
(_, month, day, year) =>
|
|||
|
`${year}/${month.padStart(2, "0")}/${day.padStart(2, "0")}`,
|
|||
|
text
|
|||
|
);
|
|||
|
}
|
|||
|
if (options?.spaceCorrection) {
|
|||
|
text = spaceCorrection(text);
|
|||
|
}
|
|||
|
|
|||
|
// حذف خطوط اضافی اول و انتهای متن
|
|||
|
if (options?.trimLine) text = text.replace(/^\s+|\s+$/g, "");
|
|||
|
|
|||
|
text = text.trim();
|
|||
|
|
|||
|
return text;
|
|||
|
}
|
|||
|
|
|||
|
export function replaceAlphabets(text) {
|
|||
|
let res = text;
|
|||
|
res = res.replaceAll("\u00AD", "\u200C");
|
|||
|
res = res.replaceAll("\u00AC", "\u200C"); // نیم اسپیس خاص
|
|||
|
|
|||
|
res = replaceRegText("ﺁ|آ", "آ", res);
|
|||
|
res = replaceRegText("ﺎ|ٱ|ﺍ", "ا", res); //
|
|||
|
res = replaceRegText("ٲ|أ|ﺄ|ﺃ", "أ", res);
|
|||
|
res = replaceRegText("ﺈ|ﺇ", "إ", res);
|
|||
|
res = replaceRegText("ﺐ|ﺏ|ﺑ|ﺒ", "ب", res);
|
|||
|
res = replaceRegText("ﭖ|ﭗ|ﭙ|ﭘ", "پ", res);
|
|||
|
res = replaceRegText("ﭡ|ٺ|ٹ|ﭞ|ٿ|ټ|ﺕ|ﺗ|ﺖ|ﺘ", "ت", res);
|
|||
|
res = replaceRegText("ﺙ|ﺛ|ﺚ|ﺜ", "ث", res);
|
|||
|
res = replaceRegText("ﺝ|ڃ|ﺠ|ﺟ", "ج", res);
|
|||
|
res = replaceRegText("ڃ|ﭽ|ﭼ", "چ", res);
|
|||
|
res = replaceRegText("ﺢ|ﺤ|څ|ځ|ﺣ", "ح", res);
|
|||
|
res = replaceRegText("ﺥ|ﺦ|ﺨ|ﺧ", "خ", res);
|
|||
|
res = replaceRegText("ڏ|ډ|ﺪ|ﺩ", "د", res);
|
|||
|
res = replaceRegText("ﺫ|ﺬ|ذ", "ذ", res);
|
|||
|
res = replaceRegText("ڙ|ڗ|ڒ|ڑ|ڕ|ﺭ|ﺮ", "ر", res);
|
|||
|
res = replaceRegText("ﺰ|ﺯ", "ز", res);
|
|||
|
res = replaceRegText("ﮊ", "ژ", res);
|
|||
|
res = replaceRegText("ݭ|ݜ|ﺱ|ﺲ|ښ|ﺴ|ﺳ", "س", res);
|
|||
|
res = replaceRegText("ﺵ|ﺶ|ﺸ|ﺷ", "ش", res);
|
|||
|
res = replaceRegText("ﺺ|ﺼ|ﺻ|ﺹ", "ص", res); //
|
|||
|
res = replaceRegText("ﺽ|ﺾ|ﺿ|ﻀ", "ض", res);
|
|||
|
res = replaceRegText("ﻁ|ﻂ|ﻃ|ﻄ", "ط", res);
|
|||
|
res = replaceRegText("ﻆ|ﻇ|ﻈ", "ظ", res);
|
|||
|
res = replaceRegText("ڠ|ﻉ|ﻊ|ﻋ|ﻌ", "ع", res);
|
|||
|
res = replaceRegText("ﻎ|ۼ|ﻍ|ﻐ|ﻏ", "غ", res);
|
|||
|
res = replaceRegText("ﻒ|ﻑ|ﻔ|ﻓ", "ف", res);
|
|||
|
res = replaceRegText("ﻕ|ڤ|ﻖ|ﻗ|ﻘ", "ق", res);
|
|||
|
res = replaceRegText("ڭ|ﻚ|ﮎ|ﻜ|ﮏ|ګ|ﻛ|ﮑ|ﮐ|ڪ|ك", "ک", res);
|
|||
|
res = replaceRegText("ﮚ|ﮒ|ﮓ|ﮕ|ﮔ", "گ", res);
|
|||
|
res = replaceRegText("ﻝ|ﻞ|ﻠ|ڵ|ﻟ", "ل", res); //
|
|||
|
res = replaceRegText("ﻵ|ﻶ|ﻷ|ﻸ|ﻹ|ﻺ|ﻻ|ﻼ", "لا", res); //
|
|||
|
res = replaceRegText("ﻡ|ﻤ|ﻢ|ﻣ", "م", res);
|
|||
|
res = replaceRegText("ڼ|ﻦ|ﻥ|ﻨ|ﻧ", "ن", res);
|
|||
|
res = replaceRegText("ވ|ﯙ|ۈ|ۋ|ﺆ|ۊ|ۇ|ۏ|ۅ|ۉ|ﻭ|ﻮ|ؤ", "و", res);
|
|||
|
res = replaceRegText("ﻬ|ھ|ﻩ|ﻫ|ﻪ|ە|ہ", "ه", res);
|
|||
|
res = replaceRegText("ﭛ|ﻯ|ۍ|ﻰ|ﻱ|ﻲ|ں|ﻳ|ﻴ|ﯼ|ې|ﯽ|ﯾ|ﯿ|ێ|ے|ى|ي", "ی", res);
|
|||
|
res = replaceRegText("¬", "", res);
|
|||
|
res = replaceRegText("•|·|●|·|・|∙|。|ⴰ", ".", res);
|
|||
|
res = replaceRegText(",|٬|٫|‚|،", "،", res);
|
|||
|
res = replaceRegText("ʕ", "؟", res);
|
|||
|
res = replaceRegText("۰|٠", "0", res);
|
|||
|
res = replaceRegText("۱|١", "1", res);
|
|||
|
res = replaceRegText("۲|٢", "2", res);
|
|||
|
res = replaceRegText("۳|٣", "3", res);
|
|||
|
res = replaceRegText("۴|٤", "4", res);
|
|||
|
res = replaceRegText("۵", "5", res);
|
|||
|
res = replaceRegText("۶|٦", "6", res);
|
|||
|
res = replaceRegText("۷|٧", "7", res);
|
|||
|
res = replaceRegText("۸|٨", "8", res);
|
|||
|
res = replaceRegText("۹|٩", "9", res);
|
|||
|
res = replaceRegText("²", "2", res);
|
|||
|
res = replaceRegText("|ِ|ُ|َ|ٍ|ٌ|ً|", "", res);
|
|||
|
// res = replaceRegText("ـ", "_", res);
|
|||
|
res = replaceRegText("ـ", "-", res); //
|
|||
|
return res;
|
|||
|
}
|
|||
|
|
|||
|
export function spaceCorrection(text) {
|
|||
|
let res = text;
|
|||
|
res = replaceRegText("^(بی|می|نمی)( )", "$1", res);
|
|||
|
res = replaceRegText("( )(می|نمی|بی)( )", "$1$2", res);
|
|||
|
res = replaceRegText(
|
|||
|
"( )(هایی|ها|های|ایی|هایم|هایت|هایش|هایمان|هایتان|هایشان|ات|ان|ین|انی|بان|ام|ای|یم|ید|اید|اند|بودم|بودی|بود|بودیم|بودید|بودند|ست)( )",
|
|||
|
"$2$3",
|
|||
|
res
|
|||
|
);
|
|||
|
res = replaceRegText("( )(شده|نشده)( )", "$2", res);
|
|||
|
res = replaceRegText(
|
|||
|
"( )(طلبان|طلب|گرایی|گرایان|شناس|شناسی|گذاری|گذار|گذاران|شناسان|گیری|پذیری|بندی|آوری|سازی|بندی|کننده|کنندگان|گیری|پرداز|پردازی|پردازان|آمیز|سنجی|ریزی|داری|دهنده|آمیز|پذیری|پذیر|پذیران|گر|ریز|ریزی|رسانی|یاب|یابی|گانه|گانهای|انگاری|گا|بند|رسانی|دهندگان|دار)( )",
|
|||
|
"$2$3",
|
|||
|
res
|
|||
|
);
|
|||
|
return res;
|
|||
|
}
|
|||
|
|
|||
|
export function replaceRegText(pattern, replacement, text) {
|
|||
|
const regex = new RegExp(pattern, "g");
|
|||
|
return text.replace(regex, replacement);
|
|||
|
}
|
|||
|
|
|||
|
//////////////////////////////////////////
|
|||
|
|
|||
|
// export { wait, handleErrors }
|