r19989 - in /branches/upstream/libbiblio-endnotestyle-perl: ./ current/ current/bin/ current/lib/ current/lib/Biblio/ current/t/
vdanjean at users.alioth.debian.org
vdanjean at users.alioth.debian.org
Fri May 16 08:01:35 UTC 2008
Author: vdanjean
Date: Fri May 16 08:01:34 2008
New Revision: 19989
URL: http://svn.debian.org/wsvn/?sc=1&rev=19989
Log:
[svn-inject] Installing original source of libbiblio-endnotestyle-perl
Added:
branches/upstream/libbiblio-endnotestyle-perl/
branches/upstream/libbiblio-endnotestyle-perl/current/
branches/upstream/libbiblio-endnotestyle-perl/current/Changes
branches/upstream/libbiblio-endnotestyle-perl/current/MANIFEST
branches/upstream/libbiblio-endnotestyle-perl/current/MANIFEST.SKIP
branches/upstream/libbiblio-endnotestyle-perl/current/META.yml
branches/upstream/libbiblio-endnotestyle-perl/current/Makefile.PL
branches/upstream/libbiblio-endnotestyle-perl/current/README
branches/upstream/libbiblio-endnotestyle-perl/current/bin/
branches/upstream/libbiblio-endnotestyle-perl/current/bin/endnote-format (with props)
branches/upstream/libbiblio-endnotestyle-perl/current/lib/
branches/upstream/libbiblio-endnotestyle-perl/current/lib/Biblio/
branches/upstream/libbiblio-endnotestyle-perl/current/lib/Biblio/EndnoteStyle.pm
branches/upstream/libbiblio-endnotestyle-perl/current/t/
branches/upstream/libbiblio-endnotestyle-perl/current/t/Biblio-EndnoteStyle.t
Added: branches/upstream/libbiblio-endnotestyle-perl/current/Changes
URL: http://svn.debian.org/wsvn/branches/upstream/libbiblio-endnotestyle-perl/current/Changes?rev=19989&op=file
==============================================================================
--- branches/upstream/libbiblio-endnotestyle-perl/current/Changes (added)
+++ branches/upstream/libbiblio-endnotestyle-perl/current/Changes Fri May 16 08:01:34 2008
@@ -1,0 +1,43 @@
+$Id: Changes,v 1.11 2007/10/04 00:07:18 mike Exp $
+
+Revision history for Perl extension Biblio::EndnoteStyle.
+
+0.05 Thu Oct 4 01:07:14 BST 2007
+ - Field names may contain digits.
+ - Horrible but useful special case: when inserting a field
+ called URL, if the value does not begin with a schema then
+ "http://" is prepended.
+
+0.04 Wed Mar 14 11:14:57 GMT 2007
+ - Templates may now contain |-separated components consisting
+ only of whitespace. (That they couldn't previously was a
+ bug.)
+ - Templates now correctly interpret backquotes surrounding a
+ word for force its interpretation as a literal rather than a
+ fieldname.
+ - Much better test-suite.
+
+0.03 Sat Feb 17 22:09:38 GMT 2007
+ - Downgrade "use 5.008" in lib/Biblio/EndnoteStyle.pm to
+ 5.006, to match what's specified in Makefile.PL.
+
+0.02 Fri Feb 16 01:16:32 GMT 2007
+ - Properly implement non-breaking space "¬", which was
+ previously rendered as a literal.
+ - Tweak the rules so that a field that exists but is undefined
+ in the data hash is treated as an absent field rather than a
+ literal.
+ - Add debug() method to the formatter, causing compiled
+ templates to be dumped to standard error.
+ - Add command-line script "bin/endnote-format", to allow the
+ library to be simply exercised.
+ - Improvements to documentation.
+
+0.01 Mon Jan 22 22:03:12 2007
+ - original version; created by h2xs 1.23 with options
+ -X --name=Biblio::EndnoteStyle --compat-version=5.6.0 --omit-constant --skip-exporter --skip-ppport
+ - This release is functional but incomplete: many, many more
+ test cases are needed, and adding these will no doubt
+ require fixes to the code. Nevertheless, the module is
+ useful as it stands.
+
Added: branches/upstream/libbiblio-endnotestyle-perl/current/MANIFEST
URL: http://svn.debian.org/wsvn/branches/upstream/libbiblio-endnotestyle-perl/current/MANIFEST?rev=19989&op=file
==============================================================================
--- branches/upstream/libbiblio-endnotestyle-perl/current/MANIFEST (added)
+++ branches/upstream/libbiblio-endnotestyle-perl/current/MANIFEST Fri May 16 08:01:34 2008
@@ -1,0 +1,11 @@
+# $Id: MANIFEST,v 1.4 2007/02/15 23:49:52 mike Exp $
+
+Changes
+MANIFEST
+MANIFEST.SKIP
+META.yml Module meta-data (added by MakeMaker)
+Makefile.PL
+README
+bin/endnote-format
+lib/Biblio/EndnoteStyle.pm
+t/Biblio-EndnoteStyle.t
Added: branches/upstream/libbiblio-endnotestyle-perl/current/MANIFEST.SKIP
URL: http://svn.debian.org/wsvn/branches/upstream/libbiblio-endnotestyle-perl/current/MANIFEST.SKIP?rev=19989&op=file
==============================================================================
--- branches/upstream/libbiblio-endnotestyle-perl/current/MANIFEST.SKIP (added)
+++ branches/upstream/libbiblio-endnotestyle-perl/current/MANIFEST.SKIP Fri May 16 08:01:34 2008
@@ -1,0 +1,8 @@
+# $Id: MANIFEST.SKIP,v 1.3 2007/01/23 09:36:10 mike Exp $
+
+.cvsignore
+CVS
+archive
+lib/Biblio/CVS
+lib/CVS
+t/CVS
Added: branches/upstream/libbiblio-endnotestyle-perl/current/META.yml
URL: http://svn.debian.org/wsvn/branches/upstream/libbiblio-endnotestyle-perl/current/META.yml?rev=19989&op=file
==============================================================================
--- branches/upstream/libbiblio-endnotestyle-perl/current/META.yml (added)
+++ branches/upstream/libbiblio-endnotestyle-perl/current/META.yml Fri May 16 08:01:34 2008
@@ -1,0 +1,10 @@
+# http://module-build.sourceforge.net/META-spec.html
+#XXXXXXX This is a prototype!!! It will change in the future!!! XXXXX#
+name: Biblio-EndnoteStyle
+version: 0.05
+version_from: lib/Biblio/EndnoteStyle.pm
+installdirs: site
+requires:
+
+distribution_type: module
+generated_by: ExtUtils::MakeMaker version 6.30_01
Added: branches/upstream/libbiblio-endnotestyle-perl/current/Makefile.PL
URL: http://svn.debian.org/wsvn/branches/upstream/libbiblio-endnotestyle-perl/current/Makefile.PL?rev=19989&op=file
==============================================================================
--- branches/upstream/libbiblio-endnotestyle-perl/current/Makefile.PL (added)
+++ branches/upstream/libbiblio-endnotestyle-perl/current/Makefile.PL Fri May 16 08:01:34 2008
@@ -1,0 +1,15 @@
+# $Id: Makefile.PL,v 1.2 2007/02/15 23:52:08 mike Exp $
+
+use 5.006;
+use ExtUtils::MakeMaker;
+# See lib/ExtUtils/MakeMaker.pm for details of how to influence
+# the contents of the Makefile that is written.
+WriteMakefile(
+ NAME => 'Biblio::EndnoteStyle',
+ VERSION_FROM => 'lib/Biblio/EndnoteStyle.pm', # finds $VERSION
+ PREREQ_PM => {}, # e.g., Module::Name => 1.1
+ ($] >= 5.005 ? ## Add these new keywords supported since 5.005
+ (ABSTRACT_FROM => 'lib/Biblio/EndnoteStyle.pm', # retrieve abstract from module
+ AUTHOR => 'Mike Taylor <mike at miketaylor.org.uk>') : ()),
+ EXE_FILES => [ 'bin/endnote-format' ],
+);
Added: branches/upstream/libbiblio-endnotestyle-perl/current/README
URL: http://svn.debian.org/wsvn/branches/upstream/libbiblio-endnotestyle-perl/current/README?rev=19989&op=file
==============================================================================
--- branches/upstream/libbiblio-endnotestyle-perl/current/README (added)
+++ branches/upstream/libbiblio-endnotestyle-perl/current/README Fri May 16 08:01:34 2008
@@ -1,0 +1,29 @@
+$Id: README,v 1.1.1.1 2007/01/23 09:26:00 mike Exp $
+
+Biblio::EndnoteStyle
+====================
+
+This module provides a class that can format references according to
+style templates resembling those used by Endnote. For details, see
+the POD documentation in lib/Biblio/EndnoteStyle.pm -- for example,
+use:
+ $ perldoc lib/Biblio/EndnoteStyle.pm
+
+INSTALLATION
+
+To install this module type the following:
+
+ perl Makefile.PL
+ make
+ make test
+ make install
+
+COPYRIGHT AND LICENCE
+
+Copyright (C) 2007 by Mike Taylor
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself, either Perl version 5.8.7 or,
+at your option, any later version of Perl 5 you may have available.
+
+
Added: branches/upstream/libbiblio-endnotestyle-perl/current/bin/endnote-format
URL: http://svn.debian.org/wsvn/branches/upstream/libbiblio-endnotestyle-perl/current/bin/endnote-format?rev=19989&op=file
==============================================================================
--- branches/upstream/libbiblio-endnotestyle-perl/current/bin/endnote-format (added)
+++ branches/upstream/libbiblio-endnotestyle-perl/current/bin/endnote-format Fri May 16 08:01:34 2008
@@ -1,0 +1,20 @@
+#! /usr/bin/perl -w
+
+# $Id: endnote-format,v 1.2 2007/02/16 01:16:48 mike Exp $
+
+use strict;
+use warnings;
+use Getopt::Std;
+use Biblio::EndnoteStyle;
+
+my %opts;
+if (!getopts('d', \%opts) || @ARGV < 1 || @ARGV % 2 != 1) {
+ print STDERR "Usage: $0 [options] 'template' key1 val1 [keyN valN] ...
+ -d Dump compiled recipe to standard error\n";
+ exit 1;
+}
+
+my($template, %data) = @ARGV;
+my $style = new Biblio::EndnoteStyle();
+$style->debug(1) if $opts{d};
+print $style->format($template, \%data);
Propchange: branches/upstream/libbiblio-endnotestyle-perl/current/bin/endnote-format
------------------------------------------------------------------------------
svn:executable =
Added: branches/upstream/libbiblio-endnotestyle-perl/current/lib/Biblio/EndnoteStyle.pm
URL: http://svn.debian.org/wsvn/branches/upstream/libbiblio-endnotestyle-perl/current/lib/Biblio/EndnoteStyle.pm?rev=19989&op=file
==============================================================================
--- branches/upstream/libbiblio-endnotestyle-perl/current/lib/Biblio/EndnoteStyle.pm (added)
+++ branches/upstream/libbiblio-endnotestyle-perl/current/lib/Biblio/EndnoteStyle.pm Fri May 16 08:01:34 2008
@@ -1,0 +1,308 @@
+# $Id: EndnoteStyle.pm,v 1.10 2007/10/04 00:07:03 mike Exp $
+
+package Biblio::EndnoteStyle;
+
+use 5.006;
+use strict;
+use warnings;
+
+our $VERSION = 0.05;
+
+=head1 NAME
+
+Biblio::EndnoteStyle - reference formatting using Endnote-like templates
+
+=head1 SYNOPSIS
+
+ use Biblio::EndnoteStyle;
+ $style = new Biblio::EndnoteStyle();
+ ($text, $errmsg) = $style->format($template, \%fields);
+
+=head1 DESCRIPTION
+
+This small module provides a way of formatting bibliographic
+references using style templates similar to those used by the popular
+reference management software Endnote (http://www.endnote.com/). The
+API is embarrassingly simple: a formatter object is made using the
+class's constructor, the C<new()> method; C<format()> may then be
+repeatedly called on this object, using the same or different
+templates.
+
+(The sole purpose of the object is to cache compiled templates so that
+multiple C<format()> invocations are more efficient than they would
+otherwise be. Apart from that, the API might just as well have been a
+single function.)
+
+=head1 METHODS
+
+=head2 new()
+
+ $style = new Biblio::EndnoteStyle();
+
+Creates a new formatter object. Takes no arguments.
+
+=cut
+
+# The object is vacuous except that it knows its class, so that
+# subclasses can be made that override some of the methods.
+#
+sub new {
+ my $class = shift();
+
+ return bless {
+ debug => 0,
+ compiled => {}, # cache of compiled templates
+ }, $class;
+}
+
+
+=head2 debug()
+
+ $olddebug = $style->debug(1);
+
+Turns debugging on or off and returns the old debugging status. If an
+argument is provided, then debugging is turned either on or off
+according to whether then argument is true or false. In any case, the
+old value of the debugging status is returned, so that a call with no
+argument is a side-effect-free inquiry.
+
+When debugging is turned on, compiled templates are dumped to standard
+error. It is not pretty.
+
+=cut
+
+sub debug {
+ my $this = shift();
+ my($val) = @_;
+
+ my $old = $this->{debug};
+ $this->{debug} = $val if defined $val;
+ return $old;
+}
+
+
+=head2 format()
+
+ ($text, $errmsg) = $style->format($template, \%fields);
+
+Formats a reference, consisting of a hash of fields, according to an
+Endnote-like template. The template is a string essentially the same
+as those used in Endnote, as documented in the Endnote X User Guide at
+http://www.endnote.com/support/helpdocs/EndNoteXWinManual.pdf
+pages 390ff. In particular, pages 415-210 have details of the recipe
+format. Because the templates used in this module are plain text, a
+few special characters are used:
+
+=over 4
+
+=item ¬
+
+Link adjacent words. This is the "non-breaking space"
+described on page 418 of the EndNote X
+
+=item |
+
+Forced Seperation of elements that would otherwise be dependent.
+
+=item ^
+
+Separator for singular/plural aternatives.
+
+=cut `
+
+=item `
+
+Used to prevent literal text from being interpreted as a fieldname.
+
+=back
+
+The hash of fields is passed by reference: keys are fieldnames, and
+the corresponding values are the data. PLEASE NOTE AN IMPORTANT
+DIFFERENCE. Keys that do not appear in the hash at all are not
+considered to be fields, so that if they appear in the template, they
+will be interpreted as literal text; keys that appear in the hash but
+whose values are undefined or empty are considered to be fields with
+no value, and will be formatted as empty with dependent text omitted.
+So for example:
+
+ $style->format(";Author: ", { Author => "Taylor" }) eq ":Taylor: "
+ $style->format(";Author: ", { Author => "" }) eq ";"
+ $style->format(";Author: ", { xAuthor => "" }) eq ";Author: "
+
+C<format()> returns two values: the formatted reference and an
+error-message. The error message is defined if and only if the
+formatted reference is not.
+
+=cut
+
+sub format {
+ my $this = shift();
+ my($text, $data) = @_;
+
+ #use Data::Dumper; print Dumper($data);
+ my $template = $this->{compiled}->{$text};
+ if (!defined $template) {
+ my $errmsg;
+ ($template, $errmsg) =
+ Biblio::EndnoteStyle::Template->new($text, $this->{debug});
+ return (undef, $errmsg) if !defined $template;
+ #print "template '$text'\n", $template->render();
+ $this->{compiled}->{$text} = $template;
+ }
+
+ return $template->format($data);
+}
+
+
+package Biblio::EndnoteStyle::Template;
+
+sub new {
+ my $class = shift();
+ my($text, $debug) = @_;
+
+ my @sequences;
+ while ($text ne "") {
+ if ($text =~ s/^(\s*[^\s|]*\s?)//) {
+ my $sequence = $1;
+ my $obj = Biblio::EndnoteStyle::Sequence->new($sequence);
+ push @sequences, $obj;
+ $text =~ s/^\|//;
+ } else {
+ die "unparseable template fragment '$text'";
+ }
+ }
+
+ my $this = bless {
+ text => $text,
+ sequences => \@sequences,
+ }, $class;
+ print STDERR $this->render() if $debug;
+
+ return $this;
+}
+
+sub render {
+ my $this = shift();
+
+ return join("", map { $_->render() . "\n" } @{ $this->{sequences} });
+}
+
+sub format {
+ my $this = shift();
+ my($data) = @_;
+
+ my $result = "";
+ foreach my $sequence (@{ $this->{sequences} }) {
+ my($substr, $errmsg) = $sequence->format($data);
+ return (undef, $errmsg) if !defined $substr;
+ $result .= $substr;
+ }
+
+ return $result;
+}
+
+
+# ----------------------------------------------------------------------------
+
+package Biblio::EndnoteStyle::Sequence;
+
+sub WORD { 290168 }
+sub LITERAL { 120368 }
+sub typename {
+ my($type) = @_;
+ return "WORD" if $type == WORD;
+ return "LITERAL" if $type == LITERAL;
+ return "???";
+}
+
+sub new {
+ my $class = shift();
+ my($text) = @_;
+
+ use Carp;
+ confess("new($class) with text undefined") if !defined $text;
+ my $tail = $text;
+ $tail =~ s/¬/ /g;
+ my @tokens;
+ while ($tail =~ s/(.*?)([``a-z_0-9]+)//i) {
+ my($head, $word) = ($1, $2);
+ push @tokens, [ LITERAL, $head ] if $head ne "";
+ if ($word =~ s/^`(.*)`$/$1/) {
+ push @tokens, [ LITERAL, $word ];
+ } else {
+ push @tokens, [ WORD, $word ];
+ }
+ }
+ push @tokens, [ LITERAL, $tail ] if $tail ne "";
+
+ return bless {
+ text => $text,
+ tokens => \@tokens,
+ }, $class;
+}
+
+sub render {
+ my $this = shift();
+
+ return (sprintf("%24s: ", ("'" . $this->{text} . "'")) .
+ join(", ", map {
+ my($type, $val) = @$_;
+ typename($type) . " '$val'";
+ } @{ $this->{tokens} }));
+}
+
+sub format {
+ my $this = shift();
+ my($data) = @_;
+
+ my $gotField = 0;
+ my $result = "";
+ foreach my $token (@{ $this->{tokens} }) {
+ my($type, $val) = @$token;
+ if ($type == LITERAL) {
+ $result .= $val;
+ } elsif ($type != WORD) {
+ die "unexpected token type '$type'";
+ } else {
+ my $dval = $data->{$val};
+ $dval = $data->{lc($val)} if !defined $dval;
+ $dval = "" if !defined $dval && (exists $data->{$val} ||
+ exists $data->{lc($val)});
+ if (!defined $dval) {
+ # The word is not a fieldname at all: treat as a literal
+ #print "!defined \$dval\n";
+ $result .= $val;
+ } elsif (!$gotField && $dval eq "") {
+ #print "\$dval is empty\n";
+ # Field is empty, so whole dependent sequence is omitted
+ return "";
+ } else {
+ #print "$dval eq '$dval'\n";
+ $gotField = 1;
+ # Loathesome but useful special case
+ $dval = "http://$dval" if $val eq "URL" && $dval !~ /^[a-z]+:/;
+ $result .= $dval;
+ }
+ }
+ }
+
+ return $result;
+}
+
+
+=head1 AUTHOR
+
+Mike Taylor, E<lt>mike at miketaylor.org.ukE<gt>
+
+=head1 COPYRIGHT AND LICENCE
+
+Copyright (C) 2007 by Mike Taylor.
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself, either Perl version 5.8.4 or,
+at your option, any later version of Perl 5 you may have available.
+
+=cut
+
+
+1;
Added: branches/upstream/libbiblio-endnotestyle-perl/current/t/Biblio-EndnoteStyle.t
URL: http://svn.debian.org/wsvn/branches/upstream/libbiblio-endnotestyle-perl/current/t/Biblio-EndnoteStyle.t?rev=19989&op=file
==============================================================================
--- branches/upstream/libbiblio-endnotestyle-perl/current/t/Biblio-EndnoteStyle.t (added)
+++ branches/upstream/libbiblio-endnotestyle-perl/current/t/Biblio-EndnoteStyle.t Fri May 16 08:01:34 2008
@@ -1,0 +1,40 @@
+# $Id: Biblio-EndnoteStyle.t,v 1.4 2007/03/14 11:12:49 mike Exp $
+
+use strict;
+use warnings;
+
+use vars qw(@tests);
+
+BEGIN {
+ @tests = (
+ [ ";Author: ", ";Taylor: ", "author provided" ],
+ [ ";`Author`: ", ";Author: ", "author quoted" ],
+ [ ";Title: ", "", "title empty" ],
+ [ ";Title|: ", ": ", "title empty 2" ],
+ [ ";Title|: ", ": ", "title empty 2" ],
+ [ ";Title |: ", ": ", "title empty 3" ],
+ [ ";Title¬|: ", ": ", "absent title with nbsp" ],
+ [ ";Author¬|: ", ";Taylor : ", "present author with nbsp" ],
+ [ ";NoSuchField: ", ";NoSuchField: ", "NoSuchField absent" ],
+ );
+};
+
+use Test::More tests => 2+ at tests;
+
+BEGIN { use_ok('Biblio::EndnoteStyle') };
+
+my $style = new Biblio::EndnoteStyle();
+ok(1, "made style object");
+
+my $data = { Author => "Taylor", Title => "" };
+
+foreach my $test (@tests) {
+ my($template, $result, $description) = @$test;
+ #print("[", $style->format($template, $data), "]\n");
+ my $actual = $style->format($template, $data);
+ if ($actual eq $result) {
+ ok(1, $description);
+ } else {
+ ok(0, qq[$description: expected "$result", got "$actual"]);
+ }
+}
More information about the Pkg-perl-cvs-commits
mailing list