/// <summary> /// /// </summary> /// <param name="text"></param> /// <param name="option"></param> /// <returns></returns> private static int[] SplitChar(string text, DiffOption option) { if (option.IgnoreCase) text = text.ToUpperInvariant(); // TODO: FIXME! Optimize this if (option.IgnoreSpace) text = Regex.Replace(text, @"\s+", " "); if (option.TrimSpace) text = text.Trim(); int[] result = new int[text.Length]; for (int i = 0; i < text.Length; i++) result[i] = text[i]; return result; }
/// <summary> /// /// </summary> /// <param name="text"></param> /// <param name="option"></param> /// <returns></returns> private static string[] SplitLine(string text, DiffOption option) { if (option.IgnoreCase) text = text.ToUpperInvariant(); string[] lines = text.Split(new string[] { "\r\n", "\n", "\r" }, StringSplitOptions.None); // TODO: FIXME! Optimize this if (option.IgnoreSpace) for (int i = 0; i < lines.Length; ++i) lines[i] = Regex.Replace(lines[i], @"\s+", " "); if (option.TrimSpace) for (int i = 0; i < lines.Length; ++i) lines[i] = lines[i].Trim(); return lines; }
/// <summary> /// /// </summary> /// <param name="textA"></param> /// <param name="textB"></param> /// <param name="option"></param> private void SplitChar(string textA, string textB, DiffOption option) { this.dataA = SplitChar(textA, option); this.dataB = SplitChar(textB, option); }
/// <summary> /// /// </summary> /// <param name="textA"></param> /// <param name="textB"></param> /// <param name="option"></param> /// <returns></returns> private DiffResult[] DiffCore(string textA, string textB, DiffOption option) { this.linesA = SplitLine(textA, option); this.linesB = SplitLine(textB, option); if (this.linesB.Length < this.linesA.Length) { this.isSwap = true; string[] tmps = this.linesA; this.linesA = this.linesB; this.linesB = tmps; } this.dataA = MakeHash(this.linesA); this.dataB = MakeHash(this.linesB); this.isSame = delegate(int posA, int posB) { return (this.dataA[posA] == this.dataB[posB]) && (this.linesA[posA] == this.linesB[posB]); }; return DetectDiff(); }
/// <summary>単一行の各文字を比較します</summary> /// <param name="textA">元テキスト</param> /// <param name="textB">変更テキスト</param> /// <param name="option">オプション指定</param> /// <returns>比較結果</returns> public static DiffResult[] DiffChar(string textA, string textB, DiffOption option) { if (string.IsNullOrEmpty(textA) || string.IsNullOrEmpty(textB)) return StringNullOrEmpty(textA, textB); FastDiff diff = new FastDiff(); if (textA.Length <= textB.Length) { diff.SplitChar(textA, textB, option); } else { diff.isSwap = true; diff.SplitChar(textB, textA, option); } diff.isSame = delegate(int posA, int posB) { return diff.dataA[posA] == diff.dataB[posB]; }; return diff.DetectDiff(); }
/// <summary>単一行の各文字を比較します</summary> /// <param name="textA">元テキスト</param> /// <param name="textB">変更テキスト</param> /// <returns>比較結果</returns> public static DiffResult[] DiffChar(string textA, string textB) { DiffOption option = new DiffOption(); return DiffChar(textA, textB, option); }
/// <summary>複数行の文字列を行単位で比較します</summary> /// <param name="textA">元テキスト</param> /// <param name="textB">変更テキスト</param> /// <param name="option">オプション指定</param> /// <returns>比較結果</returns> public static DiffResult[] Diff(string textA, string textB, DiffOption option) { if (string.IsNullOrEmpty(textA) || string.IsNullOrEmpty(textB)) return StringNullOrEmpty(textA, textB); FastDiff diff = new FastDiff(); return diff.DiffCore(textA, textB, option); }