مقایسه اسناد

مقایسه اسناد

مقایسه سند

این راهنما نشان می‌دهد که چگونه دو اجرای متن را مقایسه کنید و توالی ویرایش‌ها بین آن‌ها را با استفاده از Aspose.PDF FOSS text-diff engine برای .NET تولید کنید. نقطه ورودی این مدل مقایسه عبارت است از DiffOperation، یک ویرایش تک که برچسب‌گذاری شده با یک Operation (Equal, Delete، یا Insert)، همراه با DiffUtils کلاس کمکی برای یافتن متن مشترک و بازسازی یک diff به متن منبع و مقصد. یک عبور بهینه‌سازی جداگانه، که در بهینه‌سازی Diff، خروجی خام diff تولید شده به این روش را قبل از رندر یا اعمال، استاندارد می‌کند.


مدل فرق: عملیات و DiffOperation

Operation یک شمارشگر (enum) است که هر ویرایش در یک فرق را طبقه‌بندی می‌کند: Equal یک بخش متن را که بدون تغییر است علامت‌گذاری می‌کند، Delete یک بخش حذف‌شده از منبع را علامت‌گذاری می‌کند، و Insert یک بخش اضافه‌شده به مقصد را علامت‌گذاری می‌کند. DiffOperation یک مقدار Operation را با Text که به آن اعمال می‌شود جفت می‌کند و IEquatable<DiffOperation> را پیاده‌سازی می‌کند تا دو ویرایش بتوانند برای برابری مقایسه شوند.

using Aspose.Pdf.Comparison.Diff;

// A single edit consists of an Operation and the run of text it applies to.
var unchanged = new DiffOperation(Operation.Equal, "Aspose.PDF ");
var removed = new DiffOperation(Operation.Delete, "for .NET Framework");
var added = new DiffOperation(Operation.Insert, "FOSS for .NET");

Console.WriteLine(unchanged.Operation); // Equal
Console.WriteLine(added.Text);          // "FOSS for .NET"

یافتن متن مشترک با DiffUtils

DiffUtils یک کلاس کمکی ایستا است که توسط موتور فرق برای یافتن پیشوند و پسوند مشترکی که دو رشته آن را به اشتراک دارند، قبل از این که بخش میانی متفاوت فرق‌گذاری شود، استفاده می‌شود. FindCommonStartParts پیشوند مشترک را پیدا می‌کند، و FindCommonEndParts پسوند مشترک را پیدا می‌کند؛ یک overload از FindCommonEndParts یک startIndex می‌پذیرد تا جستجوی پسوند به متنی که پس از پیشوند پیشاپیش پیدا شده می‌آید محدود شود.

string original = "The quick brown fox";
string revised = "The quick red fox jumps";

var commonStart = DiffUtils.FindCommonStartParts(original, revised);
var commonEnd = DiffUtils.FindCommonEndParts(original, revised);

بازسازی متن از یک فرق

به‌محض اینکه یک diff به صورت دنباله‌ای از مقادیر DiffOperation بیان شود، DiffUtils می‌تواند هر یک از طرف‌های مقایسه را بازسازی کند: AssemblySourceText متن اصلی را از اجراهای Equal و Delete بازسازی می‌کند، و AssemblyDestinationText متن اصلاح‌شده را از اجراهای Equal و Insert بازسازی می‌کند.

using System.Collections.Generic;

var diffs = new List<DiffOperation>
{
    new DiffOperation(Operation.Equal, "The quick "),
    new DiffOperation(Operation.Delete, "brown"),
    new DiffOperation(Operation.Insert, "red"),
    new DiffOperation(Operation.Equal, " fox")
};

string sourceText = DiffUtils.AssemblySourceText(diffs);
string destinationText = DiffUtils.AssemblyDestinationText(diffs);

Console.WriteLine(sourceText);      // "The quick brown fox"
Console.WriteLine(destinationText); // "The quick red fox"

مقایسه و گزارش ویرایش‌ها

DiffOperation Equals، GetHashCode و ToString را بازنویسی می‌کند، بنابراین ویرایش‌ها می‌توانند برای برابری مقایسه شوند یا بدون کد تبدیل اضافی به لاگ‌ها و خروجی تست نوشته شوند.

var a = new DiffOperation(Operation.Equal, "PDF");
var b = new DiffOperation(Operation.Equal, "PDF");

bool same = a.Equals(b); // true - same Operation and Text
Console.WriteLine(a.ToString());

