diff --git a/sigal/gallery.py b/sigal/gallery.py index e671762..507c8c3 100644 --- a/sigal/gallery.py +++ b/sigal/gallery.py @@ -221,6 +221,7 @@ class Album(UnicodeMixin): self.name = path.split(os.path.sep)[-1] self.gallery = gallery self.settings = settings + self.subdirs = dirnames self.output_file = settings['output_filename'] self._thumbnail = None @@ -240,10 +241,6 @@ class Album(UnicodeMixin): self.index_url = url_from_path(os.path.relpath( settings['destination'], self.dst_path)) + '/' + self.url_ext - # sort sub-albums - dirnames.sort(key=strxfrm, reverse=settings['albums_sort_reverse']) - self.subdirs = dirnames - #: List of all medias in the album (:class:`~sigal.gallery.Image` and #: :class:`~sigal.gallery.Video`). self.medias = medias = [] @@ -313,6 +310,20 @@ class Album(UnicodeMixin): self.orig_path = join(self.dst_path, self.settings['orig_dir']) check_or_create_dir(self.orig_path) + def sort_subdirs(self, albums_sort_attr): + if self.subdirs: + if albums_sort_attr: + root_path = self.path if self.path != '.' else '' + key = lambda s: strxfrm(getattr( + self.gallery.albums[join(root_path, s)], albums_sort_attr)) + else: + key = strxfrm + + self.subdirs.sort(key=key, + reverse=self.settings['albums_sort_reverse']) + + signals.albums_sorted.send(self) + def sort_medias(self, medias_sort_attr): if self.medias: if medias_sort_attr == 'date': @@ -525,6 +536,11 @@ class Gallery(object): album.create_output_directories() albums[relpath] = album + with progressbar(albums.values(), label="Sorting albums", + file=self.progressbar_target) as progress_albums: + for album in progress_albums: + album.sort_subdirs(settings['albums_sort_attr']) + with progressbar(albums.values(), label="Sorting media", file=self.progressbar_target) as progress_albums: for album in progress_albums: diff --git a/sigal/settings.py b/sigal/settings.py index 723000e..00e094f 100644 --- a/sigal/settings.py +++ b/sigal/settings.py @@ -31,6 +31,7 @@ from .compat import PY2, text_type _DEFAULT_CONFIG = { + 'albums_sort_attr': 'name', 'albums_sort_reverse': False, 'autorotate_images': True, 'colorbox_column_size': 4, diff --git a/sigal/signals.py b/sigal/signals.py index 534317d..f6e82d5 100644 --- a/sigal/signals.py +++ b/sigal/signals.py @@ -8,4 +8,5 @@ album_initialized = signal('album_initialized') gallery_initialized = signal('gallery_initialized') gallery_build = signal('gallery_build') media_initialized = signal('media_initialized') +albums_sorted = signal('albums_sorted') medias_sorted = signal('medias_sorted') diff --git a/sigal/templates/sigal.conf.py b/sigal/templates/sigal.conf.py index 86d4d2f..8dca8be 100644 --- a/sigal/templates/sigal.conf.py +++ b/sigal/templates/sigal.conf.py @@ -101,6 +101,9 @@ thumb_size = (280, 210) # Use symbolic links instead of copying the original images # orig_link = False +# Attribute of Album objects which is used to sort medias (eg 'title'). +# albums_sort_attr = 'name' + # Reverse sort for albums # albums_sort_reverse = False diff --git a/tests/sample/pictures/dir1/test3/.index.md.swp b/tests/sample/pictures/dir1/test3/.index.md.swp new file mode 100644 index 0000000..45b2051 Binary files /dev/null and b/tests/sample/pictures/dir1/test3/.index.md.swp differ diff --git a/tests/sample/pictures/dir1/test3/3.jpg b/tests/sample/pictures/dir1/test3/3.jpg new file mode 100644 index 0000000..0b60190 Binary files /dev/null and b/tests/sample/pictures/dir1/test3/3.jpg differ diff --git a/tests/sample/pictures/dir1/test3/index.md b/tests/sample/pictures/dir1/test3/index.md new file mode 100644 index 0000000..848e37c --- /dev/null +++ b/tests/sample/pictures/dir1/test3/index.md @@ -0,0 +1 @@ +Title: 01 First title alphabetically diff --git a/tests/test_gallery.py b/tests/test_gallery.py index 8180b4e..066a739 100644 --- a/tests/test_gallery.py +++ b/tests/test_gallery.py @@ -15,7 +15,7 @@ REF = { 'title': 'An example gallery', 'name': 'dir1', 'thumbnail': 'dir1/test1/thumbnails/11.tn.jpg', - 'subdirs': ['test1', 'test2'], + 'subdirs': ['test1', 'test2', 'test3'], 'medias': [], }, 'dir1/test1': { @@ -34,6 +34,13 @@ REF = { 'subdirs': [], 'medias': ['21.jpg', '22.jpg', 'archlinux-kiss-1024x640.png'], }, + 'dir1/test3': { + 'title': '01 First title alphabetically', + 'name': 'test3', + 'thumbnail': 'test3/thumbnails/3.tn.jpg', + 'subdirs': [], + 'medias': ['3.jpg'], + }, 'dir2': { 'title': 'Another example gallery with a very long name', 'name': 'dir2', @@ -165,10 +172,29 @@ def test_album_medias(settings): def test_albums_sort(settings): gal = Gallery(settings, ncpu=1) album = REF['dir1'] + subdirs = list(album['subdirs']) + + settings['albums_sort_reverse'] = False + a = Album('dir1', settings, album['subdirs'], album['medias'], gal) + a.sort_subdirs('') + assert [alb.name for alb in a.albums] == subdirs settings['albums_sort_reverse'] = True a = Album('dir1', settings, album['subdirs'], album['medias'], gal) - assert [im.filename for im in a.images] == list(reversed(album['medias'])) + a.sort_subdirs('') + assert [alb.name for alb in a.albums] == list(reversed(subdirs)) + + titles = [im.title for im in a.albums] + titles.sort() + settings['albums_sort_reverse'] = False + a = Album('dir1', settings, album['subdirs'], album['medias'], gal) + a.sort_subdirs('title') + assert [im.title for im in a.albums] == titles + + settings['albums_sort_reverse'] = True + a = Album('dir1', settings, album['subdirs'], album['medias'], gal) + a.sort_subdirs('title') + assert [im.title for im in a.albums] == list(reversed(titles)) def test_medias_sort(settings):