public FormattingAssemblerSettings()
 {
     RemoveStyleNamesFromParagraphAndRunProperties = true;
     ClearStyles = true;
     OrderElementsPerStandard = true;
     CreateHtmlConverterAnnotationAttributes = true;
     RestrictToSupportedNumberingFormats = false;
     RestrictToSupportedLanguages = false;
     ListItemRetrieverSettings = new ListItemRetrieverSettings();
 }
Exemple #2
0
        private static void InitializeListItemRetrieverForPart(WordprocessingDocument wordDoc, OpenXmlPart part, ListItemRetrieverSettings settings)
        {
            var mainXDoc = part.GetXDocument();

            var numPart = wordDoc.MainDocumentPart.NumberingDefinitionsPart;

            if (numPart == null)
            {
                return;
            }
            var numXDoc = numPart.GetXDocument();

            var stylesPart = wordDoc.MainDocumentPart.StyleDefinitionsPart;

            if (stylesPart == null)
            {
                return;
            }
            var stylesXDoc = stylesPart.GetXDocument();

            var rootNode = mainXDoc.Root;

            InitializeListItemRetrieverForStory(numXDoc, stylesXDoc, rootNode);

            var textBoxes = mainXDoc
                            .Root
                            .Descendants(W.txbxContent);

            foreach (var textBox in textBoxes)
            {
                InitializeListItemRetrieverForStory(numXDoc, stylesXDoc, textBox);
            }
        }
Exemple #3
0
        private static void InitializeListItemRetriever(WordprocessingDocument wordDoc, ListItemRetrieverSettings settings)
        {
            foreach (var part in wordDoc.ContentParts())
            {
                InitializeListItemRetrieverForPart(wordDoc, part, settings);
            }

#if false
            foreach (var part in wordDoc.ContentParts())
            {
                var xDoc  = part.GetXDocument();
                var paras = xDoc
                            .Descendants(W.p)
                            .Where(p =>
                                   p.Annotation <ListItemInfo>() == null);
                if (paras.Any())
                {
                    Console.WriteLine("Error");
                }
            }
#endif
        }
Exemple #4
0
        public static string RetrieveListItem(WordprocessingDocument wordDoc, XElement paragraph, ListItemRetrieverSettings settings)
        {
            if (wordDoc.MainDocumentPart.NumberingDefinitionsPart == null)
            {
                return(null);
            }

            var listItemInfo = paragraph.Annotation <ListItemInfo>();

            if (listItemInfo == null)
            {
                InitializeListItemRetriever(wordDoc, settings);
            }

            listItemInfo = paragraph.Annotation <ListItemInfo>();
            if (!listItemInfo.IsListItem)
            {
                return(null);
            }

            var numberingDefinitionsPart = wordDoc
                                           .MainDocumentPart
                                           .NumberingDefinitionsPart;

            if (numberingDefinitionsPart == null)
            {
                return(null);
            }

            StyleDefinitionsPart styleDefinitionsPart = wordDoc
                                                        .MainDocumentPart
                                                        .StyleDefinitionsPart;

            if (styleDefinitionsPart == null)
            {
                return(null);
            }

            var numXDoc    = numberingDefinitionsPart.GetXDocument();
            var stylesXDoc = styleDefinitionsPart.GetXDocument();

            var paragraphLevel = GetParagraphLevel(paragraph);
            var lvl            = listItemInfo.Lvl(paragraphLevel);

            string lvlText = (string)lvl.Elements(W.lvlText).Attributes(W.val).FirstOrDefault();

            if (lvlText == null)
            {
                return(null);
            }

            var levelNumbersAnnotation = paragraph.Annotation <LevelNumbers>();

            if (levelNumbersAnnotation == null)
            {
                throw new OpenXmlPowerToolsException("Internal error");
            }

            int[]  levelNumbers       = levelNumbersAnnotation.LevelNumbersArray;
            string languageIdentifier = GetLanguageIdentifier(paragraph, stylesXDoc);
            string listItem           = FormatListItem(listItemInfo, levelNumbers, GetParagraphLevel(paragraph),
                                                       lvlText, stylesXDoc, languageIdentifier, settings);

            return(listItem);
        }
