commit 590b7acfe912c44c8148f7c954e4b8a37bdcdeaf Author: danial23 Date: Sat Dec 30 16:07:24 2023 -0500 v0.1 diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..d6c9537 --- /dev/null +++ b/.eslintrc.cjs @@ -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 }, + ], + }, +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/.gitignore @@ -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? diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000..2d6787a Binary files /dev/null and b/bun.lockb differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..7506191 --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Vaznyaab + + +
+ + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..6dacc0e --- /dev/null +++ b/package.json @@ -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" + } +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..3ac5cee --- /dev/null +++ b/src/App.tsx @@ -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([]); + + 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 ( +
    + {output.map((vazn) => ( +
  1. {vazn}
  2. + ))} +
+ ); + } + + function toggle_exact_fuzzy(fuzzy: boolean) { + if (fuzzy) { + set_fuzzy_matcher(1); + } else { + set_exact_matcher(); + } + vaznha(input).then((val) => setOutput(val)); + } + + + return ( + <> +
+
+ + یک مصراع را به فینگلیش وارد کنید. +
+ دقیق + toggle_exact_fuzzy(event.currentTarget.checked)} /> + فازی +
+
+ +
{heja_to_unicode(heja(input))}
+

{display_vaznha(output)}

+
+
+ + ); +} + +export default App diff --git a/src/data.ts b/src/data.ts new file mode 100644 index 0000000..c933b2b --- /dev/null +++ b/src/data.ts @@ -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: "مفعول مفاعیل مفاعیل مفاعیلن" }] +} diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ b/src/index.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..3d7150d --- /dev/null +++ b/src/main.tsx @@ -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( + + + , +) diff --git a/src/talisman.d.ts b/src/talisman.d.ts new file mode 100644 index 0000000..2c26015 --- /dev/null +++ b/src/talisman.d.ts @@ -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 }; +} diff --git a/src/vaznha.ts b/src/vaznha.ts new file mode 100644 index 0000000..a0ede4e --- /dev/null +++ b/src/vaznha.ts @@ -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 { + 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 = /(?:(?