using System;
using System.IO;
using System.Xml;
using System.Xml.XPath;
using System.Diagnostics;
public struct ConfigOption
{
private string name;
private string setting;
public ConfigOption( string name, string setting )
{
this.name = name;
this.setting = setting;
}
public string Name
{
get{ return name; }
set{ name = value; }
}
public string Setting
{
get{ return setting; }
set{ setting = value; }
}
}//struct ConfigOption
public class Configurator
{
private int max_options; //the max amount of options to parse into our internal list
private ConfigOption[] configList;
private int actual_cfg;
public Configurator()
{
max_options = 10;
configList = new ConfigOption[ max_options ];
}
public Configurator( int max_options )
{
this.max_options = max_options;
configList = new ConfigOption[ this.max_options ];
}
//TODO enforce the max_options--don't parse and try to add more than you can
private ConfigOption build_option( XPathNavigator nav )
{
XPathNodeIterator iter = nav.SelectDescendants( XPathNodeType.Element, false);
ConfigOption cfg_option = new ConfigOption( );
while( iter.MoveNext() )
{
string option = iter.Current.Name;
if( option == "name" )
{
cfg_option.Name = iter.Current.Value;
}
if( option == "setting" )
{
cfg_option.Setting = iter.Current.Value;
}
}
return cfg_option;
}//build_option
public void parse_options( )
{
int i = 0;
try
{
XPathDocument xpdoc = new XPathDocument( "config.xml" );
XPathNavigator nav = xpdoc.CreateNavigator( );
XPathNodeIterator iter = nav.Select( "/configuration/option" );
for( i = 0; iter.MoveNext() ; i++ )
{
configList[i] = build_option( iter.Current );
}
actual_cfg = i;
}
catch( Exception ex )
{
Console.WriteLine( ex.Message );
}
}//parse_options
public string get_config_value( string option )
{
for( int i=0 ; i < actual_cfg ; i++ )
{
if( configList[i].Name == option )
return configList[i].Setting;
}
return null;
}//get_config_value
public void write_configuration_file( )
{
XmlTextWriter xwriter = new XmlTextWriter("config.xml",null);
xwriter.Formatting = Formatting.Indented;
xwriter.Indentation = 4;
xwriter.WriteStartDocument( );
xwriter.WriteComment("MakeGallery Configuration - Blursoft 2004");
xwriter.WriteStartElement("configuration");
//gallery name
xwriter.WriteStartElement("option");
xwriter.WriteStartElement("name");
xwriter.WriteString("gallery_name");
xwriter.WriteEndElement();
xwriter.WriteStartElement("setting");
xwriter.WriteString("USE_DIRECTORY");
xwriter.WriteEndElement( );
xwriter.WriteEndElement( );
//image extension option
xwriter.WriteStartElement("option");
xwriter.WriteStartElement("name");
xwriter.WriteString("image_extension");
xwriter.WriteEndElement();
xwriter.WriteStartElement("setting");
xwriter.WriteString(".jpg");
xwriter.WriteEndElement( );
xwriter.WriteEndElement( );
//thumbsize option
xwriter.WriteStartElement("option");
xwriter.WriteStartElement("name");
xwriter.WriteString("thumbsize");
xwriter.WriteEndElement();
xwriter.WriteStartElement("setting");
xwriter.WriteString("200x150");
xwriter.WriteEndElement( );
xwriter.WriteEndElement( );
//smallsize option
xwriter.WriteStartElement("option");
xwriter.WriteStartElement("name");
xwriter.WriteString("smallsize");
xwriter.WriteEndElement();
xwriter.WriteStartElement("setting");
xwriter.WriteString("400x300");
xwriter.WriteEndElement( );
xwriter.WriteEndElement( );
//mediumsize option
xwriter.WriteStartElement("option");
xwriter.WriteStartElement("name");
xwriter.WriteString("mediumsize");
xwriter.WriteEndElement();
xwriter.WriteStartElement("setting");
xwriter.WriteString("640x480");
xwriter.WriteEndElement( );
xwriter.WriteEndElement( );
xwriter.WriteEndElement( );//configuration
xwriter.Flush( );
xwriter.Close( );
}
}//class Configurator
public class Thumbnailer
{
public void MakeThumbnail( string directory )
{
Configurator config = new Configurator( );
config.parse_options( );
string thumbsize = config.get_config_value( "thumbsize" );
string smallsize = config.get_config_value( "smallsize" );
string mediumsize = config.get_config_value( "mediumsize" );
string extension = config.get_config_value("image_extension");
string gallery_name = config.get_config_value("gallery_name");
string basename = null;
GalleryWriter writer = new GalleryWriter( directory );
DirectoryInfo dirInfo = new DirectoryInfo( directory );
FileInfo[] files = dirInfo.GetFiles( );
Process pImageMagick = null;
ProcessStartInfo psi = new ProcessStartInfo();
psi.UseShellExecute = false;
writer.WriteHeadChunk( gallery_name );
psi.WorkingDirectory = directory;
psi.FileName = "convert";
foreach( FileInfo file in files )
{
if( String.Compare(file.Extension,extension,true) == 0 )
{
string fullpath = Path.Combine(file.DirectoryName,file.Name);
basename = fullpath.Trim( extension.ToCharArray() );
string thumbname = basename+"-tb"+extension;
string smallname = basename+"-sm"+extension;
string mediumname = basename+"-md"+extension;
Console.Write("Processing {0} ...",file.Name);
psi.Arguments = "convert "+"-interlace NONE -geometry "+thumbsize+" "+fullpath+" "+thumbname;
pImageMagick=Process.Start( psi );
pImageMagick.WaitForExit( );
Console.Write("thumbnail [OK] ...");
psi.Arguments = "convert "+"-interlace NONE -geometry "+smallsize+" "+fullpath+" "+smallname;
pImageMagick=Process.Start( psi );
pImageMagick.WaitForExit( );
Console.Write("small [OK] ...");
psi.Arguments = "convert "+"-interlace NONE -geometry "+mediumsize+" "+fullpath+" "+mediumname;
pImageMagick=Process.Start( psi );
pImageMagick.WaitForExit( );
Console.Write("medium [OK] ...");
Console.WriteLine("[DONE]");
writer.WriteNewImage( file.Name, Path.GetFileName(thumbname), Path.GetFileName(smallname), Path.GetFileName(mediumname));
}
}//foreach
writer.WriteTailChunk( );
writer.Close( );
}
}//class Thumbnailer
public class GalleryWriter
{
private StreamWriter writer;
private string directory;
public GalleryWriter( string directory )
{
this.directory = directory;
writer = File.CreateText( Path.Combine( directory, "index.html") );
}
public void WriteNewImage( string large, string thumb, string small, string med )
{
writer.WriteLine("");
writer.WriteLine("
");
writer.WriteLine(" small ");
writer.WriteLine(" medium ");
writer.WriteLine(" large ");
writer.WriteLine("
");
}
public void WriteHeadChunk( string gallery_name )
{
if( String.Compare( gallery_name , "USE_DIRECTORY" ) == 0 )
gallery_name = directory;
writer.WriteLine("\n