Esempio n. 1
0
    void TestDiffMatchPatch()
    {
        var s1 = @"//.
using Au; using Au.Types; using System; using System.Collections.Generic;
class Script : AScript { [STAThread] static void Main(string[] a) => new Script(a); Script(string[] args) { //;;;
	
	var s=""one"";
";
        var s2 = @"/*/ role exeProgram;		outputPath %AFolders.Workspace%\bin; console true; /*/ //.
using Au; using Au.Types; using System; using System.Collections.Generic;
using My.NS1; //ąčę îôû
using My.NS2;
class Script : AScript { [STAThread] static void Main(string[] a) => new Script(a); Script(string[] args) { //;;;
	var i=2;
";

        var         dmp  = new diff_match_patch();
        List <Diff> diff = dmp.diff_main(s1, s2, true);

        dmp.diff_cleanupSemantic(diff);
        var delta = dmp.diff_toDelta(diff);

        AOutput.Write(delta);
        AOutput.Write("----");
        var d2 = dmp.diff_fromDelta(s1, delta);

        //AOutput.Write(d2);
        AOutput.Write(dmp.diff_text2(d2));
    }
Esempio n. 2
0
        /// <summary>
        /// Patch a JSON object
        /// </summary>
        /// <param name="left">Unpatched JSON object</param>
        /// <param name="patch">JSON Patch Document</param>
        /// <returns>Patched JSON object</returns>
        /// <exception cref="System.IO.InvalidDataException">Thrown if the patch document is invalid</exception>
        public JToken Patch(JToken left, JToken patch)
        {
            if (patch == null)
            {
                return(left);
            }

            if (patch.Type == JTokenType.Object)
            {
                var       patchObj        = (JObject)patch;
                JProperty arrayDiffCanary = patchObj.Property("_t");

                if (left != null &&
                    left.Type == JTokenType.Array &&
                    arrayDiffCanary != null &&
                    arrayDiffCanary.Value.Type == JTokenType.String &&
                    arrayDiffCanary.ToObject <string>() == "a")
                {
                    return(ArrayPatch((JArray)left, patchObj));
                }

                return(ObjectPatch(left as JObject, patchObj));
            }

            if (patch.Type == JTokenType.Array)
            {
                var patchArray = (JArray)patch;

                if (patchArray.Count == 1)                 // Add
                {
                    return(patchArray[0]);
                }
                else if (patchArray.Count == 2)                 // Replace
                {
                    return(patchArray[1]);
                }
                else if (patchArray.Count == 3)                 // Delete, Move or TextDiff
                {
                    if (patchArray[2].Type != JTokenType.Integer)
                    {
                        throw new InvalidDataException("Invalid patch object");
                    }

                    int op = patchArray[2].Value <int>();

                    if (op == 0)
                    {
                        return(null);
                    }
                    else if (op == 2)
                    {
                        var          dmp     = new diff_match_patch();
                        List <Patch> patches = dmp.patch_fromText(patchArray[0].ToObject <string>());

                        if (patches.Count != 1)
                        {
                            throw new InvalidDataException("Invalid textline");
                        }

                        string right = dmp.diff_text2(patches[0].diffs);
                        return(right);
                    }
                    else
                    {
                        throw new InvalidDataException("Invalid patch object");
                    }
                }
                else
                {
                    throw new InvalidDataException("Invalid patch object");
                }
            }

            return(null);
        }