mourningdove/bin/gens2editlib.pl

182 lines
5 KiB
Perl
Raw Permalink Normal View History

2026-05-24 01:03:05 +00:00
#!/usr/bin/perl
# This code was forked from the LiveJournal project owned and operated
# by Live Journal, Inc. The code has been modified and expanded by
# Dreamwidth Studios, LLC. These files were originally licensed under
# the terms of the license supplied by Live Journal, Inc, which can
# currently be found at:
#
# http://code.livejournal.org/trac/livejournal/browser/trunk/LICENSE-LiveJournal.txt
#
# In accordance with the original license, this code and all its
# modifications are provided under the GNU General Public License.
# A copy of that license can be found in the LICENSE file included as
# part of this distribution.
# ----------------------------------------------------------------------------
# S2 editor library generation script 08/03/2005
#
# Generates s2library.js from the core layer definitions.
# ----------------------------------------------------------------------------
use strict;
use warnings;
use Getopt::Long;
use Pod::Usage;
my ( $filename, $layerid, $query, $outputpath, $help );
GetOptions(
'help|h' => \$help,
'filename|f=s' => \$filename,
'layerid|l=i' => \$layerid,
'query|q' => \$query,
'output|o=s' => \$outputpath
) or pod2usage(1);
pod2usage(0) if $help;
my $home = $ENV{LJHOME} or die "You'll have to set \$LJHOME first.\n";
require "$home/cgi-bin/ljlib.pl";
require "$home/cgi-bin/LJ/S2.pm";
$outputpath ||= "$home/htdocs/js/s2edit/s2library.js";
my $info;
if ($filename) {
local $/ = undef;
open F, $filename or die $!;
eval <F>;
die $@ if $@;
close F;
$info = S2::get_layer_all( defined($layerid) ? $layerid : 1 );
}
elsif ($query) {
my $pub = LJ::S2::get_public_layers();
my $id = $pub->{core1};
$id = $id ? $id->{'s2lid'} : 0;
die "Couldn't locate a core 1 layer.\n" unless $id;
my $dbr = LJ::get_db_reader();
my $rv = S2::load_layers_from_db( $dbr, $id );
$info = S2::get_layer_all($id);
}
else {
pod2usage(1);
}
open LIB, ">$outputpath" or die "Failed to open $outputpath for writing: $!\n";
select LIB;
print "// Automatically generated by gens2editlib.pl\n";
print "// Do not edit!\n\n";
# ----------------------------------------------------------------------------
# Classes
# ----------------------------------------------------------------------------
print "// Classes\n";
print "var s2classlib = new Array(";
my %classes = %{ $info->{'class'} };
my @orderedClasses =
map { $_->[0] } sort { $a->[1] cmp $b->[1] } map { [ $_, lc $_ ] } keys %classes;
my $cma = 0;
foreach my $className (@orderedClasses) {
my $class = $classes{$className};
my ( %methods, %members );
my $c = $class;
do {
%methods = ( %methods, %{ $c->{funcs} } );
%members = ( %members, %{ $c->{vars} } );
$c = ( $c->{'parent'} ? $classes{ $c->{'parent'} } : undef );
} while ($c);
print "," if $cma++;
print "\n\t{\n\t\tname: '$className',\n";
print "\t\tmembers: new Array(";
my $cm = 0;
foreach my $memberName ( sort keys %members ) {
print "," if $cm++;
print "\n\t\t\t{ ";
print "name: '$memberName', ";
print "type: '$members{$memberName}->{type}'";
print " }";
}
print "),\n";
print "\t\tmethods: new Array(";
$cm = 0;
foreach my $methodName ( sort keys %methods ) {
print "," if $cm++;
print "\n\t\t\t{ ";
print "name: '$methodName', ";
print "type: '$methods{$methodName}->{returntype}'";
print " }";
}
print ")\n";
print "\t}";
}
print ");\n\n";
# ----------------------------------------------------------------------------
# Functions
# ----------------------------------------------------------------------------
print "// Functions\n";
my $global = $info->{'global'};
print "var s2funclib = new Array(";
my $cm = 0;
foreach my $func ( sort keys %$global ) {
print "," if $cm++;
print "\n\t{ name: '$func', type: '$global->{$func}{returntype}' }";
}
print ");\n\n";
# ----------------------------------------------------------------------------
# Properties
# ----------------------------------------------------------------------------
print "// Properties\n";
my $props = $info->{'prop'};
print "var s2proplib = new Array(";
$cm = 0;
foreach my $prop ( sort keys %$props ) {
print "," if $cm++;
print "\n\t{ name: '$prop', type: '$props->{$prop}{type}' }";
}
print ");\n";
print "\n// End\n";
__END__
=head1 NAME
gens2editlib.pl - generate the LJ S2 editor library file for core layer 1
=head1 SYNOPSIS
gens2editlib.pl [-q] [-f core1.pl] [-l layerid] [-h] [-o ./s2library.js]
Options consist of:
-f, --file specify path to layer compiled with s2compile.pl
-h, --help print this help message
-l, --layerid specify layer ID number with -f option; defaults to 1
-q, --query query local database to obtain S2 core layer
-o, --output specify where to put the generated JavaScript; defaults to
$LJHOME/htdocs/customize/advanced/s2edit/s2library.js
You must specify either the -q or the -f option.
=cut