[WM] multi language support: first patch
Chris
ckolumbus.gmx.de
Tue Nov 20 13:16:12 GMT 2001
Hi Justin,
here are the first results of my efforts. It's a patch against a vanilla
HTML-WebMake-2.3 source tree. I made the changes in the site-lib tree of the
installed webmake distribution and incorporated the changes afterwards into
the source tree. So there might be problems in applying the patch.
Now some explanations on how it works:
1. The <out> and <wmmeta> tags have a new attribute 'lang' which can be set to
an arbitrary value ('de', 'en' and so on is suggested :-)
2. All metadata is stored accordung to the discussed scheme
contentname.name::lang
e.g. "index.txt.title::en". As I'm writing this I remember that we wanted
to set it like "index.txt.title::lang=en". I forgot this but it can be
fixed easily.
3. All $(url) references are also stored in this format. This allows for two
or more output sets with different lang settings within one wmk-File and
all url's stay accessible. So only one call to 'webmake' is necessary to
generate all files.
4. csv-metatable support is augmented by a language feature. A new 'special'
line has been introduced which starts with '..'. The first element after
'..' names a 'feature' and the second element gives the value for this
feature. At the moment, the only feature available is 'lang' :-). Such a
file might look like :
.|title
..|lang|de
1.jpg|Bild 1
2.jpg|Bild 2
..|lang|en
1.jpg|Image 1
2.jpg|Image 2
5. If metadata is requested the language augmented name is searched for first
and the unaugmented one afterwards. This ensures backward compatibility and
makes default values possible.
6. A new plugin 'lang_tag' has been added which enables for language dependent
contents.
An example content might look like this:
---------------------------- snip --------------------------------------
<wmmeta name="up" value="index.txt" />
<wmmeta name="title" lang="de" value="Bilder" />
<wmmeta name="abstract" lang="de" value="Bildergallerien" />
<wmmeta name="title" lang=en value="Galleries" />
<wmmeta name="abstract" lang="en">
Various image galleries
</wmmeta>
<lang id="de">
Bilder
~~~~~~
</lang>
<lang id="en">
Gallery
~~~~~~~~
</lang>
---------------------------- snap --------------------------------------
My complete test environment is attached to this mail. After un-bzipping and
untarring change to "htdocs/WMK" and just type 'make'. Hopfully it works in
different environments to. If not, please remember that this is the first
'release' ;-)
One thing I don't understand is a problem with the 'sorted_content_matching'
call within the examples. I got a lot of 'unitialized variable' warnings when
'webmake'ing an example which uses this function. I tracke the problem down to
the actual 'sort' call in which metadata is requested and the
"Metadata::convert_to_type" function is called. The "get_current_metaset"
should always return a defined value. But for reasons I don't know the
"$self->{main}->{current_subst}" variable is defined but the value of
"$self->{main}->{current_subst}->{metaset}", which is returned then, is
undefined. I couldn't find one line of code which leaves the 'metaset' entry
within the SubstCtx class undefined. The work around was to test from the
beginng for a defined "$self->{main}->{current_subst}->{metaset}" value. But
I'm not sure, which side effects may appear.
TODO
----
1. Clean up the code (many additional dbg? calls)
2. Test all plugins and functions for backwards compatibility of the current
code
3. Test all plugins and functions if they support the new lang feature
4. Clean up EtText for simplier use of inserted tags (like <lang>)
5. Add documentation for the new 'lang' plugin and for all additional features
(I never wrote perldoc before)
6. Check other tags for 'language-awareness'. E.g. xml-metatables are
still not able to handle lang tags. Maybe there are still others.
Best regards,
Chris
-------------- next part --------------
diff -Nur HTML-WebMake-2.3-orig/lib/HTML/WebMake/Main.pm HTML-WebMake-2.3/lib/HTML/WebMake/Main.pm
--- HTML-WebMake-2.3-orig/lib/HTML/WebMake/Main.pm Tue Oct 30 02:45:23 2001
+++ HTML-WebMake-2.3/lib/HTML/WebMake/Main.pm Tue Nov 20 21:12:40 2001
@@ -215,6 +215,8 @@
$self->{xform_hooks} = [ ];
+ $self->{lang} = undef;
+
$DEBUG = $self->{debug};
$VERBOSE = $self->{verbose};
$HTML_LOGGING = $self->{html_logging};
@@ -549,7 +551,7 @@
sub set_metadata_content_item ($$$$$) {
my ($self, $name, $file, $attrs, $text) = @_;
-
+ dbg2("Main->set_metadata_content_item : $name");
if (!defined $self->{metadatas}->{$name}) {
push (@{$self->{content_order}}, $name);
}
@@ -681,13 +683,31 @@
$attrs->{up} = $from;
- if ($setthisdotmetas) {
- $self->set_metadata_content_item ($thiskey, $wmkf, $attrs, $val);
- push (@{$self->{this_metas_added}}, $thiskey);
- }
+ if (defined($attrs->{lang}) ){
+ dbg2 ("metadata lang attr == \"$attrs->{lang}\"") ;
+ my $langkey = "::".lc($attrs->{lang});
+ dbg2 ("set metadata $key == \"".$fullkey.$langkey."\"");
+
+ if ($setthisdotmetas) {
+ $self->set_metadata_content_item ($thiskey.$langkey, $wmkf, $attrs, $val);
+ push (@{$self->{this_metas_added}}, $thiskey.$langkey);
+ }
+
+ $self->set_metadata_content_item ($fullkey.$langkey, $wmkf, $attrs, $val);
+ $self->getcache()->put_metadata ($fullkey.$langkey, $val);
+
+ #return if ($self->{lang} !~ $attrs->{lang});
+
+ } else {
+
+ if ($setthisdotmetas) {
+ $self->set_metadata_content_item ($thiskey, $wmkf, $attrs, $val);
+ push (@{$self->{this_metas_added}}, $thiskey);
+ }
- $self->set_metadata_content_item ($fullkey, $wmkf, $attrs, $val);
- $self->getcache()->put_metadata ($fullkey, $val);
+ $self->set_metadata_content_item ($fullkey, $wmkf, $attrs, $val);
+ $self->getcache()->put_metadata ($fullkey, $val);
+ }
}
# -------------------------------------------------------------------------
@@ -754,6 +774,10 @@
sub add_url {
my ($self, $name, $location) = @_;
+
+ my $lang = $self->{current_subst}->{lang};
+ $name = $name."::".$lang if defined $lang;
+
dbg2 ("adding URL \"$name\" = $location");
if (!defined $self->{locations}->{$name}) {
push (@{$self->{location_order}}, $name);
@@ -1062,7 +1086,7 @@
sub _this_subst {
my ($self, $from, $origkey) = @_;
-
+ dbg2("Main->_this_subst: $origkey");
# trim off the default value from our working copy of the key
my $key = $origkey;
$key =~ s/\?([^\?]+)$//;
@@ -1081,8 +1105,9 @@
# -------------------------------------------------------------------------
-sub _subst_open ($$$$$$$) {
- my ($self, $filename, $outname, $dotdots, $fmt, $useurls, $metaset) = @_;
+sub _subst_open ($$$$$$$$) {
+ my ($self, $filename, $outname, $dotdots, $fmt, $useurls, $metaset,
+ $lang) = @_;
my $current_subst = $self->{current_subst};
if (defined $current_subst) {
@@ -1105,16 +1130,24 @@
if (!defined $metaset) {
$metaset = $current_subst->{metaset};
}
+ if (!defined $lang) {
+ $lang = $current_subst->{lang};
+ }
}
# if (!defined $dotdots) { $dotdots = ""; }
- if (!defined $filename) { $filename = $SUBST_EVAL; }
- if (!defined $outname) { $outname = $SUBST_EVAL; }
- if (!defined $useurls) { $useurls = 1; }
- if (!defined $metaset) { $metaset = $self->{metaset}; }
-
+ if (!defined $filename) { $filename = $SUBST_EVAL; }
+ if (!defined $outname) { $outname = $SUBST_EVAL; }
+ if (!defined $useurls) { $useurls = 1; }
+ if (!defined $metaset) { $metaset = $self->{metaset}; }
+ if (!defined $lang) { $lang = $self->{lang}; }
+
+ dbg2("Main->_subst_open: lang $lang") if defined $lang;
+ dbg2("Main->_subst_open: lang NOLANG") if !defined $lang;
+ dbg2("Main->_subst_open: metaset $metaset") if defined $metaset;
+ dbg2("Main->_subst_open: metaset NOSET") if !defined $metaset;
$self->{current_subst} = new HTML::WebMake::SubstCtx ($self,
- $filename, $outname, $dotdots, $fmt, $useurls, $metaset);
+ $filename, $outname, $dotdots, $fmt, $useurls, $metaset, $lang);
}
sub _subst_close {
@@ -1131,6 +1164,7 @@
# if (!defined $key) { croak "No key defined in subst"; }
# warn "JMD CURLY $key";
+ dbg2 ("_curly_subst:$from:$key:$contents_only");
my $str;
my $current_subst = $self->{current_subst};
@@ -1151,15 +1185,30 @@
}
my $cont;
+
+ my $lang = $self->{current_subst}->{lang};
+ my $lang_key = $key."::".$lang if defined $lang;
if ($contents_only) { # expanding a ${foo} ref
$cont = $self->{contents}->{$key};
+ if (!defined $cont && defined($lang_key)) {
+ $cont = $self->{metadatas}->{$lang_key};
+ dbg2("Main->_curly_subst(0): cont $lang_key") if (defined($cont));
+ }
if (!defined $cont) {
$cont = $self->{metadatas}->{$key};
+ dbg2("Main->_curly_subst(0): metas $key") if (defined($cont));
}
} else { # expanding a $[foo] ref
- $cont = $self->{metadatas}->{$key};
+ $cont = $self->{metadatas}->{$lang_key} if defined($lang_key);
+ dbg2("Main->_curly_subst(1): metas1 $lang_key") if (defined($cont));
+
+ if (!defined $cont){
+ $cont = $self->{metadatas}->{$key};
+ dbg2("Main->_curly_subst(1): metas2 $key") if (defined($cont));
+ }
+
# it's also possible to refer to content items using the metadata reference
# type $[..], as in fact that reference type simply means a reference whose
@@ -1169,6 +1218,7 @@
# metadata hash.
if (!defined $cont) {
$cont = $self->{contents}->{$key};
+ dbg2("Main->_curly_subst(1): contents $key") if (defined($cont));
}
}
@@ -1214,6 +1264,7 @@
}
ret:
+ dbg2 ("_curly_subst:end:$str:");
$str;
}
@@ -1227,10 +1278,15 @@
if (!defined $from) { croak "No from defined in subst"; }
if ($self->{current_subst}->{inf_loop}) { return ""; }
+ my $lang = $self->{current_subst}->{lang};
+ my $lang_key ;
+
my $defval = undef;
if ($key =~ s/\?([^\?]+)$//) { $defval = $1; }
my $str;
+ my $lang_str;
+
if ($key eq 'TOP/') { $str = ''; }
if (!defined $str) {
@@ -1241,16 +1297,30 @@
$self->subst_deferred_refs ($from, \$key);
}
- $str = $self->{locations}->{$key};
+ if (defined $lang) {
+ $lang_key = $key."::".$lang;
+ $lang_str = $self->{locations}->{$lang_key};
+ }
+ dbg2("Main->_round_subst \"$lang_key\" -> \"$lang_str\"") if defined $lang_str;
+ if (!defined $lang_str) {
+ $str = $self->{locations}->{$key};
+ dbg2("Main->_round_subst \"$key\" -> \"$str\"") if defined $str;
+ }
}
+ $str = $lang_str if defined $lang_str;
+
if ((!defined $str || $str eq '') && $key ne 'TOP/') {
if (defined $defval) { return $defval; }
- vrb ("no value defined for output URL \$($key) in \"$from\".");
+ vrb ("no value defined for output URL \$($key) or \$($lang_key) in \"$from\".");
return "";
}
- $self->add_url_dependency ($key);
+ if (defined $lang_str) {
+ $self->add_url_dependency ($lang_key);
+ } else {
+ $self->add_url_dependency ($key);
+ }
# make it a valid relative URL
if ($str !~ /^\// && $str !~ /^[-_a-zA-Z0-9]:/) {
@@ -1942,7 +2012,7 @@
$self->{this_metas_added} = [ ];
$self->_subst_open($fname, $out->{name}, $dotdots,
- $fmt, $useurls, $self->{metaset}); #{
+ $fmt, $useurls, $self->{metaset}, $out->{lang}); #{
my $txt = $out->get_text();
$self->strip_metadata ($fname, \$txt);
@@ -2089,7 +2159,8 @@
my $ctx = $self->{need_rewrite_subst_context}->{$fname};
$self->_subst_open($ctx->{filename}, $ctx->{outname}, $ctx->{dotdots},
- $ctx->{format}, $ctx->{useurls}, $ctx->{metaset});
+ $ctx->{format}, $ctx->{useurls}, $ctx->{metaset},
+ $ctx->{lang});
#{
$txt =~ s/{!!WMDEFER_dotdots}/$ctx->{dotdots}/gs;
diff -Nur HTML-WebMake-2.3-orig/lib/HTML/WebMake/MetaTable.pm HTML-WebMake-2.3/lib/HTML/WebMake/MetaTable.pm
--- HTML-WebMake-2.3-orig/lib/HTML/WebMake/MetaTable.pm Thu Sep 13 03:09:58 2001
+++ HTML-WebMake-2.3/lib/HTML/WebMake/MetaTable.pm Tue Nov 20 21:12:40 2001
@@ -67,7 +67,9 @@
$delim = qr{\Q${delim}\E};
my @metanames = ();
+ my @addinfo = ();
my $i;
+ my $lang;
foreach my $line (split (/\n/, $text)) {
my @elems = split (/${delim}/, $line);
@@ -77,6 +79,12 @@
if ($contname eq '.') {
@metanames = @elems; next;
}
+ if ($contname eq '..') {
+ @addinfo = @elems;
+ $lang = lc $addinfo[1] if $addinfo[0] =~ 'lang';
+ dbg2 ("setting \"lang\" to \"$lang\"");
+ next;
+ }
$contname = $self->fixname ($contname);
@@ -93,6 +101,7 @@
for ($i = 0; $i <= $#elems && $i <= $#metanames; $i++) {
my $metaname = $metanames[$i];
+ $metaname .= "::".$lang if defined $lang;
my $val = $elems[$i];
$contobj->create_extra_metas_if_needed();
diff -Nur HTML-WebMake-2.3-orig/lib/HTML/WebMake/Metadata.pm HTML-WebMake-2.3/lib/HTML/WebMake/Metadata.pm
--- HTML-WebMake-2.3-orig/lib/HTML/WebMake/Metadata.pm Fri Oct 12 08:24:55 2001
+++ HTML-WebMake-2.3/lib/HTML/WebMake/Metadata.pm Tue Nov 20 21:12:40 2001
@@ -66,7 +66,9 @@
sub get_current_metaset ($)
{
my ($self) = @_;
- if (defined $self->{main}->{current_subst}) {
+ ## CHRIS: FIXME added ->{metaset}, don't know why it's not defined
+ ## when {current_subst} is
+ if (defined $self->{main}->{current_subst}->{metaset}) {
return $self->{main}->{current_subst}->{metaset};
} elsif (defined $self->{main}->{metaset}) {
return $self->{main}->{metaset};
@@ -83,6 +85,8 @@
croak "no meta defined in get_type" unless defined($meta);
+ $meta =~ s/::.*$//;
+
my $set = $self->get_current_metaset();
my $info = $self->{metasets}->{$set}->{$meta};
@@ -98,6 +102,8 @@
croak "no meta defined in get_default_value" unless defined($meta);
+ $meta =~ s/::.*$//;
+
my $set = $self->get_current_metaset();
my $info = $self->{metasets}->{$set}->{$meta};
if (!defined $info) { return undef; }
@@ -114,6 +120,9 @@
croak "no meta defined in get_type" unless defined($meta);
croak "no val defined in get_type" unless defined($val);
+ $meta =~ s/::.*$//;
+
+ dbg("Metadata->convert_to_type: meta $meta");
my $set = $self->get_current_metaset();
my $info = $self->{metasets}->{$set}->{$meta};
if (!defined $info) { return undef; }
diff -Nur HTML-WebMake-2.3-orig/lib/HTML/WebMake/MetadataContent.pm HTML-WebMake-2.3/lib/HTML/WebMake/MetadataContent.pm
--- HTML-WebMake-2.3-orig/lib/HTML/WebMake/MetadataContent.pm Sun Sep 30 08:02:29 2001
+++ HTML-WebMake-2.3/lib/HTML/WebMake/MetadataContent.pm Tue Nov 20 21:12:40 2001
@@ -66,6 +66,8 @@
my ($self, $key) = @_;
my $val;
+ dbg2 ("MetadataContent->get_metadata: \"$key\"");
+
# kludge: ensure metadata clusters beside its parent datum
# for (full) sitemaps.
if ($key eq 'score') { $val = '0'; }
diff -Nur HTML-WebMake-2.3-orig/lib/HTML/WebMake/NormalContent.pm HTML-WebMake-2.3/lib/HTML/WebMake/NormalContent.pm
--- HTML-WebMake-2.3-orig/lib/HTML/WebMake/NormalContent.pm Tue Oct 30 02:45:23 2001
+++ HTML-WebMake-2.3/lib/HTML/WebMake/NormalContent.pm Tue Nov 20 21:12:40 2001
@@ -150,24 +150,56 @@
sub get_metadata {
my ($self, $key) = @_;
+
if (!defined $self->{cached_metas}) {
$self->{cached_metas} = { };
}
- my $val = $self->{cached_metas}->{$key};
my $main = $self->{main};
+ my $l = $self->{main}->{current_subst}->{lang};
+ $l = "undef" if ! defined($l);
+
+ my $lang_key = $key."::".$l;
+ my $val = undef;
- if (!defined $val) {
- $val = $main->quiet_curly_meta_subst
- ($HTML::WebMake::Main::SUBST_META, $self->{name}.".".$key);
- if (!defined $val) {
- $val ||= $main->{metadata}->get_default_value ($key);
- }
+ ###########
+ $val = $self->{cached_metas}->{$lang_key};
+ dbg2("NormalContent->get_metadata(1)") if (defined($val));
+ goto ret if defined($val);
+
+ ###########
+ #$val = $main->quiet_curly_meta_subst
+ # ($HTML::WebMake::Main::SUBST_META, $self->{name}.".".$lang_key);
+ #dbg2("NormalContent->get_metadata(2): $val") if (defined($val));
+ #goto ret_conv2 if defined($val);
+
+ ###########
+ $val = $self->{cached_metas}->{$key};
+ dbg2("NormalContent->get_metadata(3)") if (defined($val));
+ goto ret if defined($val);
+
+ ###########
+ $val = $main->quiet_curly_meta_subst
+ ($HTML::WebMake::Main::SUBST_META, $self->{name}.".".$key);
+ dbg2("NormalContent->get_metadata(4)") if (defined($val));
+ goto ret_conv if defined($val);
+
+
+ ###########
+ $val ||= $main->{metadata}->get_default_value ($key);
+ dbg2("NormalContent->get_metadata(5)");
+ret_conv:
$val = $main->{metadata}->convert_to_type ($key, $val);
$self->{cached_metas}->{$key} = $val;
- }
+ goto ret;
+ret_conv2:
+ $val = $main->{metadata}->convert_to_type ($key, $val);
+ $self->{cached_metas}->{$lang_key} = $val;
+
+ret:
+ #dbg2 ("NormalContent->get_metadata: \"$key\", lang=\"$l\", val=\"$val\"");
return $val;
}
@@ -243,6 +275,8 @@
my $val = $attrs->{value};
if (!defined $val) { $val = $text; }
+ dbg2 ("adding wmmeta $name: \"$val\"");
+
$self->{main}->add_metadata ($self->{meta_from}, $name, $val, $attrs,
$self->{set_thisdot_metadata_items});
@@ -253,7 +287,7 @@
sub infer_implicit_metas {
my ($self) = @_;
-
+ dbg2("NormalContent->infer_implicit_metas");
if (defined $self->{main}->{metadatas}->{"this.title"}
&& defined $self->{main}->{metadatas}->{$self->{name}.".title"})
{
@@ -342,6 +376,7 @@
# etc.
my ($metaname, $val);
while (($metaname, $val) = each %{$self->{extra_metas}}) {
+ dbg2 ("adding extra meta, from $from, $metaname: \"$val\"");
$self->{main}->add_metadata ($from, $metaname, $val, { },
$self->{set_thisdot_metadata_items});
}
diff -Nur HTML-WebMake-2.3-orig/lib/HTML/WebMake/Out.pm HTML-WebMake-2.3/lib/HTML/WebMake/Out.pm
--- HTML-WebMake-2.3-orig/lib/HTML/WebMake/Out.pm Fri Oct 12 08:24:55 2001
+++ HTML-WebMake-2.3/lib/HTML/WebMake/Out.pm Tue Nov 20 21:12:40 2001
@@ -62,6 +62,12 @@
}
$self->{clean} = $attrval;
+ $attrval = $attrs->{'lang'};
+ if (!defined $attrval) {
+ $attrval = $self->{main}->{metadata}->get_attrdefault ('lang');
+ }
+ $self->{lang} = $attrval;
+
$self;
}
diff -Nur HTML-WebMake-2.3-orig/lib/HTML/WebMake/PerlCode.pm HTML-WebMake-2.3/lib/HTML/WebMake/PerlCode.pm
--- HTML-WebMake-2.3-orig/lib/HTML/WebMake/PerlCode.pm Mon Oct 1 05:41:32 2001
+++ HTML-WebMake-2.3/lib/HTML/WebMake/PerlCode.pm Tue Nov 20 21:12:40 2001
@@ -121,7 +121,6 @@
my $sortsub = eval $sortsubstr;
$SORT_SUBS{$sortstr} = $sortsub;
}
-
$SORT_SUBS{$sortstr};
}
diff -Nur HTML-WebMake-2.3-orig/lib/HTML/WebMake/PerlLib/lang_tag.wmk HTML-WebMake-2.3/lib/HTML/WebMake/PerlLib/lang_tag.wmk
--- HTML-WebMake-2.3-orig/lib/HTML/WebMake/PerlLib/lang_tag.wmk Thu Jan 1 01:00:00 1970
+++ HTML-WebMake-2.3/lib/HTML/WebMake/PerlLib/lang_tag.wmk Tue Nov 20 22:00:18 2001
@@ -0,0 +1,15 @@
+
+<{perl
+ $self->define_tag ("lang", \&handle_lang_tag, qw(id));
+
+ sub handle_lang_tag {
+ my ($tagname, $attrs, $text) = @_;
+ my $l = $attrs->{id};
+
+ $_ = "";
+ if ($self->{main}->{current_subst}->{lang} =~ lc($l)) {
+ $_ = $text;
+ }
+ }
+}>
+
diff -Nur HTML-WebMake-2.3-orig/lib/HTML/WebMake/SubstCtx.pm HTML-WebMake-2.3/lib/HTML/WebMake/SubstCtx.pm
--- HTML-WebMake-2.3-orig/lib/HTML/WebMake/SubstCtx.pm Fri Oct 12 08:24:55 2001
+++ HTML-WebMake-2.3/lib/HTML/WebMake/SubstCtx.pm Tue Nov 20 21:12:40 2001
@@ -19,10 +19,10 @@
###########################################################################
-sub new ($$$$$$$) {
+sub new ($$$$$$$$) {
my $class = shift;
$class = ref($class) || $class;
- my ($main, $filename, $outname, $dotdots, $fmt, $useurls, $metaset) = @_;
+ my ($main, $filename, $outname, $dotdots, $fmt, $useurls, $metaset, $lang) = @_;
my $self = {
'main' => $main,
@@ -34,6 +34,7 @@
'useurls' => $useurls,
'format' => $fmt,
'metaset' => $metaset,
+ 'lang' => $lang
};
bless ($self, $class);
diff -Nur HTML-WebMake-2.3-orig/lib/HTML/WebMake/WmkFile.pm HTML-WebMake-2.3/lib/HTML/WebMake/WmkFile.pm
--- HTML-WebMake-2.3-orig/lib/HTML/WebMake/WmkFile.pm Tue Oct 30 02:45:23 2001
+++ HTML-WebMake-2.3/lib/HTML/WebMake/WmkFile.pm Tue Nov 20 21:12:40 2001
@@ -620,7 +620,12 @@
$self->subst_attrs ("<out>", $attrs);
my $file = $attrs->{file};
my $name = $attrs->{name}; $name ||= $file;
+
$self->{main}->add_out ($file, $self, $name, $attrs, $text);
+
+ my $lang = $self->{main}->{outs}->{$file}->{lang};
+ $name = $name."::".$lang if defined $lang;
+
$self->{main}->add_url ($name, $file);
"";
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: webmake-new.tbz
Type: application/octet-stream
Size: 71591 bytes
Desc: Test project
Url : http://amgod.boxhost.net/pipermail/webmake-talk/attachments/20011120/4e8e7a12/webmake-new.obj
More information about the Webmake-talk
mailing list