العمل مع النص

العمل مع النص

العمل مع النص

النص في مستند Word يُنظم في عقد Run (أحرف متجاورة تشترك في نفس تنسيق الخط) مُجمعة داخل عقد Paragraph. Aspose.Words FOSS لـ .NET يُظهر كلاهما مباشرة، بالإضافة إلى Font لتنسيق الأحرف، ParagraphFormat لتنسيق الفقرات، وRange لقراءة أو استبدال النص في أي جزء من الشجرة. يغطي هذا الدليل الجريانات (runs) والخطوط، تنسيق الفقرات، قراءة واستبدال النص، التعليقات، وتنسيق القوائم على مستوى الفقرة.


الجريانات وتنسيق الأحرف

يمثل Run مقطعًا من النص يشارك مجموعة واحدة من التنسيقات؛ خاصية Text الخاصة به تحتفظ بمحتوى النص العادي وخاصية Font (كائن Font) تحتفظ بتنسيق الأحرف — Name، Size، Bold، Italic، Underline، Color، HighlightColor، Subscript/Superscript، StrikeThrough، والعديد غيرها. يقوم Font.ClearFormatting() بإعادة ضبط خط الجريان إلى الإعدادات الافتراضية. جريانات الفقرة متاحة عبر خاصية Runs الخاصة بها، وهي RunCollection.


الفقرات وتنسيق الفقرات

Paragraph هو عقدة مركبة تحتوي على الجريانات (وباقي المحتوى المضمن) لفقرة واحدة؛ فقرات المستند أو الجسم تُعرض كـ ParagraphCollection (Body.Paragraphs). Paragraph.ParagraphFormat (كائن ParagraphFormat) يتحكم في تخطيط مستوى الفقرة — Alignment، الهوامش (LeftIndent، RightIndent، FirstLineIndent)، المسافات (SpaceBefore، SpaceAfter، LineSpacing، LineSpacingRule)، وسلوك الترقيم (KeepTogether، KeepWithNext، PageBreakBefore، WidowControl). ParagraphFormat.ClearFormatting() يعيد ضبط هذه إلى الإعدادات الافتراضية، وParagraph.JoinRunsWithSameFormatting() يدمج الجريانات المتجاورة التي تحمل نفس التنسيق.


قراءة واستبدال النص باستخدام النطاق

كل عقدة تحتوي على محتوى — Document، Section، Paragraph أو Run — تكشف عن Range. Range.Text تُعيد النص العادي لكل ما داخل ذلك النطاق، وRange.Replace(pattern, replacement) تُجري عملية بحث-استبدال محصورة فقط على ذلك النطاق، بحيث يمكنك، على سبيل المثال، استبدال النص داخل فقرة واحدة دون لمس باقي المستند. Range.Delete() يزيل محتوى النطاق بالكامل.


Comments

عقدة Comment تُثبت تعليقًا في موقعٍ داخل النص؛ أنشئ واحدة باستخدام new Comment(doc, author, initial, dateTime) واضبط نص جسمها باستخدام SetText(text)، ثم أدخلها في المستند كأي عقدة أخرى. Comment.AddReply(author, initial, dateTime, text) تُرفق ردًا متسلسلًا، وRemoveReply(reply) / RemoveAllReplies() تُزيلهما. تُجمع تعليقات المستند في CommentCollection.


تنسيق القوائم على مستوى الفقرة

Paragraph.ListFormat (كائن ListFormat) يبلّغ ويتحكم فيما إذا كانت الفقرة جزءًا من قائمة: IsListItem وListLevelNumber يُبلغان حالتها الحالية، ApplyBulletDefault() وApplyNumberDefault() يحولان الفقرة إلى عنصر قائمة نقطي أو مرقم افتراضي، ListIndent() / ListOutdent() يغيّران مستوى تعشيق القائمة، وRemoveNumbers() يعيدها إلى فقرة عادية.


