﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Xml.Linq;
using DocumentFormat.OpenXml.Packaging;
using OpenXmlPowerTools;

class OpenXmlRegexExample
{
    static void Main(string[] args)
    {
        var n = DateTime.Now;
        var tempDi = new DirectoryInfo(string.Format("ExampleOutput-{0:00}-{1:00}-{2:00}-{3:00}{4:00}{5:00}", n.Year - 2000, n.Month, n.Day, n.Hour, n.Minute, n.Second));
        tempDi.Create();

        var sourceDoc = new FileInfo("../../TestDocument.docx");
        var newDoc = new FileInfo("Modified.docx");
        if (newDoc.Exists)
            newDoc.Delete();
        File.Copy(sourceDoc.FullName, newDoc.FullName);
        using (WordprocessingDocument wDoc = WordprocessingDocument.Open(newDoc.FullName, true))
        {
            int count;
            var xDoc = wDoc.MainDocumentPart.GetXDocument();
            Regex regex;
            IEnumerable<XElement> content;

            content = xDoc.Descendants(W.p);
            regex = new Regex("[.]\x020+");
            count = OpenXmlRegex.Replace(content, regex, "." + Environment.NewLine, null);

            foreach (var para in content)
            {
                var newPara = (XElement)TransformEnvironmentNewLineToParagraph(para);
                para.ReplaceNodes(newPara.Nodes());
            }

            wDoc.MainDocumentPart.PutXDocument();
        }
    }

    private static object TransformEnvironmentNewLineToParagraph(XNode node)
    {
        var element = node as XElement;
        if (element != null)
        {
            if (element.Name == W.p)
            {

            }

            return new XElement(element.Name,
                element.Attributes(),
                element.Nodes().Select(n => TransformEnvironmentNewLineToParagraph(n)));
        }
        return node;
    }
}
