Skip to content

sajadweb/persian-tools

 
 

Repository files navigation

Persian tools

PersianTools.js is a standalone, library-agnostic JavaScript that enables some of the Persian features for use in the JavaScript.

Rate on Openbase CI/CD codecov GitHub license PRs Welcome CodeFactor All Contributors Wallaby.js


Features

Getting started

There are two main ways to get PersianTools.js in your JavaScript project: via script tags or by installing it from NPM and using a build tool like Parcel, WebPack, or Rollup.

via Script Tag

Add the following code to an HTML file:

<html>
<head>
    <!-- Load PersianTools.js -->
    <script src="https://cdn.jsdelivr.net/npm/persian-tools2@1.5.0/dist/index.bowser.js"></script>

    <!-- Place your code in the script tag below. You can also use an external .js file -->
    <script type="text/javascript">
        // Notice there is no 'import' statement. 'all persian-tools functions like digitsEnToFa, etc...' is available on the index-page
        // because of the script tag above.

        // Takes a string made of English digits only, and returns a string that represents the same number but with Persian digits
        var convertToFa = PersianTools.digitsEnToFa(1234567);

        // etc...
    </script>
</head>

<body></body>
</html>

Open up that html file in your browser, and the code should run!

via NPM

Add PersianTools.js to your project using yarn or npm. Note: Because we use ES2017 syntax (such as import), this workflow assumes you are using a modern browser, or a bundler/transpiler to convert your code to something older browsers understand.

import * as persianTools from "persian-tools2";
// or
import { digitsEnToFa } from "persian-tools2";

// Takes a string made of English digits only, and returns a string that represents the same number but with Persian digits
const convertToFa = persianTools.digitsEnToFa(1234567);
// or
const convertToFa = digitsEnToFa(1234567);

Usage

Let's take a look at what an example test case would look like using Persian-tools.

Convert Persian words to the number

Options Description Default
fuzzy(Beta) Fix typo in the Persian words by using levenshtein algorithm false
digits Result will be converted to the English or Persian digits en
addCommas Commas will be added to the Result false
  • Convert with no option
import { WordsToNumber } from "persian-tools2";

WordsToNumber.convert("منفی سه هزارمین") // -3000
WordsToNumber.convert("منفی سه هزارم") // -3000
WordsToNumber.convert("منفی سه هزار") // -3000
WordsToNumber.convert("سه هزار دویست و دوازده") // 3212
WordsToNumber.convert("دوازده هزار بیست دو") // 12022
  • Digits converter
WordsToNumber.convert("منفی سه هزارمین", { digits: "fa" }) // "-۳۰۰۰"
WordsToNumber.convert("دوازده هزار بیست دو", { digits: "fa" }) // ۱۲۰۲۲
  • Add commas
WordsToNumber.convert("منفی سه هزارمین", { addCommas: true }) // "-3,000"
WordsToNumber.convert("دوازده هزار بیست دو", { addCommas: true }) // "12,022"
  • Fuzzy typo fixer(v1.5.0):
import { WordsToNumber } from "persian-tools2";

WordsToNumber.convert("یگصد و بنجاه هزار", { fuzzy: true }) // "150000"  
WordsToNumber.convert("دویشت ر بیشت هزار", { fuzzy: true }) // "220000"  
WordsToNumber.convert("منقی ضد", { fuzzy: true }) // "-100"  

Convert Numbers to Persian words

import { NumberToWords } from "persian-tools2";

NumberToWords.convert(500443) // "پانصد هزار و چهار صد و چهل و سه"
NumberToWords.convert("500,443") // "پانصد هزار و چهار صد و چهل و سه"
NumberToWords.convert("500,443", { ordinal: true }) // "پانصد هزار و چهار صد و چهل و سوم"
NumberToWords.convert(30000000000) // "سی میلیارد"

Add and remove commas

import { addCommas, removeCommas } from "persian-tools2";

addCommas(30000000) // "30,000,000"
addCommas(300) // "300"

removeCommas("30,000,000") // 30000000
removeCommas(300) // 300
removeCommas("300") // 300

Convert Persian numbers to Arabic or English numbers and vice versa

import { digitsArToFa, digitsArToEn, digitsEnToFa, digitsFaToEn } from "persian-tools2";

digitsArToFa("٠١٢٣٤٥٦٧٨٩"); // "۰۱۲۳۴۵۶۷۸۹"
digitsArToFa("۸۹123۴۵"); // "۸۹123۴۵"
digitsArToFa(456128); // "456128"
digitsArToFa("Text ٠١٢٣٤٥٦٧٨٩"); // "Text ۰۱۲۳۴۵۶۷۸۹"

digitsArToEn("٠١٢٣٤٥٦٧٨٩"); // "0123456789"
digitsArToEn("٨٩123٤٥"); // "8912345"
digitsArToEn(456128); // "456128"

