Compare commits

...

10 Commits

Author SHA1 Message Date
3044da0413 v2.14 2020-08-09 17:29:41 +02:00
7cb819d401 Update template
* Faster display after searching large amount of files
* Also show "searching..." indicator.
* Fix [..] position
2020-08-09 17:29:25 +02:00
b3476e455a Bugfix: UNC paths stopped working since 2.1 2020-08-09 13:31:17 +02:00
a68b36c02e version 2.13 2020-05-05 20:20:27 +02:00
87914ff327 Be more specific on StreamWriter and template encoding to avoid EncoderFallbackException 2020-05-05 18:16:38 +02:00
1726eb9301 version 2.12 2020-04-29 19:20:13 +02:00
8156351973 Rework how to read and execute command line to fix issues introduced in last version. Now command line is completely separate from GUI. 2020-04-29 19:05:29 +02:00
fa80b22ad0 Make parent folder [..] sticky 2020-04-29 19:02:28 +02:00
2ef355bb2d Add "onlyLinkExtensions" variable in template to allow customizing what files to link 2020-04-28 19:12:52 +02:00
a622e419a1 Get ful path from model on-the-fly to reduce memory consumsion 2020-04-28 19:12:04 +02:00
8 changed files with 459 additions and 302 deletions

View File

@ -15,6 +15,15 @@ namespace Snap2HTML
public bool openInBrowser { get; set; }
public bool linkFiles { get; set; }
public string linkRoot { get; set; }
public SnapSettings()
{
this.skipHiddenItems = true;
this.skipSystemItems = true;
this.openInBrowser = false;
this.linkFiles = false;
this.linkRoot = "";
}
}
@ -47,15 +56,34 @@ namespace Snap2HTML
this.Path = path;
this.Properties = new Dictionary<string, string>();
this.Files = new List<SnappedFile>();
this.FullPath = ( this.Path + "\\" + this.Name ).Replace( "\\\\", "\\" );
}
public string Name { get; set; }
public string Path { get; set; }
public string FullPath { get; set; }
public Dictionary<string, string> Properties { get; set; }
public List<SnappedFile> Files { get; set; }
public string GetFullPath()
{
string path;
if( this.Path.EndsWith( @"\" ) )
path = this.Path + this.Name;
else
path = this.Path + @"\" + this.Name;
if( path.EndsWith( @"\" ) ) // remove trailing backslash
{
if(!Utils.IsWildcardMatch( @"?:\", path, false )) // except for drive letters
{
path = path.Remove( path.Length - 1 );
}
}
return path;
}
public string GetProp( string key )
{
if( this.Properties.ContainsKey( key ) )

View File

@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion( "2.11.0.0" )]
[assembly: AssemblyFileVersion( "2.11.0.0" )]
[assembly: AssemblyVersion( "2.14.0.0" )]
[assembly: AssemblyFileVersion( "2.14.0.0" )]

View File

@ -99,9 +99,9 @@
Starts the program with the given root path already set
Full: Snap2HTMl.exe [-path:"root folder path"] [-outfile:"filename"]
Full: Snap2HTMl.exe -path:"root folder path" -outfile:"filename"
[-link:"link to path"] [-title:"page title"]
[-hidden] [-system]
[-hidden] [-system] [-silent]
-path:"root folder path" - The root path to load.
Example: -path:"c:\temp"
@ -113,23 +113,26 @@
-link:"link to path" - The path to link files to.
Example: -link:"c:\temp"
-title:"page title" - Set the page title
-title:"page title" - Set the page title. If omitted, title
is generated based on path.
-hidden - Include hidden items
-hidden - Include hidden items
-system - Include system items
-silent - Run without showing the window (only
if both -path and -outfile are used)
Notes: Using -path and -outfile will cause the program to automatically
start generating the snapshot, and quit when done!
Notes: When both -path and -outfile are specified, the program will
automatically start generating the snapshot, and quit when done.
Always surround paths and filenames with quotes ("")!
Do not include the [sqaure brackets] when you write your command
line. (Sqaure brackets signify optional command line parameters)
In silent mode, in case or error the program will just quit
without telling why.
Do not include the [square brackets] when you write your command
line. (Square brackets signify optional command line parameters)
--- Template Design ---------------------------------------------------------
@ -229,6 +232,20 @@
v2.11 (2020-04-18)
Fixed a threading issue that caused the program to hang on some systems
v2.12 (2020-04-29)
Reduced memory consumsion when generating HTML
Parent folder link [..] is now sticky
Reworked command line code to fix issues in 2.11
A few small tweaks too
v2.13 (2020-05-05)
Fixed an encoding issue causing EncoderFallbackException while saving
v2.14 (2020-08-09)
UNC paths work again (including linking)
Searches returning lots of items should be a bit faster now
And a few smaller fixes as usual
--- End User License Agreement -----------------------------------------------

View File

@ -54,6 +54,7 @@
this.pictureBox4 = new System.Windows.Forms.PictureBox();
this.label4 = new System.Windows.Forms.Label();
this.tabPage2 = new System.Windows.Forms.TabPage();
this.pictureBoxDonate = new System.Windows.Forms.PictureBox();
this.groupBoxMoreApps = new System.Windows.Forms.GroupBox();
this.label33 = new System.Windows.Forms.Label();
this.label32 = new System.Windows.Forms.Label();
@ -78,6 +79,7 @@
this.tabPage3.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).BeginInit();
this.tabPage2.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxDonate)).BeginInit();
this.groupBoxMoreApps.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit();
@ -354,6 +356,7 @@
//
// tabPage2
//
this.tabPage2.Controls.Add(this.pictureBoxDonate);
this.tabPage2.Controls.Add(this.groupBoxMoreApps);
this.tabPage2.Controls.Add(this.pictureBox1);
this.tabPage2.Controls.Add(this.linkLabel1);
@ -368,6 +371,18 @@
this.tabPage2.Text = "About";
this.tabPage2.UseVisualStyleBackColor = true;
//
// pictureBoxDonate
//
this.pictureBoxDonate.Cursor = System.Windows.Forms.Cursors.Hand;
this.pictureBoxDonate.Image = ((System.Drawing.Image)(resources.GetObject("pictureBoxDonate.Image")));
this.pictureBoxDonate.Location = new System.Drawing.Point(193, 132);
this.pictureBoxDonate.Name = "pictureBoxDonate";
this.pictureBoxDonate.Size = new System.Drawing.Size(74, 21);
this.pictureBoxDonate.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
this.pictureBoxDonate.TabIndex = 6;
this.pictureBoxDonate.TabStop = false;
this.pictureBoxDonate.Click += new System.EventHandler(this.pictureBoxDonate_Click);
//
// groupBoxMoreApps
//
this.groupBoxMoreApps.Controls.Add(this.label33);
@ -378,9 +393,9 @@
this.groupBoxMoreApps.Controls.Add(this.label11);
this.groupBoxMoreApps.Controls.Add(this.pictureBox3);
this.groupBoxMoreApps.Controls.Add(this.pictureBox2);
this.groupBoxMoreApps.Location = new System.Drawing.Point(6, 174);
this.groupBoxMoreApps.Location = new System.Drawing.Point(6, 176);
this.groupBoxMoreApps.Name = "groupBoxMoreApps";
this.groupBoxMoreApps.Size = new System.Drawing.Size(318, 130);
this.groupBoxMoreApps.Size = new System.Drawing.Size(318, 128);
this.groupBoxMoreApps.TabIndex = 5;
this.groupBoxMoreApps.TabStop = false;
this.groupBoxMoreApps.Text = "More utilities by me";
@ -389,7 +404,7 @@
//
this.label33.AutoSize = true;
this.label33.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label33.Location = new System.Drawing.Point(210, 29);
this.label33.Location = new System.Drawing.Point(209, 27);
this.label33.Name = "label33";
this.label33.Size = new System.Drawing.Size(91, 13);
this.label33.TabIndex = 13;
@ -399,18 +414,18 @@
//
this.label32.AutoSize = true;
this.label32.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label32.Location = new System.Drawing.Point(66, 29);
this.label32.Location = new System.Drawing.Point(58, 27);
this.label32.Name = "label32";
this.label32.Size = new System.Drawing.Size(66, 13);
this.label32.Size = new System.Drawing.Size(108, 13);
this.label32.TabIndex = 10;
this.label32.Text = "Snap2IMG";
this.label32.Text = "Exif Tag Remover";
//
// linkLabel3
//
this.linkLabel3.AutoSize = true;
this.linkLabel3.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline;
this.linkLabel3.LinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(192)))));
this.linkLabel3.Location = new System.Drawing.Point(66, 100);
this.linkLabel3.Location = new System.Drawing.Point(58, 100);
this.linkLabel3.Name = "linkLabel3";
this.linkLabel3.Size = new System.Drawing.Size(51, 13);
this.linkLabel3.TabIndex = 12;
@ -421,18 +436,18 @@
//
// label17
//
this.label17.Location = new System.Drawing.Point(66, 42);
this.label17.Location = new System.Drawing.Point(58, 40);
this.label17.Name = "label17";
this.label17.Size = new System.Drawing.Size(100, 74);
this.label17.Size = new System.Drawing.Size(108, 74);
this.label17.TabIndex = 11;
this.label17.Text = "Generate contact sheets (thumbnail index) for folders on your hard drive.";
this.label17.Text = "Delete all metadata before publishing images to protect your privacy.";
//
// linkLabel2
//
this.linkLabel2.AutoSize = true;
this.linkLabel2.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline;
this.linkLabel2.LinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(192)))));
this.linkLabel2.Location = new System.Drawing.Point(210, 100);
this.linkLabel2.Location = new System.Drawing.Point(209, 100);
this.linkLabel2.Name = "linkLabel2";
this.linkLabel2.Size = new System.Drawing.Size(51, 13);
this.linkLabel2.TabIndex = 10;
@ -443,16 +458,16 @@
//
// label11
//
this.label11.Location = new System.Drawing.Point(210, 42);
this.label11.Location = new System.Drawing.Point(209, 40);
this.label11.Name = "label11";
this.label11.Size = new System.Drawing.Size(102, 71);
this.label11.TabIndex = 9;
this.label11.Text = "File renaming utility with lots of time saving automation features.";
this.label11.Text = "Advanced file renaming utility that will save you lots of time.";
//
// pictureBox3
//
this.pictureBox3.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox3.Image")));
this.pictureBox3.Location = new System.Drawing.Point(169, 29);
this.pictureBox3.Location = new System.Drawing.Point(169, 27);
this.pictureBox3.Name = "pictureBox3";
this.pictureBox3.Size = new System.Drawing.Size(39, 48);
this.pictureBox3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
@ -462,9 +477,9 @@
// pictureBox2
//
this.pictureBox2.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox2.Image")));
this.pictureBox2.Location = new System.Drawing.Point(12, 29);
this.pictureBox2.Location = new System.Drawing.Point(10, 27);
this.pictureBox2.Name = "pictureBox2";
this.pictureBox2.Size = new System.Drawing.Size(48, 48);
this.pictureBox2.Size = new System.Drawing.Size(46, 39);
this.pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
this.pictureBox2.TabIndex = 0;
this.pictureBox2.TabStop = false;
@ -484,7 +499,7 @@
this.linkLabel1.AutoSize = true;
this.linkLabel1.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline;
this.linkLabel1.LinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(192)))));
this.linkLabel1.Location = new System.Drawing.Point(163, 104);
this.linkLabel1.Location = new System.Drawing.Point(163, 101);
this.linkLabel1.Name = "linkLabel1";
this.linkLabel1.Size = new System.Drawing.Size(120, 13);
this.linkLabel1.TabIndex = 3;
@ -495,7 +510,7 @@
// labelAboutSoftware
//
this.labelAboutSoftware.AutoSize = true;
this.labelAboutSoftware.Location = new System.Drawing.Point(163, 87);
this.labelAboutSoftware.Location = new System.Drawing.Point(163, 84);
this.labelAboutSoftware.Name = "labelAboutSoftware";
this.labelAboutSoftware.Size = new System.Drawing.Size(135, 13);
this.labelAboutSoftware.TabIndex = 2;
@ -564,6 +579,7 @@
((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).EndInit();
this.tabPage2.ResumeLayout(false);
this.tabPage2.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxDonate)).EndInit();
this.groupBoxMoreApps.ResumeLayout(false);
this.groupBoxMoreApps.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit();
@ -618,6 +634,7 @@
private System.Windows.Forms.Label label7;
private System.Windows.Forms.LinkLabel linkLabel5;
private System.Windows.Forms.Label label8;
private System.Windows.Forms.PictureBox pictureBoxDonate;
}
}

