pkgsrc-WIP-changes archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Rename fgallery to efgallery as it is the start of a version 2.x of the venerable version 1.x fgallery line which will not be maintained anymore. Hence use a new MASTER_SITE which obviates the need for all those large patch files.
- To: pkgsrc-wip-changes%NetBSD.org@localhost
- Subject: Rename fgallery to efgallery as it is the start of a version 2.x of the venerable version 1.x fgallery line which will not be maintained anymore. Hence use a new MASTER_SITE which obviates the need for all those large patch files.
- From: ast <ast%NetBSD.org@localhost>
- Date: Sun, 13 May 2018 13:45:49 +0000
Module Name: pkgsrc-wip
Committed By: ast <ast%NetBSD.org@localhost>
Pushed By: ast
Date: Sun May 13 15:45:49 2018 +0200
Changeset: c1f1bd05b72b5da75ce637e00ec1629c961265a9
Modified Files:
Makefile
Added Files:
efgallery/DESCR
efgallery/Makefile
efgallery/PLIST
efgallery/distinfo
efgallery/files/noscript.css
efgallery/files/overview.css
efgallery/files/overview.html
efgallery/files/overview.js
efgallery/files/overview.png
Removed Files:
fgallery/DESCR
fgallery/Makefile
fgallery/PLIST
fgallery/distinfo
fgallery/files/noscript.css
fgallery/files/overview.css
fgallery/files/overview.html
fgallery/files/overview.js
fgallery/files/overview.png
fgallery/patches/patch-fgallery
fgallery/patches/patch-view_index.css
fgallery/patches/patch-view_index.html
fgallery/patches/patch-view_index.js
Log Message:
Rename fgallery to efgallery as it is the start of a version 2.x
of the venerable version 1.x fgallery line which will not be
maintained anymore. Hence use a new MASTER_SITE which obviates the
need for all those large patch files.
To see a diff of this commit:
https://wip.pkgsrc.org/cgi-bin/gitweb.cgi?p=pkgsrc-wip.git;a=commitdiff;h=c1f1bd05b72b5da75ce637e00ec1629c961265a9
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
diffstat:
Makefile | 2 +-
efgallery/DESCR | 16 +
efgallery/Makefile | 88 +++++
efgallery/PLIST | 27 ++
efgallery/distinfo | 6 +
efgallery/files/noscript.css | 64 ++++
efgallery/files/overview.css | 53 +++
efgallery/files/overview.html | 14 +
efgallery/files/overview.js | 46 +++
efgallery/files/overview.png | Bin 0 -> 196 bytes
fgallery/DESCR | 20 --
fgallery/Makefile | 90 -----
fgallery/PLIST | 31 --
fgallery/distinfo | 10 -
fgallery/files/noscript.css | 64 ----
fgallery/files/overview.css | 53 ---
fgallery/files/overview.html | 14 -
fgallery/files/overview.js | 46 ---
fgallery/files/overview.png | Bin 196 -> 0 bytes
fgallery/patches/patch-fgallery | 597 ---------------------------------
fgallery/patches/patch-view_index.css | 27 --
fgallery/patches/patch-view_index.html | 36 --
fgallery/patches/patch-view_index.js | 522 ----------------------------
23 files changed, 315 insertions(+), 1511 deletions(-)
diffs:
diff --git a/Makefile b/Makefile
index cc50cad1b6..d71769f95c 100644
--- a/Makefile
+++ b/Makefile
@@ -659,6 +659,7 @@ SUBDIR+= edb-debugger-git
SUBDIR+= edbrowse
SUBDIR+= edelib
SUBDIR+= eduke32
+SUBDIR+= efgallery
SUBDIR+= efltk
SUBDIR+= eic
SUBDIR+= eina-musicplayer
@@ -776,7 +777,6 @@ SUBDIR+= fftjet
SUBDIR+= fftw-mpich
SUBDIR+= fftw-openmpi
SUBDIR+= fftw2-openmpi
-SUBDIR+= fgallery
SUBDIR+= fiche
SUBDIR+= file-roller
SUBDIR+= filelight
diff --git a/efgallery/DESCR b/efgallery/DESCR
new file mode 100644
index 0000000000..9036b4430c
--- /dev/null
+++ b/efgallery/DESCR
@@ -0,0 +1,16 @@
+Efgallery is a static photo gallery generator in Perl with a minimalist
+look and feel: it shows your photos, and optionally detects faces
+so they aren't cropped in the thumbnails.
+
+Efgallery stands for "extended fgallery" as it was inspired from
+the fgallery 1.x version.
+
+You can see an example galleries at the following addresses:
+
+https://marabu.ch/efgallery/demo/ (efgallery)
+https://alexschroeder.ch/gallery/ (sitelen-mute)
+http://www.thregr.org/~wavexx/software/fgallery/demo/ (fgallery 1.x)
+
+There is no server-side processing, only static generation. The
+resulting gallery can be uploaded anywhere without any additional
+requirements on the web server or browser.
diff --git a/efgallery/Makefile b/efgallery/Makefile
new file mode 100644
index 0000000000..9d65fe2c96
--- /dev/null
+++ b/efgallery/Makefile
@@ -0,0 +1,88 @@
+# $NetBSD$
+
+PORTVERSION= 2.1
+PKGBASE= efgallery
+DISTNAME= ${PKGBASE}-${PORTVERSION}
+PKGREVISION= 1
+CATEGORIES= www
+
+MASTER_SITES= ${MASTER_SITE_GITHUB:=0-ast-0/}
+GITHUB_PROJECT= ${PKGBASE}
+GITHUB_TAG= ${PORTVERSION}
+
+MAINTAINER= ast%NetBSD.org@localhost
+HOMEPAGE= https://github.com/0-ast-0/efgallery
+COMMENT= Minimilistic photo gallery generator in Perl
+LICENSE= gnu-gpl-v2
+
+NO_BUILD= yes
+USE_TOOLS+= perl
+REPLACE_PERL= ${PKGBASE}
+
+DEPENDS+= facedetect>=0.1:../../wip/facedetect
+DEPENDS+= ImageMagick>=6.9:../../graphics/ImageMagick
+DEPENDS+= jpegoptim>=1.4:../../graphics/jpegoptim
+DEPENDS+= pngcrush>=1.7:../../graphics/pngcrush
+DEPENDS+= lcms2>=2.7:../../graphics/lcms2
+DEPENDS+= p7zip>=9.38:../../archivers/p7zip
+DEPENDS+= p5-Image-ExifTool>=10.0:../../graphics/p5-Image-ExifTool
+
+EFG_SHAREDIR= share/${PKGBASE}
+EFG_VIEWDIR= share/${PKGBASE}/view
+
+SUBST_CLASSES+= fix-paths
+SUBST_STAGE.fix-paths= post-patch
+SUBST_MESSAGE.fix-paths= Fixing ${EFG_VIEWDIR} path.
+SUBST_FILES.fix-paths= efgallery
+SUBST_SED.fix-paths= -e "s,%%EFG_VIEWDIR%%,${PREFIX}/${EFG_VIEWDIR},g"
+
+SUBST_CLASSES+= fix-vers
+SUBST_STAGE.fix-vers= post-patch
+SUBST_MESSAGE.fix-vers= Setting version to ${PKGVERSION:C/^.*-//}.
+SUBST_FILES.fix-vers= efgallery
+SUBST_SED.fix-vers= -e "s,\"${PORTVERSION}\",\"${PKGVERSION:C/^.*-//}\","
+
+EFG_DOCS= COPYING.txt README.md
+EFG_SRCDIR= ${WRKDIR}/${DISTNAME}
+EFG_VIEWFILES= back.png \
+ cap-always.png \
+ cap-never.png \
+ cap-normal.png \
+ cut-left.png \
+ cut-mov.png \
+ cut-right.png \
+ cut-top.png \
+ download.png \
+ eye.png \
+ index.css \
+ index.html \
+ index.js \
+ mootools-core-1.4.js \
+ mootools-idle.js \
+ mootools-mooswipe.js \
+ mootools-more-1.4.js \
+ noise.png \
+ throbber.gif \
+ overview.html \
+ overview.js \
+ overview.png
+
+INSTALLATION_DIRS= bin ${PKGMANDIR}/man1 ${EFG_SHAREDIR} ${EFG_VIEWDIR}
+
+do-install:
+ ${INSTALL_SCRIPT} ${EFG_SRCDIR}/${PKGBASE} \
+ ${DESTDIR}${PREFIX}/bin/${PKGBASE}
+ ${INSTALL_MAN} ${WRKSRC}/efgallery.1 \
+ ${DESTDIR}${PREFIX}/${PKGMANDIR}/man1
+
+post-install:
+.for file in ${EFG_DOCS}
+ ${INSTALL_DATA} ${EFG_SRCDIR}/${file} \
+ ${DESTDIR}${PREFIX}/${EFG_SHAREDIR}
+.endfor
+.for file in ${EFG_VIEWFILES}
+ ${INSTALL_DATA} ${EFG_SRCDIR}/view/${file} \
+ ${DESTDIR}${PREFIX}/${EFG_VIEWDIR}
+.endfor
+
+.include "../../mk/bsd.pkg.mk"
diff --git a/efgallery/PLIST b/efgallery/PLIST
new file mode 100644
index 0000000000..83461ae2f8
--- /dev/null
+++ b/efgallery/PLIST
@@ -0,0 +1,27 @@
+@comment $NetBSD$
+bin/efgallery
+man/man1/efgallery.1
+share/efgallery/COPYING.txt
+share/efgallery/README.md
+share/efgallery/view/back.png
+share/efgallery/view/cap-always.png
+share/efgallery/view/cap-never.png
+share/efgallery/view/cap-normal.png
+share/efgallery/view/cut-left.png
+share/efgallery/view/cut-mov.png
+share/efgallery/view/cut-right.png
+share/efgallery/view/cut-top.png
+share/efgallery/view/download.png
+share/efgallery/view/eye.png
+share/efgallery/view/index.css
+share/efgallery/view/index.html
+share/efgallery/view/index.js
+share/efgallery/view/mootools-core-1.4.js
+share/efgallery/view/mootools-idle.js
+share/efgallery/view/mootools-mooswipe.js
+share/efgallery/view/mootools-more-1.4.js
+share/efgallery/view/noise.png
+share/efgallery/view/overview.html
+share/efgallery/view/overview.js
+share/efgallery/view/overview.png
+share/efgallery/view/throbber.gif
diff --git a/efgallery/distinfo b/efgallery/distinfo
new file mode 100644
index 0000000000..246f071a7f
--- /dev/null
+++ b/efgallery/distinfo
@@ -0,0 +1,6 @@
+$NetBSD$
+
+SHA1 (efgallery-2.1.tar.gz) = 027cb81fcb5b5890e12330aad7dcc5c5791b9344
+RMD160 (efgallery-2.1.tar.gz) = aa0f29ec542aeb16510b2d0f0d949fad591064ef
+SHA512 (efgallery-2.1.tar.gz) = bef104c06964ec59ddd80926b8210db3ba9cf558648d19309cd95a9dd1469be1399a21d5a4a7218991275cec841e2276f1053e1e01285fba251b208a5762b0e3
+Size (efgallery-2.1.tar.gz) = 145941 bytes
diff --git a/efgallery/files/noscript.css b/efgallery/files/noscript.css
new file mode 100644
index 0000000000..8d03d5ed0f
--- /dev/null
+++ b/efgallery/files/noscript.css
@@ -0,0 +1,64 @@
+/* noscript environment, based on https://css-tricks.com/seamless-responsive-photo-grid/ */
+html, body
+{
+ overflow: hidden; /* IE<9 */
+ padding: 0;
+ margin: 0;
+ border: 0;
+ height: 100.1% /* IOS>7.1 meta viewport minimal-ui to hide menu + bars */
+}
+
+body
+{
+ overflow: scroll;
+ background-color: #eee;
+}
+
+#photos {
+ /* Prevent vertical gaps */
+ line-height: 0;
+ -webkit-column-count: 8;
+ -webkit-column-gap: 0px;
+ -moz-column-count: 8;
+ -moz-column-gap: 0px;
+ column-count: 8;
+ column-gap: 0px;
+}
+
+#photos img {
+ /* Just in case there are inline attributes */
+ width: 100% !important;
+ height: auto !important;
+}
+
+@media (max-width: 1200px) {
+ #photos {
+ -moz-column-count: 7;
+ -webkit-column-count: 7;
+ column-count: 7;
+ }
+}
+
+@media (max-width: 1000px) {
+ #photos {
+ -moz-column-count: 6;
+ -webkit-column-count: 6;
+ column-count: 6;
+ }
+}
+
+@media (max-width: 800px) {
+ #photos {
+ -moz-column-count: 5;
+ -webkit-column-count: 5;
+ column-count: 5;
+ }
+}
+
+@media (max-width: 400px) {
+ #photos {
+ -moz-column-count: 3;
+ -webkit-column-count: 3;
+ column-count: 3;
+ }
+}
diff --git a/efgallery/files/overview.css b/efgallery/files/overview.css
new file mode 100644
index 0000000000..05732fa935
--- /dev/null
+++ b/efgallery/files/overview.css
@@ -0,0 +1,53 @@
+html, body
+{
+ overflow: hidden; /* IE<9 */
+ padding: 0;
+ margin: 0;
+ border: 0;
+ height: 100.1% /* IOS>7.1 meta viewport minimal-ui to hide menu + bars */
+}
+
+body
+{
+ overflow: scroll;
+ background-color: #eee;
+}
+
+#overview
+{
+ margin: 1em;
+}
+
+.overview-img-div
+{
+ display: inline-block;
+ margin: 0.5em;
+}
+
+.overview-img, .overview-img-div
+{
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+}
+
+.overview-img-div {
+ display: inline-block;
+ background: black;
+ padding: 0;
+ box-shadow: 5px 5px 15px #888;
+}
+
+.overview-img-div img {
+ display: block;
+
+ -webkit-transition: all 0.05s linear;
+ -moz-transition: all 0.05s linear;
+ -ms-transition: all 0.05s linear;
+ -o-transition: all 0.05s linear;
+ transition: all 0.05s linear;
+}
+
+.overview-img-div:hover img {
+ opacity: 0.7;
+}
diff --git a/efgallery/files/overview.html b/efgallery/files/overview.html
new file mode 100755
index 0000000000..39ae999808
--- /dev/null
+++ b/efgallery/files/overview.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <meta name="viewport" content="width=device-width,initial-scale=1,minimal-ui" />
+ <noscript>
+ <meta http-equiv="refresh" content="0;url=noscript.html" />
+ </noscript>
+ <script src="mootools-core-1.4.js" type="text/javascript"></script>
+ <script src="overview.js" type="text/javascript"></script>
+ <link href="overview.css" rel="stylesheet" type="text/css" />
+ </head>
+ <body><div id="overview"></div></body>
+</html>
diff --git a/efgallery/files/overview.js b/efgallery/files/overview.js
new file mode 100644
index 0000000000..ac55ff37e4
--- /dev/null
+++ b/efgallery/files/overview.js
@@ -0,0 +1,46 @@
+var datafile = '../data.json';
+
+function initOverview(data)
+{
+ emain = $('overview');
+ data.data.each(function(x, i) {
+ emain.grab(new Element('div', {
+ 'class': 'overview-img-div'
+ }).grab(new Element('a', {
+ 'href': '../index.html#' + i
+ }).grab(new Element('img', {
+ 'class': 'overview-img',
+ 'src': '../' + x.thumb[0]
+ }))))
+ });
+};
+
+function initFailure()
+{
+ emain = $('overview');
+ emain.set('html', "<h2>Cannot load gallery data :'(</h2>");
+ emain.setStyles(
+ {
+ 'background': 'inherit',
+ 'display': 'block'
+ });
+}
+
+window.addEvent("domready", function() {
+ new Request.JSON(
+ {
+ url: datafile,
+ onRequest: function()
+ {
+ if(this.xhr.overrideMimeType)
+ this.xhr.overrideMimeType('application/json');
+ },
+ isSuccess: function()
+ {
+ return (!this.status || (this.status >= 200 && this.status < 300));
+ },
+ onSuccess: initOverview,
+ onFailure: initFailure
+ }).get();
+});
+
diff --git a/efgallery/files/overview.png b/efgallery/files/overview.png
new file mode 100644
index 0000000000..a1bd7320dd
Binary files /dev/null and b/efgallery/files/overview.png differ
diff --git a/fgallery/DESCR b/fgallery/DESCR
deleted file mode 100644
index d9c41701df..0000000000
--- a/fgallery/DESCR
+++ /dev/null
@@ -1,20 +0,0 @@
-Fgallery is a minimalist javascript photo gallery.
-
-It is a static photo gallery generator with no frills that has a
-stylish, minimalist look: it shows your photos, and nothing else.
-
-You can see an example gallery at the following address:
-
-http://www.thregr.org/~wavexx/software/fgallery/demo/
-
-There is no server-side processing, only static generation. The
-resulting gallery can be uploaded anywhere without additional
-requirements and works with any modern browser.
-
-- Automatically orients pictures without quality loss.
-- Multi-camera friendly: automatically sorts pictures by time.
-- Adapts to the current screen size and aspect.
-- Supports face detection for improved thumbnail centering.
-- Loads fast! Especially over slow connections.
-- Can original (raw) pictures in a zip file for downloading.
-- Panoramas can be seen full-size by default.
diff --git a/fgallery/Makefile b/fgallery/Makefile
deleted file mode 100644
index 374bdb220f..0000000000
--- a/fgallery/Makefile
+++ /dev/null
@@ -1,90 +0,0 @@
-# $NetBSD$
-
-PORTVERSION= 1.8.2
-PKGBASE= fgallery
-DISTNAME= ${PKGBASE}-${PORTVERSION}
-PKGREVISION= 4
-CATEGORIES= www
-
-MASTER_SITES= http://www.thregr.org/~wavexx/software/fgallery/releases/
-EXTRACT_SUFX= .zip
-
-MAINTAINER= ast%NetBSD.org@localhost
-HOMEPAGE= http://www.thregr.org/~wavexx/software/fgallery
-COMMENT= Minimilistic, static photo gallery generator
-LICENSE= gnu-gpl-v2
-
-NO_BUILD= yes
-USE_TOOLS+= perl
-REPLACE_PERL= ${PKGBASE}
-
-DEPENDS+= facedetect>=0.1:../../wip/facedetect
-DEPENDS+= ImageMagick>=6.9:../../graphics/ImageMagick
-DEPENDS+= jpegoptim>=1.4:../../graphics/jpegoptim
-DEPENDS+= pngcrush>=1.7:../../graphics/pngcrush
-DEPENDS+= lcms2>=2.7:../../graphics/lcms2
-DEPENDS+= p7zip>=9.38:../../archivers/p7zip
-DEPENDS+= p5-Image-ExifTool>=10.0:../../graphics/p5-Image-ExifTool
-
-FG_SHAREDIR= share/${PKGBASE}
-FG_VIEWDIR= share/${PKGBASE}/view
-
-SUBST_CLASSES+= fix-paths
-SUBST_STAGE.fix-paths= post-patch
-SUBST_MESSAGE.fix-paths= Fixing ${FG_VIEWDIR} path.
-SUBST_FILES.fix-paths= fgallery
-SUBST_SED.fix-paths= -e "s,%%FG_VIEWDIR%%,${PREFIX}/${FG_VIEWDIR},g"
-
-SUBST_CLASSES+= fix-vers
-SUBST_STAGE.fix-vers= post-patch
-SUBST_MESSAGE.fix-vers= Setting version to ${PKGVERSION:C/^.*-//}.
-SUBST_FILES.fix-vers= fgallery
-SUBST_SED.fix-vers= -e "s,\"${PORTVERSION}\",\"${PKGVERSION:C/^.*-//}\","
-
-FG_DOCS= COPYING.txt NEWS.html NEWS.rst README.html README.rst
-FG_SRCDIR= ${WRKDIR}/${DISTNAME}
-FG_VIEWFILES= back.png \
- cap-always.png \
- cap-never.png \
- cap-normal.png \
- cut-left.png \
- cut-mov.png \
- cut-right.png \
- cut-top.png \
- download.png \
- eye.png \
- index.css \
- index.html \
- index.js \
- mootools-core-1.4.js \
- mootools-idle.js \
- mootools-mooswipe.js \
- mootools-more-1.4.js \
- noise.png \
- throbber.gif
-
-OV_FILES= overview.css \
- overview.html \
- overview.js \
- overview.png \
- noscript.css
-
-INSTALLATION_DIRS= bin ${FG_SHAREDIR} ${FG_VIEWDIR}
-
-pre-patch:
-.for file in ${OV_FILES}
- ${CP} ${FILESDIR}/${file} ${WRKSRC}/view
-.endfor
-
-do-install:
- ${INSTALL_SCRIPT} ${FG_SRCDIR}/${PKGBASE} ${DESTDIR}${PREFIX}/bin/${PKGBASE}
-
-post-install:
-.for file in ${FG_DOCS}
- ${INSTALL_DATA} ${FG_SRCDIR}/${file} ${DESTDIR}${PREFIX}/${FG_SHAREDIR}
-.endfor
-.for file in ${FG_VIEWFILES} ${OV_FILES}
- ${INSTALL_DATA} ${FG_SRCDIR}/view/${file} ${DESTDIR}${PREFIX}/${FG_VIEWDIR}
-.endfor
-
-.include "../../mk/bsd.pkg.mk"
diff --git a/fgallery/PLIST b/fgallery/PLIST
deleted file mode 100644
index 04e7bf5c2b..0000000000
--- a/fgallery/PLIST
+++ /dev/null
@@ -1,31 +0,0 @@
-@comment $NetBSD$
-bin/fgallery
-share/fgallery/COPYING.txt
-share/fgallery/NEWS.html
-share/fgallery/NEWS.rst
-share/fgallery/README.html
-share/fgallery/README.rst
-share/fgallery/view/back.png
-share/fgallery/view/cap-always.png
-share/fgallery/view/cap-never.png
-share/fgallery/view/cap-normal.png
-share/fgallery/view/cut-left.png
-share/fgallery/view/cut-mov.png
-share/fgallery/view/cut-right.png
-share/fgallery/view/cut-top.png
-share/fgallery/view/download.png
-share/fgallery/view/eye.png
-share/fgallery/view/index.css
-share/fgallery/view/index.html
-share/fgallery/view/index.js
-share/fgallery/view/mootools-core-1.4.js
-share/fgallery/view/mootools-idle.js
-share/fgallery/view/mootools-mooswipe.js
-share/fgallery/view/mootools-more-1.4.js
-share/fgallery/view/noise.png
-share/fgallery/view/noscript.css
-share/fgallery/view/overview.css
-share/fgallery/view/overview.html
-share/fgallery/view/overview.js
-share/fgallery/view/overview.png
-share/fgallery/view/throbber.gif
diff --git a/fgallery/distinfo b/fgallery/distinfo
deleted file mode 100644
index 5bee7babe5..0000000000
--- a/fgallery/distinfo
+++ /dev/null
@@ -1,10 +0,0 @@
-$NetBSD$
-
-SHA1 (fgallery-1.8.2.zip) = a4164160f9e7d70fe1b135f11e175e8a470a94f2
-RMD160 (fgallery-1.8.2.zip) = 959854b675a813379e78d8e66022dd2f56e30561
-SHA512 (fgallery-1.8.2.zip) = 1e782b86c74b7cafbb61e46f346b2e42dab9cc3133cf8cedef827f916b5eb29316d86a52020305b56a42fa9d6555423b9d5a175dac4446a0f7f5d538beb9311f
-Size (fgallery-1.8.2.zip) = 158562 bytes
-SHA1 (patch-fgallery) = f0536a948a24849cc3b4821aa3b0e6c7fe4dc3b1
-SHA1 (patch-view_index.css) = 562587d10dc72d8a22a9577cba9cc63fa9473c86
-SHA1 (patch-view_index.html) = 6ea26e75ee14d5d6825ebab6e647f37853ed1382
-SHA1 (patch-view_index.js) = b8deb226c5ade199440565f87ae0e38c62b4bad4
diff --git a/fgallery/files/noscript.css b/fgallery/files/noscript.css
deleted file mode 100644
index 8d03d5ed0f..0000000000
--- a/fgallery/files/noscript.css
+++ /dev/null
@@ -1,64 +0,0 @@
-/* noscript environment, based on https://css-tricks.com/seamless-responsive-photo-grid/ */
-html, body
-{
- overflow: hidden; /* IE<9 */
- padding: 0;
- margin: 0;
- border: 0;
- height: 100.1% /* IOS>7.1 meta viewport minimal-ui to hide menu + bars */
-}
-
-body
-{
- overflow: scroll;
- background-color: #eee;
-}
-
-#photos {
- /* Prevent vertical gaps */
- line-height: 0;
- -webkit-column-count: 8;
- -webkit-column-gap: 0px;
- -moz-column-count: 8;
- -moz-column-gap: 0px;
- column-count: 8;
- column-gap: 0px;
-}
-
-#photos img {
- /* Just in case there are inline attributes */
- width: 100% !important;
- height: auto !important;
-}
-
-@media (max-width: 1200px) {
- #photos {
- -moz-column-count: 7;
- -webkit-column-count: 7;
- column-count: 7;
- }
-}
-
-@media (max-width: 1000px) {
- #photos {
- -moz-column-count: 6;
- -webkit-column-count: 6;
- column-count: 6;
- }
-}
-
-@media (max-width: 800px) {
- #photos {
- -moz-column-count: 5;
- -webkit-column-count: 5;
- column-count: 5;
- }
-}
-
-@media (max-width: 400px) {
- #photos {
- -moz-column-count: 3;
- -webkit-column-count: 3;
- column-count: 3;
- }
-}
diff --git a/fgallery/files/overview.css b/fgallery/files/overview.css
deleted file mode 100644
index 05732fa935..0000000000
--- a/fgallery/files/overview.css
+++ /dev/null
@@ -1,53 +0,0 @@
-html, body
-{
- overflow: hidden; /* IE<9 */
- padding: 0;
- margin: 0;
- border: 0;
- height: 100.1% /* IOS>7.1 meta viewport minimal-ui to hide menu + bars */
-}
-
-body
-{
- overflow: scroll;
- background-color: #eee;
-}
-
-#overview
-{
- margin: 1em;
-}
-
-.overview-img-div
-{
- display: inline-block;
- margin: 0.5em;
-}
-
-.overview-img, .overview-img-div
-{
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
-}
-
-.overview-img-div {
- display: inline-block;
- background: black;
- padding: 0;
- box-shadow: 5px 5px 15px #888;
-}
-
-.overview-img-div img {
- display: block;
-
- -webkit-transition: all 0.05s linear;
- -moz-transition: all 0.05s linear;
- -ms-transition: all 0.05s linear;
- -o-transition: all 0.05s linear;
- transition: all 0.05s linear;
-}
-
-.overview-img-div:hover img {
- opacity: 0.7;
-}
diff --git a/fgallery/files/overview.html b/fgallery/files/overview.html
deleted file mode 100755
index 39ae999808..0000000000
--- a/fgallery/files/overview.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- <meta name="viewport" content="width=device-width,initial-scale=1,minimal-ui" />
- <noscript>
- <meta http-equiv="refresh" content="0;url=noscript.html" />
- </noscript>
- <script src="mootools-core-1.4.js" type="text/javascript"></script>
- <script src="overview.js" type="text/javascript"></script>
- <link href="overview.css" rel="stylesheet" type="text/css" />
- </head>
- <body><div id="overview"></div></body>
-</html>
diff --git a/fgallery/files/overview.js b/fgallery/files/overview.js
deleted file mode 100644
index ac55ff37e4..0000000000
--- a/fgallery/files/overview.js
+++ /dev/null
@@ -1,46 +0,0 @@
-var datafile = '../data.json';
-
-function initOverview(data)
-{
- emain = $('overview');
- data.data.each(function(x, i) {
- emain.grab(new Element('div', {
- 'class': 'overview-img-div'
- }).grab(new Element('a', {
- 'href': '../index.html#' + i
- }).grab(new Element('img', {
- 'class': 'overview-img',
- 'src': '../' + x.thumb[0]
- }))))
- });
-};
-
-function initFailure()
-{
- emain = $('overview');
- emain.set('html', "<h2>Cannot load gallery data :'(</h2>");
- emain.setStyles(
- {
- 'background': 'inherit',
- 'display': 'block'
- });
-}
-
-window.addEvent("domready", function() {
- new Request.JSON(
- {
- url: datafile,
- onRequest: function()
- {
- if(this.xhr.overrideMimeType)
- this.xhr.overrideMimeType('application/json');
- },
- isSuccess: function()
- {
- return (!this.status || (this.status >= 200 && this.status < 300));
- },
- onSuccess: initOverview,
- onFailure: initFailure
- }).get();
-});
-
diff --git a/fgallery/files/overview.png b/fgallery/files/overview.png
deleted file mode 100644
index a1bd7320dd..0000000000
Binary files a/fgallery/files/overview.png and /dev/null differ
diff --git a/fgallery/patches/patch-fgallery b/fgallery/patches/patch-fgallery
deleted file mode 100644
index a80ab9a576..0000000000
--- a/fgallery/patches/patch-fgallery
+++ /dev/null
@@ -1,597 +0,0 @@
-$NetBSD$
-
-Merge from https://raw.githubusercontent.com/wavexx/fgallery/master/fgallery
-Use a "cmd_exists" for tests of existence of commands in given environment
-Use oct instead of 0### and don't return undef explicitely (Perl::Critic)
-Adaptions for keeping all fgallery files in view subdirectory
-Pretty print json for easier customization
-
---- fgallery.orig 2016-05-25 09:53:19.000000000 +0000
-+++ fgallery
-@@ -8,6 +8,8 @@ use warnings;
-
- use locale;
- use utf8;
-+use if $^V lt v5.23.4, open => qw{:std :utf8};
-+use if $^V ge v5.23.4, open => qw{:std :locale};
- require Encode;
- require encoding;
-
-@@ -20,25 +22,20 @@ use Fcntl;
- use File::Basename qw{fileparse};
- use File::Find qw{find};
- use File::Path qw{make_path remove_tree};
--use File::Spec::Functions qw{rel2abs};
--use FindBin qw{$RealBin};
-+use File::Spec::Functions qw{rel2abs canonpath catfile};
- use Getopt::Long qw{:config bundling};
- use IO::Handle;
- use Image::ExifTool qw{ImageInfo};
- use Time::Piece;
-
--# We require either Cpanel::JSON::XS or JSON::PP (JSON::XS does not support ithreads)
--my $JSON_cls = eval { require Cpanel::JSON::XS; "Cpanel::JSON::XS"; } //
-- eval { require JSON::PP; "JSON::PP"; } //
-- fatal("either Cpanel::JSON::XS or JSON::PP is required");
--$JSON_cls->import(qw{encode_json});
-+use JSON::PP;
-
- # constants
- our $VERSION = "1.8.2";
- our $ENCODING = encoding::_get_locale_encoding() || 'UTF-8';
-
- # defaults
--my $mode = 0644;
-+my $mode = oct(644);
- my $slim = 0;
- my $ofile = 0;
- my $orient = 1;
-@@ -55,6 +52,7 @@ my $fullpano = 1;
- my $nodown = 0;
- my $panort = 2.;
- my $facedet = 0;
-+my $keeporig = 0;
- my $jpegoptim = 1;
- my $pngoptim = 1;
- my $p7zip = 1;
-@@ -63,6 +61,8 @@ my $workers = 0;
- my $sRGB = 1;
- my $indexUrl = undef;
- my @capmethods = ("txt", "xmp", "exif");
-+my $use_symlinks = 0;
-+my $do_blur = 1;
-
-
- # support functions
-@@ -73,6 +73,14 @@ sub fatal
- }
-
-
-+# see if our environment has a given command installed
-+sub cmd_exists
-+{
-+ my ($c) = @_;
-+ return qx{/bin/sh -c "command -v $c"};
-+}
-+
-+
- sub sys
- {
- my @cmd = @_;
-@@ -87,13 +95,13 @@ sub sys
- }
-
- local $/ = undef;
-- my $out = <$fd>;
-+ my $output = <$fd>;
-
- unless(close($fd)) {
- fatal("command \"@cmd\" failed");
- }
-
-- return split("\n", $out);
-+ return split("\n", $output);
- }
-
-
-@@ -110,7 +118,10 @@ sub isin
- sub slurp
- {
- my ($fn) = @_;
-- open(my $fd, "<:encoding($ENCODING)", "$fn") or fatal("cannot read $fn: $!");
-+ open(my $fd, '<', $fn) or fatal("cannot read $fn: $!");
-+ if($^V lt v5.23.4) {
-+ binmode($fd, ":encoding($ENCODING)");
-+ }
- local $/;
- return <$fd> // "";
- }
-@@ -132,7 +143,7 @@ sub dispatch
- my $thr = threads->create(sub
- {
- while(defined(my $v = $queue->dequeue_nb())) {
-- &$fun($v);
-+ &$fun($v);
- }
- });
- push(@threads, $thr);
-@@ -187,7 +198,7 @@ sub clamp
-
- sub decode
- {
-- return Encode::decode($ENCODING, @_);
-+ return Encode::decode($ENCODING, $_[0]);
- }
-
-
-@@ -263,7 +274,7 @@ sub cap_clean_desc
- sub cap_from_str
- {
- my ($title, $desc) = split("\n", shift, 2);
-- return undef if(!$title && !$desc);
-+ return unless $title || $desc;
- my $ret = [cap_clean_title($title), ($desc? cap_clean_desc($desc): '')];
- return $ret;
- }
-@@ -322,32 +333,84 @@ sub parse_cap
-
- sub print_version
- {
-- print("fgallery $VERSION\n");
-+ print("$0 $VERSION\n");
- exit(0);
- }
-
-+sub init_noscript
-+{
-+ my ($d) = @_;
-+ fatal("init_noscript: $d not a directory")
-+ unless $d && -d $d;
-+ my $fd;
-+ my $f = "$d/noscript.html";
-+ unless(open($fd, ">:raw", $f)) {
-+ fatal("init_noscript: cannot write file '$f': $!");
-+ }
-+ chmod($mode, $f);
-+ select $fd;
-+ print join "\n",
-+ '<!DOCTYPE html>',
-+ '<html>',
-+ '<head>',
-+ ' <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />',
-+ ' <meta name="viewport" '
-+ . 'content="width=device-width,initial-scale=1,'
-+ . 'minimum-scale=1,minimal-ui" />',
-+ ' <link href="view/noscript.css" rel="stylesheet" type="text/css" />',
-+ '</head>',
-+ '<body>',
-+ ' <section id="photos">',
-+ '';
-+}
-+
-+sub print_noscript
-+# <a href="imgs/DSC00712.jpg"><img src="thumbs/DSC00712.jpg" alt="c1 c2"></a>
-+{
-+ my ($f, $t, $c) = @_;
-+ return unless @_ == 3 && $f && $t;
-+ $c = [] unless $c && ref $c eq 'ARRAY';
-+ my $x = '';
-+ for (@$c) {
-+ $x .= ' ' if $c =~ /\S$/o;
-+ $x .= $_ if defined $_ && /\S/o;
-+ }
-+ my $a = '';
-+ $a = sprintf ' alt="%s"', $x if $x && $x =~ /\S/o;
-+ printf ' <a href="%s"><img src="%s"%s></a>' . "\n", $f, $t, $a;
-+}
-+
-+sub finish_noscript
-+{
-+ print join "\n", ' </section>', '</body>', '</html>', '';
-+ select STDOUT;
-+}
-+
- sub print_help
- {
- print(STDERR qq{Usage: $0 [options] input-dir output-dir [album name]
-- -h, --help this help
-- --version output current fgallery version
-- -v verbose (show commands as being executed)
-- -s slim output (no original files and downloads)
-- -i include individual originals
-- -c methods caption extraction methods (txt,xmp,exif,cmt or none)
-- -o do not auto-orient
-- -t do not time-sort
-- -r reverse album order
-- -p do not automatically include full-sized panoramas
-- -d do not generate a full album download
-- -f improve thumbnail cutting by performing face detection
-- -j N set process-level parallelism
-- --max-full WxH maximum full image size ($maxfull[0]x$maxfull[1])
-- --max-thumb WxH maximum thumbnail size ($maxthumb[0]x$maxthumb[1])
-- --min-thumb WxH minimum thumbnail size ($minthumb[0]x$minthumb[1])
-- --no-sRGB do not remap preview/thumbnail color profiles to sRGB
-- --quality Q preview image quality (0-100, currently: $imgq)
-- --index url specify the URL location for the index/back button
-+ -h, --help this help
-+ --version output current fgallery version
-+ -v verbose (show commands as being executed)
-+ -s slim output (no original files and downloads)
-+ -i include individual originals
-+ -c methods caption extraction (txt, xmp, exif, cmt, or none)
-+ -o do not auto-orient
-+ -k do not modify files, keep original
-+ -t do not time-sort
-+ -r reverse album order
-+ -p do not automatically include full-sized panoramas
-+ -d do not generate a full album download
-+ -f improve thumbnail cutting by performing face detection
-+ -j N set process-level parallelism
-+ -L symlink %%FG_VIEWDIR%% (instead of copy)
-+ --max-full WxH maximum full image size ($maxfull[0]x$maxfull[1])
-+ --max-thumb WxH maximum thumbnail size ($maxthumb[0]x$maxthumb[1])
-+ --min-thumb WxH minimum thumbnail size ($minthumb[0]x$minthumb[1])
-+ --no-sRGB do not remap preview/thumbnail color profiles to sRGB
-+ --quality Q preview image quality (0-100, currently: $imgq)
-+ --index url specify the URL location for the index/back button
-+ --noblur skip blurry backdrop generation (just dark noise)
- });
- exit(shift);
- }
-@@ -363,17 +426,21 @@ my ($ret, @ARGS) = GetOptions(
- 'i' => sub { $ofile = 1; },
- 'j=i' => sub { $workers = parse_int($_[0], $_[1], 1, undef); },
- 'o' => sub { $orient = 0; },
-+ 'k' => sub { $keeporig = 1; },
- 'p' => sub { $fullpano = 0; },
- 'r' => sub { $revsort = 1; },
- 's' => sub { $slim = 1; },
- 't' => sub { $timesort = 0; },
- 'v' => sub { $verbose = 1; },
-+ 'L' => sub { $use_symlinks = 1; },
- 'max-full=s' => sub { @maxfull = parse_wh(@_); },
- 'max-thumb=s' => sub { @maxthumb = parse_wh(@_); },
- 'min-thumb=s' => sub { @minthumb = parse_wh(@_); },
- 'no-sRGB' => sub { $sRGB = 0; },
- 'quality=i' => sub { $imgq = parse_int($_[0], $_[1], 0, 100); },
-- 'index=s' => sub { $indexUrl = decode($_[1]); });
-+ 'index=s' => sub { $indexUrl = decode($_[1]); },
-+ 'noblur' => sub { $do_blur = 0; },
-+);
-
- if(@ARGV < 2 || @ARGV > 3 || !$ret) {
- print_help(2);
-@@ -383,8 +450,16 @@ my $out = $ARGV[1];
- my $name = (@ARGV < 3? undef: decode($ARGV[2]));
-
- # check paths
--my $absDir = rel2abs($dir) . '/';
--my $absOut = rel2abs($out) . '/';
-+my $absDir = canonpath(rel2abs($dir)) . '/';
-+my $absOut = canonpath(rel2abs($out)) . '/';
-+
-+sub is_fgallery_dir
-+{
-+ return unless -e catfile($out, 'view');
-+ return unless -e catfile($out, 'index.html');
-+ return unless -e catfile($out, 'data.json');
-+ return 1;
-+}
-
- if(!-d $dir) {
- fatal("input directory \"$dir\" does not exist");
-@@ -393,55 +468,37 @@ if(!-d $dir) {
- } elsif(substr($absOut, 0, length($absDir)) eq $absDir) {
- fatal("output directory is a sub-directory of input, refusing to scan");
- } elsif(!-d $out) {
-- sys('cp', '-L', '-R', "$RealBin/view", $out);
--} elsif(!-f "$out/index.html") {
-- fatal("output directory already exists, but doesn't look like a template copy");
-+ mkdir($out);
-+ unless ($use_symlinks) {
-+ sys('cp', '-L', '-R', '%%FG_VIEWDIR%%', $out);
-+ sys('mv', "$out/view/index.html", $out);
-+ }
-+} elsif(!is_fgallery_dir) {
-+ fatal("Output directory '$absOut' exists but wasn't generated by fgallery");
- }
-
- # check tools
--if(system("identify -version >/dev/null 2>&1")
--|| system("convert -version >/dev/null 2>&1")) {
-- fatal("cannot run \"identify\" or \"convert\" (check if ImageMagick is installed)");
--}
--if(system("7za -h >/dev/null 2>&1"))
--{
-+fatal 'Missing identify or convert executable (from ImageMagick)'
-+ unless cmd_exists('identify') || cmd_exists('convert');
-+unless(cmd_exists('7za')) {
- $p7zip = 0;
-- if(system("zip -h >/dev/null 2>&1")) {
-- fatal("cannot run \"zip\" (check if 7za or zip is installed)");
-- }
--}
--if(system("jpegoptim -V >/dev/null 2>&1")) {
-- $jpegoptim = 0;
-+ cmd_exists('zip') || fatal('Missing 7z or zip command');
- }
--if(system("pngcrush -h >/dev/null 2>&1")) {
-- $pngoptim = 0;
--}
--if($facedet && system("facedetect -h >/dev/null 2>&1")) {
-- fatal("cannot run \"facedetect\" (see https://www.thregr.org/~wavexx/software/facedetect/)");
--}
--
--my $tificccmd;
--if($sRGB)
--{
-- if(!system("tificc >/dev/null 2>&1")) {
-- $tificccmd = "tificc";
-- } elsif(!system("tificc2 >/dev/null 2>&1")) {
-- $tificccmd = "tificc2";
-- } else {
-- fatal("cannot run \"tificc\" or \"tificc2\" (check if liblcms2-utils is installed)");
-- }
--}
--
-+$jpegoptim = 0 unless cmd_exists('jpegoptim');
-+$pngoptim = 0 unless cmd_exists('pngcrush');
-+fatal 'Missing facedetect (see http://www.thregr.org/~wavexx/hacks/facedetect/'
-+ if $facedet && !cmd_exists('facedetect');
-+fatal 'Missing tificc executable (from lcms2 library)'
-+ if $sRGB && !cmd_exists('tificc');
-+my $tificccmd = 'tificc';
- my $exiftrancmd;
--if($orient)
-+while($orient)
- {
-- if(!system("exiftran -h >/dev/null 2>&1")) {
-- $exiftrancmd = "exiftran -aip";
-- } elsif(!system("exifautotran >/dev/null 2>&1")) {
-- $exiftrancmd = "exifautotran";
-- } else {
-- fatal("cannot execute exiftran or exifautotran for lossless JPEG autorotation");
-- }
-+ $exiftrancmd = "exiftran -aip" if cmd_exists('exiftran');
-+ last if $exiftrancmd;
-+ $exiftrancmd = "exifautotran" if cmd_exists('exifautotran');
-+ fatal 'Missing exiftran or exifautotran executable for JPEG autorotation'
-+ unless $exiftrancmd;
- }
-
- # list available files
-@@ -475,6 +532,7 @@ my @backsize = (int($minthumb[0] * 4), i
- for my $path("$out/thumbs", "$out/blurs", "$out/imgs", "$out/files")
- {
- remove_tree($path);
-+ next if ($path eq "$out/blurs") && ! $do_blur;
- make_path($path);
- }
-
-@@ -496,7 +554,7 @@ sub analyze_file
-
- my $props = ImageInfo($file, {PrintConv => 0, Sort => 'File'});
- unless(defined($props) && isin($props->{FileType}, @filetypes)) {
-- return undef;
-+ return;
- }
-
- # sanitize file name
-@@ -535,9 +593,9 @@ sub analyze_file
- {
- if($props->{'Comment'})
- {
-- my $cmt = Encode::decode_utf8($props->{'Comment'});
-- $props->{'caption'} = cap_from_str($cmt);
-- last;
-+ my $cmt = Encode::decode_utf8($props->{'Comment'});
-+ $props->{'caption'} = cap_from_str($cmt);
-+ last;
- }
- }
- elsif($m eq "txt")
-@@ -545,16 +603,16 @@ sub analyze_file
- my $txt = "$dir$base.txt";
- if(-f $txt)
- {
-- $props->{'caption'} = cap_from_str(slurp($txt));
-- last;
-+ $props->{'caption'} = cap_from_str(slurp($txt));
-+ last;
- }
- }
- elsif($m eq "exif")
- {
- if($props->{'Title'} || $props->{'Description'})
- {
-- $props->{'caption'} = cap_from_props($props);
-- last;
-+ $props->{'caption'} = cap_from_props($props);
-+ last;
- }
- }
- elsif($m eq "xmp")
-@@ -562,8 +620,8 @@ sub analyze_file
- my $xmp = ImageInfo("$file.xmp", {PrintConv => 0, Sort => 'File'});
- if(defined($xmp) && ($xmp->{'Title'} || $xmp->{'Description'}))
- {
-- $props->{'caption'} = cap_from_props($xmp);
-- last;
-+ $props->{'caption'} = cap_from_props($xmp);
-+ last;
- }
- }
- }
-@@ -635,22 +693,24 @@ sub process_img
-
- # copy source file
- sys('cp', '-L', $file, $fout);
-- chmod(0600, $fout);
-
- # apply lossless transforms
-- if($orient && $props{FileType} eq "JPEG" && ($props{'Orientation'} // 0))
-+ if(!$keeporig)
- {
-- sys("$exiftrancmd $fout 2>/dev/null");
-- if(($props{'Orientation'} // 0) > 4) {
-- ($props{ImageWidth}, $props{ImageHeight}) = ($props{ImageHeight}, $props{ImageWidth});
-+ if($orient && $props{FileType} eq "JPEG" && ($props{'Orientation'} // 0))
-+ {
-+ sys("$exiftrancmd $fout 2>/dev/null");
-+ if(($props{'Orientation'} // 0) > 4) {
-+ ($props{ImageWidth}, $props{ImageHeight}) = ($props{ImageHeight}, $props{ImageWidth});
-+ }
-+ }
-+ if($jpegoptim && $props{FileType} eq "JPEG") {
-+ sys('jpegoptim', '-q', $fout);
-+ } elsif($pngoptim && $props{FileType} eq "PNG")
-+ {
-+ sys('pngcrush', '-q', $fout, $ftmp);
-+ rename($ftmp, $fout);
- }
-- }
-- if($jpegoptim && $props{FileType} eq "JPEG") {
-- sys('jpegoptim', '-q', $fout);
-- } elsif($pngoptim && $props{FileType} eq "PNG")
-- {
-- sys('pngcrush', '-q', $fout, $ftmp);
-- rename($ftmp, $fout);
- }
-
- # final file mode
-@@ -658,11 +718,12 @@ sub process_img
- sys('touch', '-r', $file, $fout);
-
- # intermediate sRGB colorspace conversion
-- if(!$sRGB || ($props{ColorSpace} // 65535) == 1 || !defined($props{ProfileID})) {
-- link($fout, $ftmp) or sys('cp', '-L', $fout, $ftmp);
-+ if(!$sRGB || !defined($props{ProfileID}) || ($props{ColorSpace} // 65535) == 1
-+ || ($props{DeviceModel} // '') eq 'sRGB') {
-+ $ftmp = $fout;
- } else
- {
-- sys('convert', $fout, '-compress', 'LZW', "tiff:$ftmp");
-+ sys('convert', '-quiet', $fout, '-compress', 'LZW', '-type', 'truecolor', "tiff:$ftmp");
- sys($tificccmd, '-t0', $ftmp, "$ftmp.tmp");
- rename("$ftmp.tmp", $ftmp);
- }
-@@ -674,13 +735,13 @@ sub process_img
-
- # generate main image
- my @sfile = ($props{ImageWidth}, $props{ImageHeight});
-- my @simg = sys('convert', $ftmp,
-- '-gamma', '0.454545',
-- '-geometry', "$maxfull[0]x$maxfull[1]>",
-- '-print', '%w\n%h',
-- '-gamma', '2.2',
-- '+profile', '!icc,*',
-- '-quality', $imgq, "$out/$fimg");
-+ my @simg = sys('convert', '-quiet', $ftmp,
-+ '-gamma', '0.454545',
-+ '-geometry', "$maxfull[0]x$maxfull[1]>",
-+ '-print', '%w\n%h',
-+ '-gamma', '2.2',
-+ '+profile', '!icc,*',
-+ '-quality', $imgq, "$out/$fimg");
-
- # face/center detection
- my @center = (0.5, 0.5);
-@@ -701,7 +762,7 @@ sub process_img
- $thumbrt = $minthumb[1] / $sfile[1];
- }
- my @sthumb = (max(int($sfile[0] * $thumbrt + 0.5), $minthumb[0]),
-- max(int($sfile[1] * $thumbrt + 0.5), $minthumb[1]));
-+ max(int($sfile[1] * $thumbrt + 0.5), $minthumb[1]));
- my @mthumb = (min($maxthumb[0], $sthumb[0]), min($maxthumb[1], $sthumb[1]));
-
- # cropping window
-@@ -710,7 +771,7 @@ sub process_img
- my $dy = $sthumb[1] - $mthumb[1];
- my $cy = clamp(0, $dy, int($center[1] * $sthumb[1] - $sthumb[1] / 2 + $dy / 2));
-
-- sys('convert', $ftmp,
-+ sys('convert', '-quiet', $ftmp,
- '-gamma', '0.454545',
- '-resize', "$sthumb[0]x$sthumb[1]!",
- '-gravity', 'NorthWest',
-@@ -720,17 +781,17 @@ sub process_img
- '-quality', $imgq, "$out/$fthumb");
-
- # blur
-- sys('convert', "$out/$fthumb",
-+ sys('convert', '-quiet', "$out/$fthumb",
- '-virtual-pixel', 'Mirror',
- '-gaussian-blur', "0x$backblur",
- '-scale', "$backsize[0]x$backsize[1]",
-- '-quality', '90', "$out/$fblur");
-+ '-quality', '90', "$out/$fblur") if $do_blur;
-
- my %fdata;
- $fdata{props} = \%props;
- $fdata{img} = [$fimg, [map { int } @simg]];
- $fdata{file} = [$ffile, [map { int } @sfile]];
-- $fdata{blur} = $fblur;
-+ $fdata{blur} = $fblur if $do_blur;
-
- # do not store duplicate information
- my @tdata = ($fthumb, [map { int } @mthumb]);
-@@ -747,7 +808,9 @@ sub process_img
- }
-
- # remove temporary files
-- unlink($ftmp);
-+ if($ftmp ne $fout) {
-+ unlink($ftmp);
-+ }
-
- return \%fdata;
- }
-@@ -807,7 +870,7 @@ if(!$ofile || $slim)
- my $omp = ($ox * $oy / 1e6);
-
- if($mp >= $omp && $mp > $amp && abs($x / $y) >= $panort) {
-- $keep = 1;
-+ $keep = 1;
- }
- }
-
-@@ -828,9 +891,11 @@ $json{version} = $VERSION;
- $json{name} = $name if($name);
- $json{download} = $fdownload if($fdownload);
- $json{index} = $indexUrl if($indexUrl);
--$json{blur} = \@backsize;
-+$json{blur} = \@backsize if $do_blur;
- $json{thumb} = { min => \@minthumb, max => \@maxthumb };
-
-+# prepare data.json and print out noscript.html file
-+init_noscript($out);
- foreach my $fdata(@adata)
- {
- my %data;
-@@ -845,13 +910,22 @@ foreach my $fdata(@adata)
- }
- }
- push(@{$json{data}}, \%data);
-+ print_noscript($data{img}->[0], $data{thumb}->[0], $data{caption});
- }
-+finish_noscript();
-
- my $fd;
--unless(open($fd, ">:raw", "$out/data.json")) {
-- fatal("cannot write data file: $!");
-+my $dj = "$out/data.json";
-+unless(open($fd, ">:raw", $dj)) {
-+ fatal("cannot write file '$dj': $!");
- }
--print($fd encode_json(\%json));
-+print($fd JSON::PP->new->ascii->pretty->canonical->allow_blessed->encode(\%json));
- close($fd);
-
--print("completed\n");
-+if ($use_symlinks) {
-+ chdir($absOut) || die "Failed to 'cd $absOut' for symlink creation";
-+ sys('ln', '-s', '%%FG_VIEWDIR%%');
-+ sys('ln', '-s', 'view/index.html');
-+}
-+
-+print("$0 version $VERSION done for $absOut\n");
diff --git a/fgallery/patches/patch-view_index.css b/fgallery/patches/patch-view_index.css
deleted file mode 100644
index 1dc23add46..0000000000
--- a/fgallery/patches/patch-view_index.css
+++ /dev/null
@@ -1,27 +0,0 @@
-$NetBSD$
-
-Force fullscreen on IOS > 1.1 where minimal-ui fails
-Make the (optional) download/date text slightly less conspicuous
-
---- view/index.css.orig 2016-01-11 19:17:15.000000000 +0000
-+++ view/index.css
-@@ -1,10 +1,10 @@
--/* General reset */
- html, body
- {
- overflow: hidden; /* IE<9 */
- padding: 0;
- margin: 0;
- border: 0;
-+ height: 100.1% /* IOS>7.1 meta viewport minimal-ui to hide menu + bars */
- }
-
- img
-@@ -110,6 +110,7 @@ img
- background: #111; /* IE<9 */
- background: rgba(0, 0, 0, 0.7);
- font-family: sans-serif;
-+ font-size: 80%;
- padding: 0.5em;
- }
-
diff --git a/fgallery/patches/patch-view_index.html b/fgallery/patches/patch-view_index.html
deleted file mode 100644
index 4100c26a83..0000000000
--- a/fgallery/patches/patch-view_index.html
+++ /dev/null
@@ -1,36 +0,0 @@
-$NetBSD$
-
-Move all fgallery files into view subdirectory so we can symlink it on
-webserver to /usr/pkg/share/fgallery/view in DocumentRoot hierarchies
-
---- view/index.html.orig 2016-01-06 19:45:03.000000000 +0000
-+++ view/index.html
-@@ -2,18 +2,16 @@
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-- <meta name="viewport" content="width=device-width,initial-scale=1" />
-- <script src="mootools-core-1.4.js" type="text/javascript"></script>
-- <script src="mootools-more-1.4.js" type="text/javascript"></script>
-- <script src="mootools-idle.js" type="text/javascript"></script>
-- <script src="mootools-mooswipe.js" type="text/javascript"></script>
-- <script src="index.js" type="text/javascript"></script>
-- <link href="index.css" rel="stylesheet" type="text/css"/>
-- </head>
-- <body>
-+ <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,minimal-ui" />
- <noscript>
-- <h2>Frak! JavaScript required :'(</h2>
-+ <meta http-equiv="refresh" content="0;url=noscript.html" />
- </noscript>
-- <div id="gallery"></div>
-- </body>
-+ <script src="view/mootools-core-1.4.js" type="text/javascript"></script>
-+ <script src="view/mootools-more-1.4.js" type="text/javascript"></script>
-+ <script src="view/mootools-idle.js" type="text/javascript"></script>
-+ <script src="view/mootools-mooswipe.js" type="text/javascript"></script>
-+ <script src="view/index.js" type="text/javascript"></script>
-+ <link href="view/index.css" rel="stylesheet" type="text/css" />
-+ </head>
-+ <body><div id="gallery"></div></body>
- </html>
diff --git a/fgallery/patches/patch-view_index.js b/fgallery/patches/patch-view_index.js
deleted file mode 100644
index 835f7116f2..0000000000
--- a/fgallery/patches/patch-view_index.js
+++ /dev/null
@@ -1,522 +0,0 @@
-$NetBSD$
-
-Slideshow on/off: click (tap) on center image (or type 's' with keyboard)
-Remove forward and back buttons so slideshow works better
-
-Move all fgallery files into view subdirectory so we can symlink it on
-webserver to /usr/pkg/share/fgallery/view in DocumentRoot hierarchies
-
---- view/index.js.orig 2016-04-25 19:57:44.000000000 +0000
-+++ view/index.js
-@@ -4,10 +4,13 @@
- "use strict";
-
- var datafile = 'data.json';
-+
-+// dimensions
- var padding = 22;
--var duration = 500;
--var thrdelay = 1500;
--var hidedelay = 3000;
-+var duration = 500; // for scrolling
-+var thrdelay = 1500; // throbber delay
-+var hidedelay = 3000; // header and caption hiding delay
-+var slidedelay = 5000; // slide show delay
- var prefetch = 1;
- var minupscale = 640 * 480;
- var thumbrt = 16/9 - 5/3;
-@@ -15,6 +18,34 @@ var cutrt = 0.15;
- var capdelay = 5000;
- var rdwdelay = 500;
-
-+// state variables
-+var emain; // main object
-+var eback; // background
-+var enoise; // additive noise
-+var eflash; // flashing object
-+var ehdr; // header
-+var ecap; // caption
-+var capst; // caption status
-+var captm; // caption timeout
-+var elist; // thumbnail list
-+var fscr; // thumbnail list scroll fx
-+var econt; // picture container
-+var ebuff; // picture buffer
-+var oimg; // old image
-+var eimg; // new image
-+var cthumb; // current thumbnail
-+var mthumb; // thumbnail measurement cache
-+var eidx; // current index
-+var tthr; // throbber timeout
-+var imgs; // image list
-+var first; // first image
-+var idle; // general idle timer
-+var idleMouse; // idle mouse timer
-+var clayout; // current layout
-+var csr; // current scaling ratio
-+var sdir; // scrolling direction
-+var slideshow; // slideshow status
-+
- Element.Events.hashchange =
- {
- onAdd: function()
-@@ -32,41 +63,13 @@ Element.Events.hashchange =
- };
-
- if("onhashchange" in window
-- && (!Browser.ie || Browser.version > 7))
-+ && (!Browser.ie || Browser.version > 7))
- window.onhashchange = hashchange;
- else
- hashchange.periodical(50);
- }
- };
-
--// some state variables
--var emain; // main object
--var eback; // background
--var enoise; // additive noise
--var eflash; // flashing object
--var ehdr; // header
--var ecap; // caption
--var capst; // caption status
--var captm; // caption timeout
--var elist; // thumbnail list
--var fscr; // thumbnail list scroll fx
--var econt; // picture container
--var ebuff; // picture buffer
--var eleft; // go left
--var eright; // go right
--var oimg; // old image
--var eimg; // new image
--var cthumb; // current thumbnail
--var mthumb; // thumbnail measurement cache
--var eidx; // current index
--var tthr; // throbber timeout
--var imgs; // image list
--var first; // first image
--var idle; // idle timer
--var clayout; // current layout
--var csr; // current scaling ratio
--var sdir; // scrolling direction
--
- function resize()
- {
- // best layout
-@@ -100,7 +103,7 @@ function resize()
- {
- econt.setStyles(
- {
-- 'width': epos.x,
-+ 'width': (slideshow == 'on'? msize.x: epos.x),
- 'height': msize.y
- });
- }
-@@ -109,7 +112,7 @@ function resize()
- econt.setStyles(
- {
- 'width': msize.x,
-- 'height': epos.y
-+ 'height': (slideshow == 'on'? msize.y: epos.y)
- });
- }
-
-@@ -119,6 +122,7 @@ function resize()
-
- function onResize()
- {
-+ setSlideshowOff();
- resize();
- onScroll();
- }
-@@ -131,9 +135,9 @@ function onLayoutChanged(layout, sr)
- imgs.data.each(function(x, i)
- {
- var crop = x.thumb[1];
-- var size = (x.thumb[2]? x.thumb[2]: crop);
-- var offset = (x.thumb[3]? x.thumb[3]: [0, 0]);
-- var center = (x.center? [x.center[0] / 1000, x.center[1] / 1000]: [0.5, 0.5]);
-+ var size = (x.thumb[2]? x.thumb[2] : crop);
-+ var offset = (x.thumb[3]? x.thumb[3] : [0, 0]);
-+ var center = (x.center? [x.center[0]/1000, x.center[1]/1000] : [0.5, 0.5]);
-
- var maxw, maxh;
- if(layout == 'horizontal')
-@@ -155,7 +159,8 @@ function onLayoutChanged(layout, sr)
- {
- 'width': Math.round(maxw * sr),
- 'height': Math.round(maxh * sr),
-- 'background-size': Math.round(crop[0] * sr) + "px " + Math.round(crop[1] * sr) + "px"
-+ 'background-size':
-+ Math.round(crop[0] * sr) + 'px ' + Math.round(crop[1] * sr) + 'px'
- });
-
- // center cropped thumbnail
-@@ -169,7 +174,8 @@ function onLayoutChanged(layout, sr)
- cy = Math.round(crop[1] / 2 - cy + dy / 2);
- cy = Math.max(Math.min(0, cy), dy);
-
-- x.eimg.setStyle('background-position', Math.round(cx * sr) + 'px ' + Math.round(cy * sr) + 'px');
-+ x.eimg.setStyle('background-position',
-+ Math.round(cx * sr) + 'px ' + Math.round(cy * sr) + 'px');
-
- // border styles
- var classes = ['cut-left', 'cut-right', 'cut-top', 'cut-bottom'];
-@@ -244,13 +250,17 @@ function resizeMainImg(img)
- {
- var contSize = econt.getSize();
- var listSize = elist.getSize();
-- var thumbWidth = (clayout == 'horizontal'? listSize.x: listSize.y);
- var data = imgs.data[img.idx].img;
- var width = data[1][0];
- var height = data[1][1];
- var imgrt = width / height;
-- var pad = padding * 2;
--
-+ var thumbWidth = 0;
-+ var pad = 0;
-+ if(slideshow != 'on')
-+ {
-+ thumbWidth = clayout == 'horizontal'? listSize.x: listSize.y;
-+ pad = padding * 2;
-+ }
- if(imgrt > (contSize.x / contSize.y))
- {
- img.width = Math.max(thumbWidth + pad, contSize.x - pad);
-@@ -333,7 +343,6 @@ function onScroll()
- beg = Math.max(0, beg - psize);
- end = Math.min(imgs.data.length, end + psize);
- }
--
- for(var i = beg; i != end; ++i)
- {
- if(!imgs.data[i].thumbLoaded)
-@@ -388,17 +397,20 @@ function hideCap(nodelay)
- function showCap(nodelay)
- {
- if(capst == 'never') return;
-+ var cap = imgs.data[ecap.eidx]['caption'];
-+ if(!cap || (cap[0].length + cap[1].length == 0))
-+ {
-+ hideCap(true);
-+ return;
-+ }
- captm = resetTimeout(captm);
- ecap.get('tween').cancel();
--
- if(nodelay) ecap.fade('show');
- else ecap.tween('opacity', 1);
- ecap.setStyle('display', 'block');
--
- if(capst != 'always')
- {
- // calculate a decent reading time
-- var cap = imgs.data[ecap.eidx]['caption'];
- var words = cap[0].split(' ').length + cap[1].split(' ').length;
- var delay = Math.max(capdelay, rdwdelay * words);
- captm = hideCap.delay(delay);
-@@ -408,7 +420,6 @@ function showCap(nodelay)
- function toggleCap()
- {
- if(!imgs.captions) return;
--
- // switch mode
- if(capst == 'normal')
- capst = 'never';
-@@ -416,53 +427,83 @@ function toggleCap()
- capst = 'always';
- else
- capst = 'normal';
--
- // update visual state
- if(capst == 'never')
- hideCap(true);
- else if(ecap.eidx == eidx)
- showCap(true);
--
- // update indicator
- var img = document.id('togglecap', ehdr);
-- img.src = 'cap-' + capst + '.png';
-+ img.src = 'view/cap-' + capst + '.png';
- showHdr();
- }
-
-+function setSlideshowOff()
-+{
-+ if(slideshow == 'off') return;
-+ idle.removeEvent('idle', next);
-+ showHdr();
-+ elist.setStyle('display', 'block');
-+ slideshow = 'off';
-+}
-+
-+function setSlideshowOn()
-+{
-+ if(slideshow == 'on') return;
-+ idle.addEvent('idle', next);
-+ hideHdr();
-+ elist.setStyle('display', 'none');
-+ slideshow = 'on';
-+}
-+
-+function toggleSlideshow()
-+{
-+ if(slideshow == 'on')
-+ setSlideshowOff();
-+ else
-+ setSlideshowOn();
-+ resize();
-+}
-+
- function setupHeader()
- {
- ehdr.empty();
-+ var el;
- if(imgs.index)
- {
-- var el = new Element('a', { 'title': 'Back to index', 'href': imgs.index });
-- el.set('html', '<img src=\"back.png\"/>');
-+ el = new Element('a', { 'title': 'Back to index', 'href': imgs.index });
-+ el.set('html', '<img src="view/back.png"/>');
- ehdr.adopt(el);
- }
- if(imgs.data[eidx].file)
- {
- var file = imgs.data[eidx].file[0];
-- var el = new Element('a', { 'title': 'Download image', 'href': file });
-- el.set('html', '<img src=\"eye.png\"/>');
-+ el = new Element('a', { 'title': 'Download image', 'href': file });
-+ el.set('html', '<img src="view/eye.png"/>');
- ehdr.adopt(el);
- }
- if(imgs.download)
- {
-- var el = new Element('a', { 'title': 'Download album', 'href': imgs.download });
-- el.set('html', '<img src=\"download.png\"/>');
-+ el = new Element('a', { 'title': 'Download album', 'href': imgs.download });
-+ el.set('html', '<img src="view/download.png"/>');
- ehdr.adopt(el);
- }
- if(imgs.captions)
- {
-- var el = new Element('a', { 'title': 'Toggle captions (shortcut: c)' });
-+ el = new Element('a', { 'title': 'Toggle captions' });
- el.setStyle('cursor', 'pointer');
- el.addEvent('click', toggleCap);
-- var img = new Element('img', { 'id': 'togglecap', 'src': 'cap-' + capst + '.png' });
-+ var img = new Element('img', { 'id': 'togglecap', 'src': 'view/cap-' + capst + '.png' });
- img.inject(el);
- el.inject(ehdr);
- }
- if(imgs.data[eidx].date)
-- ehdr.adopt(new Element('span', { 'html': '<b>Date</b>: ' + imgs.data[eidx].date }));
-+ ehdr.adopt(new Element('span', { 'title': 'EXIF timestamp', 'html': imgs.data[eidx].date }));
-+ el = new Element('a', { 'title': 'Overview', 'href': 'view/overview.html' });
-+ el.set('html', '<img src="view/overview.png"/>');
-+ ehdr.adopt(el);
- ehdr.setStyle('display', (ehdr.children.length? 'block': 'none'));
-+ ehdr.removeEvent('click', toggleSlideshow);
- }
-
- function onMainReady()
-@@ -513,11 +554,11 @@ function onMainReady()
- {
- var diff = umod(eidx - oimg.idx, imgs.data.length);
- if(diff == 1)
-- sdir = 1;
-+ sdir = 1;
- else if(diff == imgs.data.length - 1)
-- sdir = -1;
-+ sdir = -1;
- else
-- sdir = 0;
-+ sdir = 0;
- }
-
- // fade old image
-@@ -544,26 +585,30 @@ function onMainReady()
- fx.start('opacity', 1);
-
- var rp = Math.floor(Math.random() * 100);
-- eback.src = imgs.data[eidx].blur;
-- enoise.setStyle('background-position', rp + 'px ' + rp + 'px');
-+ eback.src = '';
-+ if (imgs.data[eidx].blur)
-+ {
-+ eback.src = imgs.data[eidx].blur;
-+ enoise.setStyle('background-position', rp + 'px ' + rp + 'px');
-+ }
-
- tthr = resetTimeout(tthr);
- idle.start();
-- showHdr();
-+ if(slideshow != 'on') showHdr();
- centerThumb(d);
-
- // prefetch next image
- if(prefetch && sdir != 0)
- {
- var data = imgs.data[umod(eidx + sdir, imgs.data.length)];
-- Asset.images([data.img[0], data.blur]);
-+ Asset.images([data.img[0], data.blur? data.blur :[]]);
- }
- }
-
- function showThrobber()
- {
- var img = new Element('img', { id: 'throbber' });
-- img.src = "throbber.gif";
-+ img.src = "view/throbber.gif";
- ehdr.empty();
- img.inject(ehdr);
- ehdr.setStyle('display', 'block');
-@@ -573,32 +618,17 @@ function showThrobber()
-
- function hideHdr()
- {
-- if(idle.started)
-- ehdr.tween('opacity', 0);
--}
--
--function hideNav()
--{
-+ ehdr.tween('opacity', 0);
- emain.addClass('no-cursor');
-- eleft.tween('opacity', 0);
-- eright.tween('opacity', 0);
- }
-
- function showHdr()
- {
-+ emain.removeClass('no-cursor');
- ehdr.get('tween').cancel();
- ehdr.fade('show');
- }
-
--function showNav()
--{
-- emain.removeClass('no-cursor');
-- eleft.get('tween').cancel();
-- eleft.fade('show');
-- eright.get('tween').cancel();
-- eright.fade('show');
--}
--
- function flash()
- {
- eflash.setStyle('display', 'block');
-@@ -637,7 +667,7 @@ function load(i)
- if(i == eidx) return;
-
- var data = imgs.data[i];
-- var assets = Asset.images([data.img[0], data.blur],
-+ var assets = Asset.images([data.img[0], data.blur? data.blur: []],
- {
- onComplete: function() { if(i == eidx) onMainReady(); }
- });
-@@ -722,16 +752,6 @@ function initGallery(data)
- ecap = new Element('div', { id: 'caption' });
- ecap.inject(econt);
-
-- eleft = new Element('a', { id: 'left' });
-- eleft.adopt((new Element('div')).adopt(new Element('img', { 'src': 'left.png' })));
-- eleft.set('tween', { link: 'ignore' })
-- eleft.inject(econt);
--
-- eright = new Element('a', { id: 'right' });
-- eright.adopt((new Element('div')).adopt(new Element('img', { 'src': 'right.png' })));
-- eright.set('tween', { link: 'ignore' })
-- eright.inject(econt);
--
- ehdr = new Element('div', { id: 'header' });
- ehdr.set('tween', { link: 'ignore' })
- ehdr.inject(econt);
-@@ -771,10 +791,9 @@ function initGallery(data)
-
- // events and navigation shortcuts
- elist.addEvent('scroll', onScroll);
-- eleft.addEvent('click', prev);
-- eright.addEvent('click', next);
- window.addEvent('resize', onResize);
- window.addEvent('hashchange', change);
-+ econt.addEvent('click', toggleSlideshow);
-
- window.addEvent('keydown', function(ev)
- {
-@@ -788,10 +807,6 @@ function initGallery(data)
- ev.stop();
- next();
- }
-- else if(ev.key == 'c')
-- {
-- toggleCap();
-- }
- });
-
- econt.addEvent('mousewheel', function(ev)
-@@ -815,16 +830,21 @@ function initGallery(data)
- });
-
- // setup an idle callback for mouse movement only
-- var idleTmp = new IdleTimer(window, {
-+ idleMouse = new IdleTimer(window, {
- timeout: hidedelay,
- events: ['mousemove', 'mousedown', 'mousewheel']
- }).start();
-- idleTmp.addEvent('idle', hideNav);
-- idleTmp.addEvent('active', function() { showNav(); showHdr(); });
-+ idleMouse.addEvent('active', showHdr);
-+ idleMouse.addEvent('idle', hideHdr);
-
- // general idle callback
-- idle = new IdleTimer(window, { timeout: hidedelay }).start();
-- idle.addEvent('idle', hideHdr);
-+ idle = new IdleTimer(window, { timeout: slidedelay }).start();
-+
-+ // start slide show immediately if specified in data.json
-+ if(imgs.startslideshow == 'yes')
-+ setSlideshowOn();
-+ else
-+ setSlideshowOff();
-
- // prepare first image
- sdir = 1;
-@@ -834,7 +854,10 @@ function initGallery(data)
- loadThumb(first);
- centerThumb(0);
-
-+ // set visibility
- emain.setStyle('visibility', 'visible');
-+ if(slideshow == 'on')
-+ elist.setStyle('display', 'none');
- }
-
- function initFailure()
-@@ -860,7 +883,7 @@ function init()
- onRequest: function()
- {
- if(this.xhr.overrideMimeType)
-- this.xhr.overrideMimeType('application/json');
-+ this.xhr.overrideMimeType('application/json');
- },
- isSuccess: function()
- {
-@@ -871,12 +894,12 @@ function init()
- }).get();
-
- // preload some resources
-- Asset.images(['throbber.gif',
-- 'left.png', 'right.png',
-- 'eye.png', 'download.png', 'back.png',
-- 'cap-normal.png', 'cap-always.png', 'cap-never.png',
-- 'cut-left.png', 'cut-right.png',
-- 'cut-top.png', 'cut-mov.png']);
-+ Asset.images([
-+ 'view/throbber.gif', 'view/overview.png', 'view/eye.png',
-+ 'view/download.png', 'view/back.png', 'view/cap-normal.png',
-+ 'view/cap-always.png', 'view/cap-never.png', 'view/cut-left.png',
-+ 'view/cut-right.png', 'view/cut-top.png', 'view/cut-mov.png'
-+ ]);
- }
-
- window.addEvent('domready', init);
Home |
Main Index |
Thread Index |
Old Index