public void Process(HtmlAgilityPack.HtmlDocument document, HtmlStaticizeContext context)
{
Uri documentUri = context.Uri;
String baseUrl = documentUri.GetParent();// GetParent(documentUri);
var htmlNode = document.DocumentNode;
var nodes = htmlNode.SelectNodes(resourcesNodeSelectPath);
if (nodes == null || nodes.Count == 0)
{
return;
}
var srcAttributes = GetSrcAttributes(nodes);
if (srcAttributes == null || srcAttributes.Count() == 0)
{
return;
}
var parsedSrcUris = ParseResourcesUris(documentUri, baseUrl, srcAttributes);
if (parsedSrcUris == null || parsedSrcUris.Length == 0)
{
return;
}
OnResourceParsed(parsedSrcUris, context);
for (int i = 0; i < parsedSrcUris.Length; i++)
{
var uri = parsedSrcUris[i];
String localPath = fileReslover.ResloveLocalPath(uri);
if (String.IsNullOrEmpty(localPath))
{
continue;
}
var localDirectory = System.IO.Path.Combine(outputDirectory, System.IO.Path.GetDirectoryName(localPath));
if (!directories.ContainsKey(localDirectory) && !System.IO.Directory.Exists(localDirectory))
{
System.IO.Directory.CreateDirectory(localDirectory);
//并发 patch
try
{
directories.Add(localDirectory, null);
}
catch (Exception)
{
}
}
String saveFile = System.IO.Path.Combine(outputDirectory, localPath);
//并发 patch
try
{
//已存在相同文件,则跳过。为避免并发写同一个文件。
if (files.ContainsKey(saveFile))
{
continue;
}
files.Add(saveFile, null);
}
catch (Exception)
{
}
if (System.IO.File.Exists(saveFile))
{
continue;
}
if (this.fileReslover.TryCopyFromLocal(uri, saveFile))
{
continue;
}
using (System.Net.WebClient wc = new System.Net.WebClient())
{
try
{
wc.DownloadFile(uri, saveFile);
}
catch (Exception ex)
{
//修复WebClient 文件不存在仍然本地保存了一个空文件
System.IO.File.Delete(saveFile);
context.Errors.Add(new ResourcesDownloadException(String.Format(@"下载资源 ""{0}"" 时发生异常。", uri.ToString()), ex)
{
Url = uri,
});
continue;
}
}
}
}