rmyen

.سكرب حساب عدد الكلمات و الحروف

Nov 11th, 2025 (edited)
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
HTML 18.12 KB | None | 0 0
  1. <!DOCTYPE html>
  2. <html lang="ar" dir="rtl">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>حساب عددالكلمات والحروف</title>
  7.     <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
  8.     <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/font/bootstrap-icons.min.css">
  9.    
  10.     <style>
  11.         /* CSS مخصص لتوسيط الحاوية وتنسيقات إضافية */
  12.         body {
  13.             background-color: #f8f9fa; /* لون خلفية خفيف */
  14.             display: flex;
  15.             justify-content: center;
  16.             align-items: center;
  17.             min-height: 100vh; /* تأكد من أن الصفحة تملأ كامل ارتفاع الشاشة */
  18.             margin: 0;
  19.         }
  20.         .custom-container {
  21.             background-color: #ffffff;
  22.             padding: 40px;
  23.             border-radius: 12px;
  24.             box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
  25.             max-width: 600px; /* تحديد عرض أقصى للحاوية */
  26.             width: 90%; /* تجاوب أفضل */
  27.         }
  28.         .icon-group {
  29.             display: flex;
  30.             justify-content: space-around;
  31.             margin-bottom: 25px;
  32.         }
  33.         .icon-group a {
  34.             font-size: 1.8rem;
  35.             color: #ffb703; /* لون أيقونات Bootstrap الأزرق */
  36.             transition: color 0.3s;
  37.         }
  38.         .icon-group a:hover {
  39.             color: #fb8500;
  40.         }
  41.         .form-label {
  42.             font-weight: bold;
  43.         }
  44.  
  45.      .container {
  46.             max-width: 600px; /* تحديد عرض النموذج */
  47.             background-color: #ffffff;
  48.             padding: 30px;
  49.             border-radius: 10px;
  50.             box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
  51.         }
  52.         h2 {
  53.             color: #ffb703; /* اللون الأزرق الأساسي */
  54.             border-bottom: 2px solid #0d6efd;
  55.             padding-bottom: 10px;
  56.             margin-top: 20px;
  57.         }
  58.         /* تنسيق أزرار الراديو المخصص */
  59.         .form-check {
  60.             padding: 10px;
  61.             margin-bottom: 8px;
  62.             border-radius: 5px;
  63.             transition: background-color 0.2s;
  64.         }
  65.         .form-check:hover {
  66.             background-color: #f1f1f1;
  67.         }
  68.  
  69.         /* تنسيقات الألوان لأزرار الراديو */
  70.         .option-green {
  71.             border-right: 5px solid #198754; /* أخضر */
  72.         }
  73.         .option-blue {
  74.             border-right: 5px solid #0d6efd; /* أزرق */
  75.         }
  76.         .option-yellow {
  77.             border-right: 5px solid #ffc107; /* أصفر */
  78.         }
  79.         .option-red {
  80.             border-right: 5px solid #dc3545; /* أحمر */
  81.         }
  82.  
  83.         /* تغيير لون زر الإرسال */
  84.         .btn-submit {
  85.             background-color: #ffb703; /* استخدام الأخضر لزر الإجراء */
  86.             border-color: #ffb703;
  87.         }
  88.         .btn-submit:hover {
  89.             background-color: #fb8500;
  90.             border-color: #fb8500;
  91.         }
  92.  
  93.         /* تحسين شكل الـ textarea */
  94.         textarea.form-control {
  95.             resize: vertical;
  96.         }
  97.      
  98.       /* CSS مخصص لتثبيت Modal على اليمين وإزالة حواف الظل */
  99.    .offcanvas-modal .modal-content {
  100.         height: 50px; /* يبقى الارتفاع كامل الشاشة */
  101.         width: 300px; /* **تعديل: تم تقليل العرض من 350px إلى 300px** */
  102.         border-radius: 0;
  103.         box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); /* إضافة ظل بسيط للجمالية */
  104.         margin: 0;
  105.     }
  106.  
  107.     .offcanvas-modal.modal-dialog {
  108.         /* إزالة هامش التمركز الافتراضي لـ Modal */
  109.         margin: 0;
  110.        
  111.         /* وضع الـ Modal على اليمين */
  112.         position: fixed;
  113.         top: 0;
  114.         right: 0;
  115.         transform: translate(100%, 0); /* إخفاءها مبدئيًا خارج الشاشة */
  116.         transition: transform .3s ease-in-out;
  117.     }
  118.  
  119.     /* تأثير الفتح: عند إضافة فئة .show بواسطة JavaScript */
  120.     .modal.show .offcanvas-modal.modal-dialog {
  121.         transform: none; /* إعادتها إلى موضعها الطبيعي (اليمين) */
  122.     }
  123.  
  124.     .modal {
  125.         /* إزالة الخلفية المعتمة تلقائيًا */
  126.         --bs-modal-backdrop-opacity: 0;
  127.     }
  128.      
  129.             body {
  130.             background-color: #ffffff; /* خلفية بيضاء */
  131.             color: #333333; /* نص داكن */
  132.             font-family: Arial, sans-serif;
  133.             transition: background-color 0.3s, color 0.3s; /* انتقال سلس */
  134.             padding: 20px;
  135.         }
  136.  
  137.         .container {
  138.             border: 1px solid #ccc;
  139.             padding: 20px;
  140.             border-radius: 8px;
  141.             max-width: 600px;
  142.             margin: 20px auto;
  143.         }
  144.  
  145.         button {
  146.             background-color: #007bff;
  147.             color: white;
  148.             border: none;
  149.             padding: 10px 20px;
  150.             cursor: pointer;
  151.             border-radius: 5px;
  152.         }
  153.  
  154.         /* ==================================== */
  155.         /* 2. تنسيقات وضع الليل (Dark Mode) */
  156.         /* ==================================== */
  157.         .dark-mode {
  158.             background-color: #121212; /* خلفية داكنة جداً */
  159.             color: #e0e0e0; /* نص فاتح جداً */
  160.         }
  161.  
  162.         .dark-mode .container {
  163.             background-color: #1f1f1f; /* خلفية أغمق للحاوية */
  164.             border: 1px solid #444444;
  165.         }
  166.  
  167.         .dark-mode button {
  168.             background-color: #4a4a4a;
  169.             color: #f0f0f0;
  170.             border-radius: 5px;
  171.             border-color: #FFFF;
  172.         }
  173.      
  174.           h1 {
  175.      
  176.             color: #4a4a4a;
  177.      
  178.              }
  179.      
  180.      
  181.       .form-check-label {
  182.      
  183.       color: #4a4a4a;
  184.      
  185.       }
  186.      
  187.   </style>
  188. </head>
  189. <body>
  190.  
  191. <div class="custom-container">
  192.  
  193. <div class="d-flex justify-content-end mb-4 icon-group">
  194.  
  195.   <a id="modeToggle" title="الوظع المظلم" class="me-3 fs-3">
  196.         <i class="bi bi-moon" id="qamar"></i>
  197.     </a>
  198.    
  199.     <a href="https://rmyen.pages.dev/الإتصال-بي" target="_blank" title="الإتصال بي" class="me-3 fs-3">
  200.         <i class="bi bi-telephone-fill"></i>
  201.     </a>
  202.    
  203.     <a href="https://rmyen.pages.dev" target="_blank" title="معلومات عني" class="me-3 fs-3">
  204.         <i class="bi bi-info-circle-fill"></i>
  205.     </a>
  206.    
  207. </div>
  208.    
  209.  
  210.   <h1 class="text-center">حساب عدد الكلمات والحروف بالنص</h1>
  211.  
  212.  
  213.         <form class="mt-5" id="dataForm">
  214.             <h2>إدخال النص 📝</h2>
  215.             <div class="mb-3 mt-3">
  216.                
  217.                 <textarea class="form-control" id="nass" name="userParagraph" rows="5" placeholder="كتابة النص هنا"></textarea>
  218.             </div>
  219.            
  220.             <hr>
  221.  
  222.             <h2> نوع الحساب للمحتوى 🏷️</h2>
  223.            
  224.             <div class="form-check option-yellow mt-3">
  225.                 <input class="form-check-input" type="radio" id="idKalimet" name="contentType" value="kalimet" required>
  226.                 <label class="form-check-label" for="option1">كلمات</label>
  227.             </div>
  228.  
  229.  
  230.             <div class="form-check option-green">
  231.                 <input class="form-check-input" type="radio" id="idHaref" name="contentType" value="haref">
  232.                 <label class="form-check-label" for="option3">حروف</label>
  233.             </div>
  234.  
  235.            
  236.           <button type="submit" class="btn btn-lg btn-submit w-100 mt-3">حساب</button>
  237.         </form>
  238.  
  239.  
  240.   <div class="modal fade" id="ijbatonModal" tabindex="-1" aria-labelledby="modalLabel" aria-hidden="true">
  241.     <div class="modal-dialog modal-dialog-end offcanvas-modal">
  242.         <div class="modal-content">
  243.             <div class="modal-header bg-success text-white">
  244.                 <h5 class="modal-title" id="modalLabel">نتيجة الحساب</h5>
  245.                 <button type="button" class="btn-close btn-close-white" aria-label="Close" onclick="closeModal()"></button>
  246.             </div>
  247.            
  248.             <div class="modal-body">
  249.                 <p id="ijabatonMohtawa" class="lead text-dark"></p>
  250.             </div>
  251.         </div>
  252.     </div>
  253. </div>
  254.  
  255.  
  256.   <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
  257.  
  258.   <script>
  259.     // 1. الحصول على عنصر النموذج باستخدام مُعرِّفه
  260.     const form = document.getElementById('dataForm');
  261.  
  262.     // 2. إضافة مستمع للحدث (Event Listener) على حدث الإرسال (submit)
  263.     form.addEventListener('submit', function(event) {
  264.        
  265.         // منع الإرسال الافتراضي للنموذج (الذي يؤدي إلى تحديث الصفحة)
  266.         event.preventDefault();
  267.        
  268.         // استدعاء الدالة المسؤولة عن جمع البيانات ومعالجتها
  269.         collectFormData();
  270.     });
  271.  
  272.     /**
  273.      * دالة لجمع البيانات من حقول الإدخال في النموذج
  274.      */
  275.     function collectFormData() {
  276.        
  277.         // 3. جمع قيم الحقول باستخدام مُعرفاتها (IDs)
  278.         const data = {
  279.             kalimet: document.getElementById('idKalimet').checked,
  280.             haref: document.getElementById('idHaref').checked,
  281.         }
  282.        
  283.         const nass = document.getElementById('nass').value;
  284.        
  285.         if (data.kalimet) {
  286.        
  287.         nawaa = "kalimet";
  288.        
  289.         } else {
  290.        
  291.         nawaa = "haref";
  292.        
  293.         }
  294.      
  295.      
  296.         hysabAlNass(nass, nawaa)
  297.      
  298.         }
  299.    
  300.     function hysabAlNass(nass, nawaa) {
  301.     // 1. التحقق من النص
  302.     if (!nass || typeof nass !== 'string') {
  303.      
  304.         ijabaton = "ليس هنالك نص لحسابه.";
  305.         ondhorIjabatonModal(ijabaton);
  306.         return 0;
  307.     }
  308.  
  309.     // 2. معالجة النص حسب الوضع المطلوب
  310.     if (nawaa === 'kalimet') {
  311.         // إزالة المسافات الزائدة في البداية والنهاية
  312.         const hysabNass = nass.trim();
  313.        
  314.         // إذا كان النص فارغًا بعد الإزالة، فعدد الكلمات صفر
  315.       if (hysabNass) {
  316.      
  317.         // استخدام التعبير النمطي (RegEx) لتقسيم النص عند وجود مسافة واحدة أو أكثر (بما في ذلك فواصل الأسطر)
  318.         // ثم حساب طول المصفوفة الناتجة
  319.         const kalimetJadwal = hysabNass.split(/\s+/);
  320.         ijabaton = "النص يحتوي عن "+kalimetJadwal.length+" من الكلمات.";
  321.         ondhorIjabatonModal(ijabaton);
  322.         return kalimetJadwal.length;
  323.        
  324.      
  325.       }  
  326.      
  327.       if (hysabNass === '') {
  328.             ijabaton = ".النص يحتوي عن 0 كلمات";
  329.             ondhorIjabatonModal(ijabaton);
  330.             return 0;
  331.         }
  332.        
  333.        
  334.  
  335.        
  336.        
  337.     } else if (nawaa === 'haref') {
  338.         // حساب عدد الأحرف الكلي (بما في ذلك المسافات وفواصل الأسطر)
  339.        
  340.       ijabaton = "النص يحتوي عن "+nass.length+" من الحروف.";
  341.         ondhorIjabatonModal(ijabaton);
  342.       return nass.length;
  343.        
  344.     } else {
  345.         // رسالة تنبيه إذا لم يتم تحديد الوضع بشكل صحيح
  346.         console.error("'الوضع غير صالح. يجب أن يكون 'كلمات' أو 'حروف");
  347.         return 0;
  348.     }
  349. }
  350.    
  351.     function ondhorIjabatonModal1 (ijabaton) {
  352.             // 1. استلام عنصر الـ Modal وجسم الإجابة
  353.             const modalElement = document.getElementById('ijbatonModal');
  354.             const contentElement = document.getElementById('ijabatonMohtawa');
  355.  
  356.             // 2. تعبئة المحتوى (الإجابة)
  357.             contentElement.textContent = ijabaton;
  358.  
  359.             // 3. عرض النافذة (يجب استخدام طرق Bootstrap لعرضها بشكل صحيح)
  360.             // إذا كنت لا تستخدم Bootstrap، يمكنك استخدام: modalElement.style.display = 'block';
  361.            
  362.             // الطريقة باستخدام فئات Bootstrap (لتحريك وتأثيرات الإظهار)
  363.             modalElement.classList.add('show');
  364.             modalElement.style.display = 'block';
  365.             modalElement.setAttribute('aria-hidden', 'false');
  366.             document.body.classList.add('modal-open'); // لإخفاء التمرير في الخلفية
  367.  
  368.             // إضافة خلفية معتمة (backdrop)
  369.             const backdrop = document.createElement('div');
  370.             backdrop.className = 'modal-backdrop fade show';
  371.             backdrop.setAttribute('id', 'modalBackdrop');
  372.             document.body.appendChild(backdrop);
  373.         }
  374.  
  375. const AUTOCLOSE_TIME = 5000;
  376.    
  377.    
  378. function ondhorIjabatonModal(ijabaton) {
  379.     const modalElement = document.getElementById('ijbatonModal');
  380.     const contentElement = document.getElementById('ijabatonMohtawa');
  381.  
  382.     // 1. تعبئة المحتوى
  383.     if (contentElement) {
  384.         contentElement.textContent = ijabaton;
  385.     }
  386.  
  387.     // 2. عرض النافذة
  388.     if (modalElement) {
  389.         modalElement.classList.add('show');
  390.         modalElement.style.display = 'block';
  391.         modalElement.setAttribute('aria-hidden', 'false');
  392.         // نبقي على هذه الفئة لضمان ثبات الخلفية أثناء ظهور الـ Modal
  393.         document.body.classList.add('modal-open');
  394.     }
  395.  
  396.     // 3. جدولة الإغلاق التلقائي بعد 3 ثواني
  397.     setTimeout(closeModal, AUTOCLOSE_TIME);
  398. }
  399.  
  400. /**
  401.  * دالة لإغلاق النافذة المنبثقة.
  402.  * (تم حذف كود إزالة الخلفية المعتمة)
  403.  */
  404. function closeModal() {
  405.     const modalElement = document.getElementById('ijbatonModal');
  406.    
  407.     if (modalElement) {
  408.         modalElement.classList.remove('show');
  409.         modalElement.style.display = 'none';
  410.         modalElement.setAttribute('aria-hidden', 'true');
  411.     }
  412.    
  413.     // إزالة فئة 'modal-open' لتمكين التمرير
  414.     if (document.body) {
  415.         document.body.classList.remove('modal-open');
  416.     }
  417.    
  418.     // لم نعد نحتاج إلى إزالة backdropElement.remove();
  419. }
  420.    
  421.     const body = document.body;
  422.         const toggleButton = document.getElementById('modeToggle');
  423.         const statusElement = document.getElementById('modeStatus');
  424.         const storageKey = 'user-theme';
  425.    
  426.         const qamarIcon = document.getElementById('qamar');
  427.    
  428.         const modalText = document.getElementById('ijabatonMohtawa');
  429.         /**
  430.          * 1. دالة لتطبيق الوضع
  431.          * @param {string} mode - 'dark' أو 'light'
  432.          */
  433.     function applyMode(mode) {
  434.     if (mode === 'dark') {
  435.         // 1. تطبيق الوضع المظلم على الجسم
  436.         body.classList.add('dark-mode');
  437.         localStorage.setItem(storageKey, 'dark');
  438.  
  439.         // 2. تغيير الأيقونة إلى القمر الممتلئ (للدلالة على أن الوضع المظلم نشط)
  440.         if (qamarIcon && modalText) {
  441.            qamarIcon.classList.remove('bi-moon');      // إزالة غير الممتلئ
  442.             qamarIcon.classList.add('bi-moon-fill');    // إضافة الممتلئ
  443.        
  444.        
  445.             modalText.classList.remove('text-dark');
  446.             modalText.classList.add('text-white');
  447.        
  448.         }
  449.      
  450.      
  451.     } else {
  452.         // 1. إزالة الوضع المظلم
  453.         body.classList.remove('dark-mode');
  454.         localStorage.setItem(storageKey, 'light');
  455.  
  456.         // 2. تغيير الأيقونة إلى القمر غير الممتلئ (للدلالة على أن وضع النهار نشط)
  457.         if (qamarIcon && modalText) {
  458.            qamarIcon.classList.remove('bi-moon-fill'); // إزالة الممتلئ
  459.             qamarIcon.classList.add('bi-moon');         // إضافة غير الممتلئ
  460.        
  461.        
  462.             modalText.classList.remove('text-white');
  463.             modalText.classList.add('text-dark');
  464.        
  465.         }
  466.     }
  467. }
  468.  
  469.         /**
  470.          * 2. دالة لتبديل الوضع عند النقر على الزر
  471.          */
  472.         function toggleMode() {
  473.             // التحقق مما إذا كانت الفئة موجودة حاليًا
  474.             if (body.classList.contains('dark-mode')) {
  475.                 applyMode('light');
  476.             } else {
  477.                 applyMode('dark');
  478.             }
  479.         }
  480.        
  481.         /**
  482.          * 3. التحقق عند تحميل الصفحة وتطبيق الاختيار المحفوظ
  483.          */
  484.         function loadSavedMode() {
  485.             // التحقق من التفضيل المحفوظ في التخزين المحلي (LocalStorage)
  486.             const savedMode = localStorage.getItem(storageKey);
  487.  
  488.             if (savedMode) {
  489.                 applyMode(savedMode);
  490.             } else {
  491.                 // إذا لم يتم حفظ أي تفضيل، نستخدم تفضيل النظام (إذا كان المتصفح يدعمه)
  492.                 const prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
  493.                 applyMode(prefersDark ? 'dark' : 'light');
  494.             }
  495.         }
  496.  
  497.         // 4. ربط الدالة بالزر
  498.         toggleButton.addEventListener('click', toggleMode);
  499.  
  500.         // 5. استدعاء الدالة عند تحميل الصفحة
  501.         loadSavedMode();
  502.  
  503.   </script>
  504.  
  505.   </body>
  506. </html>
Add Comment
Please, Sign In to add comment