diff --git a/html/arabic/net/html-document-manipulation/_index.md b/html/arabic/net/html-document-manipulation/_index.md index 3f4a7f174..5dca51c48 100644 --- a/html/arabic/net/html-document-manipulation/_index.md +++ b/html/arabic/net/html-document-manipulation/_index.md @@ -69,6 +69,8 @@ url: /ar/net/html-document-manipulation/ تعلم كيفية استخدام Aspose.HTML لـ .NET. قم باستيراد مساحة الأسماء ودمج HTML مع XML وتعزيز مهارات تطوير الويب لديك باستخدام هذا الدليل الشامل. ### [إنشاء مستندات XPS بواسطة XpsDevice في .NET باستخدام Aspose.HTML](./generate-xps-documents-by-xpsdevice/) أطلق العنان لإمكانات تطوير الويب باستخدام Aspose.HTML for .NET. أنشئ مستندات HTML وحولها وتعامل معها بسهولة. +### [إنشاء HTML من سلسلة في C# – دليل معالج الموارد المخصص](./create-html-from-string-in-c-custom-resource-handler-guide/) +تعرف على كيفية إنشاء مستند HTML من سلسلة نصية في C# باستخدام معالج موارد مخصص. ## خاتمة @@ -78,4 +80,4 @@ url: /ar/net/html-document-manipulation/ {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/arabic/net/html-document-manipulation/create-html-from-string-in-c-custom-resource-handler-guide/_index.md b/html/arabic/net/html-document-manipulation/create-html-from-string-in-c-custom-resource-handler-guide/_index.md new file mode 100644 index 000000000..3b290c48a --- /dev/null +++ b/html/arabic/net/html-document-manipulation/create-html-from-string-in-c-custom-resource-handler-guide/_index.md @@ -0,0 +1,261 @@ +--- +category: general +date: 2025-12-30 +description: إنشاء HTML من سلسلة في C# باستخدام Aspose.HTML ومعالج موارد مخصص. تعلم + كيفية كتابة تدفق HTML، تحويل HTML إلى سلسلة، وإخراج HTML في وحدة التحكم. +draft: false +keywords: +- create html from string +- convert html to string +- write html stream +- custom resource handler +- output html console +language: ar +og_description: إنشاء HTML من سلسلة في C# باستخدام Aspose.HTML. يوضح هذا الدرس كيفية + كتابة تدفق HTML، تحويل HTML إلى سلسلة، وإخراج HTML في وحدة التحكم. +og_title: إنشاء HTML من سلسلة في C# – دليل معالج الموارد المخصص +tags: +- C# +- Aspose.HTML +- HTML generation +title: إنشاء HTML من سلسلة في C# – دليل معالج الموارد المخصص +url: /ar/net/html-document-manipulation/create-html-from-string-in-c-custom-resource-handler-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# إنشاء HTML من سلسلة في C# – دليل معالج الموارد المخصص + +هل احتجت يوماً إلى **إنشاء html من سلسلة** في تطبيق .NET لكن لم تكن متأكدًا من كيفية التقاط الناتج دون كتابة ملف مؤقت؟ لست وحدك. في العديد من سيناريوهات الأتمتة ستحتاج إلى **تحويل html إلى سلسلة**، وتمريرها مباشرة إلى مخزن ذاكرة، وربما **إخراج html إلى وحدة التحكم** لأغراض التصحيح. + +في هذا الدليل سنستعرض حلًا كاملاً من البداية إلى النهاية يستخدم Aspose.HTML، و**معالج موارد مخصص** خفيف الوزن، وبعض حيل .NET. في النهاية ستحصل على نمط قابل لإعادة الاستخدام يكتب تدفق HTML في الذاكرة، ويعيد تحويله إلى سلسلة، ويطبعه على وحدة التحكم—كل ذلك دون لمس القرص. + +## ما ستتعلمه + +- كيفية إنشاء `HTMLDocument` مباشرةً من سلسلة HTML خام. +- لماذا يُعد **معالج الموارد المخصص** أنقى طريقة لاعتراض العلامات التي تم توليدها. +- الخطوات الدقيقة لـ **كتابة تدفق html** إلى `MemoryStream`. +- كيفية **تحويل html إلى سلسلة** بأمان وكفاءة. +- طريقة سريعة لـ **إخراج html إلى وحدة التحكم** للتحقق السريع. + +لا خدمات خارجية، لا عمليات إدخال/إخراج ملفات، فقط كود C# نقي يمكنك وضعه في أي مشروع Console أو ASP.NET. + +--- + +![Create HTML from string example](https://example.com/create-html-from-string.png "Create HTML from string example") + +*نص بديل للصورة: مثال على إنشاء HTML من سلسلة يُظهر مقتطف الكود ومخرجات وحدة التحكم.* + +## المتطلبات المسبقة + +- .NET 6.0 أو أحدث (الكود يعمل أيضاً على .NET Framework 4.7+). +- حزمة NuGet `Aspose.Html` (Aspose.HTML for .NET). +- إلمام أساسي بـ streams في C# ونمط `using`. + +هذا كل ما تحتاجه—بدون تبعيات إضافية، بدون مكتبات ثقيلة. + +--- + +## الخطوة 1: إنشاء HTML من سلسلة + +أول شيء نحتاجه هو `HTMLDocument` يعيش بالكامل في الذاكرة. يتيح لك Aspose.HTML إمداد مُنشئه بسلسلة خام مباشرة. + +```csharp +using Aspose.Html; +using Aspose.Html.Converters; +using Aspose.Html.Rendering; +using System.IO; + +// Your raw HTML source – could be generated dynamically or read from a DB. +string htmlSource = "