نصائح وأفضل الممارسات

  • اضبط خصائص الخط على DocumentBuilder.Font قبل كتابة النص باستخدام الباني بدلاً من كتابة النص أولًا وإعادة تنسيق كائنات Run الفردية لاحقًا.
  • حدّد نطاق Range.Replace إلى أصغر نطاق يغطي ما تريد تغييره فعليًا — استدعِه على نطاق Paragraph أو Section بدلاً من المستند بأكمله عندما لا ينبغي أن يُطبق التغيير على كامل المستند.
  • استدعِ Paragraph.JoinRunsWithSameFormatting() بعد سلسلة من التعديلات البرمجية لتجنب هيكل تشغيل مجزّأ غير ضروري.
  • استخدم ListFormat.ApplyBulletDefault() / ApplyNumberDefault() للحصول على قائمة افتراضية سريعة بدلاً من إنشاء تعريفات القوائم يدويًا عندما تكون القيم الافتراضية المدمجة كافية.
  • اقرأ نتائج Comment.AddReply كعُقد Comment نفسها — الردود هي كائنات تعليق كاملة، ليست سلاسل نصية عادية.

المشكلات الشائعة

المشكلةالسببالإصلاح
تنسيق Run’s Font لا يغيّر النص المجاور بصريًاالنص المجاور موجود في Run مختلف مع مثاله الخاص من Fontحدد وقم بتنسيق كل Run المتأثر، أو اضبط التنسيق عبر DocumentBuilder.Font قبل الكتابة
Range.Replace يغيّر النص خارج المجال المقصودReplace تم استدعاؤه على Document.Range بدلاً من نطاق عقدة أضيقاستدعِ Replace على Paragraph المحدد، Section، أو Range الخاص بالعقدة الأخرى
يبدو الفقرة كعنصر قائمة لكن IsListItem غير صحيحالرمز النقطي/الرقم هو نص يدوي، وليس تنسيق قائمة حقيقيطبّق تنسيق قائمة حقيقي باستخدام ListFormat.ApplyBulletDefault() أو ApplyNumberDefault() بدلاً من الأحرف المكتوبة
المستند يحتوي على عدد أكبر بكثير من عقد Run مما كان متوقعًاالتعديلات الصغيرة المتكررة تقسم السلاسل دون إعادة ربطهااستدعِ Paragraph.JoinRunsWithSameFormatting() بعد دفعات التعديلات

FAQ

ما الفرق بين Run و Paragraph؟

الـRun هو مقطع نصي يشارك مجموعة واحدة من تنسيق الأحرف (Font)؛ الـParagraph هو العقدة المركبة التي تحتوي على تشغيل واحد أو أكثر (ومحتوى مضمن آخر) بالإضافة إلى تنسيق على مستوى الفقرة (ParagraphFormat).

كيف يمكنني قراءة كل النص في مستند أو قسم؟

اقرأ خاصية Text لتلك العقدة Range — على سبيل المثال، document.Range.Text أو section.Range.Text.

كيف يمكنني البحث عن النص واستبداله في فقرة واحدة فقط؟

استدعِ Replace(pattern, replacement) على Range الخاص بـParagraph بدلاً من Document.Range.

كيف أضيف تعليقًا إلى مستند؟

أنشئه باستخدام new Comment(doc, author, initial, dateTime)، اضبط نصه باستخدام SetText(text)، وأدرجه في الشجرة؛ رد عليه باستخدام Comment.AddReply(author, initial, dateTime, text).

كيف أحول فقرة إلى عنصر قائمة نقطية؟

استدعِ ApplyBulletDefault() على ListFormat الخاص بتلك الفقرة؛ استخدم ApplyNumberDefault() للقائمة المرقمة بدلاً من ذلك.


API Reference ملخص

فئة/طريقةوصف
Runنص يشارك مجموعة واحدة من تنسيق الأحرف.
Fontتنسيق على مستوى الأحرف — الاسم، الحجم، الغامق، المائل، اللون، وأكثر.
Paragraphالعقدة المركبة التي تحتوي على السلاسل والتنسيق لفقرة واحدة.
ParagraphFormatتنسيق على مستوى الفقرة — المحاذاة، والمسافات البادئة، والمسافات، وترقيم الصفحات.
ParagraphCollectionمجموعة ذات نوع من عقد Paragraph، مثل Body.Paragraphs.
Rangeمنطقة متصلة من المستند؛ تدعم Text، Replace، وDelete.
Commentتعليق متسلسل مثبت في موقع داخل النص.
CommentCollectionمجموعة تعليقات المستند.
ListFormatيتحكم فيما إذا كانت الفقرة تشارك في قائمة وكيفية مشاركتها.

انظر أيضاً

 العربية