public async Task ParseAsync(StringBuilder contentBuilder, string filePath, bool isDynamic) { var context = new PluginParseContext(this); var startParsesAsync = _pluginManager.GetExtensions <IPluginCreateStartAsync>(); if (startParsesAsync != null) { foreach (var extension in startParsesAsync) { try { await extension.ParseAsync(context); } catch (Exception ex) { await AddStlErrorLogAsync(nameof(IPluginCreateStartAsync), string.Empty, ex); } } } var startParses = _pluginManager.GetExtensions <IPluginCreateStart>(); if (startParses != null) { foreach (var extension in startParses) { try { extension.Parse(context); } catch (Exception ex) { await AddStlErrorLogAsync(nameof(IPluginCreateStartAsync), string.Empty, ex); } } } if (contentBuilder.Length > 0) { await ParseTemplateContentAsync(contentBuilder); } var endParsesAsync = _pluginManager.GetExtensions <IPluginCreateEndAsync>(); if (endParsesAsync != null) { foreach (var extension in endParsesAsync) { try { await extension.ParseAsync(context); } catch (Exception ex) { await AddStlErrorLogAsync(nameof(IPluginCreateEndAsync), string.Empty, ex); } } } var endParses = _pluginManager.GetExtensions <IPluginCreateEnd>(); if (endParses != null) { foreach (var extension in endParses) { try { extension.Parse(context); } catch (Exception ex) { await AddStlErrorLogAsync(nameof(IPluginCreateEnd), string.Empty, ex); } } } if (FileUtils.IsHtml(PathUtils.GetExtension(filePath))) { if (isDynamic) { var pageUrl = PageUtils.AddProtocolToUrl( PathManager.ParseUrl( $"~/{PathUtils.GetPathDifference(SettingsManager.WebRootPath, filePath)}")); string templateString = $@" <base href=""{pageUrl}"" />"; StringUtils.InsertAfter(new[] { "<head>", "<HEAD>" }, contentBuilder, templateString); } if (PageInfo.Site.IsCreateBrowserNoCache) { const string templateString = @" <META HTTP-EQUIV=""Pragma"" CONTENT=""no-cache""> <META HTTP-EQUIV=""Expires"" CONTENT=""-1"">"; StringUtils.InsertAfter(new[] { "<head>", "<HEAD>" }, contentBuilder, templateString); } if (PageInfo.Site.IsCreateIe8Compatible) { const string templateString = @" <META HTTP-EQUIV=""x-ua-compatible"" CONTENT=""ie=7"" />"; StringUtils.InsertAfter(new[] { "<head>", "<HEAD>" }, contentBuilder, templateString); } if (PageInfo.Site.IsCreateJsIgnoreError) { const string templateString = @" <script type=""text/javascript"">window.onerror=function(){return true;}</script>"; StringUtils.InsertAfter(new[] { "<head>", "<HEAD>" }, contentBuilder, templateString); } var isShowPageInfo = PageInfo.Site.IsCreateShowPageInfo; if (!PageInfo.IsLocal) { if (PageInfo.Site.IsCreateDoubleClick) { var fileTemplateId = 0; if (PageInfo.Template.TemplateType == TemplateType.FileTemplate) { fileTemplateId = PageInfo.Template.Id; } var ajaxUrl = PathManager.GetTriggerApiUrl(PageInfo.SiteId, ContextInfo.ChannelId, ContextInfo.ContentId, fileTemplateId, true); if (!PageInfo.FootCodes.ContainsKey("CreateDoubleClick")) { PageInfo.FootCodes.Add("CreateDoubleClick", $@" <script type=""text/javascript"" language=""javascript"">document.ondblclick=function(x){{location.href = '{ajaxUrl}&returnUrl=' + encodeURIComponent(location.search);}}</script>"); } } } else { isShowPageInfo = true; } if (isShowPageInfo) { contentBuilder.Append($@" <!-- {PageInfo.Template.RelatedFileName}({PageInfo.Template.TemplateType.GetDisplayName()}) -->"); } var headCodesHtml = PageInfo.HeadCodesHtml; if (!string.IsNullOrEmpty(headCodesHtml)) { if (contentBuilder.ToString().IndexOf("</head>", StringComparison.Ordinal) != -1 || contentBuilder.ToString().IndexOf("</HEAD>", StringComparison.Ordinal) != -1) { StringUtils.InsertBefore(new[] { "</head>", "</HEAD>" }, contentBuilder, headCodesHtml); } else { contentBuilder.Insert(0, headCodesHtml); } } var bodyCodesHtml = PageInfo.BodyCodesHtml; if (!string.IsNullOrEmpty(bodyCodesHtml)) { if (contentBuilder.ToString().IndexOf("<body", StringComparison.Ordinal) != -1 || contentBuilder.ToString().IndexOf("<BODY", StringComparison.Ordinal) != -1) { var index = contentBuilder.ToString().IndexOf("<body", StringComparison.Ordinal); if (index == -1) { index = contentBuilder.ToString().IndexOf("<BODY", StringComparison.Ordinal); } index = contentBuilder.ToString().IndexOf(">", index, StringComparison.Ordinal); contentBuilder.Insert(index + 1, Constants.ReturnAndNewline + bodyCodesHtml + Constants.ReturnAndNewline); } else { contentBuilder.Insert(0, bodyCodesHtml); } } var footCodesHtml = PageInfo.FootCodesHtml; if (!string.IsNullOrEmpty(footCodesHtml)) { contentBuilder.Append(footCodesHtml + Constants.ReturnAndNewline); } } }
internal static string ParseStlElement(string stlElement, PageInfo pageInfo, ContextInfo contextInfo) { string parsedContent = null; var stlElementInfo = StlParserUtility.ParseStlElement(stlElement); if (stlElementInfo != null) { var elementName = stlElementInfo.Name; if (ElementsToTranslateDic.ContainsKey(elementName)) { Func <string, string> func; if (ElementsToTranslateDic.TryGetValue(elementName, out func)) { parsedContent = func(stlElement); } } else if (ElementsToParseDic.ContainsKey(elementName)) { if (stlElementInfo.IsDynamic) { parsedContent = StlDynamic.ParseDynamicElement(stlElement, pageInfo, contextInfo); } else { try { Func <PageInfo, ContextInfo, object> func; if (ElementsToParseDic.TryGetValue(elementName, out func)) { var contextInfoClone = contextInfo.Clone(stlElement, stlElementInfo.InnerHtml, stlElementInfo.Attributes); var obj = func(pageInfo, contextInfoClone); if (obj == null) { parsedContent = string.Empty; } else if (obj is string) { parsedContent = (string)obj; } else { parsedContent = TranslateUtils.JsonSerialize(obj); } } } catch (Exception ex) { parsedContent = StlParserUtility.GetStlErrorMessage(elementName, stlElement, ex); } } } else { var parsers = PluginStlParserContentManager.GetParses(); if (parsers.ContainsKey(elementName)) { if (stlElementInfo.IsDynamic) { parsedContent = StlDynamic.ParseDynamicElement(stlElement, pageInfo, contextInfo); } else { try { Func <PluginParseContext, string> func; if (parsers.TryGetValue(elementName, out func)) { var context = new PluginParseContext(stlElementInfo.OuterHtml, stlElementInfo.InnerHtml, stlElementInfo.Attributes, pageInfo, contextInfo); parsedContent = func(context); } } catch (Exception ex) { parsedContent = StlParserUtility.GetStlErrorMessage(elementName, stlElement, ex); } } } } } return(parsedContent ?? stlElement); }
internal static string ParseStlElement(string stlElement, PageInfo pageInfo, ContextInfo contextInfo) { string parsedContent = null; //var parsedContent = StlCacheManager.ParsedContent.GetParsedContent(stlElement, pageInfo, contextInfo); //if (parsedContent != null) return parsedContent; var xmlDocument = StlParserUtility.GetXmlDocument(stlElement, contextInfo.IsInnerElement); XmlNode node = xmlDocument.DocumentElement; if (node != null) { node = node.FirstChild; if (node?.Name != null) { var elementName = node.Name.ToLower(); if (ElementsToTranslateDic.ContainsKey(elementName)) { Func <string, string> func; if (ElementsToTranslateDic.TryGetValue(elementName, out func)) { parsedContent = func(stlElement); } } else if (ElementsToParseDic.ContainsKey(elementName)) { var isDynamic = false; var attributes = new Dictionary <string, string>(); var innerXml = StringUtils.Trim(node.InnerXml); var childNodes = node.ChildNodes; var ie = node.Attributes?.GetEnumerator(); if (ie != null) { while (ie.MoveNext()) { var attr = (XmlAttribute)ie.Current; if (StringUtils.EqualsIgnoreCase(attr.Name, "isDynamic")) { isDynamic = TranslateUtils.ToBool(attr.Value, false); } else { var key = attr.Name; if (!string.IsNullOrEmpty(key)) { var value = attr.Value; if (string.IsNullOrEmpty(StringUtils.Trim(value))) { value = string.Empty; } attributes[key] = value; } } } } if (isDynamic) { parsedContent = StlDynamic.ParseDynamicElement(stlElement, pageInfo, contextInfo); } else { try { Func <PageInfo, ContextInfo, string> func; if (ElementsToParseDic.TryGetValue(elementName, out func)) { parsedContent = func(pageInfo, contextInfo.Clone(stlElement, attributes, innerXml, childNodes)); } } catch (Exception ex) { parsedContent = StlParserUtility.GetStlErrorMessage(elementName, stlElement, ex); } } } else { var parsers = PluginStlParserContentManager.GetParses(); if (parsers.ContainsKey(elementName)) { var isDynamic = false; var attributes = new Dictionary <string, string>(); var innerXml = StringUtils.Trim(node.InnerXml); var ie = node.Attributes?.GetEnumerator(); if (ie != null) { while (ie.MoveNext()) { var attr = (XmlAttribute)ie.Current; if (StringUtils.EqualsIgnoreCase(attr.Name, "isDynamic")) { isDynamic = TranslateUtils.ToBool(attr.Value, false); } else { var key = attr.Name; if (!string.IsNullOrEmpty(key)) { var value = attr.Value; if (string.IsNullOrEmpty(StringUtils.Trim(value))) { value = string.Empty; } attributes[key] = value; } } } } if (isDynamic) { parsedContent = StlDynamic.ParseDynamicElement(stlElement, pageInfo, contextInfo); } else { try { Func <PluginParseContext, string> func; if (parsers.TryGetValue(elementName, out func)) { var context = new PluginParseContext(attributes, innerXml, pageInfo, contextInfo); parsedContent = func(context); } } catch (Exception ex) { parsedContent = StlParserUtility.GetStlErrorMessage(elementName, stlElement, ex); } } } } } } if (parsedContent == null) { parsedContent = stlElement; } else { parsedContent = contextInfo.IsInnerElement ? parsedContent : StlParserUtility.GetBackHtml(parsedContent, pageInfo); } //StlCacheManager.ParsedContent.SetParsedContent(stlElement, pageInfo, contextInfo, parsedContent); return(parsedContent); }