Hello World

"; + +// Create the document directly from the string. +HTMLDocument document = new HTMLDocument(htmlSource); +``` + +**لماذا هذا مهم:** ببدء العمل بسلسلة تتجنب عبء تحميل ملفات من القرص، وهو مثالي للوظائف السحابية أو اختبارات الوحدة. هذا السطر هو جوهر عملية **إنشاء html من سلسلة**. + +--- + +## الخطوة 2: تنفيذ معالج موارد مخصص لكتابة تدفق HTML + +طريقة `Save` في Aspose.HTML تتوقع `ResourceHandler` عندما تريد تحكمًا دقيقًا في مكان وضع كل مورد (HTML، CSS، صور). سنقوم بإنشاء فئة فرعية بحيث يكتب كل مورد إلى `MemoryStream` واحد. + +```csharp +// Step 2: Define a custom handler that captures the generated HTML in memory. +class MemoryResourceHandler : ResourceHandler +{ + // The stream that will hold the final HTML markup. + public MemoryStream HtmlStream { get; private set; } = new MemoryStream(); + + // Aspose calls this for each resource the converter wants to write. + public override Stream HandleResource(ResourceInfo resourceInfo) + { + // For simplicity we return the same stream for the main document. + // In a real‑world scenario you could branch based on resourceInfo. + return HtmlStream; + } +} +``` + +**لماذا نستخدم معالجًا مخصصًا؟** يمنحك مكانًا حاسمًا لـ **كتابة تدفق html** دون التخمين بشأن مسارات الملفات. كما يتيح لك المعالج فحص أو تعديل المحتوى قبل حفظه. + +--- + +## الخطوة 3: حفظ المستند والتقاط HTML + +الآن بعد أن أصبح لدينا كل من `HTMLDocument` و `MemoryResourceHandler`، نطلب من Aspose أن يُظهر المستند. يهبط الناتج في `HtmlStream` الذي أنشأناه مسبقًا. + +```csharp +// Step 3: Instantiate the handler and tell Aspose to save the document. +MemoryResourceHandler resourceHandler = new MemoryResourceHandler(); + +// SaveOptions lets us specify the format – here we want plain HTML. +SaveOptions saveOptions = new SaveOptions(SaveFormat.Html); + +// This call triggers the handler, filling HtmlStream with the markup. +document.Save(resourceHandler, saveOptions); +``` + +في هذه المرحلة يحتوي `resourceHandler.HtmlStream` على HTML الدقيق الذي أنشأه Aspose من السلسلة الأصلية. لا ملفات مؤقتة، لا إدخال/إخراج إضافي. + +--- + +## الخطوة 4: قراءة الـ Stream وتحويل HTML إلى سلسلة + +يعمل `MemoryStream` كصفيف بايت، لذا نحتاج إلى إرجاع المؤشر إلى البداية قبل القراءة. ثم يمكننا سحب البايتات إلى `string` في .NET. + +```csharp +// Step 4: Reset the stream position so we can read from the beginning. +resourceHandler.HtmlStream.Position = 0; + +// Use a StreamReader to turn the bytes into a UTF‑8 string. +using (StreamReader reader = new StreamReader(resourceHandler.HtmlStream)) +{ + // This is the final string representation of the generated HTML. + string resultHtml = reader.ReadToEnd(); + + // Optional: you could now pass resultHtml to another API, store it, etc. +} +``` + +**نقطة رئيسية:** هذه هي اللحظة التي **نحوّل فيها html إلى سلسلة**. لأن الـ stream موجود بالفعل في الذاكرة، فإن التحويل هو مجرد نسخة في الذاكرة—سريع جدًا. + +--- + +## الخطوة 5: إخراج HTML إلى وحدة التحكم + +للتصحيح السريع أو العرض التوضيحي، غالبًا ما يكون طباعة HTML إلى وحدة التحكم كافية. كما أنها تلبي متطلبات **إخراج html إلى وحدة التحكم**. + +```csharp +// Step 5: Display the HTML in the console. +Console.WriteLine(resultHtml); +``` + +عند تشغيل البرنامج، سترى شيئًا مثل: + +``` +