View File

@ -11,8 +11,8 @@ namespace Snap2HTML
{
public partial class frmMain : Form
{
private string outFile = ""; // set when automating via command line
private bool initDone = false;
private bool runningAutomated = false;
public frmMain()
{
@ -61,44 +61,68 @@ namespace Snap2HTML
{
// parse command line
var commandLine = Environment.CommandLine;
commandLine = commandLine.Replace( "-output:", "-outfile:" ); // correct wrong parameter to avoid confusion
var splitCommandLine = Arguments.SplitCommandLine(commandLine);
var arguments = new Arguments(splitCommandLine);
// first test for single argument (ie path only)
if (splitCommandLine.Length == 2 && !arguments.Exists("path"))
{
if (System.IO.Directory.Exists(splitCommandLine[1]))
{
if( splitCommandLine.Length == 2 && !arguments.Exists( "path" ) )
{
if( System.IO.Directory.Exists( splitCommandLine[1] ) )
{
SetRootPath( splitCommandLine[1] );
}
}
}
}
var autoRun = false;
if (arguments.IsTrue("hidden")) chkHidden.Checked = true;
if (arguments.IsTrue("system")) chkSystem.Checked = true;
if( arguments.Exists( "path" ) )
var settings = new SnapSettings();
if( arguments.Exists( "path" ) && arguments.Exists( "outfile" ) )
{
// note: relative paths not handled
string path = arguments.Single( "path" );
if( !System.IO.Directory.Exists( path ) ) path = Environment.CurrentDirectory + System.IO.Path.DirectorySeparatorChar + path;
this.runningAutomated = true;
if( System.IO.Directory.Exists( path ) )
{
SetRootPath( path );
settings.rootFolder = arguments.Single( "path" );
settings.outputFile = arguments.Single( "outfile" );
// First validate paths
if( !System.IO.Directory.Exists( settings.rootFolder ) )
{
if( !arguments.Exists( "silent" ) )
{
MessageBox.Show( "Input path does not exist: " + settings.rootFolder, "Automation Error", MessageBoxButtons.OK, MessageBoxIcon.Error );
}
Application.Exit();
}
if( !System.IO.Directory.Exists( System.IO.Path.GetDirectoryName(settings.outputFile) ) )
{
if( !arguments.Exists( "silent" ) )
{
MessageBox.Show( "Output path does not exist: " + System.IO.Path.GetDirectoryName( settings.outputFile ), "Automation Error", MessageBoxButtons.OK, MessageBoxIcon.Error );
}
Application.Exit();
}
// Rest of settings
settings.skipHiddenItems = !arguments.Exists( "hidden" );
settings.skipSystemItems = !arguments.Exists( "system" );
settings.openInBrowser = false;
settings.linkFiles = false;
if( arguments.Exists( "link" ) )
{
settings.linkFiles = true;
settings.linkRoot = arguments.Single( "link" );
}
settings.title = "Snapshot of " + settings.rootFolder;
if( arguments.Exists( "title" ) )
{
settings.title = arguments.Single( "title" );
}
// if outfile is also given, start generating snapshot
if (arguments.Exists("outfile"))
{
autoRun = true;
outFile = arguments.Single("outfile");
cmdCreate.PerformClick();
}
}
}
// keep window hidden in silent mode
if( arguments.IsTrue( "silent" ) && autoRun )
if( arguments.IsTrue( "silent" ) && this.runningAutomated )
{
Visible = false;
}
@ -107,16 +131,9 @@ namespace Snap2HTML
Opacity = 100;
}
// run link/title after path, since path automatically updates title
if( arguments.Exists( "link" ) )
if( this.runningAutomated )
{
chkLinkFiles.Checked = true;
txtLinkRoot.Text = arguments.Single( "link" );
txtLinkRoot.Enabled = true;
}
if( arguments.Exists( "title" ) )
{
txtTitle.Text = arguments.Single( "title" );
StartProcessing( settings );
}
}
@ -124,7 +141,7 @@ namespace Snap2HTML
{
if( backgroundWorker.IsBusy ) e.Cancel = true;
if( outFile == "" ) // don't save settings when automated through command line
if( !this.runningAutomated ) // don't save settings when automated through command line
{
Snap2HTML.Properties.Settings.Default.WindowLeft = this.Left;
Snap2HTML.Properties.Settings.Default.WindowTop = this.Top;
@ -144,7 +161,7 @@ namespace Snap2HTML
}
catch( System.Exception ex )
{
MessageBox.Show( "Could not select folder: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error );
MessageBox.Show( "Could not select folder:\n\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error );
SetRootPath( "", false );
}
}
@ -152,57 +169,25 @@ namespace Snap2HTML
private void cmdCreate_Click(object sender, EventArgs e)
{
// ensure source path format
txtRoot.Text = System.IO.Path.GetFullPath( txtRoot.Text );
if (txtRoot.Text.EndsWith(@"\")) txtRoot.Text = txtRoot.Text.Substring(0, txtRoot.Text.Length - 1);
if( Utils.IsWildcardMatch( "?:", txtRoot.Text, false ) ) txtRoot.Text += @"\"; // add backslash to path if only letter and colon eg "c:"
// add slash or backslash to end of link (in cases where it is clearthat we we can)
if( !txtLinkRoot.Text.EndsWith( @"/" ) && txtLinkRoot.Text.ToLower().StartsWith( @"http" ) ) // web site
// ask for output file
string fileName = new System.IO.DirectoryInfo( txtRoot.Text + @"\" ).Name;
char[] invalid = System.IO.Path.GetInvalidFileNameChars();
for (int i = 0; i < invalid.Length; i++)
{
txtLinkRoot.Text += @"/";
}
if( !txtLinkRoot.Text.EndsWith( @"\" ) && Utils.IsWildcardMatch( "?:*", txtLinkRoot.Text, false ) ) // local disk
{
txtLinkRoot.Text += @"\";
fileName = fileName.Replace(invalid[i].ToString(), "");
}
// get output file
if( outFile == "" )
{
string fileName = new System.IO.DirectoryInfo( txtRoot.Text + @"\" ).Name;
char[] invalid = System.IO.Path.GetInvalidFileNameChars();
for (int i = 0; i < invalid.Length; i++)
{
fileName = fileName.Replace(invalid[i].ToString(), "");
}
saveFileDialog1.DefaultExt = "html";
if( !fileName.ToLower().EndsWith( ".html" ) ) fileName += ".html";
saveFileDialog1.FileName = fileName;
saveFileDialog1.Filter = "HTML files (*.html)|*.html|All files (*.*)|*.*";
saveFileDialog1.InitialDirectory = System.IO.Path.GetDirectoryName(txtRoot.Text);
if (saveFileDialog1.ShowDialog() != DialogResult.OK) return;
}
else // command line
{
saveFileDialog1.FileName = outFile;
}
saveFileDialog1.DefaultExt = "html";
if( !fileName.ToLower().EndsWith( ".html" ) ) fileName += ".html";
saveFileDialog1.FileName = fileName;
saveFileDialog1.Filter = "HTML files (*.html)|*.html|All files (*.*)|*.*";
saveFileDialog1.InitialDirectory = System.IO.Path.GetDirectoryName(txtRoot.Text);
saveFileDialog1.CheckPathExists = true;
if (saveFileDialog1.ShowDialog() != DialogResult.OK) return;
if( !saveFileDialog1.FileName.ToLower().EndsWith( ".html" ) ) saveFileDialog1.FileName += ".html";
// make sure output path exists
if( !System.IO.Directory.Exists( System.IO.Path.GetDirectoryName( saveFileDialog1.FileName ) ) )
{
MessageBox.Show( "The output folder does not exists...\n\n" + System.IO.Path.GetDirectoryName( saveFileDialog1.FileName ), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error );
return;
}
// begin generating html
Cursor.Current = Cursors.WaitCursor;
this.Text = "Snap2HTML (Working... Press Escape to Cancel)";
tabControl1.Enabled = false;
var settings = new SnapSettings()
{
rootFolder = txtRoot.Text,
@ -214,8 +199,40 @@ namespace Snap2HTML
linkFiles = chkLinkFiles.Checked,
linkRoot = txtLinkRoot.Text,
};
backgroundWorker.RunWorkerAsync(argument: settings);
StartProcessing(settings);
}
private void StartProcessing(SnapSettings settings)
{
// ensure source path format
settings.rootFolder = System.IO.Path.GetFullPath( settings.rootFolder );
if( settings.rootFolder.EndsWith( @"\" ) ) settings.rootFolder = settings.rootFolder.Substring( 0, settings.rootFolder.Length - 1 );
if( Utils.IsWildcardMatch( "?:", settings.rootFolder, false ) ) settings.rootFolder += @"\"; // add backslash to path if only letter and colon eg "c:"
// add slash or backslash to end of link (in cases where it is clear that we we can)
if( settings.linkFiles )
{
if( !settings.linkRoot.EndsWith( @"/" ) )
{
if( settings.linkRoot.ToLower().StartsWith( @"http" ) ) // web site
{
settings.linkRoot += @"/";
}
if( Utils.IsWildcardMatch( "?:*", settings.linkRoot, false ) ) // local disk
{
settings.linkRoot += @"\";
}
if( settings.linkRoot.StartsWith( @"\\" ) ) // unc path
{
settings.linkRoot += @"\";
}
}
}
Cursor.Current = Cursors.WaitCursor;
this.Text = "Snap2HTML (Working... Press Escape to Cancel)";
tabControl1.Enabled = false;
backgroundWorker.RunWorkerAsync( argument: settings );
}
private void backgroundWorker_ProgressChanged( object sender, ProgressChangedEventArgs e )
@ -233,7 +250,7 @@ namespace Snap2HTML
this.Text = "Snap2HTML";
// Quit when finished if automated via command line
if( outFile != "" )
if( this.runningAutomated )
{
Application.Exit();
}
@ -254,11 +271,11 @@ namespace Snap2HTML
}
private void linkLabel3_LinkClicked( object sender, LinkLabelLinkClickedEventArgs e )
{
System.Diagnostics.Process.Start( @"http://www.rlvision.com/snap2img/about.asp" );
System.Diagnostics.Process.Start( @"https://rlvision.com/exif/about.php" );
}
private void linkLabel2_LinkClicked( object sender, LinkLabelLinkClickedEventArgs e )
{
System.Diagnostics.Process.Start( @"http://www.rlvision.com/flashren/about.asp" );
System.Diagnostics.Process.Start( @"http://www.rlvision.com/flashren/about.php" );
}
private void linkLabel4_LinkClicked( object sender, LinkLabelLinkClickedEventArgs e )
{
@ -266,7 +283,11 @@ namespace Snap2HTML
}
private void linkLabel5_LinkClicked( object sender, LinkLabelLinkClickedEventArgs e )
{
System.Diagnostics.Process.Start( @"http://www.rlvision.com/contact.asp" );
System.Diagnostics.Process.Start( @"http://www.rlvision.com/contact.php" );
}
private void pictureBoxDonate_Click( object sender, EventArgs e )
{
System.Diagnostics.Process.Start( @"https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=U3E4HE8HMY9Q4&item_name=Snap2HTML&currency_code=USD&source=url" );
}
// Drag & Drop handlers

View File

@ -494,6 +494,35 @@
jTImu2uXMzlKjrHmOMi2HdX5XuWSJmvKfmgyh+cNp8H6sf+27Lsm+y3Dfgvqr611T/8VtDTJLpqNOUXr
pv6L5CL5mS0+oHBCISJ/spaaoiaNUoPpu7oB1TR69G3yfkUeX0J/vgj+zvwzMC20NMkumo3v+d9Bs/E9
/ztoNr7nfwfNxvf8rwDl/wALZf6ZRmxttQAAAABJRU5ErkJggg==
</value>
</data>
<data name="pictureBoxDonate.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
R0lGODlhSgAVAIfPAP7DOf7DONqnMf7EOSgeCNmmMAgGAeCsMmNMFv/DOfC4NfzBOOqzNP/EOvS7Nv/F
PgkGAgEAAAIBAAUDAVlEE+mzNP/GQf7COZx3IiAYB0AxDg4KAwMCAPe9NyIaB//aguGsMv/QYdimMPO6
NTYpDPvLWOizN9qoMP/OW9yoMf3CON+rMtyoMPO6NkMzDiogCe21NP/LU+iyM//JSv7TcPC4NlVBExgS
BfjCRO64OOKtM2JLFQcFAcucLSEZB0k4EPzJTvvAOCUcCAYEATAkCv/ciRUQBP7QZv3FQvi+N/rCQT8w
DrmOKfTHV1xGFOKvMvm/N/m+N6Z/JfjBPlpFFDImC+y0NZNwIPrAN66FJv7PYdelMJVyIcycLfq/OBsU
BvzEP39hHHdbGtWjL3NYGU88Ee62Nf/DOu22Nf3QZfG5NRENA0o4EGRMFjUoC+eyNOWwNDkrDM6eLrCH
J7uPKf/ISDwuDXldG/W+PvG9Q0U1DwoHAnpdG29VGDstDXZaGjElCtuoMBwVBpd0IWFKFfW8Nt6qMmhP
FzosDCwhCffETey1NVdCE//XeYNkHZl1IqF7I+WwMriNKYdnHhQPBPfAPuy1NNakL/q/N+u0NJ96I+22
NuWwM9GgLnxfGxkTBcWXLPK9RPfETt+rMfvDP3teG8OVK7yQKj0uDUExDkc2D/7PXw8LAwsIAoBiHAQD
ANCfLt6pMsmaLJFvIP3COZRxIfa+P1E+Ev/HQZBuIP/JSf/Wd96qMS0iCr6SKlZCE+eyMx8XBnVZGrqO
Kf7QZW1TGGVNFtOiL//Wdv/YesiZLNqnMP/cigAAAP/EOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ACH/C05FVFNDQVBFMi4wAwEBAAAh+QQBAADPACwAAAAASgAVAAAI/wCfCRz4DEUdC2cAKAQwgGHDhgCc
RZQocaHCAAACYMTI0GGAARozKnw4wFlJZw1w6UJBsOVAIEi07PpQhJnNmzhz6tzJs+fOIh+QrUICxOVA
MGkahZhhoYGzp1CjSp1KtapVqg0szAiRjBgpo0poxLhKtqzZs09j0FDSstKRB2jjyo374MiUgaJKOJ3L
t2/VBiUUCcQDtyyBZs1u/OjiN+olWY0f2HrWBMdZAhO4/BrCwVTjpxokfMbRJM+CywaeKmtG4qkkIhv0
LHvKR4gYD4CYOAvQxwcEErCcHYLQTEiip3N6rWHk4OyCUDkuoH4agNIELJ04fNoBQVBzBM2qGP/jQcRZ
kFZsCE245UxKhghhHDnrEQEVmSHFzl7IgQYtgdRPxdGMDG0004MzuTQDiTPgHeCMKs0o4AwUzijghwEU
hgbVDgYcoIYLHqC1ySK0TOdMBwbsEcASHAThDCjNeMJgMw5S0AwDzmiSQTMRROiMhk8tgRhiRuhnBQNe
mJhFMz8440QzWziDQTOPzFjjjXJEYAMINviYigQBPOXEBGM44EAhZ2FSgQkjXPZKKVTwAMExzgzTDCJX
BMOKDFY6YyMDTDQjzCkv+PhHM65MkgkdzbiBwSCznDWCCc+8kYBZhzXzRRkiQFXLBs1k4MtTDfp54wIu
NOODHc2A4IwIhd6AwImURjSzwR1mJQCMQJG08JkKFZhlBlWWSFWBCme1AMdAT0Tx2bN8RfFESzokAe21
ZiWhg1Gj1HAptuBGlUANvBglkCErwNDBAt+G61cCC3QAwwqxmEvQCSmwEEgByxTAL7/LCBCwwAIvY/DB
BxNMsMEKB2zwv/8ifDALKZxgVEAAOw==
</value>
</data>
<data name="pictureBox3.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@ -552,110 +581,62 @@
</data>
<data name="pictureBox2.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<data name="pictureBox1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">

View File

@ -53,14 +53,14 @@ namespace Snap2HTML
var sbTemplate = new StringBuilder();
try
{
using( System.IO.StreamReader reader = new System.IO.StreamReader( System.IO.Path.GetDirectoryName( Application.ExecutablePath ) + System.IO.Path.DirectorySeparatorChar + "template.html" ) )
using( System.IO.StreamReader reader = new System.IO.StreamReader( System.IO.Path.GetDirectoryName( Application.ExecutablePath ) + System.IO.Path.DirectorySeparatorChar + "template.html", Encoding.UTF8 ) )
{
sbTemplate.Append(reader.ReadToEnd());
}
}
catch( System.Exception ex )
{
MessageBox.Show( "Failed to open 'Template.html' for reading...", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error );
MessageBox.Show( "Failed to open 'Template.html' for reading:\n\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error );
backgroundWorker.ReportProgress( 0, "An error occurred..." );
return;
}
@ -75,7 +75,7 @@ namespace Snap2HTML
sbTemplate.Replace( "[NUM FILES]", totFiles.ToString() );
sbTemplate.Replace( "[NUM DIRS]", totDirs.ToString() );
sbTemplate.Replace( "[TOT SIZE]", totSize.ToString() );
if( chkLinkFiles.Checked )
if( settings.linkFiles )
{
sbTemplate.Replace( "[LINK FILES]", "true" );
sbTemplate.Replace( "[LINK ROOT]", settings.linkRoot.Replace( @"\", "/" ) );
@ -86,10 +86,15 @@ namespace Snap2HTML
{
sbTemplate.Replace( "[LINK PROTOCOL]", @"file://" );
}
else if( link_root.StartsWith( "//" ) ) // for UNC paths e.g. \\server\path
{
sbTemplate.Replace( "[LINK PROTOCOL]", @"file://///" );
}
else
{
sbTemplate.Replace( "[LINK PROTOCOL]", "" );
}
}
else
{
@ -102,8 +107,10 @@ namespace Snap2HTML
// Write output file
try
{
using( System.IO.StreamWriter writer = new System.IO.StreamWriter( settings.outputFile ) )
using( System.IO.StreamWriter writer = new System.IO.StreamWriter( settings.outputFile, false, Encoding.UTF8 ) )
{
writer.AutoFlush = true;
var template = sbTemplate.ToString();
var startOfData = template.IndexOf( "[DIR DATA]" );
@ -129,7 +136,7 @@ namespace Snap2HTML
}
catch( Exception ex )
{
MessageBox.Show( "Failed to open file for writing:\n\n" + ex, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error );
MessageBox.Show( "Failed to open file for writing:\n\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error );
backgroundWorker.ReportProgress( 0, "An error occurred..." );
return;
}
@ -346,17 +353,19 @@ namespace Snap2HTML
var dirIndexes = new Dictionary<string, string>();
for( var i = 0; i < content.Count; i++ )
{
dirIndexes.Add( content[i].FullPath, ( i + startIndex ).ToString() );
dirIndexes.Add( content[i].GetFullPath(), ( i + startIndex ).ToString() );
}
// Build a lookup table with subfolder IDs for each folder
var subdirs = new Dictionary<string, List<string>>();
foreach( var dir in content )
{
subdirs.Add( dir.FullPath, new List<string>() );
// add all folders as keys
subdirs.Add( dir.GetFullPath(), new List<string>() );
}
if( !subdirs.ContainsKey( content[0].Path ) && content[0].Name != "" )
{
// ensure that root folder is not missed missed
subdirs.Add( content[0].Path, new List<string>() );
}
foreach( var dir in content )
@ -365,7 +374,8 @@ namespace Snap2HTML
{
try
{
subdirs[dir.Path].Add( dirIndexes[dir.FullPath] );
// for each folder, add its index to its parent folder list of subdirs
subdirs[dir.Path].Add( dirIndexes[dir.GetFullPath()] );
}
catch( Exception ex )
{
@ -380,7 +390,7 @@ namespace Snap2HTML
{
result.Append( "D.p([" + lineBreakSymbol );
var sDirWithForwardSlash = currentDir.FullPath.Replace( @"\", "/" );
var sDirWithForwardSlash = currentDir.GetFullPath().Replace( @"\", "/" );
result.Append( "\"" ).Append( Utils.MakeCleanJsString( sDirWithForwardSlash ) ).Append( "*" ).Append( "0" ).Append( "*" ).Append( currentDir.GetProp( "Modified" ) ).Append( "\"," + lineBreakSymbol );
long dirSize = 0;
@ -395,7 +405,7 @@ namespace Snap2HTML
result.Append( "" ).Append( dirSize ).Append( "," + lineBreakSymbol );
// Add reference to subdirs
result.Append( "\"" ).Append( String.Join( "*", subdirs[currentDir.FullPath].ToArray() ) ).Append( "\"" + lineBreakSymbol ); // subdirs
result.Append( "\"" ).Append( String.Join( "*", subdirs[currentDir.GetFullPath()].ToArray() ) ).Append( "\"" + lineBreakSymbol );
// Finalize
result.Append( "])" );

View File

@ -1,4 +1,4 @@
<!DOCTYPE HTML>
<!DOCTYPE HTML>
<!-- saved from url=(0016)http://localhost -->
<!-- This file was generated by [APP NAME] [APP VER] at [GEN DATE] [GEN TIME]. See [APP LINK] for more information -->
<html>
@ -172,6 +172,22 @@
.list_files {
overflow: auto;
position: relative;
}
.search_indicator {
position: absolute;
left: 0px;
right: 0px;
top: 0px;
bottom: 0px;
background-color: white;
opacity: 0.7;
text-align: center;
padding-top: 100px;
font-size: 18px;
display: none;
z-index: 99;
}
/* --- Splitter --- */
@ -188,6 +204,7 @@
font-family:arial;
background-color: #cdcdcd;
font-size: 8pt;
line-height: 1.25em;
width: 100%;
text-align: left;
border-spacing: 0px;
@ -216,7 +233,11 @@
border-top: 1px solid #e0e0e0;
padding: 3px 4px 3px 4px;
}
#files.tablesorter tbody tr:nth-child(even) td {
#files.tablesorter:not(.has-parent-folder) tbody tr:nth-child(even) td {
background-color: #f8f8f8;
}
#files.tablesorter.has-parent-folder tbody tr:nth-child(odd) td {
background-color: #f8f8f8;
}
@ -276,6 +297,28 @@
}
/* make room for [..] */
#files.tablesorter.has-parent-folder th {
border-bottom: 1px solid #ccc;
}
#files.tablesorter.has-parent-folder tbody tr:first-child td {
border-top: 20px solid white;
}
#parent_folder {
position: absolute;
top: 24px;
left: 4px;
}
#parent_folder_border {
background-color: #e0e0e0;
height: 1px;
position: absolute;
width: 100%;
top: 42px;
}
/* --- Breadcrumb --- */
.list_header {
@ -369,7 +412,7 @@
}
.export_text {
width: 100%;
height: calc(100% - 5em); /* two .export_options => 4em + save link*/
height: calc(100% - 5.25em); /* two .export_options => 4em + save link*/
}
.export_close:link, .export_close:visited {
float: right;
@ -773,6 +816,7 @@
var originalHash = location.hash.replace(/#/,"");
var SelectedFolderID = "-1";
var currentView;
var onlyLinkExtensions = []; // example: ["jpg","png"]
/* --- Init --- */
@ -942,13 +986,17 @@
return;
}
var showLocationColumn = true;
if( numberOfFiles > 5000 ) {
$("#list_header").html( "Searching..." );
$("#search_indicator").show();
//$("#list_header").html( "Searching..." );
showLocationColumn = false;
}
location.hash = "";
setTimeout(function(){ // timeout allows redrawing screen before possible timeconsuming search
setTimeout(function(){ // timeout allows redrawing screen before possible time consuming search
if( SelectedFolderID != -1 )
{
@ -1005,9 +1053,15 @@
}
}
var locationHtml = "";
if(showLocationColumn) locationHtml = "<th>Folder</th>";
currentView = [];
var table_html = "";
table_html += "<table id='files' class='tablesorter'><thead><tr><th>Name</th><th>Folder</th><th>Size</th><th>Modified</th></tr></thead><tbody>\n";
table_html += "<table id='files' class='tablesorter'><thead><tr><th>Name</th>" +
locationHtml +
"<th>Size</th><th>Modified</th></tr></thead><tbody>";
var countFiles = 0;
var countDirs = 0;
@ -1051,18 +1105,23 @@
sizeDirs += SearchFilenames[index][1];
var subdir_id = parent_folders[ SearchLocationsID[index] ];
var located_in = SearchLocations[index];
if( located_in === "" ) located_in = "[.]"
located_in = located_in.substring( 0, located_in.lastIndexOf("\\") );
var timestamp = timestampToDate(SearchFilenames[index][2]);
locationHtml = "";
if(showLocationColumn) {
var located_in = SearchLocations[index];
if( located_in === "" ) located_in = "[.]"
located_in = located_in.substring( 0, located_in.lastIndexOf("\\") );
locationHtml = "<td><span class='file_folder'><a href=\"#\" class=\"folder_link\" id=\"" + subdir_id + "\"> " + located_in + "</a></span></td>";
}
table_html +=
"<tr>" +
"<td><span class='file_folder'><a href=\"#\" class=\"folder_link\" id=\"" + SearchLocationsID[index] + "\"> " + SearchFilenames[index][3] + "</a></span></td>" +
"<td><span class='file_folder'><a href=\"#\" class=\"folder_link\" id=\"" + subdir_id + "\"> " + located_in + "</a></span></td>" +
locationHtml +
"<td class='size' data-sort='" + SearchFilenames[index][1] + "'>" + bytesToSize( SearchFilenames[index][1] ) + "</td>" +
"<td class='date' data-sort='" + SearchFilenames[index][2] + "'>" + timestamp + "</td>" +
"</tr>\n";
"</tr>";
currentView.push( { "name": SearchFilenames[index][3], "path": SearchLocationsRaw[index].replace(/\//g,"\\"), "type": "dir", "size": SearchFilenames[index][1], "date": SearchFilenames[index][2] } );
}
else // files
@ -1074,41 +1133,51 @@
if( linkFiles )
{
file_tmp = linkProtocol + linkRoot + dir_tmp.replace("\\","/") + SearchFilenames[index][3] + "\">";
if( navigator.userAgent.toLowerCase().indexOf("msie") !== -1 && linkProtocol.indexOf("file:") !== -1 )
{
file_tmp = "javascript:alert('Internet Explorer does not allow linking to local files...')" + "\">";
}
if( file_tmp.substr(0,1) === "/" ) file_tmp = file_tmp.substr(1);
file_tmp = file_tmp.replace(/\\/g,"/");
file_tmp = file_tmp.replace(/#/g,"%23");
var ext = file_tmp.split('.').pop();
if(onlyLinkExtensions.length === 0 || onlyLinkExtensions.indexOf(ext) !== -1) {
var indx = file_tmp.indexOf("://");
if( indx !== -1 )
{
var protocol_tmp = file_tmp.substr(0,indx+3);
file_tmp = file_tmp.substr(indx+3);
file_tmp = file_tmp.replace(/\/\//g,"/");
file_tmp = protocol_tmp + file_tmp;
}
else
{
file_tmp = file_tmp.replace(/\/\//g,"/");
}
file_tmp = linkProtocol + linkRoot + dir_tmp.replace("\\","/") + SearchFilenames[index][3] + "\">";
if( navigator.userAgent.toLowerCase().indexOf("msie") !== -1 && linkProtocol.indexOf("file:") !== -1 )
{
file_tmp = "javascript:alert('Internet Explorer does not allow linking to local files...')" + "\">";
}
if( file_tmp.substr(0,1) === "/" ) file_tmp = file_tmp.substr(1);
file_tmp = file_tmp.replace(/\\/g,"/");
file_tmp = file_tmp.replace(/#/g,"%23");
file_tmp = "<a href=\"" + file_tmp + SearchFilenames[index][3] + "</a>";
var indx = file_tmp.indexOf("://");
if( indx !== -1 )
{
var protocol_tmp = file_tmp.substr(0,indx+3);
file_tmp = file_tmp.substr(indx+3);
file_tmp = file_tmp.replace(/\/\//g,"/");
file_tmp = protocol_tmp + file_tmp;
}
else
{
file_tmp = file_tmp.replace(/\/\//g,"/");
}
file_tmp = "<a href=\"" + file_tmp + SearchFilenames[index][3] + "</a>";
}
}
var located_in = SearchLocations[index];
if( located_in === "" ) located_in = "[.]"
locationHtml = "";
if(showLocationColumn) {
var located_in = SearchLocations[index];
if( located_in === "" ) located_in = "[.]"
locationHtml = "<td><span class='file_folder'><a href=\"#\" class=\"folder_link\" id=\"" + SearchLocationsID[index] + "\"> " + located_in + "</a></span></td>";
}
var timestamp = timestampToDate(SearchFilenames[index][2]);
table_html +=
"<tr>" +
"<td><span class='file'>" + file_tmp + "</span></td>" +
"<td><span class='file_folder'><a href=\"#\" class=\"folder_link\" id=\"" + SearchLocationsID[index] + "\"> " + located_in + "</a></span></td>" +
locationHtml +
"<td class='size' data-sort='" + SearchFilenames[index][1] + "'>" + bytesToSize( SearchFilenames[index][1] ) + "</td>" +
"<td class='date' data-sort='" + SearchFilenames[index][2] + "'>" + timestamp + "</td>" +
"</tr>\n";
"</tr>";
currentView.push( { "name": SearchFilenames[index][3], "path": SearchLocationsRaw[index].replace(/\//g,"\\"), "type": "file", "size": SearchFilenames[index][1], "date": SearchFilenames[index][2] } );
@ -1138,24 +1207,28 @@
}
}
table_html += "</tbody></table>\n";
table_html += "</tbody></table>";
$("#list_header").html( "Search Results <span class='path_divider'></span>" );
document.getElementById("list_files").innerHTML = table_html;
$("#search_indicator").hide();
addFolderClickEventHandlers();
var tablesorterHeaders = { 1 : { sorter: 'datasort' }, 2 : { sorter: 'datasort' } }
if(showLocationColumn) {
tablesorterHeaders = { 2 : { sorter: 'datasort' }, 3 : { sorter: 'datasort' } }
}
$("#files").tablesorter({
sortInitialOrder: "desc",
headers: {
2 : { sorter: 'datasort' },
3 : { sorter: 'datasort' }
}
headers: tablesorterHeaders
});
var sFiles = " files"; if(countFiles===1) sFiles = " file";
var sDirs = " folders"; if(countDirs===1) sDirs = " folder";
$("#list_footer_info_label").html( countDirs + sDirs + " (" + bytesToSize( sizeDirs , 0 ) + "), " + countFiles + sFiles + " (" + bytesToSize( sizeFiles , 0 ) + ")" );
}, 1); // end setTimeout before search
}, 50); // end setTimeout before search
}; // end doSearch()
@ -1192,14 +1265,20 @@
$("#list_header").html( breadcrumbs );
var table_html = "";
table_html += "<table id='files' class='tablesorter'><thead><th>Name</th><th>Size</th><th>Modified</th></tr></thead><tbody>\n";
var showParentFolderClass = "";
if( FolderID != 0 ) {
showParentFolderClass = " has-parent-folder"
table_html += "<span id='parent_folder' class='file_folder'><a href=\"#\" class=\"folder_link\" id=\"" + parent_folders[FolderID] + "\"> [..]</a></span>\n";
table_html += "<div id='parent_folder_border'></div>";
}
table_html += "<table id='files' class='tablesorter" + showParentFolderClass + "'><thead><th>Name</th><th>Size</th><th>Modified</th></tr></thead><tbody>\n";
currentView = [];
var countFiles = 0;
var countDirs = 0;
var subdirTotSizes = 0;
// folders
if( FolderID != 0 ) table_html += "<tr><td><span class='file_folder'><a href=\"#\" class=\"folder_link\" id=\"" + parent_folders[FolderID] + "\"> [..]</a></span></td><td></td><td></td></tr>\n";
var subdirs = getSubdirs( SelectedFolderID );
if( subdirs != "" )
{
@ -1231,29 +1310,33 @@
if( dir_tmp != "" ) dir_tmp += "/";
if( linkFiles )
{
file_tmp = linkProtocol + linkRoot + dir_tmp + sTmp[0] + "\">";
if( navigator.userAgent.toLowerCase().indexOf("msie") !== -1 && linkProtocol.indexOf("file:") !== -1 )
{
file_tmp = "javascript:alert('Internet Explorer does not allow linking to local files...')" + "\">";
}
if( file_tmp.substr(0,1) === "/" ) file_tmp = file_tmp.substr(1);
file_tmp = file_tmp.replace(/\\/g,"/");
file_tmp = file_tmp.replace(/#/g,"%23");
var indx = file_tmp.indexOf("://");
if( indx !== -1 )
{
var protocol_tmp = file_tmp.substr(0,indx+3);
file_tmp = file_tmp.substr(indx+3);
file_tmp = file_tmp.replace(/\/\//g,"/");
file_tmp = protocol_tmp + file_tmp;
}
else
{
file_tmp = file_tmp.replace(/\/\//g,"/");
}
var ext = file_tmp.split('.').pop();
if(onlyLinkExtensions.length === 0 || onlyLinkExtensions.indexOf(ext) !== -1) {
file_tmp = linkProtocol + linkRoot + dir_tmp + sTmp[0] + "\">";
if( navigator.userAgent.toLowerCase().indexOf("msie") !== -1 && linkProtocol.indexOf("file:") !== -1 )
{
file_tmp = "javascript:alert('Internet Explorer does not allow linking to local files...')" + "\">";
}
if( file_tmp.substr(0,1) === "/" ) file_tmp = file_tmp.substr(1);
file_tmp = file_tmp.replace(/\\/g,"/");
file_tmp = file_tmp.replace(/#/g,"%23");
file_tmp = "<a href=\"" + file_tmp + sTmp[0] + "</a>";
var indx = file_tmp.indexOf("://");
if( indx !== -1 )
{
var protocol_tmp = file_tmp.substr(0,indx+3);
file_tmp = file_tmp.substr(indx+3);
file_tmp = file_tmp.replace(/\/\//g,"/");
file_tmp = protocol_tmp + file_tmp;
}
else
{
file_tmp = file_tmp.replace(/\/\//g,"/");
}
file_tmp = "<a href=\"" + file_tmp + sTmp[0] + "</a>";
}
}
var timestamp = timestampToDate(sTmp[2]);
@ -1600,7 +1683,6 @@
};
};
// Save export to local file. Based on https://stackoverflow.com/a/29304414/1087811
function downloadToFile(content, fileName, mimeType) {
var a = document.createElement('a');
@ -1648,10 +1730,12 @@
<div id="loading" class="loading"><b>Loading...</b><p class="loading_info">(if nothing happens, make sure javascript is enabled and allowed to execute, or try another browser)</p></div>
<div id="content" class="content">
<div id="treeview" class="treeview"></div>
<div id="list_container" class="list_container">
<div id="search_indicator" class="search_indicator">
Searching...
</div>
<div id="list_header" class="list_header"></div>
<div id="list_files" class="list_files"></div>
<div id="list_footer" class='list_footer'>
@ -1659,7 +1743,6 @@
<span id="list_footer_info_label"></span>
</div>
</div>
</div>
</div>