v0.1
This commit is contained in:
commit
590b7acfe9
16 changed files with 525 additions and 0 deletions
18
.eslintrc.cjs
Normal file
18
.eslintrc.cjs
Normal file
|
@ -0,0 +1,18 @@
|
|||
module.exports = {
|
||||
root: true,
|
||||
env: { browser: true, es2020: true },
|
||||
extends: [
|
||||
'eslint:recommended',
|
||||
'plugin:@typescript-eslint/recommended',
|
||||
'plugin:react-hooks/recommended',
|
||||
],
|
||||
ignorePatterns: ['dist', '.eslintrc.cjs'],
|
||||
parser: '@typescript-eslint/parser',
|
||||
plugins: ['react-refresh'],
|
||||
rules: {
|
||||
'react-refresh/only-export-components': [
|
||||
'warn',
|
||||
{ allowConstantExport: true },
|
||||
],
|
||||
},
|
||||
}
|
24
.gitignore
vendored
Normal file
24
.gitignore
vendored
Normal file
|
@ -0,0 +1,24 @@
|
|||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
|
||||
node_modules
|
||||
dist
|
||||
dist-ssr
|
||||
*.local
|
||||
|
||||
# Editor directories and files
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
.idea
|
||||
.DS_Store
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
BIN
bun.lockb
Executable file
BIN
bun.lockb
Executable file
Binary file not shown.
13
index.html
Normal file
13
index.html
Normal file
|
@ -0,0 +1,13 @@
|
|||
<!doctype html>
|
||||
<html lang="fa" dir="rtl">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/svg+xml" href="" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Vaznyaab</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
<script type="module" src="/src/main.tsx"></script>
|
||||
</body>
|
||||
</html>
|
33
package.json
Normal file
33
package.json
Normal file
|
@ -0,0 +1,33 @@
|
|||
{
|
||||
"name": "vaznyaab-react",
|
||||
"private": true,
|
||||
"version": "0.0.0",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "tsc && vite build",
|
||||
"lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
|
||||
"preview": "vite preview"
|
||||
},
|
||||
"dependencies": {
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"talisman": "^1.1.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/react": "^18.2.43",
|
||||
"@types/react-dom": "^18.2.17",
|
||||
"@typescript-eslint/eslint-plugin": "^6.14.0",
|
||||
"@typescript-eslint/parser": "^6.14.0",
|
||||
"@vitejs/plugin-react-swc": "^3.5.0",
|
||||
"autoprefixer": "^10.4.16",
|
||||
"daisyui": "latest",
|
||||
"eslint": "^8.55.0",
|
||||
"eslint-plugin-react-hooks": "^4.6.0",
|
||||
"eslint-plugin-react-refresh": "^0.4.5",
|
||||
"postcss": "^8.4.32",
|
||||
"tailwindcss": "^3.4.0",
|
||||
"typescript": "^5.2.2",
|
||||
"vite": "^5.0.8"
|
||||
}
|
||||
}
|
6
postcss.config.js
Normal file
6
postcss.config.js
Normal file
|
@ -0,0 +1,6 @@
|
|||
export default {
|
||||
plugins: {
|
||||
tailwindcss: {},
|
||||
autoprefixer: {},
|
||||
},
|
||||
}
|
63
src/App.tsx
Normal file
63
src/App.tsx
Normal file
|
@ -0,0 +1,63 @@
|
|||
import { useState } from 'react'
|
||||
import { vaznha, heja, set_exact_matcher, set_fuzzy_matcher } from './vaznha.ts'
|
||||
|
||||
function App() {
|
||||
const [input, setInput] = useState('');
|
||||
const [output, setOutput] = useState<string[]>([]);
|
||||
|
||||
function ganjoor_url(vazn: string): string {
|
||||
return encodeURI("https://ganjoor.net/simi/?v=" + vazn);
|
||||
}
|
||||
|
||||
function heja_to_unicode(heja: string): string {
|
||||
let s = heja;
|
||||
s = s.replace(/U/g, '⏑');
|
||||
s = s.replace(/_/g, '–');
|
||||
return s;
|
||||
}
|
||||
|
||||
function display_vaznha(output: string[]) {
|
||||
if (output.length == 0) {
|
||||
return <> وزن یافت نشد. </>;
|
||||
}
|
||||
return (
|
||||
<ol>
|
||||
{output.map((vazn) => (
|
||||
<li><a key={vazn} href={ganjoor_url(vazn)} target='_blank' className="text-xl font-serif font-bold">{vazn}</a></li>
|
||||
))}
|
||||
</ol>
|
||||
);
|
||||
}
|
||||
|
||||
function toggle_exact_fuzzy(fuzzy: boolean) {
|
||||
if (fuzzy) {
|
||||
set_fuzzy_matcher(1);
|
||||
} else {
|
||||
set_exact_matcher();
|
||||
}
|
||||
vaznha(input).then((val) => setOutput(val));
|
||||
}
|
||||
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className="container w-full min-h-screen justify-center bg-base-100 text-lg">
|
||||
<div className="flex flex-col max-w-lg p-4 mx-auto">
|
||||
<span className="label-text p-2 text-md">
|
||||
یک مصراع را به فینگلیش وارد کنید.
|
||||
<div className='inline float-left'>
|
||||
دقیق
|
||||
<input type="checkbox" className="toggle align-middle mx-2" onClick={(event) => toggle_exact_fuzzy(event.currentTarget.checked)} />
|
||||
فازی
|
||||
</div>
|
||||
</span>
|
||||
<textarea dir="ltr" rows={2} spellCheck="false" placeholder='…' className="textarea textarea-bordered resize-none text-lg" onChange={(event) => { setInput(event.target.value); vaznha(event.target.value).then((val) => setOutput(val)); }}></textarea>
|
||||
<div dir="ltr" className="w-full p-2 justify-center font-mono text-4xl">{heja_to_unicode(heja(input))}</div>
|
||||
<p className="my-8">{display_vaznha(output)}</p>
|
||||
</div>
|
||||
</div >
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
export default App
|
195
src/data.ts
Normal file
195
src/data.ts
Normal file
|
@ -0,0 +1,195 @@
|
|||
export const ARKAAN: { [key: number]: string } = {
|
||||
1: "mafaa'ilon",
|
||||
2: "faa'elaaton",
|
||||
3: "mostaf'elon",
|
||||
4: "mafaa'ilo",
|
||||
5: "faa'elaato",
|
||||
6: "mostaf'elo",
|
||||
7: "mafaa'elon",
|
||||
8: "fa'alaaton",
|
||||
9: "mofta'elon",
|
||||
10: "fa'alaato",
|
||||
11: "mafaa'elo",
|
||||
12: "fa'alon",
|
||||
13: "faa'elon",
|
||||
14: "fa'oolon",
|
||||
15: "maf'oolon",
|
||||
16: "maf'oolo",
|
||||
17: "fa'laano",
|
||||
18: "fa'al",
|
||||
19: "fa' lon",
|
||||
20: "fa'",
|
||||
21: "faa'elo",
|
||||
22: "motafaa'elon",
|
||||
23: "mostaf'elaton",
|
||||
24: "mafaa'elaton",
|
||||
25: "motafaa'elaton",
|
||||
26: "motafaa'elaaton",
|
||||
27: "motafa'elon"
|
||||
}
|
||||
|
||||
export const VAZNHA: { [key: number]: { arkaan: number[], desc: string }[] } = {
|
||||
1: [{ arkaan: [14, 14, 14, 18], desc: "فعولن فعولن فعولن فعل (متقارب مثمن محذوف یا وزن شاهنامه)" }],
|
||||
2: [{ arkaan: [1, 1, 14], desc: "مفاعیلن مفاعیلن فعولن (هزج مسدس محذوف یا وزن دوبیتی)" }],
|
||||
3: [{ arkaan: [2, 2, 2, 13], desc: "فاعلاتن فاعلاتن فاعلاتن فاعلن (رمل مثمن محذوف)" }],
|
||||
4: [{ arkaan: [7, 8, 7, 12], desc: "مفاعلن فعلاتن مفاعلن فعلن (مجتث مثمن مخبون محذوف)" }, { arkaan: [7, 8, 7, 19], desc: "مفاعلن فعلاتن مفاعلن فعلن (مجتث مثمن مخبون محذوف)" }],
|
||||
5: [{ arkaan: [16, 5, 4, 13], desc: "مفعول فاعلات مفاعیل فاعلن (مضارع مثمن اخرب مکفوف محذوف)" }],
|
||||
6: [{ arkaan: [8, 7, 12], desc: "فعلاتن مفاعلن فعلن (خفیف مسدس مخبون)" }, { arkaan: [8, 7, 19], desc: "فعلاتن مفاعلن فعلن (خفیف مسدس مخبون)" }],
|
||||
7: [{ arkaan: [2, 2, 13], desc: "فاعلاتن فاعلاتن فاعلن (رمل مسدس محذوف یا وزن مثنوی)" }],
|
||||
8: [{ arkaan: [8, 8, 8, 12], desc: "فعلاتن فعلاتن فعلاتن فعلن (رمل مثمن مخبون محذوف)" }, { arkaan: [8, 8, 8, 19], desc: "فعلاتن فعلاتن فعلاتن فعلن (رمل مثمن مخبون محذوف)" }],
|
||||
9: [{ arkaan: [1, 1, 1, 1], desc: "مفاعیلن مفاعیلن مفاعیلن مفاعیلن (هزج مثمن سالم)" }],
|
||||
10: [{ arkaan: [16, 4, 4, 14], desc: "مفعول مفاعیل مفاعیل فعولن (هزج مثمن اخرب مکفوف محذوف)" }],
|
||||
11: [{ arkaan: [16, 4, 4, 18], desc: "مفعول مفاعیل مفاعیل فعل (وزن رباعی)" }],
|
||||
12: [{ arkaan: [16, 7, 14], desc: "مفعول مفاعلن فعولن (هزج مسدس اخرب مقبوض محذوف)" }],
|
||||
13: [{ arkaan: [9, 9, 13], desc: "مفتعلن مفتعلن فاعلن (سریع مطوی مکشوف)" }, { arkaan: [7, 9, 13], desc: "مفتعلن مفتعلن فاعلن (سریع مطوی مکشوف)" }, { arkaan: [9, 7, 13], desc: "مفتعلن مفتعلن فاعلن (سریع مطوی مکشوف)" }],
|
||||
14: [{ arkaan: [16, 2, 16, 2], desc: "مفعول فاعلاتن مفعول فاعلاتن (مضارع مثمن اخرب)" }],
|
||||
15: [{ arkaan: [14, 14, 14, 14], desc: "فعولن فعولن فعولن فعولن (متقارب مثمن سالم)" }],
|
||||
16: [{ arkaan: [9, 13, 9, 13], desc: "مفتعلن فاعلن مفتعلن فاعلن (منسرح مطوی مکشوف)" }, { arkaan: [7, 13, 9, 13], desc: "مفتعلن فاعلن مفتعلن فاعلن (منسرح مطوی مکشوف)" }, { arkaan: [9, 13, 7, 13], desc: "مفتعلن فاعلن مفتعلن فاعلن (منسرح مطوی مکشوف)" }],
|
||||
17: [{ arkaan: [8, 8, 12], desc: "فعلاتن فعلاتن فعلن (رمل مسدس مخبون محذوف)" }, { arkaan: [8, 8, 19], desc: "فعلاتن فعلاتن فعلن (رمل مسدس مخبون محذوف)" }],
|
||||
18: [{ arkaan: [9, 5, 9, 20], desc: "مفتعلن فاعلات مفتعلن فع (منسرح مثمن مطوی منحور)" }, { arkaan: [7, 5, 9, 20], desc: "مفتعلن فاعلات مفتعلن فع (منسرح مثمن مطوی منحور)" }, { arkaan: [9, 5, 7, 20], desc: "مفتعلن فاعلات مفتعلن فع (منسرح مثمن مطوی منحور)" }],
|
||||
19: [{ arkaan: [3, 3, 3, 3], desc: "مستفعلن مستفعلن مستفعلن مستفعلن (رجز مثمن سالم)" }],
|
||||
20: [{ arkaan: [16, 1, 16, 1], desc: "مفعول مفاعیلن مفعول مفاعیلن (هزج مثمن اخرب)" }],
|
||||
21: [{ arkaan: [9, 7, 9, 7], desc: "مفتعلن مفاعلن مفتعلن مفاعلن (رجز مثمن مطوی مخبون)" }, { arkaan: [7, 7, 9, 7], desc: "مفتعلن مفاعلن مفتعلن مفاعلن (رجز مثمن مطوی مخبون)" }, { arkaan: [9, 7, 7, 7], desc: "مفتعلن مفاعلن مفتعلن مفاعلن (رجز مثمن مطوی مخبون)" }],
|
||||
22: [{ arkaan: [7, 8, 7, 8], desc: "مفاعلن فعلاتن مفاعلن فعلاتن (مجتث مثمن مخبون)" }],
|
||||
23: [{ arkaan: [16, 7, 1], desc: "مفعول مفاعلن مفاعیلن (هزج مسدس اخرب مقبوض)" }],
|
||||
24: [{ arkaan: [10, 2, 10, 2], desc: "فعلات فاعلاتن فعلات فاعلاتن (رمل مثمن مشکول)" }],
|
||||
25: [{ arkaan: [], desc: "" }],
|
||||
26: [{ arkaan: [8, 8, 8, 8], desc: "فعلاتن فعلاتن فعلاتن فعلاتن (رمل مثمن مخبون)" }],
|
||||
27: [{ arkaan: [2, 2, 2, 2], desc: "فاعلاتن فاعلاتن فاعلاتن فاعلاتن (رمل مثمن سالم)" }],
|
||||
28: [{ arkaan: [16, 5, 1], desc: "مفعول فاعلات مفاعیلن (مضارع مسدس اخرب مکفوف)" }],
|
||||
29: [{ arkaan: [16, 4, 2], desc: "مفعول مفاعیل فاعلاتن" }],
|
||||
30: [{ arkaan: [13, 1, 13, 1], desc: "فاعلن مفاعیلن فاعلن مفاعیلن (مقتضب مثمن مطوی مقطوع)" }],
|
||||
31: [{ arkaan: [8, 8, 8, 20], desc: "فعلاتن فعلاتن فعلاتن فع" }],
|
||||
32: [{ arkaan: [3, 20, 3, 20], desc: "مستفعلن فع مستفعلن فع (متقارب مثمن اثلم)" }],
|
||||
33: [{ arkaan: [22, 22, 22, 22], desc: "متفاعلن متفاعلن متفاعلن متفاعلن" }],
|
||||
34: [{ arkaan: [23, 23], desc: "مستفعلتن مستفعلتن" }],
|
||||
35: [{ arkaan: [9, 9, 9, 9], desc: "مفتعلن مفتعلن مفتعلن مفتعلن (رجز مثمن مطوی)" }, { arkaan: [7, 9, 9, 9], desc: "مفتعلن مفتعلن مفتعلن مفتعلن (رجز مثمن مطوی)" }, { arkaan: [9, 9, 7, 9], desc: "مفتعلن مفتعلن مفتعلن مفتعلن (رجز مثمن مطوی)" }],
|
||||
36: [{ arkaan: [7, 20, 7, 20, 7, 20, 7, 20], desc: "مفاعلن فع مفاعلن فع مفاعلن فع مفاعلن فع" }],
|
||||
37: [{ arkaan: [16, 13, 16, 13], desc: "مفعول فاعلن مفعول فاعلن" }],
|
||||
38: [{ arkaan: [3, 12, 3, 12], desc: "مستفعلن فعلن مستفعلن فعلن (بسیط مخبون)" }, { arkaan: [3, 19, 3, 12], desc: "مستفعلن فعلن مستفعلن فعلن (بسیط مخبون)" }, { arkaan: [3, 12, 3, 19], desc: "مستفعلن فعلن مستفعلن فعلن (بسیط مخبون)" }],
|
||||
39: [{ arkaan: [2, 2, 2], desc: "فاعلاتن فاعلاتن فاعلاتن" }],
|
||||
40: [{ arkaan: [8, 7, 8, 7], desc: "فعلاتن مفاعلن فعلاتن مفاعلن" }],
|
||||
41: [{ arkaan: [16, 24, 12], desc: "مفعول مفاعلتن فعلن" }],
|
||||
42: [{ arkaan: [7, 7, 7, 7], desc: "مفاعلن مفاعلن مفاعلن مفاعلن" }],
|
||||
43: [{ arkaan: [16, 4, 13], desc: "مفعول مفاعیل فاعلن" }],
|
||||
44: [{ arkaan: [7, 20, 7, 20], desc: "مفاعلن فع مفاعلن فع" }],
|
||||
45: [{ arkaan: [4, 14, 4, 14], desc: "مفاعیل فعولن مفاعیل فعولن" }],
|
||||
46: [{ arkaan: [14, 7, 14, 7], desc: "فعولن مفاعلن فعولن مفاعلن" }],
|
||||
47: [{ arkaan: [9, 5, 9], desc: "مفتعلن فاعلات مفتعلن" }, { arkaan: [7, 5, 9], desc: "مفتعلن فاعلات مفتعلن" }, { arkaan: [9, 5, 7], desc: "مفتعلن فاعلات مفتعلن" }],
|
||||
48: [{ arkaan: [16, 5, 1], desc: "مفعول فاعلات مفاعیلن" }],
|
||||
49: [{ arkaan: [5, 20, 5, 20], desc: "فاعلات فع فاعلات فع" }],
|
||||
50: [{ arkaan: [4, 4, 4, 14], desc: "مفاعیل مفاعیل مفاعیل فعولن (هزج مثمن مکفوف محذوف)" }],
|
||||
51: [{ arkaan: [25, 25], desc: "متفاعلتن متفاعلتن" }],
|
||||
52: [{ arkaan: [3, 3, 3, 20], desc: "مستفعلن مستفعلن مستفعلن فع" }],
|
||||
53: [{ arkaan: [9, 20, 9, 20], desc: "مفتعلن فع مفتعلن فع" }],
|
||||
54: [{ arkaan: [16, 5, 4, 20], desc: "مفعول فاعلات مفاعیل فع" }],
|
||||
55: [{ arkaan: [13, 13, 2], desc: "فاعلن فاعلن فاعلاتن" }],
|
||||
56: [{ arkaan: [7, 7, 7], desc: "مفاعلن مفاعلن مفاعلن" }],
|
||||
57: [{ arkaan: [9, 9, 9, 20], desc: "مفتعلن مفتعلن مفتعلن فع" }, { arkaan: [7, 9, 9, 20], desc: "مفتعلن مفتعلن مفتعلن فع" }, { arkaan: [9, 7, 9, 20], desc: "مفتعلن مفتعلن مفتعلن فع" }, { arkaan: [9, 9, 7, 20], desc: "مفتعلن مفتعلن مفتعلن فع" }],
|
||||
58: [{ arkaan: [13, 13, 13, 20], desc: "فاعلن فاعلن فاعلن فع" }],
|
||||
59: [{ arkaan: [3, 3, 13], desc: "مستفعلن مستفعلن فاعلن" }],
|
||||
60: [{ arkaan: [16, 5, 4, 2], desc: "مفعول فاعلات مفاعیل فاعلاتن" }],
|
||||
61: [{ arkaan: [2, 2, 2, 20], desc: "فاعلاتن فاعلاتن فاعلاتن فع (رمل مثمن محجوف مطموس)" }],
|
||||
62: [{ arkaan: [16, 5, 14], desc: "مفعول فاعلات فعولن" }],
|
||||
63: [{ arkaan: [3, 3], desc: "مستفعلن مستفعلن" }],
|
||||
64: [{ arkaan: [7, 13, 7, 13], desc: "مفاعلن فاعلن مفاعلن فاعلن" }],
|
||||
65: [{ arkaan: [13, 2, 13, 2], desc: "فاعلن فاعلاتن فاعلن فاعلاتن" }],
|
||||
66: [{ arkaan: [2, 20, 2, 20], desc: "فاعلاتن فع فاعلاتن فع" }],
|
||||
67: [{ arkaan: [1, 1, 1], desc: "مفاعیلن مفاعیلن مفاعیلن" }],
|
||||
68: [{ arkaan: [3, 3, 3], desc: "مستفعلن مستفعلن مستفعلن" }],
|
||||
69: [{ arkaan: [4, 4, 14], desc: "مفاعیل مفاعیل فعولن" }],
|
||||
70: [{ arkaan: [9, 9, 9], desc: "مفتعلن مفتعلن مفتعلن" }],
|
||||
71: [{ arkaan: [13, 13, 13, 13], desc: "فاعلن فاعلن فاعلن فاعلن" }],
|
||||
72: [{ arkaan: [26, 26], desc: "متفاعلاتن متفاعلاتن" }],
|
||||
73: [{ arkaan: [3, 2, 3, 2], desc: "مستفعلن فاعلاتن مستفعلن فاعلاتن" }],
|
||||
74: [{ arkaan: [2, 13, 2, 13], desc: "فاعلاتن فاعلن فاعلاتن فاعلن" }],
|
||||
75: [{ arkaan: [9, 9, 20, 9, 9, 20], desc: "مفتعلن مفتعلن فع مفتعلن مفتعلن فع" }],
|
||||
76: [{ arkaan: [5, 20, 5, 20, 5, 20, 5, 20], desc: "فاعلات فع فاعلات فع فاعلات فع فاعلات فع" }],
|
||||
77: [{ arkaan: [4, 4, 4, 14], desc: "مفاعیل مفاعیل مفاعیل فعولن" }],
|
||||
78: [{ arkaan: [5, 9, 5, 9], desc: "فاعلات مفتعلن فاعلات مفتعلن" }],
|
||||
79: [{ arkaan: [2, 2, 2, 13, 2, 13], desc: "فاعلاتن فاعلاتن فاعلاتن فاعلن فاعلاتن فاعلن" }],
|
||||
80: [{ arkaan: [8, 12, 8, 12], desc: "فعلاتن فعلن فعلاتن فعلن" }, { arkaan: [8, 19, 8, 12], desc: "فعلاتن فعلن فعلاتن فعلن" }, { arkaan: [8, 12, 8, 19], desc: "فعلاتن فعلن فعلاتن فعلن" }],
|
||||
81: [{ arkaan: [14, 14, 14], desc: "فعولن فعولن فعولن" }],
|
||||
82: [{ arkaan: [8, 8, 8, 12, 8, 12], desc: "فعلاتن فعلاتن فعلاتن فعلن فعلاتن فعلن" }, { arkaan: [8, 8, 8, 19, 8, 12], desc: "فعلاتن فعلاتن فعلاتن فعلن فعلاتن فعلن" }, { arkaan: [8, 8, 8, 12, 8, 19], desc: "فعلاتن فعلاتن فعلاتن فعلن فعلاتن فعلن" }],
|
||||
83: [{ arkaan: [15, 15, 15, 15], desc: "مفعولن مفعولن مفعولن مفعولن" }],
|
||||
84: [{ arkaan: [16, 16, 2], desc: "مفعول مفعول فاعلاتن" }],
|
||||
85: [{ arkaan: [16, 5, 15], desc: "مفعول فاعلات مفعولن" }],
|
||||
86: [{ arkaan: [4, 4, 13], desc: "مفاعیل مفاعیل فاعلن" }],
|
||||
87: [{ arkaan: [9, 9, 13, 18], desc: "مفتعلن مفتعلن فاعلن فعل" }],
|
||||
88: [{ arkaan: [25, 25, 25, 25], desc: "متفاعلتن متفاعلتن متفاعلتن متفاعلتن" }],
|
||||
89: [{ arkaan: [13, 15, 13, 15], desc: "فاعلن مفعولن فاعلن مفعولن" }],
|
||||
90: [{ arkaan: [9, 20, 9, 20, 9, 20, 9, 20], desc: "مفتعلن فع مفتعلن فع مفتعلن فع مفتعلن فع" }],
|
||||
91: [{ arkaan: [4, 5, 4, 13], desc: "مفاعیل فاعلات مفاعیل فاعلن" }],
|
||||
92: [{ arkaan: [8, 7, 8], desc: "فعلاتن مفاعلن فعلاتن" }],
|
||||
93: [{ arkaan: [7, 14, 7, 14], desc: "مفاعلن فعولن مفاعلن فعولن" }],
|
||||
94: [{ arkaan: [4, 13], desc: "مفاعیل فاعلن" }],
|
||||
95: [{ arkaan: [16, 15, 1, 14], desc: "مفعول مفعولن مفاعیلن فعولن" }],
|
||||
96: [{ arkaan: [3, 8, 3, 8], desc: "مستفعلن فعلاتن مستفعلن فعلاتن" }],
|
||||
97: [{ arkaan: [7, 15, 7, 15], desc: "مفاعلن مفعولن مفاعلن مفعولن" }],
|
||||
98: [{ arkaan: [3, 12, 3, 20], desc: "مستفعلن فعلن مستفعلن فع" }, { arkaan: [3, 19, 3, 20], desc: "مستفعلن فعلن مستفعلن فع" }],
|
||||
99: [{ arkaan: [22, 22, 22], desc: "متفاعلن متفاعلن متفاعلن" }],
|
||||
100: [{ arkaan: [16, 2, 16, 13], desc: "مفعول فاعلاتن مفعول فاعلن" }],
|
||||
101: [{ arkaan: [5, 15, 5, 15], desc: "فاعلات مفعولن فاعلات مفعولن" }],
|
||||
102: [{ arkaan: [10, 12, 10, 12], desc: "فعلات فعلن فعلات فعلن" }, { arkaan: [10, 19, 10, 12], desc: "فعلات فعلن فعلات فعلن" }, { arkaan: [10, 12, 10, 19], desc: "فعلات فعلن فعلات فعلن" }],
|
||||
103: [{ arkaan: [3, 3, 20], desc: "مستفعلن مستفعلن فع" }],
|
||||
104: [{ arkaan: [2, 20, 24], desc: "فاعلاتن فع مفاعلتن" }],
|
||||
105: [{ arkaan: [15, 20, 15, 20], desc: "مفعولن فع مفعولن فع" }],
|
||||
106: [{ arkaan: [4, 14, 7], desc: "مفاعیل فعولن مفاعلن" }],
|
||||
107: [{ arkaan: [5, 15, 5, 9], desc: "فاعلات مفعولن فاعلات مفتعلن" }],
|
||||
108: [{ arkaan: [3, 3, 14], desc: "مستفعلن مستفعلن فعولن" }],
|
||||
109: [{ arkaan: [16, 5, 18], desc: "مفعول فاعلات فعل" }],
|
||||
110: [{ arkaan: [5, 12, 5, 12], desc: "فاعلات فعلن فاعلات فعلن" }, { arkaan: [5, 19, 5, 12], desc: "فاعلات فعلن فاعلات فعلن" }, { arkaan: [5, 12, 5, 19], desc: "فاعلات فعلن فاعلات فعلن" }],
|
||||
111: [{ arkaan: [9, 20, 7, 20], desc: "مفتعلن فع مفاعلن فع" }],
|
||||
112: [{ arkaan: [3, 3, 15], desc: "مستفعلن مستفعلن مفعولن" }],
|
||||
113: [{ arkaan: [16, 4, 9], desc: "مفعول مفاعیل مفتعلن" }],
|
||||
114: [{ arkaan: [9, 9, 14, 14], desc: "مفتعلن مفتعلن فعولن فعولن" }],
|
||||
115: [{ arkaan: [14, 1, 14, 1], desc: "فعولن مفاعیلن فعولن مفاعیلن (طویل مثمن سالم)" }],
|
||||
116: [{ arkaan: [1, 1, 14, 8], desc: "مفاعیلن مفاعیلن فعولن فعلاتن" }],
|
||||
117: [{ arkaan: [10, 19, 10, 19], desc: "فعلات فع لن فعلات فع لن" }],
|
||||
118: [{ arkaan: [4, 5, 16, 13], desc: "مفاعیل فاعلات مفعول فاعلن" }],
|
||||
119: [{ arkaan: [2, 2, 20, 2], desc: "فاعلاتن فاعلاتن فع فاعلاتن" }],
|
||||
120: [{ arkaan: [9, 14, 9, 14], desc: "مفتعلن فعولن مفتعلن فعولن" }],
|
||||
121: [{ arkaan: [2, 2, 2, 14, 13], desc: "فاعلاتن فاعلاتن فاعلاتن فعولن فاعلن" }],
|
||||
122: [{ arkaan: [21, 21, 21, 21, 20], desc: "فاعلُ فاعلُ فاعلُ فاعلُ فع" }, { arkaan: [21, 19, 21, 21, 20], desc: "فاعلُ فاعلُ فاعلُ فاعلُ فع" }, { arkaan: [21, 21, 19, 21, 20], desc: "فاعلُ فاعلُ فاعلُ فاعلُ فع" }, { arkaan: [21, 21, 21, 19, 20], desc: "فاعلُ فاعلُ فاعلُ فاعلُ فع" }],
|
||||
123: [{ arkaan: [3, 20, 3, 13], desc: "مستفعلن فع مستفعلن فاعلن" }],
|
||||
124: [{ arkaan: [16, 18, 16, 18], desc: "مفعول فعل مفعول فعل" }],
|
||||
125: [{ arkaan: [16, 7, 16, 7], desc: "مفعول مفاعلن مفعول مفاعلن" }],
|
||||
126: [{ arkaan: [1, 1, 1, 18], desc: "مفاعیلن مفاعیلن مفاعیلن فعل" }],
|
||||
127: [{ arkaan: [13, 7, 20, 13, 7, 20], desc: "فاعلن مفاعلن فع فاعلن مفاعلن فع" }],
|
||||
128: [{ arkaan: [16, 9, 16, 9], desc: "مفعول مفتعلن مفعول مفتعلن" }],
|
||||
129: [{ arkaan: [3, 8, 20], desc: "مستفعلن فعلاتن فع" }],
|
||||
130: [{ arkaan: [9, 9, 16, 1], desc: "مفتعلن مفتعلن مفعول مفاعیلن" }],
|
||||
131: [{ arkaan: [14, 14, 7], desc: "فعولن فعولن مفاعلن" }],
|
||||
132: [{ arkaan: [14, 7, 1], desc: "فعولن مفاعلن مفاعیلن" }],
|
||||
133: [{ arkaan: [16, 1, 12], desc: "مفعول مفاعیلن فعلن" }, { arkaan: [16, 1, 19], desc: "مفعول مفاعیلن فعلن" }],
|
||||
134: [{ arkaan: [1, 1], desc: "مفاعیلن مفاعیلن" }],
|
||||
135: [{ arkaan: [8, 8, 8], desc: "فعلاتن فعلاتن فعلاتن" }],
|
||||
136: [{ arkaan: [16, 1, 18], desc: "مفعول مفاعیلن فعل" }],
|
||||
137: [{ arkaan: [16, 7, 15], desc: "مفعول مفاعلن مفعولن" }],
|
||||
138: [{ arkaan: [24, 24, 24, 24], desc: "مفاعلتن مفاعلتن مفاعلتن مفاعلتن" }],
|
||||
139: [{ arkaan: [7, 7, 13], desc: "مفاعلن مفاعلن فاعلن" }],
|
||||
140: [{ arkaan: [22, 22], desc: "متفاعلن متفاعلن" }],
|
||||
141: [{ arkaan: [9, 20, 9, 9, 20, 9], desc: "مفتعلن فع مفتعلن مفتعلن فع مفتعلن" }],
|
||||
142: [{ arkaan: [10, 6, 20, 10, 6, 20], desc: "فعلات مستفعل فع فعلات مستفعل فع" }],
|
||||
143: [{ arkaan: [8, 7, 20, 8, 7, 20], desc: "فعلاتن مفاعلن فع فعلاتن مفاعلن فع" }],
|
||||
144: [{ arkaan: [10, 2, 10, 12], desc: "فعلات فاعلاتن فعلات فعلن" }, { arkaan: [10, 2, 10, 19], desc: "فعلات فاعلاتن فعلات فعلن" }],
|
||||
145: [{ arkaan: [14, 14, 14, 14, 14, 18], desc: "فعولن فعولن فعولن فعولن فعولن فعل" }],
|
||||
146: [{ arkaan: [14, 14, 14, 14, 14], desc: "فعولن فعولن فعولن فعولن فعولن" }],
|
||||
147: [{ arkaan: [4, 9, 20, 4, 9, 20], desc: "مفاعیل مفتعلن فع مفاعیل مفتعلن فع" }],
|
||||
148: [{ arkaan: [10, 2, 10, 13], desc: "فعلات فاعلاتن فعلات فاعلن" }],
|
||||
149: [{ arkaan: [1, 14, 1, 14], desc: "مفاعیلن فعولن مفاعیلن فعولن" }],
|
||||
150: [{ arkaan: [16, 4, 14, 15], desc: "مفعول مفاعیل فعولن مفعولن" }],
|
||||
151: [{ arkaan: [2, 7, 2, 7], desc: "فاعلاتن مفاعلن فاعلاتن مفاعلن" }],
|
||||
152: [{ arkaan: [8, 8, 18], desc: "فعلاتن فعلاتن فعل" }],
|
||||
153: [{ arkaan: [16, 2, 16, 20], desc: "مفعول فاعلاتن مفعول فع" }],
|
||||
154: [{ arkaan: [8, 2, 8, 2], desc: "فعلاتن فاعلاتن فعلاتن فاعلاتن" }],
|
||||
155: [{ arkaan: [9, 19, 9, 19], desc: "مفتعلن فعلن مفتعلن فعلن" }],
|
||||
156: [{ arkaan: [3, 15, 3, 19], desc: "مستفعلن مفعولن مستفعلن فع لن" }],
|
||||
157: [{ arkaan: [16, 4, 1, 20], desc: "مفعول مفاعیل مفاعیلن فع" }],
|
||||
158: [{ arkaan: [16, 2, 1], desc: "مفعول فاعلاتن مفاعیلن" }],
|
||||
159: [{ arkaan: [1, 1, 1, 14], desc: "مفاعیلن مفاعیلن مفاعیلن فعولن" }],
|
||||
160: [{ arkaan: [16, 2, 15], desc: "مفعول فاعلاتن مفعولن" }],
|
||||
161: [{ arkaan: [27, 27, 27, 27], desc: "متفعلن متفعلن متفعلن متفعلن" }],
|
||||
162: [{ arkaan: [15, 15, 15, 19], desc: "مفعولن مفعولن مفعولن فع لن" }],
|
||||
163: [{ arkaan: [16, 4, 4, 1], desc: "مفعول مفاعیل مفاعیل مفاعیلن" }]
|
||||
}
|
3
src/index.css
Normal file
3
src/index.css
Normal file
|
@ -0,0 +1,3 @@
|
|||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
10
src/main.tsx
Normal file
10
src/main.tsx
Normal file
|
@ -0,0 +1,10 @@
|
|||
import React from 'react'
|
||||
import ReactDOM from 'react-dom/client'
|
||||
import App from './App.tsx'
|
||||
import './index.css'
|
||||
|
||||
ReactDOM.createRoot(document.getElementById('root')!).render(
|
||||
<React.StrictMode>
|
||||
<App />
|
||||
</React.StrictMode>,
|
||||
)
|
5
src/talisman.d.ts
vendored
Normal file
5
src/talisman.d.ts
vendored
Normal file
|
@ -0,0 +1,5 @@
|
|||
declare module "talisman/metrics/damerau-levenshtein" {
|
||||
function damerauLevenshtein(a: string, b: string): number;
|
||||
function limited(max: number, a: string, b: string): number;
|
||||
export { damerauLevenshtein, limited };
|
||||
}
|
101
src/vaznha.ts
Normal file
101
src/vaznha.ts
Normal file
|
@ -0,0 +1,101 @@
|
|||
import { ARKAAN, VAZNHA } from "./data.ts"
|
||||
import { limited as damerau_levenshtein } from "talisman/metrics/damerau-levenshtein"
|
||||
|
||||
let match: (a: string, b: string) => boolean =
|
||||
(a: string, b: string) => a === b;
|
||||
|
||||
export function set_exact_matcher() {
|
||||
match = (a: string, b: string) => a === b;
|
||||
}
|
||||
|
||||
export function set_fuzzy_matcher(threshold: number) {
|
||||
match = (a: string, b: string) => isFinite(damerau_levenshtein(threshold, a, b));
|
||||
}
|
||||
|
||||
export async function vaznha(input: string): Promise<string[]> {
|
||||
const input_heja = heja_special(input.toLowerCase().replace(/[^\s\w]/g, ""));
|
||||
const vznha: string[] = [];
|
||||
for (let key_vazn in VAZNHA) {
|
||||
const vazn_variants = VAZNHA[key_vazn];
|
||||
for (let variant of vazn_variants) {
|
||||
let vazn = "";
|
||||
for (let key_arkaan of variant.arkaan) {
|
||||
vazn += heja(ARKAAN[key_arkaan]);
|
||||
}
|
||||
if (check_match(vazn, input_heja)) {
|
||||
vznha.push(variant.desc);
|
||||
}
|
||||
}
|
||||
}
|
||||
return vznha;
|
||||
}
|
||||
|
||||
function check_match(vazn: string, heja: string): boolean {
|
||||
if (match(vazn, heja) || check_UU_transform_match(vazn, heja)) {
|
||||
return true;
|
||||
}
|
||||
const vazn_alt = vazn.replace(/^UU__/g, "_U__");
|
||||
if (vazn_alt !== vazn) {
|
||||
if (match(vazn_alt, heja) || check_UU_transform_match(vazn_alt, heja)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function check_UU_transform_match(vazn: string, heja: string): boolean {
|
||||
let i = -1;
|
||||
while (true) {
|
||||
i = vazn.indexOf("_UU_", i + 4)
|
||||
if (i < 0) {
|
||||
return false;
|
||||
}
|
||||
if (vazn.slice(0, i) + "U_U_" + vazn.slice(i + 4) === heja) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function CSL(input: string): string {
|
||||
// order is important
|
||||
const L = /(?:aa|ee|o[ow]|i(?!y)|u)/g;
|
||||
const S = /(?:(?<!a)a(?!a)|(?<!o)o(?![ow])|e|i(?=y))/g;
|
||||
const N_DEL = /(?<=L)n(?![LS])/g;
|
||||
const C = /(?:['bdfhjlmnpqrtvxy]|ch|g[h]?|k[h]?|s[h]?|z[h]?)/g;
|
||||
const HAMZE = /(?:(?<=[LS]) (?=[LS])|^(?=[LS]))/g; // to C
|
||||
|
||||
let s = input;
|
||||
s = s.replace(L, "L");
|
||||
s = s.replace(S, "S");
|
||||
s = s.replace(N_DEL, "");
|
||||
s = s.replace(C, "C");
|
||||
s = s.replace(HAMZE, "C");
|
||||
s = s.replace(/\s/g, "");
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
export function heja(input: string): string {
|
||||
const KESHIDE = /CLCC(?![LS])|CLC(?![LS])|CSCC(?![LS])/g;
|
||||
const BOLAND = /CSC(?![LS])|CL/g;
|
||||
const KOOTAH = /CS/g;
|
||||
|
||||
let s = input;
|
||||
s = CSL(s);
|
||||
|
||||
s = s.replace(KESHIDE, "_U");
|
||||
s = s.replace(BOLAND, "_");
|
||||
s = s.replace(KOOTAH, "U");
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
function heja_special(input: string): string {
|
||||
let s = input;
|
||||
s = heja(s);
|
||||
|
||||
s = s.replace(/UUU/g, "UU_");
|
||||
s = s.replace(/_U$/g, "_");
|
||||
|
||||
return s;
|
||||
}
|
12
tailwind.config.js
Normal file
12
tailwind.config.js
Normal file
|
@ -0,0 +1,12 @@
|
|||
/** @type {import('tailwindcss').Config} */
|
||||
export default {
|
||||
content: [
|
||||
"./index.html",
|
||||
"./src/**/*.{js,jsx,ts,tsx}"
|
||||
],
|
||||
theme: {
|
||||
extend: {},
|
||||
},
|
||||
plugins: [require("daisyui")],
|
||||
}
|
||||
|
25
tsconfig.json
Normal file
25
tsconfig.json
Normal file
|
@ -0,0 +1,25 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"target": "ES2020",
|
||||
"useDefineForClassFields": true,
|
||||
"lib": ["ES2020", "DOM", "DOM.Iterable"],
|
||||
"module": "ESNext",
|
||||
"skipLibCheck": true,
|
||||
|
||||
/* Bundler mode */
|
||||
"moduleResolution": "bundler",
|
||||
"allowImportingTsExtensions": true,
|
||||
"resolveJsonModule": true,
|
||||
"isolatedModules": true,
|
||||
"noEmit": true,
|
||||
"jsx": "react-jsx",
|
||||
|
||||
/* Linting */
|
||||
"strict": true,
|
||||
"noUnusedLocals": true,
|
||||
"noUnusedParameters": true,
|
||||
"noFallthroughCasesInSwitch": true
|
||||
},
|
||||
"include": ["src"],
|
||||
"references": [{ "path": "./tsconfig.node.json" }]
|
||||
}
|
10
tsconfig.node.json
Normal file
10
tsconfig.node.json
Normal file
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"composite": true,
|
||||
"skipLibCheck": true,
|
||||
"module": "ESNext",
|
||||
"moduleResolution": "bundler",
|
||||
"allowSyntheticDefaultImports": true
|
||||
},
|
||||
"include": ["vite.config.ts"]
|
||||
}
|
7
vite.config.ts
Normal file
7
vite.config.ts
Normal file
|
@ -0,0 +1,7 @@
|
|||
import { defineConfig } from 'vite'
|
||||
import react from '@vitejs/plugin-react-swc'
|
||||
|
||||
// https://vitejs.dev/config/
|
||||
export default defineConfig({
|
||||
plugins: [react()],
|
||||
})
|
Loading…
Add table
Reference in a new issue