private bool InterpolateDataToElement(XElement source, IScope datasource, out XElement result) { result = source; if (UseExtensions) { if (!MatchCondition(source, datasource, "if")) { return(false); } #if !EMBEDQPT XmlIncludeProvider = XmlIncludeProvider ?? new XmlIncludeProvider(); #endif var globalreplace = source.Attr("xi-replace"); if (!string.IsNullOrWhiteSpace(globalreplace)) { _stringInterpolation.Interpolate(globalreplace); var xml = XmlIncludeProvider.GetXml(globalreplace, source, datasource); if (null == xml) { xml = XElement.Parse("<span class='no-ex replace'>no replace " + globalreplace + "</span>"); } result = xml; if (null != source.Parent) { source.ReplaceWith(xml); } source = xml; } if (source.Attr("xi-repeat").ToBool()) { XElement[] replace = ProcessRepeat(source, datasource); if (null == replace) { source.Remove(); } else { // ReSharper disable once CoVariantArrayConversion source.ReplaceWith(replace); } return(false); } var include = source.Attr("xi-include"); if (!string.IsNullOrWhiteSpace(include)) { _stringInterpolation.Interpolate(include); var xml = XmlIncludeProvider.GetXml(include, source, datasource); if (null == xml) { xml = XElement.Parse("<span class='no-ex include'>no replace " + include + "</span>"); } source.ReplaceAll(xml); } } var processchild = true; if (!string.IsNullOrWhiteSpace(StopAttribute)) { var stopper = source.Attribute(StopAttribute); if (null != stopper) { if (stopper.Value != "0") { if (stopper.Value == "all") { return(false); } processchild = false; } } } if (CodeOnly) { foreach (var a in source.Attributes()) { if (a.Name.LocalName == "code" || a.Name.LocalName == "id") { var val = a.Value; if (val.Contains(_stringInterpolation.AncorSymbol) && val.Contains(_stringInterpolation.StartSymbol)) { val = _stringInterpolation.Interpolate(val, datasource, SecondSource); a.Value = val; datasource.Set(a.Name.LocalName, val); } } } } else { var changed = true; while (changed) { changed = false; foreach (var a in source.Attributes().OrderBy(_ => { if (_.Value.Contains(AncorSymbol + "{") && _.Value.Contains("(")) { return(1000); } return(0); })) { var val = a.Value; if (val.Contains(_stringInterpolation.AncorSymbol) && val.Contains(_stringInterpolation.StartSymbol)) { val = _stringInterpolation.Interpolate(val, datasource, SecondSource); changed = changed || (val != a.Value); a.Value = val; datasource.Set(a.Name.LocalName, val); } } } changed = true; while (changed) { changed = false; foreach (var t in source.Nodes().OfType <XText>()) { var val = t.Value; if (val.Contains(_stringInterpolation.AncorSymbol) && val.Contains(_stringInterpolation.StartSymbol)) { val = _stringInterpolation.Interpolate(val, datasource, SecondSource); changed = changed || val != t.Value; t.Value = val; } } } } return(processchild); }
private bool InterpolateDataToElement(XElement source, IScope datasource, out XElement result) { result = source; if (UseExtensions) { if (!MatchCondition(source, datasource, "if")) { return false; } #if !EMBEDQPT XmlIncludeProvider = XmlIncludeProvider ?? new XmlIncludeProvider(); #endif var globalreplace = source.Attr("xi-replace"); if (!string.IsNullOrWhiteSpace(globalreplace)) { _stringInterpolation.Interpolate(globalreplace); var xml = XmlIncludeProvider.GetXml(globalreplace, source, datasource); if (null == xml) { xml = XElement.Parse("<span class='no-ex replace'>no replace " + globalreplace + "</span>"); } result = xml; if (null != source.Parent) { source.ReplaceWith(xml); } source = xml; } if (source.Attr("xi-repeat").ToBool()) { XElement[] replace = ProcessRepeat(source, datasource); if (null == replace) { source.Remove(); } else { // ReSharper disable once CoVariantArrayConversion source.ReplaceWith(replace); } return false; } var include = source.Attr("xi-include"); if (!string.IsNullOrWhiteSpace(include)) { _stringInterpolation.Interpolate(include); var xml = XmlIncludeProvider.GetXml(include, source, datasource); if (null == xml) { xml = XElement.Parse("<span class='no-ex include'>no replace " + include + "</span>"); } source.ReplaceAll(xml); } } var processchild = true; if (!string.IsNullOrWhiteSpace(StopAttribute)) { var stopper = source.Attribute(StopAttribute); if (null != stopper) { if (stopper.Value != "0") { if (stopper.Value == "all") { return false; } processchild = false; } } } if (CodeOnly) { foreach (var a in source.Attributes()) { if (a.Name.LocalName == "code" || a.Name.LocalName == "id") { var val = a.Value; if (val.Contains(_stringInterpolation.AncorSymbol) && val.Contains(_stringInterpolation.StartSymbol)) { val = _stringInterpolation.Interpolate(val, datasource, SecondSource); a.Value = val; datasource.Set(a.Name.LocalName, val); } } } } else { var changed = true; while (changed) { changed = false; foreach (var a in source.Attributes().OrderBy(_ => { if (_.Value.Contains(AncorSymbol+"{") && _.Value.Contains("(")) { return 1000; } return 0; })) { var val = a.Value; if (val.Contains(_stringInterpolation.AncorSymbol) && val.Contains(_stringInterpolation.StartSymbol)) { val = _stringInterpolation.Interpolate(val, datasource, SecondSource); changed = changed || (val != a.Value); a.Value = val; datasource.Set(a.Name.LocalName, val); } } } changed = true; while (changed) { changed = false; foreach (var t in source.Nodes().OfType<XText>()) { var val = t.Value; if (val.Contains(_stringInterpolation.AncorSymbol) && val.Contains(_stringInterpolation.StartSymbol)) { val = _stringInterpolation.Interpolate(val, datasource, SecondSource); changed = changed || val != t.Value; t.Value = val; } } } } return processchild; }