fu: Close-up of Fu, bringing a scoop of water to her mouth (Default)
fu ([personal profile] fu) wrote in [site community profile] changelog2010-10-29 08:39 am

[dw-free] Theme categories (tags?) are hardcoded in the code backend

[commit: http://hg.dwscoalition.org/dw-free/rev/c89cce13dcc4]

http://bugs.dwscoalition.org/show_bug.cgi?id=1744

Tag themes via the web interface, rather than hardcoding. Allows us to tag
themes without a code push.

Patch by [personal profile] exor674.

Files modified:
  • bin/upgrading/update-db-general.pl
  • cgi-bin/DW/Controller/Admin/ThemeMetadata.pm
  • cgi-bin/LJ/Customize.pm
  • cgi-bin/LJ/S2Theme.pm
  • cgi-bin/LJ/S2Theme/bases.pm
  • cgi-bin/LJ/S2Theme/basicboxes.pm
  • cgi-bin/LJ/S2Theme/blanket.pm
  • cgi-bin/LJ/S2Theme/boxesandborders.pm
  • cgi-bin/LJ/S2Theme/brittle.pm
  • cgi-bin/LJ/S2Theme/colorside.pm
  • cgi-bin/LJ/S2Theme/compartmentalize.pm
  • cgi-bin/LJ/S2Theme/core2base.pm
  • cgi-bin/LJ/S2Theme/crossroads.pm
  • cgi-bin/LJ/S2Theme/drifting.pm
  • cgi-bin/LJ/S2Theme/easyread.pm
  • cgi-bin/LJ/S2Theme/fluidmeasure.pm
  • cgi-bin/LJ/S2Theme/funkycircles.pm
  • cgi-bin/LJ/S2Theme/modish.pm
  • cgi-bin/LJ/S2Theme/modular.pm
  • cgi-bin/LJ/S2Theme/negatives.pm
  • cgi-bin/LJ/S2Theme/nouveauoleanders.pm
  • cgi-bin/LJ/S2Theme/practicality.pm
  • cgi-bin/LJ/S2Theme/refriedtablet.pm
  • cgi-bin/LJ/S2Theme/skittlishdreams.pm
  • cgi-bin/LJ/S2Theme/steppingstones.pm
  • cgi-bin/LJ/S2Theme/tranquilityiii.pm
  • cgi-bin/LJ/S2Theme/zesty.pm
  • cgi-bin/LJ/Widget/ThemeNav.pm
  • cgi-bin/ljlib.pl
  • htdocs/js/admin/themes/category.js
  • htdocs/js/admin/themes/index.js
  • views/admin/themes/category.tt
  • views/admin/themes/category.tt.text
  • views/admin/themes/index.tt
  • views/admin/themes/index.tt.text
  • views/admin/themes/theme.tt
  • views/admin/themes/theme.tt.text
--------------------------------------------------------------------------------
diff -r 09d54b296645 -r c89cce13dcc4 bin/upgrading/update-db-general.pl
--- a/bin/upgrading/update-db-general.pl	Fri Oct 29 15:09:47 2010 +0800
+++ b/bin/upgrading/update-db-general.pl	Fri Oct 29 16:39:24 2010 +0800
@@ -1151,6 +1151,16 @@ CREATE TABLE s2stylelayers2 (
     type ENUM('core','i18nc','layout','theme','i18n','user') NOT NULL,
     PRIMARY KEY (userid, styleid, type),
     s2lid INT UNSIGNED NOT NULL
+)
+EOC
+
+register_tablecreate("s2categories", <<'EOC'); # global
+CREATE TABLE s2categories (
+    s2lid INT UNSIGNED NOT NULL,
+    kwid INT(10) UNSIGNED NOT NULL,
+    active TINYINT(1) UNSIGNED NOT NULL DEFAULT 1, 
+
+    PRIMARY KEY (s2lid, kwid)    
 )
 EOC
 
diff -r 09d54b296645 -r c89cce13dcc4 cgi-bin/DW/Controller/Admin/ThemeMetadata.pm
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cgi-bin/DW/Controller/Admin/ThemeMetadata.pm	Fri Oct 29 16:39:24 2010 +0800
@@ -0,0 +1,261 @@
+#!/usr/bin/perl
+#
+# DW::Controller::Themes
+#
+# Theme metadata admin page.
+#
+# Authors:
+#      Andrea Nall <anall@andreanall.com>
+#
+# Copyright (c) 2010 by Dreamwidth Studios, LLC.
+#
+# This program is free software; you may redistribute it and/or modify it under
+# the same terms as Perl itself. For a copy of the license, please reference
+# 'perldoc perlartistic' or 'perldoc perlgpl'.
+#
+
+package DW::Controller::Admin::StyleMetadata;
+
+use strict;
+use warnings;
+use DW::Controller;
+use DW::Routing;
+use DW::Template;
+use DW::Controller::Admin;
+
+DW::Routing->register_string( "/admin/themes/", \&index_controller );
+DW::Controller::Admin->register_admin_page( '/',
+    path => 'themes/',
+    ml_scope => '/admin/themes/index.tt',
+    privs => [ 'siteadmin:themes' ]
+);
+
+DW::Routing->register_string( "/admin/themes/theme", \&theme_controller );
+DW::Routing->register_string( "/admin/themes/category", \&category_controller );
+
+my %system_cats = (
+    featured => 1,
+);
+
+sub index_controller {
+    my ( $ok, $rv ) = controller( privcheck => [ "siteadmin:themes" ] );
+    return $rv unless $ok;
+
+    my $pub = LJ::S2::get_public_layers();
+
+    my @themes = grep { $_ !~ /^\d+$/ && $pub->{$_}->{type} eq 'theme' } keys %$pub;
+    my %layers = ();
+    foreach my $uniq ( @themes ) {
+        my ( $lay, $theme ) = split('/', $uniq);
+        push @{ $layers{$lay} }, $theme;
+    }
+
+    my $vars = {
+        %$rv,
+
+        layers => \%layers,
+        categories => [ LJ::S2Theme->all_categories( all => 1, special => 1 ) ],
+    };
+
+    return DW::Template->render_template( 'admin/themes/index.tt', $vars );
+}
+
+sub _validate_category {
+    return 1 if $_[0] =~ /^[a-zA-Z0-9 ]+$/;
+    return 0;
+}
+
+sub theme_controller {
+    my ( $ok, $rv ) = controller( privcheck => [ "siteadmin:themes" ] );
+    return $rv unless $ok;
+
+    my $r = DW::Request->get;
+
+    my $args = $r->post_args || $r->get_args || {};
+    my $uniq = $args->{theme};
+ 
+    my $pub = LJ::S2::get_public_layers();
+    my $s2lid = $pub->{$uniq}->{s2lid};
+    return $r->redirect( "/admin/themes/" ) unless $s2lid;
+    
+    my $theme = LJ::S2Theme->new( themeid => $s2lid );
+    return $r->redirect( "/admin/themes/" ) unless $theme;
+
+    if ( $r->method eq 'POST' ) {
+        return $r->redirect( "/admin/themes/theme?theme=$uniq" ) unless LJ::check_form_auth( $args->{lj_form_auth} );
+
+        # FIXME: This should be in S2Themes
+        my $cats = $theme->metadata->{cats};
+        my %kwid_map = map { $_->{kwid} => $_ } values %$cats;
+        my @kwids = keys %kwid_map;
+
+        my %change_act;
+        my %delete;
+
+        foreach my $kwid ( @kwids ) {
+            my $act_db = $kwid_map{$kwid}->{active};
+            if ( $args->{"cat_remove_$kwid"} ) {
+                $delete{$kwid} = 1;
+            } else {
+                $change_act{$kwid} = 1
+                    if $args->{"cat_act_$kwid"} && ! $act_db;
+                $change_act{$kwid} = 0
+                    if ! $args->{"cat_act_$kwid"} && $act_db
+                        && exists $kwid_map{$kwid};
+            }
+        }
+
+        foreach my $kw ( split(',', $args->{cat_add} ) ) {
+            $kw = LJ::trim( $kw );
+            next unless _validate_category( $kw );
+            my $kwid = LJ::get_sitekeyword_id( $kw, 1, allowmixedcase => 1 );
+            next if $delete{ $kwid };
+            my $add = 1;
+            $add = 0 if $kwid_map{$kwid} && $kwid_map{$kwid}->{active};
+            $change_act{$kwid} = 1 if $add;
+        }
+
+        my $dbh = LJ::get_db_writer();
+
+        if ( %change_act ) { 
+            my @bind;
+            my @vals;
+
+            foreach my $kwid ( keys %change_act ) {
+                push @vals, "(?,?,?)";
+                push @bind, ( $s2lid, $kwid, $change_act{$kwid} );
+            }
+
+            $dbh->do( "REPLACE INTO s2categories ( s2lid, kwid, active ) " .
+                "VALUES " . join( ',', @vals ), undef, @bind )
+                    or die $dbh->errstr;
+        }
+
+        if ( %delete ) {
+            $dbh->do( "DELETE FROM s2categories where s2lid = ? " .
+                "AND kwid IN ( " .
+                join( ',', map { $dbh->quote( $_ ) } keys %delete ) .
+                " )", undef, $s2lid ) or die $dbh->errstr;
+        }
+
+        $theme->clear_cache;
+        LJ::S2Theme->clear_global_cache;
+        return $r->redirect( "/admin/themes/theme?theme=$uniq" );
+    }
+    
+    my %cats = %{ $theme->metadata->{cats} };
+
+    my @cat_keys = sort {
+        my $ah = $cats{$a};
+        my $bh = $cats{$b};
+        return ( $ah->{order} || 0 ) <=> ( $bh->{order} || 0 ) ||
+            ( $bh->{active} || 0 )  <=> ( $ah->{active} || 0 ) ||
+            $ah->{keyword} cmp $bh->{keyword}
+    } keys %cats;
+
+    my $vars = {
+        %$rv,
+
+        theme_arg => $uniq,
+        theme => $theme,
+        cats => \%cats,
+        cat_keys => \@cat_keys,
+    };
+
+    return DW::Template->render_template( 'admin/themes/theme.tt', $vars );
+}
+
+sub category_controller {
+    my ( $ok, $rv ) = controller( privcheck => [ "siteadmin:themes" ] );
+    return $rv unless $ok;
+
+    my $r = DW::Request->get;
+
+    my $args = $r->post_args || $r->get_args || {};
+    my $cat = $args->{category};
+
+    $cat = undef unless _validate_category( $cat );
+    return $r->redirect( "/admin/themes/" ) unless $cat;
+
+    my $pub = LJ::S2::get_public_layers();
+
+    my @themes = grep { $_ !~ /^\d+$/ && $pub->{$_}->{type} eq 'theme' } keys %$pub;
+    my %layers = ();
+    foreach my $uniq ( @themes ) {
+        my ( $lay, $theme ) = split('/', $uniq);
+        $layers{$lay}->{$theme} = $pub->{$uniq};
+    }
+
+    my %s2lid_act = map { $_->s2lid => 1 } LJ::S2Theme->load_by_cat( $cat );
+
+    my $can_delete = 0;
+    my $is_system = $system_cats{$cat} ? 1 : 0;
+
+    $can_delete = ( %s2lid_act ? 0 : 1 ) unless $is_system;
+
+    if ( $r->method eq 'POST' ) {
+        return $r->redirect( "/admin/themes/category?category=$cat" ) unless LJ::check_form_auth( $args->{lj_form_auth} );
+
+        my $dbh = LJ::get_db_writer();
+
+        if ( $args->{delete} ) {
+            return $r->redirect( "/admin/themes/category?category=$cat" )
+                unless $can_delete;
+
+            my $kwid = LJ::get_sitekeyword_id( $cat, 1, allowmixedcase => 1 );
+            my $to_clear = $dbh->selectall_arrayref( "SELECT s2lid FROM s2categories WHERE kwid = ?", undef, $kwid ) or die $dbh->errstr;
+
+            $dbh->do( "DELETE FROM s2categories WHERE kwid = ?", undef, $kwid ) or die $dbh->errstr;
+
+            LJ::S2Theme->new( themeid => $_->[0] )->clear_cache
+                foreach @$to_clear;
+            LJ::S2Theme->clear_global_cache;
+
+            return $r->redirect( "/admin/themes/" );
+        } else {
+            my %change_act;
+            foreach my $theme ( @themes ) {
+                my $s2lid = $pub->{$theme}->{s2lid};
+                my $db_act = $s2lid_act{ $s2lid };
+                my $act = $args->{ "s2lid_act_$s2lid" } || 0;
+
+                $change_act{$s2lid} = 1 if $act && ! $db_act; 
+                $change_act{$s2lid} = 0 if ! $act && $db_act; 
+            }
+
+            if ( %change_act ) { 
+                my @bind;
+                my @vals;
+
+                my $kwid = LJ::get_sitekeyword_id( $cat, 1, allowmixedcase => 1 ); 
+                foreach my $s2lid ( keys %change_act ) {
+                    push @vals, "(?,?,?)";
+                    push @bind, ( $s2lid, $kwid, $change_act{$s2lid} );
+                }
+
+                $dbh->do( "REPLACE INTO s2categories ( s2lid, kwid, active ) " .
+                    "VALUES " . join(',', @vals), undef, @bind )
+                        or die $dbh->errstr;
+            }
+
+            LJ::S2Theme->new( themeid => $_ )->clear_cache
+                foreach keys %change_act;
+            LJ::S2Theme->clear_global_cache;
+            return $r->redirect( "/admin/themes/category?category=$cat" );
+        }
+    }
+
+    my $vars = {
+        %$rv,
+
+        category => $cat,
+        layers => \%layers,
+        active => \%s2lid_act,
+        can_delete => $can_delete,
+        is_system => $is_system,
+    };
+
+    return DW::Template->render_template( 'admin/themes/category.tt', $vars );
+}
+
+1;
diff -r 09d54b296645 -r c89cce13dcc4 cgi-bin/LJ/Customize.pm
--- a/cgi-bin/LJ/Customize.pm	Fri Oct 29 15:09:47 2010 +0800
+++ b/cgi-bin/LJ/Customize.pm	Fri Oct 29 16:39:24 2010 +0800
@@ -678,7 +678,11 @@ sub get_cats {
             main => 1,
             order => 3,
         },
-
+        map { $_ => {
+            text => $_,
+            main => 1,
+            order => 3,
+        } } LJ::S2Theme->all_categories( special => 0, all => 0 ),
     );
 
     LJ::Hooks::run_hooks("modify_cat_list", \@categories, user => $u,);
diff -r 09d54b296645 -r c89cce13dcc4 cgi-bin/LJ/S2Theme.pm
--- a/cgi-bin/LJ/S2Theme.pm	Fri Oct 29 15:09:47 2010 +0800
+++ b/cgi-bin/LJ/S2Theme.pm	Fri Oct 29 16:39:24 2010 +0800
@@ -23,11 +23,11 @@ sub init {
     1;
 }
 
-
 ##################################################
 # Class Methods
 ##################################################
 
+# FIXME: This should be configurable
 sub default_themes {
     my $class = $_[0];
 
@@ -400,6 +400,8 @@ sub new {
     my $themeid = $opts{themeid}+0;
     die "No theme id given." unless $themeid;
 
+    return $LJ::CACHE_S2THEME{$themeid} if exists $LJ::CACHE_S2THEME{$themeid};
+
     my $layers = LJ::S2::get_public_layers();
     my $is_custom = 0;
     my %outhash = ();
@@ -475,6 +477,8 @@ sub new {
     } else {
         bless $self, $class;
     }
+    
+    $LJ::CACHE_S2THEME{$themeid} = $self;
 
     return $self;
 }
@@ -485,54 +489,38 @@ sub new {
 ##################################################
 
 sub s2lid {
-    my $self = shift;
-
-    return $self->{s2lid};
+    return $_[0]->{s2lid};
 }
 *themeid = \&s2lid;
 
 sub b2lid {
-    my $self = shift;
-
-    return $self->{b2lid};
+    return $_[0]->{b2lid};
 }
 *layoutid = \&b2lid;
 
 sub coreid {
-    my $self = shift;
-
-    return $self->{coreid};
+    return $_[0]->{coreid};
 }
 
 sub name {
-    my $self = shift;
-
-    return $self->{name};
+    return $_[0]->{name};
 }
 
 sub layout_name {
-    my $self = shift;
-
-    return $self->{layout_name};
+    return $_[0]->{layout_name};
 }
 
 sub uniq {
-    my $self = shift;
-
-    return $self->{uniq};
+    return $_[0]->{uniq};
 }
 
 sub layout_uniq {
-    my $self = shift;
-
-    return $self->{layout_uniq};
+    return $_[0]->{layout_uniq};
 }
 *is_system_layout = \&layout_uniq; # if the theme's layout has a uniq, then it's a system layout
 
 sub is_custom {
-    my $self = shift;
-
-    return $self->{is_custom};
+    return $_[0]->{is_custom};
 }
 
 sub preview_imgurl {
@@ -682,16 +670,170 @@ sub get_preview_styleid {
     return $styleid;
 }
 
+sub all_categories {
+    my ( undef, %args ) = @_;
 
+    my $all = 1;
+    $all = $args{all} if exists $args{all};
+
+    my $post_filter = sub {
+        my %data = map { $_ => 1 } @_;
+        $data{featured} = 1 if $args{special};
+        delete $data{featured} unless $args{special};
+        my %order = (
+            featured => -1
+        );
+        return sort {
+            ( $order{$a} || 0 ) <=> ( $order{$b} || 0 ) ||
+            $a cmp $b 
+        } keys %data;
+    };
+
+    my $memkey = "s2categories" . ( $all ? ":all" : "" );
+    my $minfo = LJ::MemCache::get( $memkey );
+    return $post_filter->( @$minfo ) if $minfo;
+
+    my $dbr = LJ::get_db_reader();
+    my $cats = $dbr->selectall_arrayref( "SELECT k.keyword AS keyword " . 
+                                            "FROM s2categories AS c, sitekeywords AS k WHERE " .
+                                            "c.kwid = k.kwid " . ( $all ? "" : "AND c.active = 1 " ) .
+                                            "GROUP BY keyword", undef );
+
+    my @rv = map { $_->[0] } @$cats;
+    
+    LJ::MemCache::set( $memkey, \@rv );
+    return $post_filter->( @rv );
+}
+
+sub clear_global_cache {
+    LJ::MemCache::delete( "s2categories" );
+    LJ::MemCache::delete( "s2categories:all" );
+}
+
+sub metadata {
+    my $self = $_[0];
+
+    return $self->{metadata} if exists $self->{metadata};
+	
+    my $VERSION_DATA = 1;
+
+    my $memkey = [ $self->s2lid, "s2meta:".$self->s2lid ];
+    my ( $info, $minfo );
+
+    my $load_info_from_cats = sub {
+        my $cats = $_[0];
+        
+        $cats->{featured}->{order} = -1;
+        $cats->{featured}->{special} = 1;
+
+        $info->{cats} = $cats;
+        $info->{active_cats} = [ grep { $cats->{$_}->{active} } keys %$cats ];        
+    };
+
+    if ( $minfo = LJ::MemCache::get( $memkey ) ) {
+        if ( ref $minfo eq 'HASH' ||
+            $minfo->[0] != $VERSION_DATA ) {
+            # old data in the cache.  delete.
+            LJ::MemCache::delete( $memkey );
+        } else {
+            my ( undef, $catstr, $cat_active ) = @$minfo;
+
+            my %id_map;
+            my $cats = {};  
+            my ( $pos, $nulpos );
+            $pos = $nulpos = 0;
+            while ( ( $nulpos = index( $catstr, "\0", $pos ) ) > 0 ) {
+                my $kw = substr( $catstr, $pos, $nulpos-$pos );
+                my $id = unpack("N", substr( $catstr, $nulpos+1, 4 ) );
+                $pos = $nulpos + 5; # skip NUL + 4 bytes.
+                $cats->{$kw} = {
+                    kwid => $id,
+                    keyword => $kw,
+                };
+                $id_map{$id} = $cats->{$kw};
+            }
+            
+            while ( length $cat_active >= 4 ) {
+                my ( $id ) = unpack "N", substr( $cat_active, 0, 4, '' );
+                $id_map{$id}->{active} = 1;
+            }
+
+            $load_info_from_cats->( $cats );
+        }
+    }
+
+    unless ( $info ) {
+        my $dbr = LJ::get_db_reader();
+
+        my $cats = $dbr->selectall_hashref( "SELECT c.kwid AS kwid, k.keyword AS keyword, c.active AS active " .
+                                            "FROM s2categories AS c, sitekeywords AS k WHERE " .
+                                            "s2lid = ? AND c.kwid = k.kwid",
+                                        'keyword', undef, $self->s2lid );
+
+        $cats->{featured} ||= {
+            keyword => 'featured',
+            kwid => LJ::get_sitekeyword_id( 'featured', 1 ),
+            active => 0,
+        };
+
+        $load_info_from_cats->( $cats );
+
+        $minfo = [
+            $VERSION_DATA,
+            join( '', map { pack( "Z*N", $_, $cats->{$_}->{kwid} ) } keys %$cats ) || "",
+            join( '', map { pack( "N", $cats->{$_}->{kwid} ) } grep { $cats->{$_}->{active} } keys %$cats ) || "",
+        ];
+ 
+       LJ::MemCache::set( $memkey, $minfo );
+    }
+
+    return $self->{metadata} = $info;
+}
+
+##################################################
+# Methods for admin pages
+##################################################
+
+sub clear_cache {
+    my $self = $_[0];
+    delete $self->{metadata};
+    LJ::MemCache::delete( [ $self->s2lid, "s2meta:".$self->s2lid ] );
+}
+
+##################################################
+# Methods that return data from DB, *DO NOT OVERIDE*
+##################################################
+
+sub cats { # categories that the theme is in
+    return @{ $_[0]->metadata->{active_cats} };
+}
+
+##################################################
+# Can be overriden if required
+##################################################
+
+sub designer { # designer of the theme
+    return $_[0]->{designer} if exists $_[0]->{designer};
+
+    my $id = $_[0]->s2lid;
+    my $bid = $_[0]->b2lid;
+    my $li = {}; 
+    LJ::S2::load_layer_info( $li, [ $id, $bid ] );
+
+    my $rv = $li->{$id}->{author_name} ||
+        $li->{$bid}->{author_name} ||
+        "";
+    
+    $_[0]->{designer} = $rv;
+    return $rv;
+}
 ##################################################
 # Methods that get overridden by child packages
 ##################################################
 
-sub cats { () } # categories that the theme is in
 sub layouts { ( "1" => 1 ) } # theme layout/sidebar placement options ( layout type => property value or 1 if no property )
 sub layout_prop { "" } # property that controls the layout/sidebar placement
 sub show_sidebar_prop { "" } # property that controls whether a sidebar shows or not
-sub designer { "" } # designer of the theme
 sub linklist_support_tab { "" } # themes that don't use the linklist_support prop will have copy pointing them to the correct tab
 
 # for appending layout-specific props to global props
diff -r 09d54b296645 -r c89cce13dcc4 cgi-bin/LJ/S2Theme/bases.pm
--- a/cgi-bin/LJ/S2Theme/bases.pm	Fri Oct 29 15:09:47 2010 +0800
+++ b/cgi-bin/LJ/S2Theme/bases.pm	Fri Oct 29 16:39:24 2010 +0800
@@ -5,53 +5,4 @@ sub layouts { ( "1" => "one-column", "2l
 sub layouts { ( "1" => "one-column", "2l" => "two-columns-left", "2r" => "two-columns-right" ) }
 sub layout_prop { "layout_type" }
 
-sub designer { "Malionette" }
-
-package LJ::S2Theme::bases::beechy;
-use base qw( LJ::S2Theme::bases );
-sub cats { qw() }
-
-package LJ::S2Theme::bases::comfort;
-use base qw( LJ::S2Theme::bases );
-sub cats { qw() }
-sub designer { "timeasmymeasure" }
-
-package LJ::S2Theme::bases::lightondark;
-use base qw( LJ::S2Theme::bases );
-sub cats { qw() }
-sub designer { "cesy" }
-
-package LJ::S2Theme::bases::nnwm2009;
-use base qw( LJ::S2Theme::bases );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::bases::steele;
-use base qw( LJ::S2Theme::bases );
-sub cats { qw() }
-
-package LJ::S2Theme::bases::strawberrysundae;
-use base qw( LJ::S2Theme::bases );
-sub cats { qw() }
-sub designer { "sky" }
-
-package LJ::S2Theme::bases::summerholiday;
-use base qw( LJ::S2Theme::bases );
-sub cats { qw() }
-sub designer { "rb" }
-
-package LJ::S2Theme::bases::sunandsand;
-use base qw( LJ::S2Theme::bases );
-sub cats { qw() }
-sub designer { "twtd" }
-
-package LJ::S2Theme::bases::tropical;
-use base qw( LJ::S2Theme::bases );
-sub cats { qw() }
-
-package LJ::S2Theme::bases::velvetsteel;
-use base qw( LJ::S2Theme::bases );
-sub cats { qw() }
-sub designer { "timeasmymeasure" }
-
 1;
diff -r 09d54b296645 -r c89cce13dcc4 cgi-bin/LJ/S2Theme/basicboxes.pm
--- a/cgi-bin/LJ/S2Theme/basicboxes.pm	Fri Oct 29 15:09:47 2010 +0800
+++ b/cgi-bin/LJ/S2Theme/basicboxes.pm	Fri Oct 29 16:39:24 2010 +0800
@@ -5,70 +5,4 @@ sub layouts { ( "1" => "one-column", "2l
 sub layouts { ( "1" => "one-column", "2l" => "two-columns-left", "2r" => "two-columns-right", "3" => "three-columns-sides", "3r" => "three-columns-right", "3l" => "three-columns-left" ) }
 sub layout_prop { "layout_type" }
 
-sub designer { "branchandroot" }
-
-package LJ::S2Theme::basicboxes::acidic;
-use base qw( LJ::S2Theme::basicboxes );
-sub cats { qw( featured ) }
-sub designer { "timeasmymeasure" }
-
-package LJ::S2Theme::basicboxes::burgundy;
-use base qw( LJ::S2Theme::basicboxes );
-sub cats { qw() }
-
-package LJ::S2Theme::basicboxes::denim;
-use base qw( LJ::S2Theme::basicboxes );
-sub cats { qw() }
-
-package LJ::S2Theme::basicboxes::ecru;
-use base qw( LJ::S2Theme::basicboxes );
-sub cats { qw() }
-
-package LJ::S2Theme::basicboxes::eggplant;
-use base qw( LJ::S2Theme::basicboxes );
-sub cats { qw() }
-sub designer { "kareila" }
-
-package LJ::S2Theme::basicboxes::freshwater;
-use base qw( LJ::S2Theme::basicboxes );
-sub cats { qw( featured ) }
-sub designer { "timeasmymeasure" }
-
-package LJ::S2Theme::basicboxes::green;
-use base qw( LJ::S2Theme::basicboxes );
-sub cats { qw() }
-
-package LJ::S2Theme::basicboxes::leaf;
-use base qw( LJ::S2Theme::basicboxes );
-sub cats { qw() }
-
-package LJ::S2Theme::basicboxes::manilaenvelope;
-use base qw( LJ::S2Theme::basicboxes );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::basicboxes::parchmentandink;
-use base qw( LJ::S2Theme::basicboxes );
-sub cats { qw( featured ) }
-sub designer { "timeasmymeasure" }
-
-package LJ::S2Theme::basicboxes::peach;
-use base qw( LJ::S2Theme::basicboxes );
-sub cats { qw() }
-
-package LJ::S2Theme::basicboxes::pleasantneutrality;
-use base qw( LJ::S2Theme::basicboxes );
-sub cats { qw( featured ) }
-sub designer { "timeasmymeasure" }
-
-package LJ::S2Theme::basicboxes::poppyfields;
-use base qw( LJ::S2Theme::basicboxes );
-sub cats { qw( featured ) }
-sub designer { "timeasmymeasure" }
-
-package LJ::S2Theme::basicboxes::repose;
-use base qw( LJ::S2Theme::basicboxes );
-sub cats { qw() }
-sub designer { "twtd" }
-
 1;
diff -r 09d54b296645 -r c89cce13dcc4 cgi-bin/LJ/S2Theme/blanket.pm
--- a/cgi-bin/LJ/S2Theme/blanket.pm	Fri Oct 29 15:09:47 2010 +0800
+++ b/cgi-bin/LJ/S2Theme/blanket.pm	Fri Oct 29 16:39:24 2010 +0800
@@ -5,66 +5,10 @@ sub layouts { ( "1" => "one-column" ) }
 sub layouts { ( "1" => "one-column" ) }
 sub layout_prop { "layout_type" }
 
-sub designer { "renoir" }
-
 sub header_props {
     my $self = shift;
     my @props = qw( color_header_footer_border );
     return $self->_append_props( "header_props", @props );
 }
 
-package LJ::S2Theme::blanket::forest;
-use base qw( LJ::S2Theme::blanket );
-sub cats { qw() }
-sub designer { "dancing_serpent" }
-
-package LJ::S2Theme::blanket::green;
-use base qw( LJ::S2Theme::blanket );
-sub cats { qw() }
-sub designer { "dancing_serpent" }
-
-package LJ::S2Theme::blanket::islandsandcities;
-use base qw( LJ::S2Theme::blanket );
-sub cats { qw() }
-sub designer { "sarken" }
-
-package LJ::S2Theme::blanket::jewels;
-use base qw( LJ::S2Theme::blanket );
-sub cats { qw() }
-sub designer { "dancing_serpent" }
-
-package LJ::S2Theme::blanket::kingsandrunaways;
-use base qw( LJ::S2Theme::blanket );
-sub cats { qw() }
-sub designer { "sarken" }
-
-package LJ::S2Theme::blanket::nnwm2009;
-use base qw( LJ::S2Theme::blanket );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::blanket::ocean;
-use base qw( LJ::S2Theme::blanket );
-sub cats { qw() }
-sub designer { "dancing_serpent" }
-
-package LJ::S2Theme::blanket::peach;
-use base qw( LJ::S2Theme::blanket );
-sub cats { qw() }
-
-package LJ::S2Theme::blanket::shallows;
-use base qw( LJ::S2Theme::blanket );
-sub cats { qw() }
-sub designer { "dancing_serpent" }
-
-package LJ::S2Theme::blanket::sprung;
-use base qw( LJ::S2Theme::blanket );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::blanket::thetealandthegrey;
-use base qw( LJ::S2Theme::blanket );
-sub cats { qw() }
-sub designer { "twtd" }
-
 1;
diff -r 09d54b296645 -r c89cce13dcc4 cgi-bin/LJ/S2Theme/boxesandborders.pm
--- a/cgi-bin/LJ/S2Theme/boxesandborders.pm	Fri Oct 29 15:09:47 2010 +0800
+++ b/cgi-bin/LJ/S2Theme/boxesandborders.pm	Fri Oct 29 16:39:24 2010 +0800
@@ -5,60 +5,4 @@ sub layouts { ( "1" => "one-column", "2l
 sub layouts { ( "1" => "one-column", "2l" => "two-columns-left", "2r" => "two-columns-right", "3" => "three-columns-sides", "3r" => "three-columns-right", "3l" => "three-columns-left" ) }
 sub layout_prop { "layout_type" }
 
-sub designer { "branchandroot" }
-
-package LJ::S2Theme::boxesandborders::bittersweet;
-use base qw( LJ::S2Theme::boxesandborders );
-sub cats { qw() }
-
-package LJ::S2Theme::boxesandborders::grass;
-use base qw( LJ::S2Theme::boxesandborders );
-sub cats { qw() }
-
-package LJ::S2Theme::boxesandborders::gray;
-use base qw( LJ::S2Theme::boxesandborders );
-sub cats { qw() }
-
-package LJ::S2Theme::boxesandborders::lightondark;
-use base qw( LJ::S2Theme::boxesandborders );
-sub cats { qw() }
-sub designer { "cesy" }
-
-package LJ::S2Theme::boxesandborders::nnwm2009;
-use base qw( LJ::S2Theme::boxesandborders );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::boxesandborders::onfire;
-use base qw( LJ::S2Theme::boxesandborders );
-sub cats { qw() }
-
-package LJ::S2Theme::boxesandborders::pinkafterdark;
-use base qw( LJ::S2Theme::boxesandborders );
-sub cats { qw() }
-
-package LJ::S2Theme::boxesandborders::poppyfields;
-use base qw( LJ::S2Theme::boxesandborders );
-sub cats { qw( featured ) }
-sub designer { "timeasmymeasure" }
-
-package LJ::S2Theme::boxesandborders::rainyday;
-use base qw( LJ::S2Theme::boxesandborders );
-sub cats { qw() }
-
-package LJ::S2Theme::boxesandborders::retrocandy;
-use base qw( LJ::S2Theme::boxesandborders );
-sub cats { qw( featured ) }
-sub designer { "timeasmymeasure" }
-
-package LJ::S2Theme::boxesandborders::silverfox;
-use base qw( LJ::S2Theme::boxesandborders );
-sub cats { qw( featured ) }
-sub designer { "timeasmymeasure" }
-
-package LJ::S2Theme::boxesandborders::sunnydays;
-use base qw( LJ::S2Theme::boxesandborders );
-sub cats { qw( featured ) }
-sub designer { "timeasmymeasure" }
-
 1;
diff -r 09d54b296645 -r c89cce13dcc4 cgi-bin/LJ/S2Theme/brittle.pm
--- a/cgi-bin/LJ/S2Theme/brittle.pm	Fri Oct 29 15:09:47 2010 +0800
+++ b/cgi-bin/LJ/S2Theme/brittle.pm	Fri Oct 29 16:39:24 2010 +0800
@@ -4,8 +4,6 @@ use strict;
 
 sub layouts { ( "2l" => "two-columns-left", "2r" => "two-columns-right" ) }
 sub layout_prop { "layout_type" }
-
-sub designer { "renoir" }
 
 sub module_props {
     my $self = shift;
@@ -37,78 +35,4 @@ sub entry_props {
     return $self->_append_props( "entry_props", @props );
 }
 
-package LJ::S2Theme::brittle::argyle;
-use base qw( LJ::S2Theme::brittle );
-sub cats { qw( featured ) }
-sub designer { "rising" }
-
-package LJ::S2Theme::brittle::badfairy;
-use base qw( LJ::S2Theme::brittle );
-sub cats { qw() }
-sub designer { "Musyc" }
-
-package LJ::S2Theme::brittle::barnhouse;
-use base qw( LJ::S2Theme::brittle );
-sub cats { qw() }
-sub designer { "rising" }
-
-package LJ::S2Theme::brittle::buttercupyellow;
-use base qw( LJ::S2Theme::brittle );
-sub cats { qw( featured ) }
-sub designer { "rising" }
-
-package LJ::S2Theme::brittle::certainfrogs;
-use base qw( LJ::S2Theme::brittle );
-sub cats { qw( featured ) }
-sub designer { "rising" }
-
-package LJ::S2Theme::brittle::chinesepink;
-use base qw( LJ::S2Theme::brittle );
-sub cats { qw( featured ) }
-sub designer { "rising" }
-
-package LJ::S2Theme::brittle::drab;
-use base qw( LJ::S2Theme::brittle );
-sub cats { qw() }
-sub designer { "rising" }
-
-package LJ::S2Theme::brittle::furcoat;
-use base qw( LJ::S2Theme::brittle );
-sub cats { qw() }
-sub designer { "Musyc" }
-
-package LJ::S2Theme::brittle::mountaindevil;
-use base qw( LJ::S2Theme::brittle );
-sub cats { qw() }
-sub designer { "Musyc" }
-
-package LJ::S2Theme::brittle::nnwm2009;
-use base qw( LJ::S2Theme::brittle );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::brittle::oldroses;
-use base qw( LJ::S2Theme::brittle );
-sub cats { qw() }
-sub designer { "dancing_serpent" }
-
-package LJ::S2Theme::brittle::powerfulgenie;
-use base qw( LJ::S2Theme::brittle );
-sub cats { qw() }
-sub designer { "Musyc" }
-
-package LJ::S2Theme::brittle::rust;
-use base qw( LJ::S2Theme::brittle );
-sub cats { qw() }
-
-package LJ::S2Theme::brittle::softblue;
-use base qw( LJ::S2Theme::brittle );
-sub cats { qw() }
-sub designer { "dancing_serpent" }
-
-package LJ::S2Theme::brittle::softgreen;
-use base qw( LJ::S2Theme::brittle );
-sub cats { qw() }
-sub designer { "dancing_serpent" }
-
 1;
diff -r 09d54b296645 -r c89cce13dcc4 cgi-bin/LJ/S2Theme/colorside.pm
--- a/cgi-bin/LJ/S2Theme/colorside.pm	Fri Oct 29 15:09:47 2010 +0800
+++ b/cgi-bin/LJ/S2Theme/colorside.pm	Fri Oct 29 16:39:24 2010 +0800
@@ -5,41 +5,4 @@ sub layouts { ( "1" => "one-column", "2l
 sub layouts { ( "1" => "one-column", "2l" => "two-columns-left", "2r" => "two-columns-right", "3" => "three-columns-sides", "3r" => "three-columns-right", "3l" => "three-columns-left" ) }
 sub layout_prop { "layout_type" }
 
-sub designer { "branchandroot" }
-
-package LJ::S2Theme::colorside::bedrock;
-use base qw( LJ::S2Theme::colorside );
-sub cats { qw( featured ) }
-sub designer { "timeasmymeasure" }
-
-package LJ::S2Theme::colorside::colorblockade;
-use base qw( LJ::S2Theme::colorside );
-sub cats { qw( featured ) }
-sub designer { "timeasmymeasure" }
-
-package LJ::S2Theme::colorside::lightondark;
-use base qw( LJ::S2Theme::colorside );
-sub cats { qw() }
-sub designer { "cesy" }
-
-package LJ::S2Theme::colorside::nnwm2009;
-use base qw( LJ::S2Theme::colorside );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::colorside::nnwm2010fresh;
-use base qw( LJ::S2Theme::colorside );
-sub cats { qw() }
-sub designer { "timeasmymeasure" }
-
-package LJ::S2Theme::colorside::nnwm2010warmth;
-use base qw( LJ::S2Theme::colorside );
-sub cats { qw() }
-sub designer { "timeasmymeasure" }
-
-package LJ::S2Theme::colorside::scatteredfields;
-use base qw( LJ::S2Theme::colorside );
-sub cats { qw( featured ) }
-sub designer { "timeasmymeasure" }
-
 1;
diff -r 09d54b296645 -r c89cce13dcc4 cgi-bin/LJ/S2Theme/compartmentalize.pm
--- a/cgi-bin/LJ/S2Theme/compartmentalize.pm	Fri Oct 29 15:09:47 2010 +0800
+++ b/cgi-bin/LJ/S2Theme/compartmentalize.pm	Fri Oct 29 16:39:24 2010 +0800
@@ -5,94 +5,4 @@ sub layouts { ( "1" => "one-column", "2l
 sub layouts { ( "1" => "one-column", "2l" => "two-columns-left", "2r" => "two-columns-right", "3" => "three-columns-sides", "3r" => "three-columns-right", "3l" => "three-columns-left" ) }
 sub layout_prop { "layout_type" }
 
-sub designer { "timeasmymeasure" }
-
-package LJ::S2Theme::compartmentalize::agingcopper;
-use base qw( LJ::S2Theme::compartmentalize );
-sub cats { qw() }
-sub designer { "rising" }
-
-package LJ::S2Theme::compartmentalize::almostroyal;
-use base qw( LJ::S2Theme::compartmentalize );
-sub cats { qw() }
-sub designer { "rising" }
-
-package LJ::S2Theme::compartmentalize::bluediamonds;
-use base qw( LJ::S2Theme::compartmentalize );
-sub cats { qw() }
-sub designer { "Musyc" }
-
-package LJ::S2Theme::compartmentalize::contemplation;
-use base qw( LJ::S2Theme::compartmentalize );
-sub cats { qw( featured ) }
-
-package LJ::S2Theme::compartmentalize::dawnflush;
-use base qw( LJ::S2Theme::compartmentalize );
-sub cats { qw( featured ) }
-
-package LJ::S2Theme::compartmentalize::goodsense;
-use base qw( LJ::S2Theme::compartmentalize );
-sub cats { qw( featured ) }
-
-package LJ::S2Theme::compartmentalize::greenclovers;
-use base qw( LJ::S2Theme::compartmentalize );
-sub cats { qw() }
-sub designer { "Musyc" }
-
-package LJ::S2Theme::compartmentalize::iridescentwings;
-use base qw( LJ::S2Theme::compartmentalize );
-sub cats { qw() }
-sub designer { "rising" }
-
-package LJ::S2Theme::compartmentalize::orangestars;
-use base qw( LJ::S2Theme::compartmentalize );
-sub cats { qw() }
-sub designer { "Musyc" }
-
-package LJ::S2Theme::compartmentalize::pinkhearts;
-use base qw( LJ::S2Theme::compartmentalize );
-sub cats { qw() }
-sub designer { "Musyc" }
-
-package LJ::S2Theme::compartmentalize::poppyfields;
-use base qw( LJ::S2Theme::compartmentalize );
-sub cats { qw( featured ) }
-
-package LJ::S2Theme::compartmentalize::purplehorseshoes;
-use base qw( LJ::S2Theme::compartmentalize );
-sub cats { qw() }
-sub designer { "Musyc" }
-
-package LJ::S2Theme::compartmentalize::simplicity;
-use base qw( LJ::S2Theme::compartmentalize );
-sub cats { qw( featured ) }
-
-package LJ::S2Theme::compartmentalize::solyluna;
-use base qw( LJ::S2Theme::compartmentalize );
-sub cats { qw() }
-sub designer { "rising" }
-
-package LJ::S2Theme::compartmentalize::somethingteal;
-use base qw( LJ::S2Theme::compartmentalize );
-sub cats { qw() }
-sub designer { "rising" }
-
-package LJ::S2Theme::compartmentalize::sweetberrygolds;
-use base qw( LJ::S2Theme::compartmentalize );
-sub cats { qw( featured ) }
-
-package LJ::S2Theme::compartmentalize::thought;
-use base qw( LJ::S2Theme::compartmentalize );
-sub cats { qw() }
-sub designer { "rising" }
-
-package LJ::S2Theme::compartmentalize::tripout;
-use base qw( LJ::S2Theme::compartmentalize );
-sub cats { qw( featured ) }
-
-package LJ::S2Theme::compartmentalize::yellowmoons;
-use base qw( LJ::S2Theme::compartmentalize );
-sub cats { qw() }
-sub designer { "Musyc" }
-
 1;
diff -r 09d54b296645 -r c89cce13dcc4 cgi-bin/LJ/S2Theme/core2base.pm
--- a/cgi-bin/LJ/S2Theme/core2base.pm	Fri Oct 29 15:09:47 2010 +0800
+++ b/cgi-bin/LJ/S2Theme/core2base.pm	Fri Oct 29 16:39:24 2010 +0800
@@ -5,38 +5,4 @@ sub layouts { ( "1" => "one-column", "2l
 sub layouts { ( "1" => "one-column", "2l" => "two-columns-left", "2r" => "two-columns-right", "3" => "three-columns-sides", "3r" => "three-columns-right", "3l" => "three-columns-left" ) }
 sub layout_prop { "layout_type" }
 
-package LJ::S2Theme::core2base::dazzle;
-use base qw( LJ::S2Theme::core2base );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::core2base::kelis;
-use base qw( LJ::S2Theme::core2base );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::core2base::muted;
-use base qw( LJ::S2Theme::core2base );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::core2base::nnwm2009;
-use base qw( LJ::S2Theme::core2base );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::core2base::shanice;
-use base qw( LJ::S2Theme::core2base );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::core2base::tabac;
-use base qw( LJ::S2Theme::core2base );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::core2base::testing;
-use base qw( LJ::S2Theme::core2base );
-sub cats { qw() }
-
 1;
diff -r 09d54b296645 -r c89cce13dcc4 cgi-bin/LJ/S2Theme/crossroads.pm
--- a/cgi-bin/LJ/S2Theme/crossroads.pm	Fri Oct 29 15:09:47 2010 +0800
+++ b/cgi-bin/LJ/S2Theme/crossroads.pm	Fri Oct 29 16:39:24 2010 +0800
@@ -5,105 +5,4 @@ sub layouts { ( "1" => "one-column", "2l
 sub layouts { ( "1" => "one-column", "2l" => "two-columns-left", "2r" => "two-columns-right", "3" => "three-columns-sides", "3r" => "three-columns-right", "3l" => "three-columns-left" ) }
 sub layout_prop { "layout_type" }
 
-sub designer { "branchandroot" }
-
-package LJ::S2Theme::crossroads::april;
-use base qw( LJ::S2Theme::crossroads );
-sub cats { qw() }
-
-package LJ::S2Theme::crossroads::bittersweet;
-use base qw( LJ::S2Theme::crossroads );
-sub cats { qw() }
-
-package LJ::S2Theme::crossroads::bluelights;
-use base qw( LJ::S2Theme::crossroads );
-sub cats { qw() }
-sub designer { "rising" }
-
-package LJ::S2Theme::crossroads::caramel;
-use base qw( LJ::S2Theme::crossroads );
-sub cats { qw() }
-
-package LJ::S2Theme::crossroads::charcoalfire;
-use base qw( LJ::S2Theme::crossroads );
-sub cats { qw() }
-
-package LJ::S2Theme::crossroads::cinnamoncream;
-use base qw( LJ::S2Theme::crossroads );
-sub cats { qw() }
-
-package LJ::S2Theme::crossroads::cloudsounds;
-use base qw( LJ::S2Theme::crossroads );
-sub cats { qw() }
-sub designer { "rising" }
-
-package LJ::S2Theme::crossroads::coconut;
-use base qw( LJ::S2Theme::crossroads );
-sub cats { qw() }
-
-package LJ::S2Theme::crossroads::descendingblue;
-use base qw( LJ::S2Theme::crossroads );
-sub cats { qw( ) }
-
-package LJ::S2Theme::crossroads::greenlight;
-use base qw( LJ::S2Theme::crossroads );
-sub cats { qw() }
-sub designer { "rising" }
-
-package LJ::S2Theme::crossroads::lettuce;
-use base qw( LJ::S2Theme::crossroads );
-sub cats { qw() }
-
-package LJ::S2Theme::crossroads::lightinthedark;
-use base qw( LJ::S2Theme::crossroads );
-sub cats { qw() }
-sub designer { "rising" }
-
-package LJ::S2Theme::crossroads::lilac;
-use base qw( LJ::S2Theme::crossroads );
-sub cats { qw() }
-
-package LJ::S2Theme::crossroads::nnwm2009;
-use base qw( LJ::S2Theme::crossroads );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::crossroads::oldhoney;
-use base qw( LJ::S2Theme::crossroads );
-sub cats { qw() }
-
-package LJ::S2Theme::crossroads::orangejulius;
-use base qw( LJ::S2Theme::crossroads );
-sub cats { qw( ) }
-
-package LJ::S2Theme::crossroads::orangelights;
-use base qw( LJ::S2Theme::crossroads );
-sub cats { qw() }
-sub designer { "rising" }
-
-package LJ::S2Theme::crossroads::persimmon;
-use base qw( LJ::S2Theme::crossroads );
-sub cats { qw() }
-
-package LJ::S2Theme::crossroads::pineneedles;
-use base qw( LJ::S2Theme::crossroads );
-sub cats { qw() }
-
-package LJ::S2Theme::crossroads::pinked;
-use base qw( LJ::S2Theme::crossroads );
-sub cats { qw() }
-sub designer { "rising" }
-
-package LJ::S2Theme::crossroads::sherbert;
-use base qw( LJ::S2Theme::crossroads );
-sub cats { qw() }
-
-package LJ::S2Theme::crossroads::sky;
-use base qw( LJ::S2Theme::crossroads );
-sub cats { qw() }
-
-package LJ::S2Theme::crossroads::spearmintice;
-use base qw( LJ::S2Theme::crossroads );
-sub cats { qw() }
-
 1;
diff -r 09d54b296645 -r c89cce13dcc4 cgi-bin/LJ/S2Theme/drifting.pm
--- a/cgi-bin/LJ/S2Theme/drifting.pm	Fri Oct 29 15:09:47 2010 +0800
+++ b/cgi-bin/LJ/S2Theme/drifting.pm	Fri Oct 29 16:39:24 2010 +0800
@@ -5,51 +5,4 @@ sub layouts { ( "2l" => "two-columns-lef
 sub layouts { ( "2l" => "two-columns-left" ) }
 sub layout_prop { "layout_type" }
 
-sub designer { "Jennie Griner" }
-
-package LJ::S2Theme::drifting::chocolatecherry;
-use base qw( LJ::S2Theme::drifting );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::drifting::comfortzone;
-use base qw( LJ::S2Theme::drifting );
-sub cats { qw() }
-sub designer { "timeasmymeasure" }
-
-package LJ::S2Theme::drifting::desertme;
-use base qw( LJ::S2Theme::drifting );
-sub cats { qw() }
-sub designer { "timeasmymeasure" }
-
-package LJ::S2Theme::drifting::go;
-use base qw( LJ::S2Theme::drifting );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::drifting::idolatry;
-use base qw( LJ::S2Theme::drifting );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::drifting::lightondark;
-use base qw( LJ::S2Theme::drifting );
-sub cats { qw() }
-sub designer { "cesy" }
-
-package LJ::S2Theme::drifting::softblues;
-use base qw( LJ::S2Theme::drifting );
-sub cats { qw() }
-sub designer { "ambrya" }
-
-package LJ::S2Theme::drifting::sweetpossibilities;
-use base qw( LJ::S2Theme::drifting );
-sub cats { qw() }
-sub designer { "timeasmymeasure" }
-
-package LJ::S2Theme::drifting::winterclarity;
-use base qw( LJ::S2Theme::drifting );
-sub cats { qw() }
-sub designer { "timeasmymeasure" }
-
 1;
diff -r 09d54b296645 -r c89cce13dcc4 cgi-bin/LJ/S2Theme/easyread.pm
--- a/cgi-bin/LJ/S2Theme/easyread.pm	Fri Oct 29 15:09:47 2010 +0800
+++ b/cgi-bin/LJ/S2Theme/easyread.pm	Fri Oct 29 16:39:24 2010 +0800
@@ -5,50 +5,4 @@ sub layouts { ( "1" => "one-column" ) }
 sub layouts { ( "1" => "one-column" ) }
 sub layout_prop { "layout_type" }
 
-sub designer { "rb" }
-
-package LJ::S2Theme::easyread::clovers;
-use base qw( LJ::S2Theme::easyread );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::easyread::green;
-use base qw( LJ::S2Theme::easyread );
-sub cats { qw() }
-
-package LJ::S2Theme::easyread::hcblack;
-use base qw( LJ::S2Theme::easyread );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::easyread::hcblackandyellow;
-use base qw( LJ::S2Theme::easyread );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::easyread::hcblueyellow;
-use base qw( LJ::S2Theme::easyread );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::easyread::hcwhite;
-use base qw( LJ::S2Theme::easyread );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::easyread::lcorange;
-use base qw( LJ::S2Theme::easyread );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::easyread::nnwm2009;
-use base qw( LJ::S2Theme::easyread );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::easyread::toros;
-use base qw( LJ::S2Theme::easyread );
-sub cats { qw() }
-sub designer { "zvi" }
-
 1;
diff -r 09d54b296645 -r c89cce13dcc4 cgi-bin/LJ/S2Theme/fluidmeasure.pm
--- a/cgi-bin/LJ/S2Theme/fluidmeasure.pm	Fri Oct 29 15:09:47 2010 +0800
+++ b/cgi-bin/LJ/S2Theme/fluidmeasure.pm	Fri Oct 29 16:39:24 2010 +0800
@@ -5,52 +5,4 @@ sub layouts { ( "1" => "one-column", "2l
 sub layouts { ( "1" => "one-column", "2l" => "two-columns-left", "2r" => "two-columns-right", "3" => "three-columns-sides", "3r" => "three-columns-right", "3l" => "three-columns-left" ) }
 sub layout_prop { "layout_type" }
 
-sub designer { "branchandroot" }
-
-package LJ::S2Theme::fluidmeasure::beachaftersunset;
-use base qw( LJ::S2Theme::fluidmeasure );
-sub cats { qw() }
-sub designer { "dancing_serpent" }
-
-package LJ::S2Theme::fluidmeasure::marblei;
-use base qw( LJ::S2Theme::fluidmeasure );
-sub cats { qw() }
-sub designer { "dancing_serpent" }
-
-package LJ::S2Theme::fluidmeasure::marbleii;
-use base qw( LJ::S2Theme::fluidmeasure );
-sub cats { qw() }
-sub designer { "dancing_serpent" }
-
-package LJ::S2Theme::fluidmeasure::mutedseashore;
-use base qw( LJ::S2Theme::fluidmeasure );
-sub cats { qw() }
-sub designer { "cimorene" }
-
-package LJ::S2Theme::fluidmeasure::nnwm2009;
-use base qw( LJ::S2Theme::fluidmeasure );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::fluidmeasure::nutmeg;
-use base qw( LJ::S2Theme::fluidmeasure );
-sub cats { qw() }
-
-package LJ::S2Theme::fluidmeasure::pigeonblue;
-use base qw( LJ::S2Theme::fluidmeasure );
-sub cats { qw() }
-sub designer { "dancing_serpent" }
-
-package LJ::S2Theme::fluidmeasure::spice;
-use base qw( LJ::S2Theme::fluidmeasure );
-sub cats { qw() }
-
-package LJ::S2Theme::fluidmeasure::summerdark;
-use base qw( LJ::S2Theme::fluidmeasure );
-sub cats { qw() }
-
-package LJ::S2Theme::fluidmeasure::wooded;
-use base qw( LJ::S2Theme::fluidmeasure );
-sub cats { qw() }
-
 1;
diff -r 09d54b296645 -r c89cce13dcc4 cgi-bin/LJ/S2Theme/funkycircles.pm
--- a/cgi-bin/LJ/S2Theme/funkycircles.pm	Fri Oct 29 15:09:47 2010 +0800
+++ b/cgi-bin/LJ/S2Theme/funkycircles.pm	Fri Oct 29 16:39:24 2010 +0800
@@ -4,8 +4,6 @@ use strict;
 
 sub layouts { ( "1" => "one-column", "2l" => "two-columns-left", "2r" => "two-columns-right", "3" => "three-columns-sides", "3r" => "three-columns-right", "3l" => "three-columns-left" ) }
 sub layout_prop { "layout_type" }
-
-sub designer { "ninetydegrees" }
 
 sub page_props {
     my $self = shift;
@@ -52,51 +50,4 @@ sub entry_props {
     return $self->_append_props( "entry_props", @props );
 }
 
-package LJ::S2Theme::funkycircles::atomicorange;
-use base qw( LJ::S2Theme::funkycircles );
-sub cats { qw() }
-
-package LJ::S2Theme::funkycircles::chocolaterose;
-use base qw( LJ::S2Theme::funkycircles );
-sub cats { qw() }
-
-package LJ::S2Theme::funkycircles::darkblue;
-use base qw( LJ::S2Theme::funkycircles );
-sub cats { qw() }
-
-package LJ::S2Theme::funkycircles::darkpurple;
-use base qw( LJ::S2Theme::funkycircles );
-sub cats { qw() }
-
-package LJ::S2Theme::funkycircles::earthygreen;
-use base qw( LJ::S2Theme::funkycircles );
-sub cats { qw() }
-
-package LJ::S2Theme::funkycircles::industrialpink;
-use base qw( LJ::S2Theme::funkycircles );
-sub cats { qw() }
-
-package LJ::S2Theme::funkycircles::industrialteal;
-use base qw( LJ::S2Theme::funkycircles );
-sub cats { qw() }
-
-package LJ::S2Theme::funkycircles::lightondark;
-use base qw( LJ::S2Theme::funkycircles );
-sub cats { qw() }
-sub designer { "cesy" }
-
-package LJ::S2Theme::funkycircles::nevermore;
-use base qw( LJ::S2Theme::funkycircles );
-sub cats { qw() }
-sub designer { "wizard101" }
-
-package LJ::S2Theme::funkycircles::nnwm2009;
-use base qw( LJ::S2Theme::funkycircles );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::funkycircles::seablues;
-use base qw( LJ::S2Theme::funkycircles );
-sub cats { qw() }
-
 1;
diff -r 09d54b296645 -r c89cce13dcc4 cgi-bin/LJ/S2Theme/modish.pm
--- a/cgi-bin/LJ/S2Theme/modish.pm	Fri Oct 29 15:09:47 2010 +0800
+++ b/cgi-bin/LJ/S2Theme/modish.pm	Fri Oct 29 16:39:24 2010 +0800
@@ -5,61 +5,4 @@ sub layouts { ( "1" => "one-column", "2l
 sub layouts { ( "1" => "one-column", "2l" => "two-columns-left", "2r" => "two-columns-right", "3" => "three-columns-sides", "3r" => "three-columns-right", "3l" => "three-columns-left" ) }
 sub layout_prop { "layout_type" }
 
-sub designer { "branchandroot" }
-
-package LJ::S2Theme::modish::bluespruce;
-use base qw( LJ::S2Theme::modish );
-sub cats { qw( featured ) }
-sub designer { "sarken" }
-
-package LJ::S2Theme::modish::cinnamonplumtea;
-use base qw( LJ::S2Theme::modish );
-sub cats { qw( featured ) }
-sub designer { "sarken" }
-
-package LJ::S2Theme::modish::cleansheets;
-use base qw( LJ::S2Theme::modish );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::modish::greyscale;
-use base qw( LJ::S2Theme::modish );
-sub cats { qw() }
-sub designer { "twtd" }
-
-package LJ::S2Theme::modish::houlihan;
-use base qw( LJ::S2Theme::modish );
-sub cats { qw( featured ) }
-sub designer { "sarken" }
-
-package LJ::S2Theme::modish::moonlight;
-use base qw( LJ::S2Theme::modish );
-sub cats { qw( featured ) }
-sub designer { "sarken" }
-
-package LJ::S2Theme::modish::nnwm2009;
-use base qw( LJ::S2Theme::modish );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::modish::plasticgrass;
-use base qw( LJ::S2Theme::modish );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::modish::porcelainteacup;
-use base qw( LJ::S2Theme::modish );
-sub cats { qw( featured ) }
-sub designer { "sarken" }
-
-package LJ::S2Theme::modish::trusty;
-use base qw( LJ::S2Theme::modish );
-sub cats { qw( featured ) }
-sub designer { "sarken" }
-
-package LJ::S2Theme::modish::verdigris;
-use base qw( LJ::S2Theme::modish );
-sub cats { qw() }
-sub designer { "zvi" }
-
 1;
diff -r 09d54b296645 -r c89cce13dcc4 cgi-bin/LJ/S2Theme/modular.pm
--- a/cgi-bin/LJ/S2Theme/modular.pm	Fri Oct 29 15:09:47 2010 +0800
+++ b/cgi-bin/LJ/S2Theme/modular.pm	Fri Oct 29 16:39:24 2010 +0800
@@ -5,67 +5,4 @@ sub layouts { ( "1" => "one-column", "2l
 sub layouts { ( "1" => "one-column", "2l" => "two-columns-left", "2r" => "two-columns-right", "3" => "three-columns-sides", "3r" => "three-columns-right", "3l" => "three-columns-left" ) }
 sub layout_prop { "layout_type" }
 
-sub designer { "branchandroot" }
-
-package LJ::S2Theme::modular::amberandgreen;
-use base qw( LJ::S2Theme::modular );
-sub cats { qw() }
-
-package LJ::S2Theme::modular::bubblegum;
-use base qw( LJ::S2Theme::modular );
-sub cats { qw() }
-
-package LJ::S2Theme::modular::calculatedrisks;
-use base qw( LJ::S2Theme::modular );
-sub cats { qw( featured ) }
-sub designer { "timeasmymeasure" }
-
-package LJ::S2Theme::modular::coffeeandcream;
-use base qw( LJ::S2Theme::modular );
-sub cats { qw() }
-
-package LJ::S2Theme::modular::distinctblue;
-use base qw( LJ::S2Theme::modular );
-sub cats { qw() }
-
-package LJ::S2Theme::modular::freshprose;
-use base qw( LJ::S2Theme::modular );
-sub cats { qw() }
-sub designer { "timeasmymeasure" }
-
-package LJ::S2Theme::modular::greensummer;
-use base qw( LJ::S2Theme::modular );
-sub cats { qw () }
-
-package LJ::S2Theme::modular::irisatdusk;
-use base qw( LJ::S2Theme::modular );
-sub cats { qw() }
-
-package LJ::S2Theme::modular::mediterraneanpeach;
-use base qw( LJ::S2Theme::modular );
-sub cats { qw() }
-
-package LJ::S2Theme::modular::olivetree;
-use base qw( LJ::S2Theme::modular );
-sub cats { qw() }
-
-package LJ::S2Theme::modular::patchwork;
-use base qw( LJ::S2Theme::modular );
-sub cats { qw( featured ) }
-sub designer { "timeasmymeasure" }
-
-package LJ::S2Theme::modular::purplehaze;
-use base qw( LJ::S2Theme::modular );
-sub cats { qw() }
-sub designer { "timeasmymeasure" }
-
-package LJ::S2Theme::modular::subtlemisses;
-use base qw( LJ::S2Theme::modular );
-sub cats { qw( featured ) }
-sub designer { "timeasmymeasure" }
-
-package LJ::S2Theme::modular::swiminthesea;
-use base qw( LJ::S2Theme::modular );
-sub cats { qw() }
-
 1;
diff -r 09d54b296645 -r c89cce13dcc4 cgi-bin/LJ/S2Theme/negatives.pm
--- a/cgi-bin/LJ/S2Theme/negatives.pm	Fri Oct 29 15:09:47 2010 +0800
+++ b/cgi-bin/LJ/S2Theme/negatives.pm	Fri Oct 29 16:39:24 2010 +0800
@@ -5,85 +5,4 @@ sub layouts { ( "1" => "one-column", "2l
 sub layouts { ( "1" => "one-column", "2l" => "two-columns-left", "2r" => "two-columns-right" ) }
 sub layout_prop { "layout_type" }
 
-sub designer { "phoenix" }
-
-package LJ::S2Theme::negatives::autumn;
-use base qw( LJ::S2Theme::negatives );
-sub cats { qw() }
-sub designer { "busaikko" }
-
-package LJ::S2Theme::negatives::azure;
-use base qw( LJ::S2Theme::negatives );
-sub cats { qw() }
-sub designer { "daven" }
-
-package LJ::S2Theme::negatives::black;
-use base qw( LJ::S2Theme::negatives );
-sub cats { qw() }
-
-package LJ::S2Theme::negatives::blastedsands;
-use base qw( LJ::S2Theme::negatives );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::negatives::bridalbouquet;
-use base qw( LJ::S2Theme::negatives );
-sub cats { qw() }
-sub designer { "busaikko" }
-
-package LJ::S2Theme::negatives::corporateembrace;
-use base qw( LJ::S2Theme::negatives );
-sub cats { qw() }
-sub designer { "busaikko" }
-
-package LJ::S2Theme::negatives::easyreader;
-use base qw( LJ::S2Theme::negatives );
-sub cats { qw() }
-sub designer { "busaikko" }
-
-package LJ::S2Theme::negatives::evening;
-use base qw( LJ::S2Theme::negatives );
-sub cats { qw() }
-sub designer { "busaikko" }
-
-package LJ::S2Theme::negatives::lightondark;
-use base qw( LJ::S2Theme::negatives );
-sub cats { qw() }
-sub designer { "cesy" }
-
-package LJ::S2Theme::negatives::limecherry;
-use base qw( LJ::S2Theme::negatives );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::negatives::nnwm2009;
-use base qw( LJ::S2Theme::negatives );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::negatives::pumpkinjuice;
-use base qw( LJ::S2Theme::negatives );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::negatives::spring;
-use base qw( LJ::S2Theme::negatives );
-sub cats { qw() }
-sub designer { "busaikko" }
-
-package LJ::S2Theme::negatives::summer;
-use base qw( LJ::S2Theme::negatives );
-sub cats { qw() }
-sub designer { "busaikko" }
-
-package LJ::S2Theme::negatives::winter;
-use base qw( LJ::S2Theme::negatives );
-sub cats { qw() }
-sub designer { "busaikko" }
-
-package LJ::S2Theme::negatives::yozakura;
-use base qw( LJ::S2Theme::negatives );
-sub cats { qw() }
-sub designer { "busaikko" }
-
 1;
diff -r 09d54b296645 -r c89cce13dcc4 cgi-bin/LJ/S2Theme/nouveauoleanders.pm
--- a/cgi-bin/LJ/S2Theme/nouveauoleanders.pm	Fri Oct 29 15:09:47 2010 +0800
+++ b/cgi-bin/LJ/S2Theme/nouveauoleanders.pm	Fri Oct 29 16:39:24 2010 +0800
@@ -4,8 +4,6 @@ use strict;
 
 sub layouts { ( "1" => "one-column", "2l" => "two-columns-left", "2r" => "two-columns-right", "3" => "three-columns-sides", "3r" => "three-columns-right", "3l" => "three-columns-left" ) }
 sub layout_prop { "layout_type" }
-
-sub designer { "branchandroot" }
 
 sub entry_props {
     my $self = shift;
@@ -45,49 +43,4 @@ sub comment_props {
     return $self->_append_props( "comment_props", @props );
 }
 
-package LJ::S2Theme::nouveauoleanders::dustyantique;
-use base qw( LJ::S2Theme::nouveauoleanders );
-sub cats { qw() }
-
-package LJ::S2Theme::nouveauoleanders::huntergreen;
-use base qw( LJ::S2Theme::nouveauoleanders );
-sub cats { qw() }
-sub designer { "dancing_serpent" }
-
-package LJ::S2Theme::nouveauoleanders::nightfall;
-use base qw( LJ::S2Theme::nouveauoleanders );
-sub cats { qw() }
-sub designer { "dancing_serpent" }
-
-package LJ::S2Theme::nouveauoleanders::palejewels;
-use base qw( LJ::S2Theme::nouveauoleanders );
-sub cats { qw( featured ) }
-sub designer { "dancing_serpent" }
-
-package LJ::S2Theme::nouveauoleanders::peridot;
-use base qw( LJ::S2Theme::nouveauoleanders );
-sub cats { qw( featured ) }
-sub designer { "dancing_serpent" }
-
-package LJ::S2Theme::nouveauoleanders::piquant;
-use base qw( LJ::S2Theme::nouveauoleanders );
-sub cats { qw() }
-
-package LJ::S2Theme::nouveauoleanders::seaandsalt;
-use base qw( LJ::S2Theme::nouveauoleanders );
-sub cats { qw() }
-
-package LJ::S2Theme::nouveauoleanders::sienna;
-use base qw( LJ::S2Theme::nouveauoleanders );
-sub cats { qw() }
-
-package LJ::S2Theme::nouveauoleanders::tearose;
-use base qw( LJ::S2Theme::nouveauoleanders );
-sub cats { qw( featured ) }
-sub designer { "dancing_serpent" }
-
-package LJ::S2Theme::nouveauoleanders::wisteria;
-use base qw( LJ::S2Theme::nouveauoleanders );
-sub cats { qw() }
-
 1;
diff -r 09d54b296645 -r c89cce13dcc4 cgi-bin/LJ/S2Theme/practicality.pm
--- a/cgi-bin/LJ/S2Theme/practicality.pm	Fri Oct 29 15:09:47 2010 +0800
+++ b/cgi-bin/LJ/S2Theme/practicality.pm	Fri Oct 29 16:39:24 2010 +0800
@@ -5,43 +5,4 @@ sub layouts { ( "1" => "one-column", "2l
 sub layouts { ( "1" => "one-column", "2l" => "two-columns-left", "2r" => "two-columns-right", "3" => "three-columns-sides", "3r" => "three-columns-right", "3l" => "three-columns-left" ) }
 sub layout_prop { "layout_type" }
 
-sub designer { "timeasmymeasure" }
-
-package LJ::S2Theme::practicality::agingcopper;
-use base qw( LJ::S2Theme::practicality );
-sub cats { qw() }
-sub designer { "rising" }
-
-package LJ::S2Theme::practicality::cherryblossoms;
-use base qw( LJ::S2Theme::practicality );
-sub cats { qw( featured ) }
-
-package LJ::S2Theme::practicality::chococraze;
-use base qw( LJ::S2Theme::practicality );
-sub cats { qw( featured ) }
-
-package LJ::S2Theme::practicality::neutralgood;
-use base qw( LJ::S2Theme::practicality );
-sub cats { qw( featured ) }
-
-package LJ::S2Theme::practicality::nightlight;
-use base qw( LJ::S2Theme::practicality );
-sub cats { qw( featured ) }
-
-package LJ::S2Theme::practicality::nnwm2010fresh;
-use base qw( LJ::S2Theme::practicality );
-sub cats { qw() }
-
-package LJ::S2Theme::practicality::nnwm2010warmth;
-use base qw( LJ::S2Theme::practicality );
-sub cats { qw() }
-
-package LJ::S2Theme::practicality::poppyfields;
-use base qw( LJ::S2Theme::practicality );
-sub cats { qw( featured ) }
-
-package LJ::S2Theme::practicality::warmth;
-use base qw( LJ::S2Theme::practicality );
-sub cats { qw( featured ) }
-
 1;
diff -r 09d54b296645 -r c89cce13dcc4 cgi-bin/LJ/S2Theme/refriedtablet.pm
--- a/cgi-bin/LJ/S2Theme/refriedtablet.pm	Fri Oct 29 15:09:47 2010 +0800
+++ b/cgi-bin/LJ/S2Theme/refriedtablet.pm	Fri Oct 29 16:39:24 2010 +0800
@@ -5,76 +5,4 @@ sub layouts { ( "1" => "one-column", "2l
 sub layouts { ( "1" => "one-column", "2l" => "two-columns-left", "2r" => "two-columns-right", "3" => "three-columns-sides", "3r" => "three-columns-right", "3l" => "three-columns-left" ) }
 sub layout_prop { "layout_type" }
 
-sub designer { "zvi" }
-
-package LJ::S2Theme::refriedtablet::autumnnight;
-use base qw( LJ::S2Theme::refriedtablet );
-sub cats { qw() }
-
-package LJ::S2Theme::refriedtablet::bluetuesday;
-use base qw( LJ::S2Theme::refriedtablet );
-sub cats { qw() }
-sub designer { "forthwritten" }
-
-package LJ::S2Theme::refriedtablet::californiaroll;
-use base qw( LJ::S2Theme::refriedtablet );
-sub cats { qw() }
-
-package LJ::S2Theme::refriedtablet::cherryicing;
-use base qw( LJ::S2Theme::refriedtablet );
-sub cats { qw() }
-
-package LJ::S2Theme::refriedtablet::damage;
-use base qw( LJ::S2Theme::refriedtablet );
-sub cats { qw() }
-sub designer { "rising" }
-
-package LJ::S2Theme::refriedtablet::easier;
-use base qw( LJ::S2Theme::refriedtablet );
-sub cats { qw() }
-sub designer { "rising" }
-
-package LJ::S2Theme::refriedtablet::foliage;
-use base qw( LJ::S2Theme::refriedtablet );
-sub cats { qw() }
-sub designer { "dancing_serpent" }
-
-package LJ::S2Theme::refriedtablet::gentleearth;
-use base qw( LJ::S2Theme::refriedtablet );
-sub cats { qw() }
-sub designer { "rising" }
-
-package LJ::S2Theme::refriedtablet::refriedclassic;
-use base qw( LJ::S2Theme::refriedtablet );
-sub cats { qw() }
-
-package LJ::S2Theme::refriedtablet::refriedjewels;
-use base qw( LJ::S2Theme::refriedtablet );
-sub cats { qw() }
-sub designer { "dancing_serpent" }
-
-package LJ::S2Theme::refriedtablet::paisaje;
-use base qw( LJ::S2Theme::refriedtablet );
-sub cats { qw() }
-sub designer { "rising" }
-
-package LJ::S2Theme::refriedtablet::refriedshallows;
-use base qw( LJ::S2Theme::refriedtablet );
-sub cats { qw() }
-sub designer { "dancing_serpent" }
-
-package LJ::S2Theme::refriedtablet::seeded;
-use base qw( LJ::S2Theme::refriedtablet );
-sub cats { qw() }
-
-package LJ::S2Theme::refriedtablet::teals;
-use base qw( LJ::S2Theme::refriedtablet );
-sub cats { qw() }
-sub designer { "rising" }
-
-package LJ::S2Theme::refriedtablet::vintagemodern;
-use base qw( LJ::S2Theme::refriedtablet );
-sub cats { qw() }
-sub designer { "rising" }
-
 1;
diff -r 09d54b296645 -r c89cce13dcc4 cgi-bin/LJ/S2Theme/skittlishdreams.pm
--- a/cgi-bin/LJ/S2Theme/skittlishdreams.pm	Fri Oct 29 15:09:47 2010 +0800
+++ b/cgi-bin/LJ/S2Theme/skittlishdreams.pm	Fri Oct 29 16:39:24 2010 +0800
@@ -5,65 +5,10 @@ sub layouts { ( "2r" => "two-columns-rig
 sub layouts { ( "2r" => "two-columns-right", "2l" => "two-columns-left" ) }
 sub layout_prop { "layout_type" }
 
-sub designer { "Kaigou" }
-
 sub entry_props {
     my $self = shift;
     my @props = qw( color_entry_title_border color_entry_title_border_alt color_entry_metadata_text );
     return $self->_append_props( "entry_props", @props );
 }
 
-package LJ::S2Theme::skittlishdreams::academy;
-use base qw( LJ::S2Theme::skittlishdreams );
-sub cats { qw() }
-sub designer { "sarken" }
-
-package LJ::S2Theme::skittlishdreams::blue;
-use base qw( LJ::S2Theme::skittlishdreams );
-sub cats { qw() }
-
-package LJ::S2Theme::skittlishdreams::cyan;
-use base qw( LJ::S2Theme::skittlishdreams );
-sub cats { qw() }
-
-package LJ::S2Theme::skittlishdreams::desertcream;
-use base qw( LJ::S2Theme::skittlishdreams );
-sub cats { qw() }
-sub designer { "sarken" }
-
-package LJ::S2Theme::skittlishdreams::green;
-use base qw( LJ::S2Theme::skittlishdreams );
-sub cats { qw() }
-
-package LJ::S2Theme::skittlishdreams::inthebag;
-use base qw( LJ::S2Theme::skittlishdreams );
-sub cats { qw() }
-sub designer { "sarken" }
-
-package LJ::S2Theme::skittlishdreams::likesunshine;
-use base qw( LJ::S2Theme::skittlishdreams );
-sub cats { qw() }
-sub designer { "sarken" }
-
-package LJ::S2Theme::skittlishdreams::orange;
-use base qw( LJ::S2Theme::skittlishdreams );
-sub cats { qw() }
-
-package LJ::S2Theme::skittlishdreams::pink;
-use base qw( LJ::S2Theme::skittlishdreams );
-sub cats { qw() }
-
-package LJ::S2Theme::skittlishdreams::red;
-use base qw( LJ::S2Theme::skittlishdreams );
-sub cats { qw() }
-
-package LJ::S2Theme::skittlishdreams::snowcherries;
-use base qw( LJ::S2Theme::skittlishdreams );
-sub cats { qw() }
-sub designer { "sarken" }
-
-package LJ::S2Theme::skittlishdreams::violet;
-use base qw( LJ::S2Theme::skittlishdreams );
-sub cats { qw() }
-
 1;
diff -r 09d54b296645 -r c89cce13dcc4 cgi-bin/LJ/S2Theme/steppingstones.pm
--- a/cgi-bin/LJ/S2Theme/steppingstones.pm	Fri Oct 29 15:09:47 2010 +0800
+++ b/cgi-bin/LJ/S2Theme/steppingstones.pm	Fri Oct 29 16:39:24 2010 +0800
@@ -5,53 +5,4 @@ sub layouts { ( "1" => "one-column", "2l
 sub layouts { ( "1" => "one-column", "2l" => "two-columns-left", "2r" => "two-columns-right", "3" => "three-columns-sides", "3r" => "three-columns-right", "3l" => "three-columns-left" ) }
 sub layout_prop { "layout_type" }
 
-sub designer { "branchandroot" }
-
-package LJ::S2Theme::steppingstones::chocolate;
-use base qw( LJ::S2Theme::steppingstones );
-sub cats { qw() }
-
-package LJ::S2Theme::steppingstones::cleargreen;
-use base qw( LJ::S2Theme::steppingstones );
-sub cats { qw() }
-sub designer { "ambrya" }
-
-package LJ::S2Theme::steppingstones::duskyrose;
-use base qw( LJ::S2Theme::steppingstones );
-sub cats { qw() }
-
-package LJ::S2Theme::steppingstones::friendlycolors;
-use base qw( LJ::S2Theme::steppingstones );
-sub cats { qw( featured ) }
-sub designer { "kareila" }
-
-package LJ::S2Theme::steppingstones::gray;
-use base qw( LJ::S2Theme::steppingstones );
-sub cats { qw() }
-
-package LJ::S2Theme::steppingstones::nnwm2009;
-use base qw( LJ::S2Theme::steppingstones );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::steppingstones::olive;
-use base qw( LJ::S2Theme::steppingstones );
-sub cats { qw() }
-
-package LJ::S2Theme::steppingstones::pool;
-use base qw( LJ::S2Theme::steppingstones );
-sub cats { qw() }
-
-package LJ::S2Theme::steppingstones::purple;
-use base qw( LJ::S2Theme::steppingstones );
-sub cats { qw() }
-
-package LJ::S2Theme::steppingstones::shadows;
-use base qw( LJ::S2Theme::steppingstones );
-sub cats { qw() }
-
-package LJ::S2Theme::steppingstones::sunset;
-use base qw( LJ::S2Theme::steppingstones );
-sub cats { qw() }
-
 1;
diff -r 09d54b296645 -r c89cce13dcc4 cgi-bin/LJ/S2Theme/tranquilityiii.pm
--- a/cgi-bin/LJ/S2Theme/tranquilityiii.pm	Fri Oct 29 15:09:47 2010 +0800
+++ b/cgi-bin/LJ/S2Theme/tranquilityiii.pm	Fri Oct 29 16:39:24 2010 +0800
@@ -5,73 +5,4 @@ sub layouts { ( "1" => "one-column", "2l
 sub layouts { ( "1" => "one-column", "2l" => "two-columns-left", "2r" => "two-columns-right", "3" => "three-columns-sides", "3r" => "three-columns-right", "3l" => "three-columns-left" ) }
 sub layout_prop { "layout_type" }
 
-sub designer { "branchandroot" }
-
-package LJ::S2Theme::tranquilityiii::brick;
-use base qw( LJ::S2Theme::tranquilityiii );
-sub cats { qw() }
-
-package LJ::S2Theme::tranquilityiii::clearmessages;
-use base qw( LJ::S2Theme::tranquilityiii );
-sub cats { qw( featured ) }
-sub designer { "timeasmymeasure" }
-
-package LJ::S2Theme::tranquilityiii::deeppurple;
-use base qw( LJ::S2Theme::tranquilityiii );
-sub cats { qw( featured ) }
-sub designer { "dancing_serpent" }
-
-package LJ::S2Theme::tranquilityiii::freshblue;
-use base qw( LJ::S2Theme::tranquilityiii );
-sub cats { qw() }
-sub designer { "forthwritten" }
-
-package LJ::S2Theme::tranquilityiii::lightondark;
-use base qw( LJ::S2Theme::tranquilityiii );
-sub cats { qw() }
-sub designer { "cesy" }
-
-package LJ::S2Theme::tranquilityiii::lilac;
-use base qw( LJ::S2Theme::tranquilityiii );
-sub cats { qw() }
-
-package LJ::S2Theme::tranquilityiii::marbleiii;
-use base qw( LJ::S2Theme::tranquilityiii );
-sub cats { qw() }
-sub designer { "dancing_serpent" }
-
-package LJ::S2Theme::tranquilityiii::nightsea;
-use base qw( LJ::S2Theme::tranquilityiii );
-sub cats { qw() }
-
-package LJ::S2Theme::tranquilityiii::nnwm2009;
-use base qw( LJ::S2Theme::tranquilityiii );
-sub cats { qw() }
-sub designer { "zvi" }
-
-package LJ::S2Theme::tranquilityiii::olive;
-use base qw( LJ::S2Theme::tranquilityiii );
-sub cats { qw() }
-sub designer { "dancing_serpent" }
-
-package LJ::S2Theme::tranquilityiii::seadeep;
-use base qw( LJ::S2Theme::tranquilityiii );
-sub cats { qw( featured ) }
-sub designer { "timeasmymeasure" }
-
-package LJ::S2Theme::tranquilityiii::shallows;
-use base qw( LJ::S2Theme::tranquilityiii );
-sub cats { qw() }
-sub designer { "dancing_serpent" }
-
-package LJ::S2Theme::tranquilityiii::stonemask;
-use base qw( LJ::S2Theme::tranquilityiii );
-sub cats { qw( featured ) }
-sub designer { "timeasmymeasure" }
-
-package LJ::S2Theme::tranquilityiii::wintergreen;
-use base qw( LJ::S2Theme::tranquilityiii );
-sub cats { qw() }
-sub designer { "dancing_serpent" }
-
 1;
diff -r 09d54b296645 -r c89cce13dcc4 cgi-bin/LJ/S2Theme/zesty.pm
--- a/cgi-bin/LJ/S2Theme/zesty.pm	Fri Oct 29 15:09:47 2010 +0800
+++ b/cgi-bin/LJ/S2Theme/zesty.pm	Fri Oct 29 16:39:24 2010 +0800
@@ -2,7 +2,4 @@ use base qw( LJ::S2Theme );
 use base qw( LJ::S2Theme );
 use strict;
 
-sub cats { qw() }
-sub designer { "exampleusername" }
-
 1;
diff -r 09d54b296645 -r c89cce13dcc4 cgi-bin/LJ/Widget/ThemeNav.pm
--- a/cgi-bin/LJ/Widget/ThemeNav.pm	Fri Oct 29 15:09:47 2010 +0800
+++ b/cgi-bin/LJ/Widget/ThemeNav.pm	Fri Oct 29 16:39:24 2010 +0800
@@ -282,7 +282,7 @@ sub js {
                 for (var arg in getArgs) {
                     if (!getArgs.hasOwnProperty(arg)) continue;
                     if (arg == "authas" || arg == "show") continue;
-                    DOM.addEventListener(filter_link, "click", function (evt) { self.filterThemes(evt, arg, getArgs[arg]) });
+                    DOM.addEventListener(filter_link, "click", function (evt) { self.filterThemes(evt, arg, unescape( getArgs[arg] ) ) });
                     evt_listener_added = 1;
                     break;
                 }
diff -r 09d54b296645 -r c89cce13dcc4 cgi-bin/ljlib.pl
--- a/cgi-bin/ljlib.pl	Fri Oct 29 15:09:47 2010 +0800
+++ b/cgi-bin/ljlib.pl	Fri Oct 29 16:39:24 2010 +0800
@@ -1228,6 +1228,7 @@ sub handle_caches
     %LJ::CACHE_CODES = ();
     %LJ::CACHE_USERPROP = ();  # {$prop}->{ 'upropid' => ... , 'indexed' => 0|1 };
     %LJ::CACHE_ENCODINGS = ();
+
     return 1;
 }
 
@@ -1249,6 +1250,7 @@ sub start_request
     $LJ::ACTIVE_CRUMB = '';           # clear active crumb
     %LJ::CACHE_USERPIC = ();          # picid -> hashref
     %LJ::CACHE_USERPIC_INFO = ();     # uid -> { ... }
+    %LJ::CACHE_S2THEME = ();
     %LJ::REQ_CACHE_USER_NAME = ();    # users by name
     %LJ::REQ_CACHE_USER_ID = ();      # users by id
     %LJ::REQ_CACHE_REL = ();          # relations from LJ::check_rel()
diff -r 09d54b296645 -r c89cce13dcc4 htdocs/js/admin/themes/category.js
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htdocs/js/admin/themes/category.js	Fri Oct 29 16:39:24 2010 +0800
@@ -0,0 +1,52 @@
+jQuery(function($) {
+    $("#clear_visible").click(function (event) {
+        $("#table_data tr:visible input[type='checkbox']:checked").each( function (_,x) {
+            x.checked = false;
+        } );
+        event.preventDefault();
+    });
+    
+    $("#check_visible").click(function (event) {
+        $("#table_data tr:visible input[type='checkbox']").each( function (_,x) {
+            x.checked = true;
+        } );
+        event.preventDefault();
+    });
+
+    $("#filter_apply").click(function () {
+        var act = $("#filter_act")[0].value;
+        var redist = $("#filter_redist")[0].value;
+        var header;
+        var ct;
+        var handle_header = function ( nh ) {
+            if ( header != undefined )
+                if ( ct == 0 )
+                    header.hide();
+                else
+                    header.show();
+            header = nh;
+            ct = 0; 
+        }
+        $("#table_data tr").each( function (_,x) {
+            var xj = $(x);
+            if ( xj.attr('data-header') )
+                return handle_header( xj );
+            var vl = $("input[type='checkbox']", x)[0];
+            var show = 1;
+            if ( show && act == "active" )
+                show = vl.checked ? 1 : 0;
+            else if ( show && act == "inactive" )
+                show = vl.checked ? 0 : 1;
+            if ( show && redist.length > 0 &&
+                    xj.attr('data-redist').indexOf( redist ) == -1 )
+                show = false;
+            if ( show ) { 
+                ct++;
+                xj.show();
+            } else {
+                xj.hide();
+            }
+        });
+        handle_header();
+    });
+});
diff -r 09d54b296645 -r c89cce13dcc4 htdocs/js/admin/themes/index.js
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htdocs/js/admin/themes/index.js	Fri Oct 29 16:39:24 2010 +0800
@@ -0,0 +1,37 @@
+jQuery(function($) {
+    var select = $( '#edit_theme' );
+    var optgr = $( 'optgroup', select );
+
+    var theme_layers = {};
+    var out_layers = $( '<select />' );
+    select.before( out_layers );
+
+    $.each( optgr, function(_, x) {
+        var themes = $( 'option', x );
+        theme_layers[ x.label ] = $.map( themes, function (y) { 
+            return y.text;
+        });
+        out_layers.append( $("<option/>", {
+            'value': x.label,
+            'text': x.label
+        }) );
+    });
+    select.empty();
+    
+    var update_themes = function () {
+        select.empty();
+        var lay = out_layers[0].value;
+        if ( theme_layers[ lay ] == undefined ) return;
+        $.each( theme_layers[ lay ], function(_, x) {
+            select.append( $("<option/>", {
+                'value': lay + "/" + x,
+                'text': x
+            }) );
+        }); 
+    };
+
+    out_layers.change( update_themes );
+    update_themes();
+
+    window._dbg = theme_layers;
+});
diff -r 09d54b296645 -r c89cce13dcc4 views/admin/themes/category.tt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/views/admin/themes/category.tt	Fri Oct 29 16:39:24 2010 +0800
@@ -0,0 +1,47 @@
+[%- sections.title = '.title' | ml ( category = category ) -%]
+[%- dw.need_res( { group => 'jquery' }, 'js/admin/themes/category.js' ) -%]
+[%- CALL dw.active_resource_group( 'jquery' ) -%]
+[%- sections.head = BLOCK -%]
+<style type="text/css">
+td, th { padding: 4px; }
+</style>
+[%- END -%]
+
+</tr>
+<p><a href="[% roots.site %]/admin/themes/">[% '.back.link' | ml %]</a></p>
+<strong>[% '.filter.label' | ml %]</strong>
+<select id="filter_act">
+    <option value="all">[% '.filter.act.all' | ml %]</option>
+    <option value="active">[% '.filter.act.on' | ml %]</option>
+    <option value="inactive">[% '.filter.act.off' | ml %]</option>
+</select>
+<input id="filter_redist" />
+<input type="button" value="[% '.filter.apply' | ml %]" id="filter_apply" />
+<form method="post" action="/admin/themes/category">
+[% dw.form_auth %]
+<input type="hidden" name="category" value="[% category %]" />
+<input type="submit" value="[% '.commit_all' | ml %]" />
+<input type="button" value="[% '.visible.clear' | ml %]" id="clear_visible" />
+<input type="button" value="[% '.visible.check' | ml %]" id="check_visible" />
+[%- UNLESS is_system -%][%- IF can_delete %]
+<input type="submit" value="[% '.delete' | ml %]"  name="delete" />
+[%- ELSE -%]
+[% '.delete.note' | ml %]
+[%- END -%][%- END -%]<br/>
+<table>
+<tbody id="table_data">
+[%- FOREACH lay IN layers.keys.sort -%]
+<tr data-header="1">
+    <td colspan="2"><strong>[% lay %]</strong></td></td>
+</tr>
+[%- FOREACH theme IN layers.$lay.keys.sort -%]
+[%- s2lid = layers.$lay.$theme.s2lid -%]
+<tr data-redist='[% lay %]/[% theme %]'>
+    <td><input type="checkbox" id="s2lid_act_[% s2lid %]" value="1" name="s2lid_act_[% s2lid %]" [% active.$s2lid ? "checked='checked'" : "" %] /></td>
+    <td><label for="s2lid_act_[% s2lid %]">[% theme %]</label></td>
+</tr>
+[%- END -%][%- END -%]
+</tbody>
+</table>
+<input type="submit" value="[% '.commit_all' | ml %]" />
+</form>
diff -r 09d54b296645 -r c89cce13dcc4 views/admin/themes/category.tt.text
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/views/admin/themes/category.tt.text	Fri Oct 29 16:39:24 2010 +0800
@@ -0,0 +1,25 @@
+;; -*- coding: utf-8 -*-
+
+.back.link=&lt;&lt; Back
+
+.commit_all=Commit All
+
+.delete.note=( Clear all and commit to be able to delete )
+
+.delete=Delete
+
+.filter.act.all=All
+
+.filter.act.off=Inactive Only
+
+.filter.act.on=Active Only
+
+.filter.apply=Apply
+
+.filter.label=Filtering:
+
+.title=Edit Category: [[category]]
+
+.visible.check=Check Visible
+
+.visible.clear=Clear Visible
diff -r 09d54b296645 -r c89cce13dcc4 views/admin/themes/index.tt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/views/admin/themes/index.tt	Fri Oct 29 16:39:24 2010 +0800
@@ -0,0 +1,26 @@
+[%- sections.title = '.admin.link' | ml -%]
+[%- dw.need_res( { group => 'jquery' }, 'js/admin/themes/index.js' ) -%]
+[%- CALL dw.active_resource_group( 'jquery' ) -%]
+
+<form action="/admin/themes/theme" method="get"><strong>[% '.edit_theme.label' | ml %]</strong>
+<select name="theme" id="edit_theme">
+[%- FOREACH lay IN layers.keys.sort -%]
+<optgroup label="[% lay %]">
+[%- FOREACH theme IN layers.$lay.sort -%]
+<option value="[% lay %]/[% theme %]">[% theme %]</option>
+[%- END -%]
+</optgroup>
+[%- END -%]
+</select> <input type="submit" value="[% '.edit_theme.btn' | ml %]" /></form>
+
+<form action="/admin/themes/category" method="get"><strong>[% '.edit_category.label' | ml %]</strong>
+<select name="category" id="cat_sel">[% FOREACH cat IN categories %]
+<option value="[% cat %]" [% IF cat == "featured" %]selected='selected'[% END %]>[% cat %]</option>
+[% END %]</select>
+<input type="submit" value="[% '.edit_category.btn' | ml %]" />
+</form>
+
+<form action="/admin/themes/category" method="get"><strong>[% '.add_category.label' | ml %]</strong>
+<input name="category" id="cat_text" />
+<input type="submit" value="[% '.add_category.btn' | ml %]" />
+</form>
diff -r 09d54b296645 -r c89cce13dcc4 views/admin/themes/index.tt.text
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/views/admin/themes/index.tt.text	Fri Oct 29 16:39:24 2010 +0800
@@ -0,0 +1,13 @@
+;; -*- coding: utf-8 -*-
+
+.add_category.btn=Add / Edit
+.add_category.label=Add Category:
+
+.admin.link=Theme Metadata
+.admin.text=Manage theme metadata ( categories )
+
+.edit_category.btn=Edit
+.edit_category.label=Edit Category:
+
+.edit_theme.btn=Edit
+.edit_theme.label=Edit Theme:
diff -r 09d54b296645 -r c89cce13dcc4 views/admin/themes/theme.tt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/views/admin/themes/theme.tt	Fri Oct 29 16:39:24 2010 +0800
@@ -0,0 +1,50 @@
+[%- sections.title = '.title' | ml ( layout = theme.layout_name, theme = theme.name ) -%]
+[%- sections.head = BLOCK -%]
+<style type="text/css">
+td, th { padding: 4px; }
+.action_links { font-size: 1em; }
+</style>
+[%- END -%]
+
+<form method="post" action="[% roots.site %]/admin/themes/theme">
+[% dw.form_auth %]
+<input type="hidden" name="theme" value="[% theme_arg %]" />
+<p class="action_links">
+<a href="[% roots.site %]/admin/themes/">[% '.back.link' | ml %]</a> ||  
+<a href="[% roots.site %]/customize/preview_redirect?themeid=[% theme.s2lid %]" target="_blank">[% '.preview.link' | ml %]</a> || [% '.source' | ml %] (
+<a href="[% roots.site %]/customize/advanced/layersource?id=[% theme.b2lid %]&fmt=html" target="_blank">[% '.source.theme' | ml %]</a> ||
+<a href="[% roots.site %]/customize/advanced/layersource?id=[% theme.s2lid %]&fmt=html" target="_blank">[% '.source.layer' | ml %]</a> )
+</p>
+<p><strong>[% '.designer' | ml %]</strong> [% theme.designer %]</p>
+
+<img src="[% theme.preview_imgurl %]" alt="" />
+<br/>
+
+<input type="submit" value="[% '.commit' | ml %]" />
+
+<p>[% '.categories' | ml %]</p>
+<table>
+<thead>
+<tr>
+    <th>[% '.header.active' | ml %]</th>
+    <th>[% '.header.category' | ml %]</th>
+    <th>[% '.header.remove' | ml %]</th>
+</tr>
+</thead>
+<tbody>
+[% FOREACH key IN cat_keys %][%- cat = cats.$key -%]
+<tr>
+    <td><input type="checkbox" id="cat_act_[% cat.kwid %]" value="[% cat.keyword %]" name="cat_act_[% cat.kwid %]" [% cat.active ? "checked='checked'" : "" %] /></td>
+    [% IF cat.special %]
+        <td><strong>[% cat.keyword %]</strong></td>
+        <td>[% '.remove.na' | ml %]</td>
+    [% ELSE %]
+        <td><label for="cat_act_[% cat.kwid %]">[% cat.keyword %]</label></td>
+        <td><input type="checkbox" id="cat_remove_[% cat.kwid %]" value="[% cat.keyword %]" name="cat_remove_[% cat.kwid %]" /></td>
+    [% END %]
+</tr>
+</tbody>
+[% END %]</table>
+<p><label for="cat_add">[% '.add.label' | ml %]</label>[% '.add.hint' | ml %]<br/><input name="cat_add" id="cat_add" /></p>
+<input type="submit" value="[% '.commit' | ml %]" />
+</form>
diff -r 09d54b296645 -r c89cce13dcc4 views/admin/themes/theme.tt.text
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/views/admin/themes/theme.tt.text	Fri Oct 29 16:39:24 2010 +0800
@@ -0,0 +1,29 @@
+;; -*- coding: utf-8 -*-
+
+.add.hint=( comma seperated )
+
+.add.label=Add Categories:
+
+.back.link=&lt;&lt; Back
+
+.categories=Categories:
+
+.commit=Commit
+
+.designer=Designer: 
+
+.header.active=Active
+
+.header.category=Category
+
+.header.remove=Remove
+
+.preview.link=Preview
+
+.remove.na=N/A
+
+.source=Source
+.source.layer=Layer
+.source.theme=Theme
+
+.title=Edit Metadata: [[layout]]/[[theme]]
--------------------------------------------------------------------------------
ninetydegrees: Art & Text: heart with aroace colors, "you are loved" (Default)

[personal profile] ninetydegrees 2010-11-03 10:35 am (UTC)(link)
Ok thank you. I'll make a post in dreamscapes about it now.