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]]
--------------------------------------------------------------------------------

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org