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); } }
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 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 }
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); }