Exemple #5
0
        private static string FormatListItem(ListItemInfo lii, int[] levelNumbers, int ilvl,
                                             string lvlText, XDocument styles, string languageCultureName, ListItemRetrieverSettings settings)
        {
            string[] formatTokens = GetFormatTokens(lvlText).ToArray();
            XElement lvl          = lii.Lvl(ilvl);
            bool     isLgl        = lvl.Elements(W.isLgl).Any();
            string   listItem     = formatTokens.Select((t, l) =>
            {
                if (t.Substring(0, 1) != "%")
                {
                    return(t);
                }
                int indentationLevel;
                if (!Int32.TryParse(t.Substring(1), out indentationLevel))
                {
                    return(t);
                }
                indentationLevel -= 1;
                if (indentationLevel >= levelNumbers.Length)
                {
                    indentationLevel = levelNumbers.Length - 1;
                }
                int levelNumber       = levelNumbers[indentationLevel];
                string levelText      = null;
                XElement rlvl         = lii.Lvl(indentationLevel);
                string numFmtForLevel = (string)rlvl.Elements(W.numFmt).Attributes(W.val).FirstOrDefault();
                if (numFmtForLevel == null)
                {
                    var numFmtElement = rlvl.Elements(MC.AlternateContent).Elements(MC.Choice).Elements(W.numFmt).FirstOrDefault();
                    if (numFmtElement != null && (string)numFmtElement.Attribute(W.val) == "custom")
                    {
                        numFmtForLevel = (string)numFmtElement.Attribute(W.format);
                    }
                }
                if (numFmtForLevel != "none")
                {
                    if (isLgl && numFmtForLevel != "decimalZero")
                    {
                        numFmtForLevel = "decimal";
                    }
                }
                if (languageCultureName != null && settings != null)
                {
                    if (settings.ListItemTextImplementations.ContainsKey(languageCultureName))
                    {
                        var impl  = settings.ListItemTextImplementations[languageCultureName];
                        levelText = impl(languageCultureName, levelNumber, numFmtForLevel);
                    }
                }
                if (levelText == null)
                {
                    levelText = ListItemTextGetter_Default.GetListItemText(languageCultureName, levelNumber, numFmtForLevel);
                }
                return(levelText);
            }).StringConcatenate();

            return(listItem);
        }
 private static void AssembleListItemInformation(WordprocessingDocument wordDoc, ListItemRetrieverSettings settings)
 {
     foreach (var part in wordDoc.ContentParts())
     {
         XDocument xDoc = part.GetXDocument();
         foreach (var para in xDoc.Descendants(W.p))
         {
             ListItemRetriever.RetrieveListItem(wordDoc, para, settings);
         }
     }
 }
 public static void AssembleFormatting(WordprocessingDocument wDoc, FormattingAssemblerSettings settings)
 {
     FormattingAssemblerInfo fai = new FormattingAssemblerInfo();
     XDocument sXDoc = wDoc.MainDocumentPart.StyleDefinitionsPart.GetXDocument();
     XElement defaultParagraphStyle = sXDoc
         .Root
         .Elements(W.style)
         .FirstOrDefault(st => st.Attribute(W._default).ToBoolean() == true &&
             (string)st.Attribute(W.type) == "paragraph");
     if (defaultParagraphStyle != null)
         fai.DefaultParagraphStyleName = (string)defaultParagraphStyle.Attribute(W.styleId);
     XElement defaultCharacterStyle = sXDoc
         .Root
         .Elements(W.style)
         .FirstOrDefault(st => st.Attribute(W._default).ToBoolean() == true &&
             (string)st.Attribute(W.type) == "character");
     if (defaultCharacterStyle != null)
         fai.DefaultCharacterStyleName = (string)defaultCharacterStyle.Attribute(W.styleId);
     XElement defaultTableStyle = sXDoc
         .Root
         .Elements(W.style)
         .FirstOrDefault(st => st.Attribute(W._default).ToBoolean() == true &&
             (string)st.Attribute(W.type) == "table");
     if (defaultTableStyle != null)
         fai.DefaultTableStyleName = (string)defaultTableStyle.Attribute(W.styleId);
     ListItemRetrieverSettings listItemRetrieverSettings = new ListItemRetrieverSettings();
     AssembleListItemInformation(wDoc, settings.ListItemRetrieverSettings);
     foreach (var part in wDoc.ContentParts())
     {
         var pxd = part.GetXDocument();
         FixNonconformantHexValues(pxd.Root);
         AnnotateWithGlobalDefaults(wDoc, pxd.Root, settings);
         AnnotateTablesWithTableStyles(wDoc, pxd.Root);
         AnnotateParagraphs(fai, wDoc, pxd.Root, settings);
         AnnotateRuns(fai, wDoc, pxd.Root, settings);
     }
     NormalizeListItems(fai, wDoc, settings);
     if (settings.ClearStyles)
         ClearStyles(wDoc);
     foreach (var part in wDoc.ContentParts())
     {
         var pxd = part.GetXDocument();
         pxd.Root.Descendants().Attributes().Where(a => a.IsNamespaceDeclaration).Remove();
         FormattingAssembler.NormalizePropsForPart(pxd, settings);
         var newRoot = (XElement)CleanupTransform(pxd.Root);
         pxd.Root.ReplaceWith(newRoot);
         part.PutXDocument();
     }
 }
        private static void InitializeListItemRetrieverForPart(WordprocessingDocument wordDoc, OpenXmlPart part, ListItemRetrieverSettings settings)
        {
            var mainXDoc = part.GetXDocument();
            
            var numPart = wordDoc.MainDocumentPart.NumberingDefinitionsPart;
            if (numPart == null)
                return;
            var numXDoc = numPart.GetXDocument();

            var stylesPart = wordDoc.MainDocumentPart.StyleDefinitionsPart;
            if (stylesPart == null)
                return;
            var stylesXDoc = stylesPart.GetXDocument();

            var rootNode = mainXDoc.Root;

            InitializeListItemRetrieverForStory(numXDoc, stylesXDoc, rootNode);

            var textBoxes = mainXDoc
                .Root
                .Descendants(W.txbxContent);

            foreach (var textBox in textBoxes)
                InitializeListItemRetrieverForStory(numXDoc, stylesXDoc, textBox);
        }
        private static void InitializeListItemRetriever(WordprocessingDocument wordDoc, ListItemRetrieverSettings settings)
        {
            foreach (var part in wordDoc.ContentParts())
                InitializeListItemRetrieverForPart(wordDoc, part, settings);

#if false
            foreach (var part in wordDoc.ContentParts())
	        {
                var xDoc = part.GetXDocument();
                var paras = xDoc
                    .Descendants(W.p)
                    .Where(p =>
                        p.Annotation<ListItemInfo>() == null);
                if (paras.Any())
                    Console.WriteLine("Error");
	        }
#endif
        }
        public static string RetrieveListItem(WordprocessingDocument wordDoc, XElement paragraph, ListItemRetrieverSettings settings)
        {
            if (wordDoc.MainDocumentPart.NumberingDefinitionsPart == null)
                return null;

            var listItemInfo = paragraph.Annotation<ListItemInfo>();
            if (listItemInfo == null)
                InitializeListItemRetriever(wordDoc, settings);

            listItemInfo = paragraph.Annotation<ListItemInfo>();
            if (!listItemInfo.IsListItem)
                return null;

            var numberingDefinitionsPart = wordDoc
                .MainDocumentPart
                .NumberingDefinitionsPart;

            if (numberingDefinitionsPart == null)
                return null;

            StyleDefinitionsPart styleDefinitionsPart = wordDoc
                .MainDocumentPart
                .StyleDefinitionsPart;

            if (styleDefinitionsPart == null)
                return null;

            var numXDoc = numberingDefinitionsPart.GetXDocument();
            var stylesXDoc = styleDefinitionsPart.GetXDocument();

            var lvl = listItemInfo.Lvl(GetParagraphLevel(paragraph));

            string lvlText = (string)lvl.Elements(W.lvlText).Attributes(W.val).FirstOrDefault();
            if (lvlText == null)
                return null;

            var levelNumbersAnnotation = paragraph.Annotation<LevelNumbers>();
            if (levelNumbersAnnotation == null)
                throw new OpenXmlPowerToolsException("Internal error");

            int[] levelNumbers = levelNumbersAnnotation.LevelNumbersArray;
            string languageIdentifier = GetLanguageIdentifier(paragraph, stylesXDoc);
            string listItem = FormatListItem(listItemInfo, levelNumbers, GetParagraphLevel(paragraph), 
                lvlText, stylesXDoc, languageIdentifier, settings);
            return listItem;
        }
 private static string FormatListItem(ListItemInfo lii, int[] levelNumbers, int ilvl,
     string lvlText, XDocument styles, string languageCultureName, ListItemRetrieverSettings settings)
 {
     string[] formatTokens = GetFormatTokens(lvlText).ToArray();
     XElement lvl = lii.Lvl(ilvl);
     bool isLgl = lvl.Elements(W.isLgl).Any();
     string listItem = formatTokens.Select((t, l) =>
     {
         if (t.Substring(0, 1) != "%")
             return t;
         int indentationLevel;
         if (!Int32.TryParse(t.Substring(1), out indentationLevel))
             return t;
         indentationLevel -= 1;
         if (indentationLevel >= levelNumbers.Length)
             indentationLevel = levelNumbers.Length - 1;
         int levelNumber = levelNumbers[indentationLevel];
         string levelText = null;
         XElement rlvl = lii.Lvl(indentationLevel);
         string numFmtForLevel = (string)rlvl.Elements(W.numFmt).Attributes(W.val).FirstOrDefault();
         if (numFmtForLevel == null)
         {
             var numFmtElement = rlvl.Elements(MC.AlternateContent).Elements(MC.Choice).Elements(W.numFmt).FirstOrDefault();
             if (numFmtElement != null && (string)numFmtElement.Attribute(W.val) == "custom")
                 numFmtForLevel = (string)numFmtElement.Attribute(W.format);
         }
         if (numFmtForLevel != "none")
         {
             if (isLgl && numFmtForLevel != "decimalZero")
                 numFmtForLevel = "decimal";
         }
         if (languageCultureName != null && settings != null)
         {
             if (settings.ListItemTextImplementations.ContainsKey(languageCultureName))
             {
                 var impl = settings.ListItemTextImplementations[languageCultureName];
                 levelText = impl(languageCultureName, levelNumber, numFmtForLevel);
             }
         }
         if (levelText == null)
             levelText = ListItemTextGetter_Default.GetListItemText(languageCultureName, levelNumber, numFmtForLevel);
         return levelText;
     }).StringConcatenate();
     return listItem;
 }