Hello World

+``` + +هذا هو نفس العلامة التي بدأنا بها، لكن الآن تمت معالجتها بواسطة Aspose.HTML، والتقاطها عبر **معالج موارد مخصص**، وطُبع دون لمس نظام الملفات. + +--- + +## مثال كامل يعمل + +بجمع كل القطع معًا، إليك البرنامج الكامل الجاهز للتنفيذ: + +```csharp +using Aspose.Html; +using Aspose.Html.Converters; +using Aspose.Html.Rendering; +using System.IO; + +// ---------- Custom handler ---------- +class MemoryResourceHandler : ResourceHandler +{ + public MemoryStream HtmlStream { get; private set; } = new MemoryStream(); + + public override Stream HandleResource(ResourceInfo resourceInfo) + { + // Direct all resources to the same stream. + return HtmlStream; + } +} + +// ---------- Main program ---------- +class Program +{ + static void Main() + { + // 1️⃣ Create HTML from a raw string. + string htmlSource = "

Hello World

"; + HTMLDocument document = new HTMLDocument(htmlSource); + + // 2️⃣ Set up the custom resource handler. + MemoryResourceHandler resourceHandler = new MemoryResourceHandler(); + + // 3️⃣ Save the document – this fills the stream. + SaveOptions saveOptions = new SaveOptions(SaveFormat.Html); + document.Save(resourceHandler, saveOptions); + + // 4️⃣ Convert the memory stream back to a string. + resourceHandler.HtmlStream.Position = 0; + string resultHtml; + using (var reader = new StreamReader(resourceHandler.HtmlStream)) + { + resultHtml = reader.ReadToEnd(); + } + + // 5️⃣ Output the HTML to the console. + Console.WriteLine(resultHtml); + } +} +``` + +**المخرجات المتوقعة:** + +``` +

Hello World

