private static Range <int> GetRange(PatchOperation difference, WordDataProvider dataProvider) { int start = dataProvider.Matches[difference.Range.Start].Index; int end = 0; for (int match = difference.Range.Start; match <= difference.Range.End; ++match) { end = Math.Max(end, dataProvider.Matches[match].Index + dataProvider.Matches[match].Length); } return(new Range <int>(start, end)); }
static void Main() { /*string w = "p{font-family:Tahoma}. После того, как вам был открыт (C) *доступ*, войти в _систему_ можно войти следующим образом. В верхней части \"главной страницы\":http://www.bronni.ru в области под названием \"Вход для клиентов\" находятся два текстовых поля, куда необходимо ввести логин и пароль. После этого нажмите на ссылку \"Войти\".\r\n\r\n" + * "Если все прошло удачно \\-\\- то %{background:#FFEA77}название ??области?? *должно (C) ^поменяться^ на* \"Вход выполнен\"%. Если такого не происходит, то обратите внимание на область, расположенную немного левее \\- там выводятся системные сообщения. Если вам сообщается о том, что вы ввели неверный логин или пароль, то вы можете воспользваться формой \"напоминания пароля(Напоминания пароля)\":http://www.bronni.ru/default.aspx?page=passwordreminderpage.ascx. Если же вам сообщается, что \"Пользователь с таким именем уже работает с базой данных\", то поставьте галочку на пункте \"Войти принудительно\", еще раз введите пароль и нажмите \"Войти\".\r\n\r\n" + * "Ну и если ничего не помогает, то \"свяжитесь с нами\":http://www.bronni.ru/default.aspx?page=contactspage.ascx\r\n\r\n" + * "После того, как вам был открыт (C) *доступ*, войти в _систему_ можно войти следующим образом. В верхней части \"главной страницы\":http://www.bronni.ru в области под названием \"Вход для клиентов\" находятся два текстовых поля, куда необходимо ввести логин и пароль. После этого нажмите на ссылку \"Войти\".\r\n\r\n" + * "Если все прошло удачно \\-\\- то %{background:#FFEA77}название ??области?? *должно (C) ^поменяться^ на* \"Вход выполнен\"%. Если такого не происходит, то обратите внимание на область, расположенную немного левее \\- там выводятся системные сообщения. Если вам сообщается о том, что вы ввели неверный логин или пароль, то вы можете воспользваться формой \"напоминания пароля(Напоминания пароля)\":http://www.bronni.ru/default.aspx?page=passwordreminderpage.ascx. Если же вам сообщается, что \"Пользователь с таким именем уже работает с базой данных\", то поставьте галочку на пункте \"Войти принудительно\", еще раз введите пароль и нажмите \"Войти\".\r\n\r\n" + * "Ну и если ничего не помогает, то \"свяжитесь с нами\":http://www.bronni.ru/default.aspx?page=contactspage.ascx\r\n\r\n" + * "После того, как вам был открыт (C) *доступ*, войти в _систему_ можно войти следующим образом. В верхней части \"главной страницы\":http://www.bronni.ru в области под названием \"Вход для клиентов\" находятся два текстовых поля, куда необходимо ввести логин и пароль. После этого нажмите на ссылку \"Войти\".\r\n\r\n" + * "Если все прошло удачно \\-\\- то %{background:#FFEA77}название ??области?? *должно (C) ^поменяться^ на* \"Вход выполнен\"%. Если такого не происходит, то обратите внимание на область, расположенную немного левее \\- там выводятся системные сообщения. Если вам сообщается о том, что вы ввели неверный логин или пароль, то вы можете воспользваться формой \"напоминания пароля(Напоминания пароля)\":http://www.bronni.ru/default.aspx?page=passwordreminderpage.ascx. Если же вам сообщается, что \"Пользователь с таким именем уже работает с базой данных\", то поставьте галочку на пункте \"Войти принудительно\", еще раз введите пароль и нажмите \"Войти\".\r\n\r\n" + * "Ну и если ничего не помогает, то \"свяжитесь с нами\":http://www.bronni.ru/default.aspx?page=contactspage.ascx\r\n\r\n" + * "После того, как вам был открыт (C) *доступ*, войти в _систему_ можно войти следующим образом. В верхней части \"главной страницы\":http://www.bronni.ru в области под названием \"Вход для клиентов\" находятся два текстовых поля, куда необходимо ввести логин и пароль. После этого нажмите на ссылку \"Войти\".\r\n\r\n" + * "Если все прошло удачно \\-\\- то %{background:#FFEA77}название ??области?? *должно (C) ^поменяться^ на* \"Вход выполнен\"%. Если такого не происходит, то обратите внимание на область, расположенную немного левее \\- там выводятся системные сообщения. Если вам сообщается о том, что вы ввели неверный логин или пароль, то вы можете воспользваться формой \"напоминания пароля(Напоминания пароля)\":http://www.bronni.ru/default.aspx?page=passwordreminderpage.ascx. Если же вам сообщается, что \"Пользователь с таким именем уже работает с базой данных\", то поставьте галочку на пункте \"Войти принудительно\", еще раз введите пароль и нажмите \"Войти\".\r\n\r\n" + * "Ну и если ничего не помогает, то \"свяжитесь с нами\":http://www.bronni.ru/default.aspx?page=contactspage.ascx\r\n\r\n"; * * TextileAuthoringEngine textileAuthoringEngine = new TextileAuthoringEngine(); * string h = textileAuthoringEngine.Author(w);*/ /*StringBuilder wiki = new StringBuilder(); * for(int i = 0; i < 1; ++i) * wiki.Append(WikiMarkup); * * IAuthoringEngine authoringEngine = new TextileAuthoringEngine(); * * Stopwatch stopwatch = Stopwatch.StartNew(); * DomDocument document = authoringEngine.Parse(wiki.ToString()); * stopwatch.Stop(); * Console.WriteLine("{0} bytes in {1} sec.", wiki.ToString().Length, * stopwatch.ElapsedMilliseconds / 1000.0); * * HtmlAuthoringDomElementVisitor htmlAuthoringDomElementVisitor = new HtmlAuthoringDomElementVisitor(); * document.Accept(htmlAuthoringDomElementVisitor);*/ const string source = "The metrics for clarity are more-well understood. Do you have a game PLAN to become peerlessly synergetic across all platforms ? Think interactive"; const string target = "The metrics for obfuscation are more-well understood. Do you have a game plan to become cross-media ? Think interactive"; WordDataProvider sourceDataProvider = new WordDataProvider(source); WordDataProvider targetDataProvider = new WordDataProvider(target); DiffEngine <string> diffEngine = new DiffEngine <string>( sourceDataProvider, targetDataProvider); PatchOperationCollection differences = diffEngine.GetPatchOperations(); foreach (PatchOperation difference in differences) { switch (difference.Type) { case PatchOperationType.Deletion: Range <int> deletionRange = GetRange(difference, sourceDataProvider); Console.ForegroundColor = ConsoleColor.Red; Console.Write("-"); Console.Write(source.Substring(deletionRange.Start, deletionRange.End - deletionRange.Start)); Console.Write("-"); break; case PatchOperationType.Addition: Range <int> additionRange = GetRange(difference, targetDataProvider); Console.ForegroundColor = ConsoleColor.Green; Console.Write("+"); Console.Write(target.Substring(additionRange.Start, additionRange.End - additionRange.Start)); Console.Write("+"); break; case PatchOperationType.Copy: Range <int> copyRange = GetRange(difference, sourceDataProvider); Console.ForegroundColor = ConsoleColor.White; Console.Write(source.Substring(copyRange.Start, copyRange.End - copyRange.Start)); break; } // swich } // foreach StringBuilder text = new StringBuilder(); foreach (PatchOperation difference in differences) { switch (difference.Type) { case PatchOperationType.Deletion: Range <int> deletionRange = difference.Range; // GetRange(difference, sourceDataProvider); text.AppendFormat("-{{color:red;}}{0}-", target.Substring(deletionRange.Start, deletionRange.End - deletionRange.Start)); break; case PatchOperationType.Addition: Range <int> additionRange = difference.Range; // = GetRange(difference, targetDataProvider); text.AppendFormat("+{{color:green;}}{0}+", source.Substring(additionRange.Start, additionRange.End - additionRange.Start)); break; case PatchOperationType.Copy: Range <int> copyRange = difference.Range; // GetRange(difference, sourceDataProvider); text.Append(target.Substring(copyRange.Start, copyRange.End - copyRange.Start)); break; } // swich } // foreach Console.WriteLine(text.ToString()); }