grunt-static-gallery v0.0.2
grunt-static-gallery
Task grunt-static-gallery
The purpose of this task is to generate HTML pages for a gallery. It use directory structure to make content. EJS tempate is used for HTML generation. This task don't :
- copy images files from source to destination directory
- resize images
Getting Started
This plugin requires Grunt ~0.4.5
If you haven't used Grunt before, be sure to check out the Getting Started guide, as it explains how to create a Gruntfile as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command:
npm install grunt-static-gallery --save-dev
Once the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:
grunt.loadNpmTasks('grunt-static-gallery');
Example
To see a example, use the following command in the module directory. The input data come from test/medias
, the process from Gruntfile
, and the result will be found in tmp\example
.
grunt example
The "grunt_static_gallery" task
Overview
In your project's Gruntfile, add a section named node_gallery_task
to the data object passed into grunt.initConfig()
.
grunt.initConfig({
static_gallery: {
options: {
// Task-specific options go here.
},
your_target: {
// Target-specific file lists and/or options go here.
},
},
});
Options
options.photos
Type: Array of string
Default value: ['*.jpeg','*.jpg','*.png','*.gif']
List of the image files to use.
options.metadatafiles
Type: String
Default value: ['title.html','description.html']
List of the matadata files to use. Content will be available in the template file.
options.inputEncoding
Type: String
Default value: utf-8
Encoding used in matadatafile. See iconv-lite
options.outputEncoding
Type: String
Default value: utf-8
Encoding for output HTML files. See iconv-lite
options.template
Type: String
Default value: none
Name of the template file use to created gallery.
options.file
Type: String
Default value: index.html
Name of the file(s) created by the template, in the dest directory and sub-directory.
options.debug
Type: Boolean
Default value: false
If true, create a debug.json file in the dest directory, with data available to the template.
Usage Examples
In this example, the default options are used. HTML files and directory structure are generate in tmp
directory with the image and metadata file in test/medias
directory. The HTML pages are generate with test/page.ejs
template file.
grunt.initConfig({
static_gallery: {
options: {},
src: 'test/medias',
dest: 'tmp',
template: 'test/page.ejs'
},
});
Data available in template file
All data coorespond to the current album and it's childs.
option : Task's options album : Directory content album.path : Relative directory path album.name : Album name album.metadata : Album metadata. Content of file options.metadatafiles in the album directory. album.metadata.xxx : Album metadata. Content of file xxx.{ext} in the album directory. album.albums : Albums in album. album.parents : List of parents album, with metadata. album.photos : List of the album's photos. album.photos[].name : Image's filename. album.photos[].description : Image's metadata. Content of file {image's filename}.html in the album directory.filename. album.photos[].exif : List of exif data of the file. album.sumPhotos: Total number of photo in this album and him child(ren).
Exemple of data :
{
"options": {
"photos": [
"*.jpeg",
"*.jpg",
"*.png",
"*.gif"
],
"metadatafiles": [
"title.html",
"description.html",
"author.html",
"showInParent"
],
"inputEncoding": "cp1252",
"outputEncoding": "utf-8",
"file": "index.html",
"debug": true,
"oututEncoding": "utf-8"
},
"album": {
"path": "",
"name": "",
"parents": [],
"metadata": {
"title": "undefined",
"description": "undefined",
"author": "undefined",
"showInParent": "undefined"
},
"albums": [
{
"path": "folder1",
"name": "folder1",
"parents": [
{
"path": "",
"name": "",
"metadata": {
"title": "undefined",
"description": "undefined",
"author": "undefined",
"showInParent": "undefined"
}
}
],
"metadata": {
"title": "undefined",
"description": "undefined",
"author": "undefined",
"showInParent": "undefined"
},
"albums": [
{
"path": "folder1\\folder11",
"name": "folder11",
"parents": [
{
"path": "",
"name": "",
"metadata": {
"title": "undefined",
"description": "undefined",
"author": "undefined",
"showInParent": "undefined"
}
},
{
"path": "folder1",
"name": "folder1",
"metadata": {
"title": "undefined",
"description": "undefined",
"author": "undefined",
"showInParent": "undefined"
}
}
],
"metadata": {
"title": "Title of the folder 11",
"description": "undefined",
"author": "undefined",
"showInParent": "undefined"
},
"albums": [
{
"path": "folder1\\folder11\\folder111",
"name": "folder111",
"parents": [
{
"path": "",
"name": "",
"metadata": {
"title": "undefined",
"description": "undefined",
"author": "undefined",
"showInParent": "undefined"
}
},
{
"path": "folder1",
"name": "folder1",
"metadata": {
"title": "undefined",
"description": "undefined",
"author": "undefined",
"showInParent": "undefined"
}
},
{
"path": "folder1\\folder11",
"name": "folder11",
"metadata": {
"title": "Title of the folder 11",
"description": "undefined",
"author": "undefined",
"showInParent": "undefined"
}
}
],
"metadata": {
"title": "Title of folder 111\r\n",
"description": "Description for the folder 111. Et voilà ! \r\n",
"author": "undefined",
"showInParent": ""
},
"albums": [],
"photos": [
{
"name": "img_111a.jpg",
"description": "Content of img_111a.html file\n",
"exif": {
"ImageDescription": "ImageDescription of medias/folder1/folder11/folder111/img_111a.jpg",
"XResolution": 72,
"YResolution": 72,
"ResolutionUnit": 2,
"Artist": "Artist of medias/folder1/folder11/folder111/img_111a.jpg",
"YCbCrPositioning": 1,
"XPTitle": "XPTitle of medias/folder1/folder11/folder111/img_111a.jpg\u0000",
"XPComment": "XPComment of medias/folder1/folder11/folder111/img_111a.jpg\u0000",
"XPAuthor": "XPAuthor of medias/folder1/folder11/folder111/img_111a.jpg\u0000"
}
},
{
"name": "img_111b.png",
"description": ""
}
],
"sumPhotos": 2
},
{
"path": "folder1\\folder11\\folder112",
"name": "folder112",
"parents": [
{
"path": "",
"name": "",
"metadata": {
"title": "undefined",
"description": "undefined",
"author": "undefined",
"showInParent": "undefined"
}
},
{
"path": "folder1",
"name": "folder1",
"metadata": {
"title": "undefined",
"description": "undefined",
"author": "undefined",
"showInParent": "undefined"
}
},
{
"path": "folder1\\folder11",
"name": "folder11",
"metadata": {
"title": "Title of the folder 11",
"description": "undefined",
"author": "undefined",
"showInParent": "undefined"
}
}
],
"metadata": {
"title": "undefined",
"description": "undefined",
"author": "undefined",
"showInParent": "undefined"
},
"albums": [],
"photos": [
{
"name": "img_112a.jpg",
"description": "",
"exif": {
"ImageDescription": "ImageDescription of medias/folder1/folder11/folder112/img_112a.jpg",
"XResolution": 72,
"YResolution": 72,
"ResolutionUnit": 2,
"Artist": "Artist of medias/folder1/folder11/folder112/img_112a.jpg",
"YCbCrPositioning": 1,
"XPTitle": "XPTitle of medias/folder1/folder11/folder112/img_112a.jpg\u0000",
"XPComment": "XPComment of medias/folder1/folder11/folder112/img_112a.jpg\u0000",
"XPAuthor": "XPAuthor of medias/folder1/folder11/folder112/img_112a.jpg\u0000"
}
}
],
"sumPhotos": 1
}
],
"photos": [],
"sumPhotos": 3
},
{
"path": "folder1\\folder12",
"name": "folder12",
"parents": [
{
"path": "",
"name": "",
"metadata": {
"title": "undefined",
"description": "undefined",
"author": "undefined",
"showInParent": "undefined"
}
},
{
"path": "folder1",
"name": "folder1",
"metadata": {
"title": "undefined",
"description": "undefined",
"author": "undefined",
"showInParent": "undefined"
}
}
],
"metadata": {
"title": "undefined",
"description": "undefined",
"author": "undefined",
"showInParent": "undefined"
},
"albums": [],
"photos": [
{
"name": "img_12a.jpg",
"description": "",
"exif": {
"ImageDescription": "ImageDescription of medias/folder1/folder12/img_12a.jpg",
"XResolution": 72,
"YResolution": 72,
"ResolutionUnit": 2,
"Artist": "Artist of medias/folder1/folder12/img_12a.jpg",
"YCbCrPositioning": 1,
"XPTitle": "XPTitle of medias/folder1/folder12/img_12a.jpg\u0000",
"XPComment": "XPComment of medias/folder1/folder12/img_12a.jpg\u0000",
"XPAuthor": "XPAuthor of medias/folder1/folder12/img_12a.jpg\u0000"
}
}
],
"sumPhotos": 1
}
],
"photos": [],
"sumPhotos": 4
},
{
"path": "folder2",
"name": "folder2",
"parents": [
{
"path": "",
"name": "",
"metadata": {
"title": "undefined",
"description": "undefined",
"author": "undefined",
"showInParent": "undefined"
}
}
],
"metadata": {
"title": "undefined",
"description": "undefined",
"author": "undefined",
"showInParent": "undefined"
},
"albums": [],
"photos": [
{
"name": "img_2a.jpg",
"description": "",
"exif": {
"ImageDescription": "ImageDescription of medias/folder2/img_2a.jpg",
"XResolution": 72,
"YResolution": 72,
"ResolutionUnit": 2,
"Artist": "Artist of medias/folder2/img_2a.jpg",
"YCbCrPositioning": 1,
"XPTitle": "XPTitle of medias/folder2/img_2a.jpg\u0000",
"XPComment": "XPComment of medias/folder2/img_2a.jpg\u0000",
"XPAuthor": "XPAuthor of medias/folder2/img_2a.jpg\u0000"
}
}
],
"sumPhotos": 1
}
],
"photos": [
{
"name": "img_a.jpg",
"description": "",
"exif": {
"ImageDescription": "ImageDescription of medias/img_a.jpg",
"XResolution": 72,
"YResolution": 72,
"ResolutionUnit": 2,
"Artist": "Artist of medias/img_a.jpg",
"YCbCrPositioning": 1,
"XPTitle": "XPTitle of medias/img_a.jpg\u0000",
"XPComment": "XPComment of medias/img_a.jpg\u0000",
"XPAuthor": "XPAuthor of medias/img_a.jpg\u0000"
}
}
],
"sumPhotos": 6
},
"isChild": false
}
Contributing
In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using Grunt.
Release History
0.0.2
- Features
- Exif data are available to the tempate, if the exif-parser module is present.
- Modifications of the data's structure.
- Total photo number is available to the tempate.
- Do not create empty gallery.
- Metadata files are used in a generic way.
- Add debug option.
- Technical
- Use more grunt functions.
- Use node functions for path manipulation.
0.0.1
- Initial release