نکات و بهترین شیوه‌ها

  • DiffOperation غیرقابل تغییر است و IEquatable<DiffOperation> را پیاده‌سازی می‌کند — برای مقایسه دو ویرایش به‌جای برابری مرجع، از Equals استفاده کنید.
  • ابتدا پیشوند مشترک را با FindCommonStartParts پیدا کنید، سپس طول آن را به نسخهٔ بارگذاری‌شدهٔ startIndex از FindCommonEndParts پاس دهید تا از دو بار شمارش پیشوند کوتاه مشترک به‌عنوان بخشی از پسوند جلوگیری شود.
  • از AssemblySourceText و AssemblyDestinationText استفاده کنید تا یک دنباله از مقادیر DiffOperation را بررسی کنید که به‌دقت به متن اصلی و اصلاح‌شده باز می‌گردد قبل از اینکه در جای دیگری به آن تکیه کنید.
  • اجرای Operation.Equal را هنگام رندر یک diff بصری به‌عنوان عملیات‌بدون‌اثر در نظر بگیرید و تنها اجراهای Delete و Insert را برجسته کنید.
  • این موتور متون را مقایسه می‌کند، نه اسناد به‌صورت مستقیم — قبل از ساخت دیف، متن مورد نظر خود را برای مقایسه استخراج کنید (مثلاً از یک صفحه یا سند).

مشکلات رایج

مشکلدلیلرفع
AssemblySourceText / AssemblyDestinationText خروجی با نسخه‌های اصلی مطابقت نداردفهرست diffs ناقص است یا ورودی‌های DiffOperation آن به ترتیب نیستندهمه ویرایش‌ها را در توالی، به همان ترتیب اصلی که رخ داده‌اند، گنجانید
FindCommonEndParts در رشته‌های کوتاه و مشابه، نتیجه غیرمنتظره‌ای برمی‌گرداندجستجوی پسوند مشترک با متنی که قبلاً توسط FindCommonStartParts مطابقت داده شده، تداخل داردطول برگردانده‌شده توسط FindCommonStartParts را به عنوان پارامتر startIndex ارسال کنید
Equals برای ویرایش‌هایی که یکسان به نظر می‌رسند، false برمی‌گرداندمقادیر Text به دلیل فاصله یا حساسیت به حروف بزرگ/کوچک متفاوت هستندمتن را (حذف فضاهای اضافی / تبدیل به حروف یکسان) پیش از ساخت مقادیر DiffOperation که قصد مقایسه آن‌ها را دارید، نرمال‌سازی کنید
خروجی Diff پر سر و صدا یا به‌طور غیرضروری تکه‌تکه به نظر می‌رسددنباله‌های خام DiffOperation هنوز به صورت قانونمند نشده‌انددنباله را از طریق مرحله بهینه‌سازی توصیف‌شده در بهینه‌سازی Diff

FAQ

موتور Diff چه چیزی را مقایسه می‌کند؟

این موتور توالی‌های متنی را مقایسه می‌کند و یک دنباله از مقادیر DiffOperation تولید می‌نماید که ویرایش‌ها را توصیف می‌کند — متن بدون تغییر، حذف‌شده یا افزوده‌شده — که برای تبدیل یک رشته به رشته دیگر لازم است.

چه انواع ویرایشی Operation پشتیبانی می‌کند؟

سه نوع: Equal برای متن بدون تغییر، Delete برای متنی که از منبع حذف شده است، و Insert برای متنی که به مقصد افزوده شده است.

چگونه می‌توانم بررسی کنم که آیا دو ویرایش یکسان هستند یا نه؟

فراخوانی Equals روی یک نمونه DiffOperation، یا مقایسه مستقیم ویژگی‌های Operation و Text آن.

آیا می‌توانم متن اصلی و متن اصلاح‌شده را از یک diff دریافت کنم؟

بله — لیست مقادیر DiffOperation را به DiffUtils.AssemblySourceText برای متن اصلی و به DiffUtils.AssemblyDestinationText برای متن اصلاح‌شده ارسال کنید.

آیا این صفحه ادغام یا تمیز کردن یک diff را پوشش می‌دهد؟

خیر — قانونمند کردن یک diff خام (ادغام توالی‌های مجاور، انتقال ویرایش‌ها در برابر برابری‌ها) به‌طور جداگانه در بهینه‌سازی Diff.


API Reference خلاصه

کلاس / متدتوضیح
Operationenum که ویرایشی را به‌عنوان Equal، Delete یا Insert طبقه‌بندی می‌کند
DiffOperationیک ویرایش واحد: یک Operation که با Textی که به آن اعمال می‌شود، جفت می‌شود
DiffOperation.Operationمقدار Operation برای این ویرایش
DiffOperation.Textبخش متنی که این ویرایش به آن اعمال می‌شود
DiffOperation.Equalsدو ویرایش را برای برابری توسط Operation و Text مقایسه می‌کند
DiffOperation.ToStringیک ویرایش را به‌صورت رشته برای ثبت یا نمایش رندر می‌کند
DiffUtilsکلاس کمکی ایستا با ابزارهای تفاوت‌سنجی متن
DiffUtils.FindCommonStartPartsپیشوند مشترک دو رشته را پیدا می‌کند
DiffUtils.FindCommonEndPartsپسوند مشترک دو رشته را پیدا می‌کند، به‌صورت اختیاری می‌تواند از یک ایندکس شروع شود
DiffUtils.AssemblySourceTextمتن اصلی را از فهرستی از مقادیر DiffOperation بازسازی می‌کند
DiffUtils.AssemblyDestinationTextمتن بازنگری‌شده را از یک فهرست از مقادیر DiffOperation بازسازی می‌کند

همچنین ببینید:

 فارسی