Esempio n. 1
0
        public void editTagsAndCommentInXLF(String fileIn, String fileOut, String tagsInfo, String Comment)
        {
            var content      = File.ReadAllText(fileIn);
            var defxml       = Regex.Match(content, @"<\?xml\b[^<>]*\?>").Value;
            var nsdef        = Regex.Match(content, @"(?<=<xliff\b[^<>]*xmlns[ \t]*=[ \t]*"")[^""]+(?="")").Value;
            var spaceTU      = Regex.Match(content, @"(?<=[\r\n]+)[ \t]*(?=<trans-unit\b)").Value;
            var spaceTUChild = Regex.Match(content, @"(?<=[\r\n]+)[ \t]*(?=<source\b)").Value;

            content = Regex.Replace(content, @"&(?!amp;|lt;|gt;)(#\d+?;|[a-zA-Z]+?;)", "&amp;#38;$1");

            XmlReaderSettings xrs = new XmlReaderSettings();

            xrs.CheckCharacters  = false;
            xrs.IgnoreWhitespace = false;
            xrs.NameTable        = new NameTable();
            XmlNamespaceManager xnm = new XmlNamespaceManager(xrs.NameTable);

            xnm.AddNamespace("xlfns", nsdef);

            XmlDocument xmlDoc = new XmlDocument();

            xmlDoc.PreserveWhitespace = true;
            var sr = new StringReader(content);

            using (var xr = XmlReader.Create(sr, xrs))
            {
                xmlDoc.Load(xr);
            }

            var TuNds = xmlDoc.SelectNodes("//xlfns:trans-unit", xnm);

            foreach (XmlNode TuNd in TuNds)
            {
                var tagsNoteNd = TuNd.SelectSingleNode("./xlfns:note[@from='tags']", xnm);
                if (tagsNoteNd != null)
                {
                    tagsNoteNd.InnerXml = tagsInfo;
                }
                else
                {
                    XmlNode    addNd = xmlDoc.CreateNode(XmlNodeType.Element, "note", nsdef);
                    XmlElement addXe = (XmlElement)addNd;
                    addXe.SetAttribute("from", "tags");
                    addXe.InnerXml = tagsInfo;
                    TuNd.AppendChild(addXe);
                }

                var commentNoteNd = TuNd.SelectSingleNode("./xlfns:note[@from='L10N comment']", xnm);
                if (commentNoteNd != null)
                {
                    commentNoteNd.InnerXml = Comment;
                }
                else
                {
                    XmlNode    addNd = xmlDoc.CreateNode(XmlNodeType.Element, "note", nsdef);
                    XmlElement addXe = (XmlElement)addNd;
                    addXe.SetAttribute("from", "L10N comment");
                    addXe.InnerXml = Comment;
                    TuNd.AppendChild(addXe);
                }
            }

            XmlWriterSettings xws = new XmlWriterSettings();

            xws.CheckCharacters     = false;
            xws.Encoding            = Encoding.UTF8;
            xws.Indent              = true;
            xws.NamespaceHandling   = NamespaceHandling.OmitDuplicates;
            xws.NewLineChars        = "\r\n";
            xws.NewLineHandling     = NewLineHandling.None;
            xws.NewLineOnAttributes = false;
            xws.OmitXmlDeclaration  = false;
            using (var xw = XmlWriter.Create(fileOut, xws))
            {
                xmlDoc.Save(xw);
            }

            var textWrite = File.ReadAllText(fileOut);
            var repand    = Regex.Replace(textWrite, @"&amp;#38;(?!amp;|lt;|gt;)(#\d+?;|[a-zA-Z]+?;)", "&$1");
            var repXmldef = Regex.Replace(repand, @"<\?xml\b[^<>]*\?>", defxml);
            var addSpace1 = Regex.Replace(repXmldef, @">\s*<(target|source|note)\b", ">\r\n" + spaceTUChild + "<$1");
            var addSpace2 = Regex.Replace(addSpace1, @">\s*<trans-unit\b", ">\r\n" + spaceTU + "<trans-unit");
            var addSpace3 = Regex.Replace(addSpace2, @">\s*</trans-unit>", ">\r\n" + spaceTU + "</trans-unit>");

            File.WriteAllText(fileOut, addSpace3, Encoding.UTF8);
        }
        public void regularFile(String str_fileIn, String str_fileOrigSrc, String str_fileOut, bool b_removeNd)
        {
            var contentIn    = File.ReadAllText(str_fileIn);
            var contentOrig  = File.ReadAllText(str_fileOrigSrc);
            var defxml       = Regex.Match(contentOrig, @"<\?xml\b[^<>]*\?>").Value;
            var spaceTU      = Regex.Match(contentOrig, @"(?<=[\r\n]+)[ \t]*(?=<trans-unit\b)").Value;
            var spaceTUChild = Regex.Match(contentOrig, @"(?<=[\r\n]+)[ \t]*(?=<source\b)").Value;
            var nsdef        = Regex.Match(contentOrig, @"(?<=xliff\b[^<>]*xmlns[ \t]*=[ \t]*"")[^""]+(?="")").Value;

            contentIn   = Regex.Replace(contentIn, @"&(?!amp;|lt;|gt;)(#\d+?;|[a-zA-Z]+?;)", "&amp;#38;$1");
            contentOrig = Regex.Replace(contentOrig, @"&(?!amp;|lt;|gt;)(#\d+?;|[a-zA-Z]+?;)", "&amp;#38;$1");

            XmlReaderSettings xrs = new XmlReaderSettings();

            xrs.CheckCharacters  = false;
            xrs.IgnoreWhitespace = false;
            xrs.NameTable        = new NameTable();
            XmlNamespaceManager xnm = new XmlNamespaceManager(xrs.NameTable);

            xnm.AddNamespace("xlfns", nsdef);

            XmlDocument xmlDocIn = new XmlDocument();

            xmlDocIn.PreserveWhitespace = true;
            var sr = new StringReader(contentIn);

            using (var xr = XmlReader.Create(sr, xrs))
            {
                xmlDocIn.Load(xr);
            }

            XmlDocument xmlDocOrig = new XmlDocument();

            xmlDocOrig.PreserveWhitespace = true;
            var srOrig = new StringReader(contentOrig);

            using (var xrOrig = XmlReader.Create(srOrig, xrs))
            {
                xmlDocOrig.Load(xrOrig);
            }

            var TuNds = xmlDocIn.SelectNodes("//xlfns:trans-unit", xnm);

            foreach (XmlNode TuNd in TuNds)
            {
                var        targetNd  = TuNd.SelectSingleNode("./xlfns:target", xnm);
                XmlElement targetXe  = (XmlElement)targetNd;
                var        stateAttr = targetXe.GetAttribute("state");
                if (stateAttr == "final" && b_removeNd == true)
                {
                    var parent = TuNd.ParentNode;
                    parent.RemoveChild(TuNd);
                }
                else
                {
                    var        noteNds     = TuNd.SelectNodes("./xlfns:note", xnm);
                    XmlElement TuXe        = (XmlElement)TuNd;
                    var        idAttr      = TuXe.GetAttribute("id");
                    var        TuNdOrig    = xmlDocOrig.SelectSingleNode("//xlfns:trans-unit[@id='" + idAttr + "']", xnm);
                    var        noteNdsOrig = TuNdOrig.SelectNodes("./xlfns:note", xnm);

                    foreach (XmlNode noteNd in noteNds)
                    {
                        TuNd.RemoveChild(noteNd);
                    }

                    foreach (XmlNode noteNdOrig in noteNdsOrig)
                    {
                        var addNd = xmlDocIn.ImportNode(noteNdOrig, true);
                        TuNd.AppendChild(addNd);
                    }
                }
            }

            XmlWriterSettings xws = new XmlWriterSettings();

            xws.CheckCharacters     = false;
            xws.Encoding            = Encoding.UTF8;
            xws.Indent              = true;
            xws.NamespaceHandling   = NamespaceHandling.OmitDuplicates;
            xws.NewLineChars        = "\r\n";
            xws.NewLineHandling     = NewLineHandling.None;
            xws.NewLineOnAttributes = false;
            xws.OmitXmlDeclaration  = false;
            using (var xw = XmlWriter.Create(str_fileOut, xws))
            {
                xmlDocIn.Save(xw);
            }

            var textWrite = File.ReadAllText(str_fileOut);
            var repand    = Regex.Replace(textWrite, @"&amp;#38;(?!amp;|lt;|gt;)(#\d+?;|[a-zA-Z]+?;)", "&$1");
            var repXmldef = Regex.Replace(repand, @"<\?xml\b[^<>]*\?>", defxml);
            var addSpace1 = Regex.Replace(repXmldef, @">\s*<(target|source|note)\b", ">\r\n" + spaceTUChild + "<$1");
            var addSpace2 = Regex.Replace(addSpace1, @">\s*<trans-unit\b", ">\r\n" + spaceTU + "<trans-unit");
            var addSpace3 = Regex.Replace(addSpace2, @">\s*</trans-unit>", ">\r\n" + spaceTU + "</trans-unit>");

            File.WriteAllText(str_fileOut, addSpace3, Encoding.UTF8);
        }