+``` + +شغّله في تطبيق Console، وسترى HTML يُطبع فورًا. لا ملفات، لا تبعيات إضافية—فقط معالجة داخل الذاكرة. + +--- + +## نصائح احترافية ومشكلات شائعة + +- **الترميز مهم** – يكتب Aspose UTF‑8 بشكل افتراضي. إذا احتجت مجموعة أحرف مختلفة، غلف `MemoryStream` بـ `StreamWriter` بالترميز المطلوب قبل القراءة. +- **عدة موارد** – إذا كان HTML الخاص بك يشير إلى CSS أو صور، سيتلقى المعالج نفسه هذه الموارد واحدة تلو الأخرى. يمكنك فحص `resourceInfo` لتوجيه المنطق (مثلاً، تخزين الصور في Stream منفصل). +- **سلامة الخيوط** – `MemoryResourceHandler` غير آمن للخلية بشكل افتراضي. للمعالجة المتوازية، أنشئ معالجًا جديدًا لكل خيط. +- **الإفراج عن الموارد** – عبارات `using` حول `StreamReader` و `MemoryStream` تضمن تحرير الموارد غير المُدارة بسرعة. + +--- + +## ما التالي؟ + +الآن بعد أن أصبحت قادرًا على **إنشاء html من سلسلة**، **كتابة تدفق html**، و **إخراج html إلى وحدة التحكم**، قد ترغب في استكشاف: + +- **دمج CSS** – استخدم المعالج لحقن ملفات الأنماط أثناء التشغيل. +- **إنشاء PDFs** – مرّر نفس `HTMLDocument` إلى Aspose.PDF لإنشاء PDF على الخادم. +- **إرسال رسائل بريد إلكتروني** – حوّل السلسلة إلى جسم بريد إلكتروني دون الحاجة إلى ملف. + +جميع هذه السيناريوهات تستفيد من نمط الذاكرة الذي بنيناه للتو. + +--- + +## الخلاصة + +غطّينا دورة حياة كاملة لتحويل مقتطف HTML خام إلى سلسلة قابلة للطباعة باستخدام C#. من خلال الاستفادة من مُنشئ `HTMLDocument` في Aspose.HTML، و**معالج موارد مخصص**، و`MemoryStream` بسيط، يمكنك **إنشاء html من سلسلة**، **تحويل html إلى سلسلة**، **كتابة تدفق html**، و**إخراج html إلى وحدة التحكم** دون أي عمليات إدخال/إخراج على القرص. + +جرّبه في الميكروسيرفيس التالي، اختبار الوحدة، أو سكريبت سريع. النمط قابل للتوسع، عالي الأداء، ويحافظ على نظافة قاعدة الشيفرة. + +إذا واجهت أي صعوبات أو لديك أفكار لتوسعات، اترك تعليقًا أدناه. برمجة سعيدة! + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/arabic/net/html-extensions-and-conversions/_index.md b/html/arabic/net/html-extensions-and-conversions/_index.md index 45a70dabe..6966b4a10 100644 --- a/html/arabic/net/html-extensions-and-conversions/_index.md +++ b/html/arabic/net/html-extensions-and-conversions/_index.md @@ -63,6 +63,8 @@ url: /ar/net/html-extensions-and-conversions/ تعرف على كيفية تحويل HTML إلى TIFF باستخدام Aspose.HTML لـ .NET. اتبع دليلنا خطوة بخطوة لتحسين محتوى الويب بكفاءة. ### [تحويل HTML إلى XPS في .NET باستخدام Aspose.HTML](./convert-html-to-xps/) اكتشف قوة Aspose.HTML لـ .NET: تحويل HTML إلى XPS بسهولة. المتطلبات الأساسية، ودليل خطوة بخطوة، والأسئلة الشائعة متضمنة. +### [حفظ HTML كملف ZIP – دليل C# كامل](./save-html-as-zip-complete-c-tutorial/) +تعلم كيفية حفظ مستند HTML كملف ZIP باستخدام Aspose.HTML في C# خطوة بخطوة. ## خاتمة @@ -74,4 +76,4 @@ url: /ar/net/html-extensions-and-conversions/ {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/arabic/net/html-extensions-and-conversions/save-html-as-zip-complete-c-tutorial/_index.md b/html/arabic/net/html-extensions-and-conversions/save-html-as-zip-complete-c-tutorial/_index.md new file mode 100644 index 000000000..8729e8fc5 --- /dev/null +++ b/html/arabic/net/html-extensions-and-conversions/save-html-as-zip-complete-c-tutorial/_index.md @@ -0,0 +1,221 @@ +--- +category: general +date: 2025-12-30 +description: احفظ HTML كملف ZIP بسرعة باستخدام معالج موارد مخصص. تعلم كيفية تحويل + صفحة الويب إلى ZIP واستخراج الصور وCSS في بضع خطوات. +draft: false +keywords: +- save html as zip +- custom resource handler +- convert webpage to zip +- extract images css +language: ar +og_description: احفظ HTML كملف ZIP مع معالج موارد مخصص. اتبع هذا الدليل لتحويل صفحة + الويب إلى ZIP واستخراج الصور وCSS بسهولة. +og_title: حفظ HTML كملف ZIP – دليل C# الكامل +tags: +- Aspose.HTML +- C# +- File Compression +title: حفظ HTML كملف ZIP – دليل C# الكامل +url: /ar/net/html-extensions-and-conversions/save-html-as-zip-complete-c-tutorial/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# حفظ HTML كملف ZIP – دليل C# الكامل + +هل تساءلت يومًا كيف **تحفظ HTML كملف ZIP** دون الحاجة إلى أدوات طرف ثالث؟ لست وحدك. يحتاج العديد من المطورين إلى أرشفة صفحة ويب كاملة—بما فيها الصور، وCSS، والسكريبتات—حتى يتمكنوا من نقلها، أو تخزينها، أو تحليلها لاحقًا. الخبر السار؟ باستخدام Aspose.HTML يمكنك القيام بذلك برمجيًا، والحيلة تكمن في **معالج موارد مخصص** يكتب كل أصل يتم جلبه مباشرةً إلى إدخال داخل ملف ZIP. + +في هذا الدليل سنستعرض كل ما تحتاج معرفته: من إعداد المشروع إلى كتابة المعالج، تحويل صفحة الويب إلى ZIP، وأخيرًا استخراج الصور وCSS إذا احتجت إليهما بشكل منفصل. لا سكريبتات خارجية، ولا نسخ‑لصق يدوي—فقط كود C# نظيف يمكنك وضعه في أي حل .NET. + +## ما ستتعلمه + +- كيفية إنشاء **معالج موارد مخصص** يعترض كل طلب مورد. +- الخطوات الدقيقة **لتحويل صفحة ويب إلى ZIP** باستخدام طريقة `HTMLDocument.Save` في Aspose.HTML. +- طرق **استخراج الصور وCSS** من الأرشيف المُولد لمعالجة إضافية. +- المشكلات الشائعة (مثل تكرار أسماء الملفات) ونصائح احترافية للحفاظ على تنظيم ملف ZIP. + +**المتطلبات المسبقة** – يجب أن تكون لديك: + +- .NET 6+ (أو .NET Framework 4.7.2+) مثبت. +- نسخة حديثة من حزمة Aspose.HTML for .NET عبر NuGet. +- إلمام أساسي بـ C# streams ومساحة الاسم `System.IO.Compression`. + +هل أنت مستعد؟ لنبدأ. + +![مخطط يوضح تدفق حفظ HTML كملف ZIP، من URL إلى ملف ZIP](save-html-as-zip-diagram.png "عملية حفظ html كملف zip") + +## حفظ HTML كملف ZIP – نظرة عامة + +على مستوى عالٍ، تبدو العملية هكذا: + +1. **تهيئة** `FileStream` يشير إلى ملف `.zip` الناتج. +2. **إنشاء** `ZipResourceHandler` (معالجنا المخصص) وتمريره إلى الـ stream. +3. **تحميل** صفحة الويب المستهدفة باستخدام `HTMLDocument`. +4. **حفظ** المستند، مما يسمح للمعالج بكتابة كل مورد داخل الأرشيف. + +نظرًا لأن المعالج يُعيد stream قابل للكتابة لكل مورد، يتولى Aspose.HTML الجزء الأكبر—جلب الصور، وCSS، وJavaScript، وإدماجها في المكان المناسب داخل ملف ZIP. + +## الخطوة 1: إعداد المشروع + +أولًا، أنشئ تطبيق console جديد (أو دمج الكود في خدمة موجودة). ثم أضف حزمة Aspose.HTML عبر NuGet: + +```bash +dotnet add package Aspose.HTML +``` + +تأكد أيضًا من الإشارة إلى `System.IO.Compression`—فهي جزء من مكتبة الفئة الأساسية، ولا تحتاج إلى حزمة إضافية. + +## الخطوة 2: إنشاء معالج موارد مخصص + +**معالج الموارد المخصص** هو قلب الحل. يتلقى كائن `ResourceInfo` لكل أصل مطلوب ويُعيد `Stream` حيث سيكتب Aspose.HTML البيانات. سنقوم بربط مسار URL باسم إدخال ZIP، مع الحفاظ على هيكل المجلد الأصلي. + +```csharp +using Aspose.Html; +using Aspose.Html.Converters; +using System.IO; +using System.IO.Compression; + +/// +/// Writes every fetched resource directly into a ZIP entry. +/// +class ZipResourceHandler : ResourceHandler +{ + private readonly ZipArchive _zipArchive; + + /// + /// Opens a ZIP archive in "Create" mode. The archive stays open + /// until the handler is disposed. + /// + /// The underlying stream for the ZIP file. + public ZipResourceHandler(Stream zipStream) + { + // leaveOpen:true lets us close the handler without closing the file stream. + _zipArchive = new ZipArchive(zipStream, ZipArchiveMode.Create, leaveOpen: true); + } + + /// + /// Called for each resource (image, CSS, script, etc.). + /// + /// Info about the requested resource. + /// A writable stream that points to a new ZIP entry. + public override Stream HandleResource(ResourceInfo resourceInfo) + { + // Trim leading '/' to avoid creating an empty top‑level folder. + var entryName = resourceInfo.Url.PathAndQuery.TrimStart('/'); + // Ensure a valid entry name; duplicate names are overwritten. + var entry = _zipArchive.CreateEntry(entryName, CompressionLevel.Optimal); + // Return the stream that Aspose.HTML will write into. + return entry.Open(); + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + _zipArchive?.Dispose(); + } + base.Dispose(disposing); + } +} +``` + +**لماذا هذا مهم:** بإرجاع stream جديد من `ZipArchiveEntry` لكل مورد، نتجنب الملفات المؤقتة ونقلل استهلاك الذاكرة. يمنحنا المعالج أيضًا تحكمًا كاملًا في التسمية—مفيد عندما تريد لاحقًا **استخراج الصور وCSS** من الأرشيف. + +## الخطوة 3: إعداد Stream إخراج ZIP + +الآن نفتح `FileStream` يشير إلى ملف ZIP النهائي. يتم تمرير الـ stream إلى المعالج الذي أنشأناه للتو. + +```csharp +// Adjust the path to wherever you want the ZIP to land. +string zipPath = Path.Combine(Environment.CurrentDirectory, "output.zip"); + +// Using statement ensures the stream is closed even if an exception occurs. +using var zipFileStream = new FileStream(zipPath, FileMode.Create, FileAccess.Write); +``` + +> **نصيحة احترافية:** إذا كنت بحاجة إلى ZIP كاستجابة HTTP، استبدل `FileStream` بـ `MemoryStream` واكتب مصفوفة البايتات إلى جسم الاستجابة. + +## الخطوة 4: تحميل وتحويل صفحة الويب + +مع المعالج جاهزًا، يمكننا تحميل أي URL عام. يقوم Aspose.HTML تلقائيًا بحل الروابط النسبية، وتحميل الأصول، واستدعاء معالجنا لكل منها. + +```csharp +// Step 4: Instantiate the handler with the ZIP stream. +var zipHandler = new ZipResourceHandler(zipFileStream); + +// Step 5: Load the target HTML page. +var url = "https://example.com"; // Change to the page you want to archive. +var htmlDoc = new HTMLDocument(url); + +// Step 6: Save the document – the handler writes everything into the ZIP. +htmlDoc.Save(zipHandler, new SaveOptions(SaveFormat.Html)); + +// Dispose the handler to flush the ZIP archive. +zipHandler.Dispose(); + +Console.WriteLine($"✅ Webpage saved as ZIP at: {zipPath}"); +``` + +**ماذا يحدث خلف الكواليس؟** +- يقوم `HTMLDocument` بتحليل HTML، واكتشاف وسوم ``، و``، و`