asp.net's cms core code article

  • 2020-05-19 04:36:53
  • OfStack

In article 1, I briefly described what my cms tag means. Part 1 of anCMS(c#) binds data

In article 2, I'll show you the code that actually works behind the tag. asp. cms principles of net

As if open source is a bit redundant, the core code is as follows.

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace an.helper 
{ 
/// <summary> 
///  To find the html Page can be converted to aspx Page method   Is the regular expression of  
/// </summary> 
public class HtmlToAspxMethod 
{ 
private static T_Validate tv=new T_Validate(); 
public static string ConvertMethodNameHtmlToAspx(string methodName) 
{ 
string str=""; 
switch(methodName) 
{ 
case "list ": str = "TextFile"; break; // The document  
case "listpager ": str = "TextFilePager"; break; // Document pages  
case "alist ": str = "Article"; break;// The article lists  
case "alistpager ": str = "ArticlePager"; break;// The article page  
case "plist ": str = "Products"; break;// Product list  
case "plistpager ": str = "ProductsPager"; break;// The product page  
case "olist ": str = "One"; break;// Single page list  
case "olistpager ": str = "OnePager"; break;// Single page paging  
case "clist ": str = "Category"; break; // Classification list  
case "clistpager ": str = "CategoryPager"; break; // Classification list  
case "llist ": str = "Link"; break;// Connection list  
case "llistpager ": str = "LinkPager"; break;// Connect the paging  
case "ilist ": str = "Images"; break;// Photo gallery list  
case "ilistpager ": str = "ImagesPager"; break;// Photo sets are paged  
default: break; 
} 
return str; 
} 
public static string MethodListName = "list |listpager |alist |alistpager |plist |plistpager |olist |olistpager |clist |clistpager |llist |llistpager |ilist |ilistpager "; 
public static string MethodFiledName = "filed|num|category|keyword|sort|page|id"; 
/// <summary> 
///  Entry to all methods , The first 1 The method is traversed at the next run time.  
/// </summary> 
public static string AllMethodContentRegex = "<!--{an:(" + MethodListName + ").*?}-->[\\s\\S]*?<!--{/an}-->"; 
public static List<string> AllMethodContent(string content) 
{ 
return Method.RegexStr(AllMethodContentRegex, content); 
} 
/// <summary> 
///  Get all the methods  
/// </summary> 
public static string AllMethodRegex = "<!--{an:(" + MethodListName + ")[^}]*}-->"; 
public static List<string> AllMethod(string content) 
{ 
return Method.RegexStr(AllMethodRegex, content); 
} 

/// <summary> 
///  Gets the function name of the method  
/// </summary> 
public static string MethodNameRegex = "<!--{an:(" + MethodListName + ")"; 
public static string MethodName(string content) 
{ 
string str = ""; 
var c=Method.RegexStr(MethodNameRegex, content); 
if (c.Count>0) 
{ 
str = c[0].ToString(); 
} 
return str.Replace("<!--{an:", ""); 
} 
/// <summary> 
///  Gets the fields and values of the method  
/// </summary> 
public static string MethodFiledRegex = "(" + MethodFiledName + ")=\\[[^]]+]"; 
public static Hashtable MethodFiled(string content) 
{ 
Hashtable ht = new Hashtable(); 
foreach (string s in Method.RegexStr(MethodFiledRegex, content)) 
{ 
string[] arr = s.Split('='); 
ht.Add(arr[0], arr[1].Replace("[", "").Replace("]", "")); 
} 
return ht; 
} 
public static string JsIncludeRegex = "<script.*rel=\"share\"[^>]*></script>"; 
public static string[] JsInclude(string html) 
{ 
string js = ""; 
List<string> list_include = Method.RegexStr(JsIncludeRegex, html); 
foreach (string inc in list_include) 
{ 
List<string> includeList = Method.RegexStr(@"\w+(?=\.js)", inc); 
if (includeList != null) 
{ 
js += includeList[0] + "(); "; 
html = html.Replace(inc, "<!--#include file=\"Share/" +includeList[0] + ".ascx\"--> "); 
} 
} 
return new string[] { js, html }; 
} 
/// <summary> 
///  A placeholder  
/// </summary> 
public static string ValueOneRegex = @"\${\d+}"; 
public static string ValueOne(string content) 
{ 
foreach (string s in Method.RegexStr(ValueOneRegex, content)) 
{ 
string num = s.Replace("${", "").Replace("}", ""); 
content = content.Replace(s, "<%=a[" + num + "]%>"); 
} 
return content; 
} 

public static string ValueOneToStringFormartRegex = @"\${\d+\|.*?}"; 
public static string ValueOneToStringFormat(string content) 
{ 
foreach (string s in Method.RegexStr(ValueOneToStringFormartRegex, content)) 
{ 
string str = s.Replace("${", "").Replace("}", ""); 
string[] arr = str.Split('|'); 
string num = arr[0].ToString(); 
string formart = arr[1].ToString(); 
content = content.Replace(s, "<%=TimeFormart(a[" + num + "],\"" + formart + "\")%>"); 
} 
return content; 
} 

public static string UrlRouteRegex = @"\$href\[\w+\]\[.*?\]"; 
public static string UrlRoute(string content) 
{ 
foreach (string s in Method.RegexStr(UrlRouteRegex, content)) 
{ 
//$href[index][{"aaa","bbb"},{"ccc","ddd"}] 
//<%=UrlRoute("",new string[,]{{"aaa","bbb"},{"ccc","ddd"}});%> 
string urlRoute = s.Replace("$href[", "<%=UrlRoute(\""). 
Replace("][", "\",new string[,]{ "). 
Replace("#0", "a[0].ToString()"). 
Replace("#1", "a[1].ToString()"). 
Replace("#2", "a[2].ToString()"). 
Replace("#3", "a[3].ToString()"). 
Replace("#4", "a[4].ToString()"). 
Replace("#5", "a[5].ToString()"). 
Replace("#6", "a[6].ToString()"). 
Replace("#7", "a[7].ToString()"). 
Replace("#8", "a[8].ToString()"). 
Replace("#9", "a[9].ToString()"); 
urlRoute = urlRoute.Substring(0,urlRoute.Length - 1); 
urlRoute = urlRoute + "})%>"; 
content = content.Replace(s, urlRoute); 
} 
return content; 
} 
public static string PagingRegex = @"\$pager\[\w+\]\[.*?\]\[\d+\]"; 
public static string Paging(string content) 
{ 
//$pager[list][Category=$category$][15] 
//<%=Paging("list",new{Category=$category$}, int showCounts, object totleCounts)%> 
foreach (string s in Method.RegexStr(PagingRegex, content)) 
{ 
int numSite=s.LastIndexOf('['); 
string pager = s.Substring(0, numSite); 
string num = s.Substring(numSite).Replace("[", "").Replace("]", ""); 

pager = pager.Replace("$pager[", "<%=Paging(\""). 
Replace("][", "\",new string[,]{"); 
pager = pager.Substring(0, pager.Length - 1) + "}," + num + ",a[0])%>"; 
content = content.Replace(s, pager); 
} 
return content; 
} 


public static string LinkHrefRegex = "(?<=<link.*href=\")[^\"]*"; 
public static string ScriptSrcRegex = "(?<=<script.*src=\")[^\"]*"; 
public static string ImgSrcRegex = "<img.*rel=\"share\"[^>]*/>"; 
public static string TemplatePath = "<%=An_DoMain%>/Templates/"; 

public static string HrefHtml(string html) 
{ 
List<string> list_link = Method.RegexStr(LinkHrefRegex, html); 
foreach (string link in list_link.Distinct()) 
{ 
html = html.Replace(link, TemplatePath + link); 
} 
List<string> list_script = Method.RegexStr(ScriptSrcRegex, html); 
foreach (string script in list_script.Distinct()) 
{ 
html = html.Replace(script, TemplatePath + script); 
} 
List<string> list_img = Method.RegexStr(ImgSrcRegex, html); 
foreach (string img in list_img.Distinct()) 
{ 
html = html.Replace(img, img.Replace("src=\"", "src=\"" + TemplatePath)); 
} 
return html; 
} 


//public static string ForRegex = "<!--{for}-->[\\s\\S]*?<!--{/for}-->"; 
//public static string For(string arr, string content) 
//{ 
// foreach (string s in Method.RegexStr(ForRegex, content)) 
// { 
// string str = ""; 
// str = "<%if(1==1){var arr=" + arr + ";foreach(var s in arr){%>"; 
// str = str + s.Replace("<!--{for}-->", "").Replace("<!--{/for}-->", "") + "<%}}%>"; 
// content=content.Replace(s,str); 
// } 
// return content; 
//} 

public static string FnSplitContentRegex = @"\$split\[.*?\]\[.*?\]"; 
public static string FnSplitRegex = @"<!--{split}-->[\s\S]*?<!--{/split}-->"; 
public static string FnSplit(string content) 
{ 
foreach (string s in Method.RegexStr(FnSplitRegex, content)) 
{ 
var list_split = Method.RegexStr(FnSplitContentRegex, content); 
string splitMethod = ""; 
if (list_split != null) 
{ 
splitMethod = list_split[0].ToString(); 
} 
if (splitMethod != "") 
{ 
string source = "", separator = ""; 
var list_split_value = splitMethod.Split(']'); 
if (list_split_value.Length > 0) 
{ 
source = list_split_value[0].Replace("$split[", ""); 
separator = list_split_value[1].Replace("[", ""); 
if (source != "") 
{ 
string str = ""; 
if (tv.IsInteger(source) == "") 
{ 
str = "<%if(1==1){var arr=a[" + source + "];foreach(var s in arr.Split('"+separator+"')){%>"; 
} 
else 
{ 
str = "<%if(1==1){var arr=\"" + source + "\";foreach(var s in arr.Split('" + separator + "')){%>"; 
} 
str += s.Replace(splitMethod, "<%=s%>").Replace("<!--{split}-->", "").Replace("<!--{/split}-->", ""); 
str += "<%}}%>"; 
content = content.Replace(s, str); 
} 
} 

} 
} 
return content; 
} 





/// <summary> 
///  will html Method conversion to aspx The method of  
/// </summary> 
/// <param name="methodName"></param> 
/// <param name="content"></param> 
/// <returns></returns> 
public static AspxFiled HtmlFiledToAspxFiled(string methodName, string content) 
{ 
AspxFiled af = new AspxFiled(); 
Hashtable ht = MethodFiled(content); 
foreach (DictionaryEntry h in ht) 
{ 
if (h.Key.ToString() == "filed") 
{ 
af.Filed = h.Value.ToString(); 
} 
if (h.Key.ToString() == "num") 
{ 
if (tv.IsInteger(h.Value.ToString()) == "") 
{ 
af.ShowCounts = Convert.ToInt32(h.Value.ToString()); 
if (af.ShowCounts < 0) 
{ 
af.ShowCounts = 1; 
} 
} 
else 
{ 
af.ShowCounts = 10; 
} 
} 
if (h.Key.ToString() == "sort") 
{ 
af.Sort = h.Value.ToString(); 
} 
if (h.Key.ToString() == "page") 
{ 
if (h.Value.ToString() == "true") 
{ 
af.Current = "An_Current"; 
} 
else 
{ 
af.Current = "1"; 
} 
} 
if (h.Key.ToString() == "category") 
{ 
af.CategoryID = h.Value.ToString(); 
} 
if (h.Key.ToString() == "keyword") 
{ 
af.Keyword = h.Value.ToString(); 
} 
if (h.Key.ToString() == "id") 
{ 
af.ID = h.Value.ToString(); 
} 
} 
return af; 
} 

public static string AspxMethodDataSet(string methodName,string content,string datatableName) 
{ 
AspxFiled af = HtmlFiledToAspxFiled(methodName, content); 
string str = ""; 
if (methodName.Contains("pager")) 
{ 
if (methodName == "clistpager ") 
{ 
str = "MyHashtable.Add(\"" + datatableName + "\", " + ConvertMethodNameHtmlToAspx(methodName) + "(\"" + af.CategoryID + "\"));"; 
} 
else 
{ 
str = "MyHashtable.Add(\"" + datatableName + "\", " + ConvertMethodNameHtmlToAspx(methodName) + "(\"" + af.ID + "\",\"" + af.CategoryID + "\",\"" + af.Keyword + "\"));"; 
} 
} 
else 
{ 
if (methodName == "clist ") 
{ 
str = "MyHashtable.Add(\"" + datatableName + "\", " + ConvertMethodNameHtmlToAspx(methodName) + "(\"" + af.Filed + "\", " + af.Current + ", " + af.ShowCounts + ", \"" + af.Sort + "\", \"" + af.CategoryID + "\"));"; 
} 
else 
{ 
str = "MyHashtable.Add(\"" + datatableName + "\", " + ConvertMethodNameHtmlToAspx(methodName) + "(\"" + af.Filed + "\", " + af.Current + ", " + af.ShowCounts + ", \"" + af.Sort + "\", \"" + af.ID + "\", \"" + af.CategoryID + "\", \"" + af.Keyword + "\"));"; 
} 
} 
return str; 
} 
public static string AspxMethodDataRow(string datatableName,string content) 
{ 
return "<%if(1==1){var myRows = MyRows(\"" + datatableName + "\"); if (myRows != null){foreach (var a in myRows){ %>" + content + "<%}}else{%><p style='margin:10px;'> No information available </p><%}}%>"; 
} 

public static string ServerFunction(string content) 
{ 
return "<script runat=\"server\">protected override void OnLoad(EventArgs e){" + content + "}</script>"; 
} 
public static string ServerFunction(string content, string fnName) 
{ 
return "<script runat=\"server\">public void " + fnName + "(){" + content + "}</script>"; 
} 

} 

public class AspxFiled 
{ 
private string _Filed; 
public string Filed 
{ 
get{ return _Filed; } 
set 
{ 
if (value.Contains("TextFile.ID,")) 
{ 
_Filed = value; 
} 
else 
{ 
_Filed = "TextFile.ID," + value; 
} 
} 
} 
private string _ID = ""; 
public string ID 
{ 
get { return _ID; } 
set { _ID = value; } 
} 
private string _CategoryID = ""; 
public string CategoryID 
{ 
get { return _CategoryID; } 
set { _CategoryID = value; } 
} 
private string _Keyword = ""; 
public string Keyword 
{ 
get { return _Keyword; } 
set { _Keyword = value; } 
} 

private string _Sort; 
public string Sort 
{ 
get { return _Sort; } 
set { _Sort = value; } 
} 
private int _ShowCounts = 0; 
public int ShowCounts 
{ 
get{return _ShowCounts;} 
set { _ShowCounts = value; } 
} 
private string _Current = "1"; 
public string Current 
{ 
get { return _Current; } 
set { _Current = value;} 
} 
} 
/// <summary> 
/// html and aspx Method name corresponding to substitution  
/// </summary> 
public class ConvertHtmlToAspx 
{ 
public string DataTableName(int num,string name) 
{ 
return Method.Md5(DateTime.Now.ToLongDateString() + new Random().Next(1000) + num + new Random().Next(1000) + name); 
} 
public string ToAspx(string html,string ascxName) 
{ 
html = AllToAspx(html); 
List<string> list_AllMethodContent = HtmlToAspxMethod.AllMethodContent(html); 
string load = ""; 
int i = 0; 
foreach (string allMethodContent in list_AllMethodContent) 
{ 
i++; 
string allMethod = HtmlToAspxMethod.AllMethod(allMethodContent)[0];//<!--{an:list}--> 
string methodName = HtmlToAspxMethod.MethodName(allMethod);// Method names <!--{an:list 
Hashtable methodFiled = HtmlToAspxMethod.MethodFiled(allMethod);//filed=[title] sort=[time desc] 
string content = allMethodContent.Replace(allMethod, "").Replace("<!--{/an}-->", ""); 
content = HtmlToAspxMethod.ValueOne(content); 
content = HtmlToAspxMethod.ValueOneToStringFormat(content); 
string dataTableName = DataTableName(i,ascxName); 
load += HtmlToAspxMethod.AspxMethodDataSet(methodName, allMethod, dataTableName); 
content = HtmlToAspxMethod.AspxMethodDataRow(dataTableName, content); 
html = html.Replace(allMethodContent, content); 
} 
if (ascxName == "") 
{ 
string[] js=HtmlToAspxMethod.JsInclude(html); 
html = js[1]; 
load += js[0]; 
load = HtmlToAspxMethod.ServerFunction(load); 
} 
else 
{ 
load = HtmlToAspxMethod.ServerFunction(load, ascxName); 
} 
html = HtmlToAspxMethod.HrefHtml(html);// Links to convert  
return load + html; 
} 
private string AllToAspx(string html) 
{ 
html = html.Replace("$categoryname", "<%=An_CategoryName%>"); 
//html = html.Replace("$title$", "<%=An_Title%>").// The page title  
// Replace("$keywords$", "<%=An_KeyWords%>").// Page keywords  
// Replace("$description$", "<%=An_Description%>").// Page description  
// Replace("$domain$", "<%=An_DoMain%>").// Website domain name  
// Replace("$categoryname$", "<%=An_CategoryName%>").// Category name  
// Replace("$contact$", "\"+An_Contact+\"").// Contact us  
// Replace("$id$", "An_ID").// The detail ID 
// Replace("$category$", "An_CategoryID").// classification ID 
// Replace("$tongji$", "<%=An_TongJi%>"). 
// Replace("$keyword$", "\"+An_KeyWord+\"");// Search keywords  
html = HtmlToAspxMethod.UrlRoute(html); 
html = HtmlToAspxMethod.Paging(html); 
html = HtmlToAspxMethod.FnSplit(html); 

return html; 
} 

} 
}

Hehe, can too shallow.

It is mainly through the above code that the html template is run by replacing it with aspx.

I'm going to perfect my CMS.

Related articles: