<%@ Page Language="C#" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Collections.Generic" %>
<script runat="server">
private List<string> jsQueue = new List<string>();
private Dictionary<string, string> jsPool = new Dictionary<string, string>();
private string JS_SET_PREFIX = "JSS_";
void Page_Load(object sender, EventArgs e)
{
string[] f = (Request["f"] ?? "")
.Split(new char[] {',',';'}, StringSplitOptions.RemoveEmptyEntries);
foreach (string jsFile in f)
queueJs(jsFile);
Response.ContentType = "text/javascript";
foreach (string js in jsQueue)
Response.Write(jsPool[js]);
Response.End();
}
private void queueJs(string jsFile)
{
string[] p = jsFile.Split(new char[] {',',';'},
StringSplitOptions.RemoveEmptyEntries);
//if multi-part
if (p.Length > 1)
{
foreach (string f in p)
queueJs(f);
return;
}
//lower case
jsFile = jsFile.ToLower();
//js set name without .js
if (jsFile.EndsWith(".js"))
{
//if already queued
if (jsPool.ContainsKey(jsFile)) return;
//else put the js into queue
jsQueue.Add(jsFile);
jsPool.Add(jsFile, getJsContent(jsFile));
}
else //if set, try to find it from web.config
{
string jsFiles =
System.Configuration.ConfigurationManager.AppSettings[
JS_SET_PREFIX + jsFile];
if (string.IsNullOrEmpty(jsFiles))
{
jsQueue.Add(jsFile);
jsPool.Add(jsFile,
string.Format("alert('JsLoader Error: [{0}] set not configured!');",
EscapeStringForJS(jsFile)));
}
else //process the predefined file list
queueJs(jsFiles);
}
}
//Get js file content
private string getJsContent(string jsFile)
{
try
{
string file = Server.MapPath("./" + jsFile);
if (!File.Exists(file))
return string.Format("alert('JsLoader Error: [{0}] not found!');",
EscapeStringForJS(jsFile));
else //Add cache/packing module here if you want
return File.ReadAllText(file);
}
catch
{
throw new ApplicationException("Failed to process " + jsFile);
}
}
/// <summary>
/// Replace characters for Javscript string literals
/// </summary>
/// <param name="text">raw string</param>
/// <returns>escaped string</returns>
public static string EscapeStringForJS(string s)
{
return s.Replace(@"\", @"\\")
.Replace("\b", @"\b")
.Replace("\f", @"\f")
.Replace("\n", @"\n")
.Replace("\0", @"\0")
.Replace("\r", @"\r")
.Replace("\t", @"\t")
.Replace("\v", @"\v")
.Replace("'", @"\'")
.Replace(@"""", @"\""");
}
</script>