Biblio-EndnoteStyle-0.06/000755 000765 000024 00000000000 13017126523 015342 5ustar00mikestaff000000 000000 Biblio-EndnoteStyle-0.06/bin/000755 000765 000024 00000000000 13017126522 016111 5ustar00mikestaff000000 000000 Biblio-EndnoteStyle-0.06/Changes000644 000765 000024 00000003532 13017126456 016645 0ustar00mikestaff000000 000000 $Id: Changes,v 1.12 2016/11/28 22:18:22 mike Exp $ Revision history for Perl extension Biblio::EndnoteStyle. 0.06 Mon Nov 28 22:17:19 GMT 2016 - Fix a POD error and a typo -- from https://rt.cpan.org/Public/Bug/Display.html?id=118948 by Florian Schlichting 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. Biblio-EndnoteStyle-0.06/lib/000755 000765 000024 00000000000 13017126522 016107 5ustar00mikestaff000000 000000 Biblio-EndnoteStyle-0.06/Makefile.PL000644 000765 000024 00000001245 10565171050 017316 0ustar00mikestaff000000 000000 # $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 ') : ()), EXE_FILES => [ 'bin/endnote-format' ], ); Biblio-EndnoteStyle-0.06/MANIFEST000644 000765 000024 00000000521 13017126523 016471 0ustar00mikestaff000000 000000 # $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 META.json Module JSON meta-data (added by MakeMaker) Biblio-EndnoteStyle-0.06/MANIFEST.SKIP000644 000765 000024 00000000157 10555353412 017246 0ustar00mikestaff000000 000000 # $Id: MANIFEST.SKIP,v 1.3 2007/01/23 09:36:10 mike Exp $ .cvsignore CVS archive lib/Biblio/CVS lib/CVS t/CVS Biblio-EndnoteStyle-0.06/META.json000644 000765 000024 00000001544 13017126523 016767 0ustar00mikestaff000000 000000 { "abstract" : "reference formatting using Endnote-like templates", "author" : [ "Mike Taylor " ], "dynamic_config" : 1, "generated_by" : "ExtUtils::MakeMaker version 6.66, CPAN::Meta::Converter version 2.133380", "license" : [ "unknown" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", "version" : "2" }, "name" : "Biblio-EndnoteStyle", "no_index" : { "directory" : [ "t", "inc" ] }, "prereqs" : { "build" : { "requires" : { "ExtUtils::MakeMaker" : "0" } }, "configure" : { "requires" : { "ExtUtils::MakeMaker" : "0" } }, "runtime" : { "requires" : {} } }, "release_status" : "stable", "version" : "0.06" } Biblio-EndnoteStyle-0.06/META.yml000644 000765 000024 00000000776 13017126523 016625 0ustar00mikestaff000000 000000 --- abstract: 'reference formatting using Endnote-like templates' author: - 'Mike Taylor ' build_requires: ExtUtils::MakeMaker: 0 configure_requires: ExtUtils::MakeMaker: 0 dynamic_config: 1 generated_by: 'ExtUtils::MakeMaker version 6.66, CPAN::Meta::Converter version 2.133380' license: unknown meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: 1.4 name: Biblio-EndnoteStyle no_index: directory: - t - inc requires: {} version: 0.06 Biblio-EndnoteStyle-0.06/README000644 000765 000024 00000001331 10555352250 016222 0ustar00mikestaff000000 000000 $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. Biblio-EndnoteStyle-0.06/t/000755 000765 000024 00000000000 13017126522 015604 5ustar00mikestaff000000 000000 Biblio-EndnoteStyle-0.06/t/Biblio-EndnoteStyle.t000644 000765 000024 00000002122 10575754261 021616 0ustar00mikestaff000000 000000 # $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+@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"]); } } Biblio-EndnoteStyle-0.06/lib/Biblio/000755 000765 000024 00000000000 13017126522 017307 5ustar00mikestaff000000 000000 Biblio-EndnoteStyle-0.06/lib/Biblio/EndnoteStyle.pm000644 000765 000024 00000016654 13017126456 022304 0ustar00mikestaff000000 000000 # $Id: EndnoteStyle.pm,v 1.12 2016/11/28 22:18:22 mike Exp $ package Biblio::EndnoteStyle; use 5.006; use strict; use warnings; our $VERSION = 0.06; =encoding utf8 =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 method; C 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 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 Separation 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 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, Emike@miketaylor.org.ukE =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; Biblio-EndnoteStyle-0.06/bin/endnote-format000755 000765 000024 00000000763 10565203000 020757 0ustar00mikestaff000000 000000 #! /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);