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.
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.
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.