digitsArToEn("Text ٠١٢٣٤٥٦٧٨٩"); // "Text 0123456789"

digitsEnToFa("123۴۵۶"); // "۱۲۳۴۵۶"
digitsEnToFa("٤٥٦"); // "٤٥٦"
digitsEnToFa("123۴۵۶"); // "۱۲۳۴۵۶"

digitsFaToEn("123۴۵۶"); // "123456"
digitsFaToEn("۸۹123۴۵"); // "8912345"
digitsFaToEn("۰۱۲۳۴۵۶۷۸۹"); // "0123456789"

Validate Iranian national number(code-e Melli)

import { verifyIranianNationalId, getPlaceByIranNationalId } from "persian-tools2";

verifyIranianNationalId("0499370899"); // true
verifyIranianNationalId("0790419904"); // true
verifyIranianNationalId("0084575948"); // true
verifyIranianNationalId("0963695398"); // true
verifyIranianNationalId("0684159414"); // true
verifyIranianNationalId("0067749828"); // true
verifyIranianNationalId("0684159415"); // false

Find city and province name by national-id(code-e Melli)

getPlaceByIranNationalId("0499370899").city; // "شهرری"
getPlaceByIranNationalId("0790419904").city; // "سبزوار"
getPlaceByIranNationalId("0084575948").city; // "تهران مرکزی"
getPlaceByIranNationalId("0060495219").city; // "تهران مرکزی"
getPlaceByIranNationalId("0084545943").city; // "تهران مرکزی"
getPlaceByIranNationalId("0671658506").city; // "بجنورد"
getPlaceByIranNationalId("0671658506").city; // "بجنورد"
getPlaceByIranNationalId("0643005846").city; // "بیرجند"
getPlaceByIranNationalId("0906582709").city; // "کاشمر"
getPlaceByIranNationalId("0451727304").city; // "شمیران"
getPlaceByIranNationalId("0371359058").city; // "قم"

Bank number validation and get the name of the bank by bank account number

import { verifyCardNumber, getBankNameFromCardNumber } from "persian-tools2";

verifyCardNumber(6037701689095443); // true
verifyCardNumber(6219861034529007); // true
verifyCardNumber(6219861034529008); // false
getBankNameFromCardNumber(6037701689095443); // "بانک کشاورزی"
getBankNameFromCardNumber(6219861034529007); // "بانک سامان"
getBankNameFromCardNumber("6219861034529007"); // "بانک سامان"

Validate the correctness of the text of the Persian language and clear the Arabic letters in the Persian text.

import { isPersian, hasPersian, toPersianChars } from "persian-tools2";

isPersian("این یک متن فارسی است؟") // true
isPersian("Lorem Ipsum Test") // false
isPersian("هل هذا نص فارسي؟")// false

hasPersian("This text includes فارسی") // true

toPersianChars("علي")) // علی

Note: You can pass 2 more options to isPersian to customize it as your needs:

  • isComplex: If you pass true, Then it accepts some of regular arabic characters which are commons in persian texts.(default is false)
  • trimPattern: By default the function skips some of characters e.g. "'-+()؟. and whitespaces. You can pass your own customized regex as you need.

Fix Persian characters in URL.

import { isPersian, toPersianChars } from "persian-tools2";

URLfix(
	"https://fa.wikipedia.org/wiki/%D9%85%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C:Gadget-Extra-Editbuttons-botworks.js",
); // "https://fa.wikipedia.org/wiki/مدیاویکی:Gadget-Extra-Editbuttons-botworks.js"
URLfix("https://en.wikipedia.org/wiki/Persian_alphabet"); // "https://en.wikipedia.org/wiki/Persian_alphabet",
URLfix("Sample Text"); // "Sample Text"

Bill calculator

Method Description Return type
getResult Result of bill calculated information BillResult
getAmount Calculate Bill amount by payment id and bill id which entered by the Bill constructor number
getBillType Get Bill provider type name BillTypes
getBarcode Calculate and get Bill's barcode string
verificationBill Validate entered both Bill id and payment id, and return true if bill id and payment id relation was true boolean
verificationBillId Validate entered Bill id boolean
verificationBillPayment Validate entered Bill payment id boolean
import { Bill } from "persian-tools2";

// Calculate bill amount by bill id and payment id
// Convert to Iranian Rials
new Bill({ billId: 1117753200140, paymentId: 12070160, currency: "rial" }).getResult().amount; // 120000
// Return bill amount by Toman(Iranian currency type) by default
new Bill({ billId: 1117753200140, paymentId: 12070160 }).getResult().amount; // 12000

// Find Bill's type by bill id and payment id
new Bill({ billId: 7748317800142, paymentId: 1770160 }).getResult().type; // تلفن ثابت
new Bill({ billId: 9174639504124, paymentId: 12908197 }).getResult().type; // برق
new Bill({ billId: 2050327604613, paymentId: 1070189 }).getResult().type; // آب
new Bill({ billId: 9100074409151, paymentId: 12908190 }).getResult().type; // تلفن همراه
new Bill({ billId: 7748317800105, paymentId: 1770160 }).getResult().type; // unknown

// Check Bill id validation
new Bill({ billId: 7748317800142, paymentId: 1770160 }).getResult().isValidBillId; // true
new Bill({ billId: 2234322344613, paymentId: 1070189 }).getResult().isValidBillId; // false

// Check Bill's payment id validation
new Bill({ billId: 7748317800142, paymentId: 1770160 }).getResult().isValidBillPayment; // true
new Bill({ billId: 9174639504124, paymentId: 12908197 }).getResult().isValidBillPayment; // false

// Check Bill id and payment id relations which is valid or not
new Bill({ billId: 7748317800142, paymentId: 1770160 }).getResult().isValid; // true
new Bill({ billId: 2234322344613, paymentId: 1070189 }).getResult().isValid; // false

// Get barcode from billId and paymentId
new Bill({ billId: 7748317800142, paymentId: 1770160 }).getResult().barcode; // 77483178001420001770160
new Bill({ billId: 9174639504124, paymentId: 12908197 }).getResult().barcode; // 917463950412400012908197

// Get bill bill id and payment id by bill's barcode
new Bill({ barcode: "22343223446130001070189" }).findByBarcode(); // { billId: 2234322344613 , paymentId: 1070189 }

Iranian Sheba(IBAN)

  • Check validation
import { Sheba } from "persian-tools2";

new Sheba("IR820540102680020817909002").validate(); // true
new Sheba("IR01234567890123456789").validate() // false
  • Recognize bank information
import { Sheba } from "persian-tools2";

new Sheba("IR820540102680020817909002").recognize();
/*
 Result: {
    "nickname": "parsian",
    "name": "Parsian Bank",
    "persianName": "بانک پارسیان",
    "code": "054",
    "accountNumberAvailable": true,
    "accountNumber": "020817909002",
    "formattedAccountNumber": "002-00817909-002"
  }
*/

Fix Persian zero-width non-joiner(Replace spaces by half-space)

import { halfSpace } from "persian-tools2";

halfSpace("نمی ‌خواهی درخت ها را ببینیم؟") // "نمی‌خواهی درخت‌ها را ببینیم؟"

Get information(province, category, type) about vehicles plate

Properties Description Return type
info provide info about plate PlateResultApi
isValid checks if plate is valid or not boolean

Usage

import { Plate } from "persian-tools2";

plate("12D45147"); // passing string argument

// or passing in object style
Plate({
  number: "1245147",
  char: "الف"
})
  • Getting info about plate
import { plate } from "persian-tools2";

Plate("12D45147").info;
/*
  {
    template: 12 D 451 ایران  47
	  province: مرکزی ,
	  type: Car,
	  category: دیپلمات,    
  }
*/

// handle motorcyles plate
Plate(12345678).info;
/*
  {
    template: 123-45678,
    province: مرکز تهران,
    type: Motorcyle,
    category: null
  }
*/

Plates that have farsi digits in them(like: الف، ب، ص) will be returned in this template

  ${first_two_digits}${plate_character}${next_three_digits}ایران${province_code}
  • Checking if plate is valid
import { Plate } from "persian-tools2";

Plate("12D45147").isValid;
/*
  true
*/

Plate(12345678).info;
/*
  true
*/

Plate(1234567).isValid
/*
  will return false - plate character is not provided
*/

Plate(1204567).isValid
/*
  will return false - plate can't have 0 in its digits (except last digit)
*/

Todo

  • Write Jalaali and Gregorian functions to convert Date together.

Contributing

Thank you for your interest in contributing! Please feel free to put up a PR for any issue or feature request.

License

This project is licensed under the MIT License - see the LICENSE.md file for details.

Contributors ✨

Thanks goes to these wonderful people (emoji key):


Ali Torki

🚇 ⚠️ 💻

mssoheil

⚠️ 💻

Mohsen

⚠️ 💻

Hesam pourghazian

💻

Amir Hossien Qasemi Moqaddam

💻

SeyyedKhandon

💻

msdDaliriyan

💻

Mahdi

💻 ⚠️ 📖

This project follows the all-contributors specification. Contributions of any kind welcome!

Wallaby.js

Wallaby.js

This repository contributors are welcome to use Wallaby.js OSS License to get test results immediately as you type, and see the results in your editor right next to your code.

About

An anthology of a variety of tools for the Persian language in javascript

Resources

License

Code of conduct

Stars

Watchers

Forks

Packages

No packages published

Languages

  • TypeScript 98.3%
  • JavaScript 1.2%
  • Makefile 0.5%