private void Replace(ControlReplacementExecutionData sdtElement) { foreach (var sdtElementControl in sdtElement.Controls.ToList()) { Replace(sdtElementControl, sdtElement.VariableSource); } }
/// <summary> /// Call this whenever you enqueue an replacement within another replacement, /// if the data is different, e.g. you use an inner dictionary of the original data as a main data source /// </summary> /// <param name="e"></param> protected virtual void OnInnerControlReplacementEnqueued(ControlReplacementExecutionData e) { InnerControlReplacementEnqueued?.Invoke(this, e); }
public void Enqueue(ControlReplacementExecutionData controlReplacementExecutionData) { executionQueue.Enqueue(controlReplacementExecutionData); }
protected override string ProcessControl(string variableIdentifier, IVariableSource variableSource, ContentControl original, List <string> otherParameters) { try { GetParameters(otherParameters, out var separator, out var lastSeparator); var dataItems = variableSource.GetVariable <IList>(variableIdentifier); if (dataItems == null || dataItems.Count == 0) { //No items found, remove the content original.Remove(); return(null); } //Copy the content control as many times as we have items for (var i = 0; i < dataItems.Count; i++) { var dataItem = dataItems[i]; var clone = original.Clone(); switch (dataItem) { case string _: case int _: case float _: case double _: case decimal _: SetTextAndRemovePlaceholderFormat(clone.SdtElement, dataItem.ToString()); break; case Dictionary <string, object> dictItem: { if (dictItem.ContainsKey("index") == false) { dictItem.Add("index", i + 1); } //Since we are creating new elements, we should add them to the queue with both this and the inner data var innerSource = new VariableSource(dictItem); var exInner = new ControlReplacementExecutionData(clone.DescendingControls, innerSource); var ex = new ControlReplacementExecutionData(clone.DescendingControls, variableSource); Enqueue(exInner); OnInnerControlReplacementEnqueued(ex); OnInnerControlReplacementEnqueued(exInner); //Support old styled documents var innerRep1 = new InnerRepeatingVariableControlReplacer(); var innerRep2 = new InnerRepeatingConditionalRemoveControlReplacer(); innerRep1.ReplaceAll(ex.Controls, ex.VariableSource); innerRep2.ReplaceAll(ex.Controls, ex.VariableSource); break; } } var lasttext = clone.SdtElement.Descendants <Text>().LastOrDefault(); if (lasttext != null) { if (i < dataItems.Count - 2) { lasttext.InsertAfterSelf(new Text(separator) { Space = SpaceProcessingModeValues.Preserve }); } else if (i < dataItems.Count - 1) { lasttext.InsertAfterSelf(new Text(lastSeparator) { Space = SpaceProcessingModeValues.Preserve }); } } } //Delete the original original.Remove(); return(null); } catch (VariableNotFoundException) { return(null); } }