libbiblio-citation-parser-perl-1.10+dfsg.orig/0000755000175000017500000000000011300037153020565 5ustar gregoagregoalibbiblio-citation-parser-perl-1.10+dfsg.orig/INSTALL0000644000175000017500000000130310115645511021621 0ustar gregoagregoaInstalling Biblio::Citation::Parser =================================== The easiest way to do this is like so: perl Build.PL ./Build ./Build install You can also optionally run './Build test', which will run a few checks on the modules. Requirements ============ The following modules are required for Biblio::Citation::Parser to function correctly: - URI - Text::Unidecode The most recent versions of these are located at http://www.cpan.org. To use the web service support, you will need the SOAP::Lite module (and any dependencies that it requires). Known working versions are available at http://paracite.eprints.org/files/perlmods/soap/, while the latest versions are at http://www.cpan.org. libbiblio-citation-parser-perl-1.10+dfsg.orig/docs/0000755000175000017500000000000011300037153021515 5ustar gregoagregoalibbiblio-citation-parser-perl-1.10+dfsg.orig/docs/html/0000755000175000017500000000000010115646330022467 5ustar gregoagregoalibbiblio-citation-parser-perl-1.10+dfsg.orig/docs/html/contact.html0000644000175000017500000000451710115645542025023 0ustar gregoagregoa Biblio::Citation::Parser 1.10 Documentation - Problems, Questions and Feedback
 Biblio::Citation::Parser 1.10 Documentation - Problems, Questions and Feedback


Bug Report Policy

There is currently no online bug tracking system. Known bugs are listed in the BUGLIST file in the distribution and a list will be kept on the http://paracite.eprints.org/developers/ site.

If you identify a bug or ``issue'' (issues are not bugs, but are things which could be clearer or better), and it's not already listed on the site, please let us know at paracite@ecs.soton.ac.uk - include all the information you can: what version of Biblio::Citation::Parser (see VERSION if you're not sure), what operating system etc.


Where to go with Questions and Suggestions

There is a mailing list for ParaTools (encompassing Biblio::Citation::Parser) which may be the right place to ask general questions and start discussions on broad design issues.

To subscribe send an email to majordomo@ecs.soton.ac.uk containing the text

 subscribe paratools
 Biblio::Citation::Parser 1.10 Documentation - Problems, Questions and Feedback
libbiblio-citation-parser-perl-1.10+dfsg.orig/docs/html/installation.html0000644000175000017500000000417510115645542026071 0ustar gregoagregoa Biblio::Citation::Parser 1.10 Documentation - How to Install Biblio::Citation::Parser
 Biblio::Citation::Parser 1.10 Documentation - How to Install Biblio::Citation::Parser


Installation

First unpack the Biblio::Citation::Parser archive:

 % tar xfvz <packagename>.tar.gz

Move into the unpacked folder, and then do the following:

 % perl Build.PL
 % ./Build

You can optionally run

 % ./Build test

which will carry out a few checks to ensure everything is working correctly.

Finally, become root and do:

 % ./Build install

This will install the modules and man pages into the correct locations.


Examples

The examples directory contains two categories of examples - parsing examples and web service examples. Note that the web service examples require the SOAP::Lite module (see Required Software for more information). To try out these samples after installation, simply cd into the directory and execute the example. More information about the examples is in the README file inside the examples directory.

 Biblio::Citation::Parser 1.10 Documentation - How to Install Biblio::Citation::Parser
libbiblio-citation-parser-perl-1.10+dfsg.orig/docs/html/troubleshooting.html0000644000175000017500000000366610115645542026623 0ustar gregoagregoa Biblio::Citation::Parser 1.10 Documentation - Troubleshooting
 Biblio::Citation::Parser 1.10 Documentation - Troubleshooting


Troubleshooting

If you cannot find a solution to your problem here, make sure you are using the latest version of the toolkit and ask on the ParaTools mailing list (see http://paracite.eprints.org/developers/).


Reference Parsing

Reference does not parse correctly

If you are using the Standard parsing module, make sure that a template for the reference exists in the package. See the HOWTO for more information on how to do this. If you are using a contributed module, please email your query to the author of the module.

 Biblio::Citation::Parser 1.10 Documentation - Troubleshooting
libbiblio-citation-parser-perl-1.10+dfsg.orig/docs/html/index.html0000644000175000017500000000234710115645542024476 0ustar gregoagregoa Biblio::Citation::Parser 1.10 Documentation

 Biblio::Citation::Parser 1.10 Documentation

Biblio::Citation::Parser 1.10 Documentation

 Biblio::Citation::Parser 1.10 Documentation

libbiblio-citation-parser-perl-1.10+dfsg.orig/docs/html/intro.html0000644000175000017500000001026410115645542024517 0ustar gregoagregoa Biblio::Citation::Parser 1.10 Documentation - Introduction
 Biblio::Citation::Parser 1.10 Documentation - Introduction


What is ParaTools?

ParaTools, short for ParaCite Toolkit, is a collection of Perl modules for reference parsing that is designed to be easily expanded and yet simple to use. The parsing modules make up the core of the package, but there are also useful modules to assist with OpenURL creation and the extraction of references from documents. The toolkit is released under the GNU Public License, so can be used freely as long as the source code is provided (see the COPYING file in the root directory of the distribution for more information).

The toolkit came about as a result of the ParaCite resource, a reference search engine located at http://paracite.eprints.org, which uses a template-based reference parser to extract metadata from provided references and then provides search results based on this metadata. The ParaCite parser is provided directly as the Biblio::Citation::Parser::Standard module, with a separate Templates module that can be replaced as new reference templates are located.

As well as providing examples for the provided parsing modules, ParaTools also includes examples for using the ParaCite web service. This is an alternate interface which provides access to ParaCite's search and parsing functionality for any language that supports the Web Services Description Language (WSDL).


Who should use ParaTools?

The ParaTools package has many applications, including:

The modularity of ParaTools means that it is very easy to add new techniques (and we would be very pleased to hear of new ones!).


What will it run on?

ParaTools should work on any platform that supports Perl 5.6.0 or higher, although testing was primarily carried out using Red Hat Linux 7.3 with Perl 5.6. Where possible platform-agnostic modules have been used for file functionality, so temporary files should be placed in the correct place for the operating system. Memory requirements for ParaTools are minimal, although the template parser and document parser will require more memory as the number of templates and sizes of documents increase.


This Documentation

This documentation is written in perl POD format and converted into Postscript (which is 2 pages to a sheet for printing), ASCII, PDF, and HTML.

The latest version of this documentation can be obtained from http://paracite.eprints.org/files/docs/

 Biblio::Citation::Parser 1.10 Documentation - Introduction
libbiblio-citation-parser-perl-1.10+dfsg.orig/docs/html/webservice.html0000644000175000017500000002065610115645542025530 0ustar gregoagregoa Biblio::Citation::Parser 1.10 Documentation - ParaCite Web Service
 Biblio::Citation::Parser 1.10 Documentation - ParaCite Web Service


The ParaCite Web Service

The Biblio::Citation::Parser package includes several examples that demonstrate the ParaCite web service, as well as the WSDL definition file. This section explains the web service, and gives an introduction to using it.

As ParaCite is written entirely in Perl, there are obvious issues if you wish to use Java, PHP, or another language. The ParaCite web services provides an interface into the reference parsing features of ParaCite, while remaining language agnostic.


Using the Web Service from Perl

To access the web service from Perl requires the SOAP::Lite module (see Required Software). Once this is present, this is all that is required to connect to the web service:

 my $service = SOAP::Lite
        -> service("http://paracite.eprints.org/paracite.wsdl";);

Three functions are now available from the $service variable:

doOpenURLConstruct($reference, $baseurl)
This returns an OpenURL, prefixed by the base URL if one is provided.

doReferenceParse($reference, $baseurl)
This returns a hash containing the metadata in the reference, and an OpenURL formed using the metadata and the base URL.

doParaciteSearch($reference, $baseurl)
This returns an hash containing 'resultElements' (an array of search results), and 'metadata' (a hash of metadata).


Web Service Examples

The following code parses a reference, and stores the metadata in $metadata and the OpenURL in $openurl:

 use SOAP::Lite;
 my $service = SOAP::Lite
        -> service("http://paracite.eprints.org/paracite.wsdl";);
 my $base_url = "http://paracite.eprints.org/cgi-bin/openurl.cgi?";;
 my $result = $service 
        -> doReferenceParse("Jewell, M (2002) Example", $base_url);
 my $metadata = $result->{metadata};
 my $openurl = $result->{openURL};

If you do not want the metadata, and just want a link to an OpenURL resolver, the following will do that:

 use SOAP::Lite;
 my $service = SOAP::Lite
        -> service("http://paracite.eprints.org/paracite.wsdl";);
 my $base_url = "http://paracite.eprints.org/cgi-bin/openurl.cgi?";;
 my $open_url = $service
        -> doOpenURLConstruct("Jewell, M (2002) Example", $base_url);
 
Finally, this example uses the doParaciteSearch method to get the first match on a reference:
 use SOAP::Lite;
 my $service = SOAP::Lite
        -> service("http://paracite.eprints.org/paracite.wsdl";);
 my $base_url = "http://paracite.eprints.org/cgi-bin/openurl.cgi?";;
 my $query = "Harnad, Stevan (1995) The PostGutenberg Galaxy.";
 my $result = $service 
        -> doParaciteSearch($query, $base_url);
 my $first_result = $result->{resultElements}->[0];
 print "First result is: ".$first_result->{URL}."\n";

The web service automatically adds Google, Scirus, and Vivissimo as resources to the search request, so if no resources match the publication or subject these will be used as fall-backs.


Web Service Structures

Most of the Paracite structures have been modelled very closely on the Google web service structures to allow some degree of standardisation. Some additions have been made, and some fields are not yet used, but these may change in future versions.

ParaciteSearchResult

resultElements
This is an array of resources, along with the search URLs associated with them. See the ResultElement description later in this section.

estimatedTotalResultsCount
This returns the number of items in the resultElements array.

estimateIsExact
This currently always returns 1.

searchQuery
This contains the original reference.

openURL
This contains the OpenURL represented by the reference metadata (prefixed by base URL if one is supplied).

metadata
This is a Metadata object (see later in this section).

ResultElement

URL
This is a URL that searches the current resource for the reference.

template
This contains the template of the matching resource interface that was used to generate the search URL.

name
The name of the resource (e.g. Google).

description
Some more information about the resource.

tollfree
A boolean value that is true if the results can be viewed without cost.

fulltext
A boolean value that is true if a resulting article from this resource will have the full text available.

stratum
An integer representing the stratum in which this resource lies. A complete list of the strata is available at http://paracite.eprints.org/cgi-bin/views/viewstrata.cgi

Metadata

All of the fields in Metadata are valid fields in OpenURL metadata. See Table 1 at http://www.sfxit.com/openurl/openurl.html for a complete list.

 Biblio::Citation::Parser 1.10 Documentation - ParaCite Web Service
libbiblio-citation-parser-perl-1.10+dfsg.orig/docs/html/howto.html0000644000175000017500000001655510115645542024535 0ustar gregoagregoa Biblio::Citation::Parser 1.10 Documentation - How-To Guides
 Biblio::Citation::Parser 1.10 Documentation - How-To Guides


HOW TO: Modify Templates in Biblio::Citation::Parser::Standard

Adding new templates to the Standard parser is relatively easy:

The Templates.pm file should contain a structure similar to this:

 $Biblio::Citation::Parser::Templates::templates = [
        '_AUTHORS_, _PUBLICATION_, _YEAR_, _ISSUE_, _SPAGE_-_EPAGE_',
 ...
        ];

Each template is a string containing a set of placeholders. For example, '_AUTHORS_ (_YEAR_) _TITLE_' can match 'Jewell, M (2002) Title'. The following are valid field names:

_ANY_
Matches anything.

_AUFIRST_
Matches the first name of an author.

_AULAST_
Matches the last name of an author.

_AUTHORS_
Matches a list of authors.

_CAPPUBLICATION_
Matches a capitalised publication title (e.g. ``Journal of Lemurs'').

_CAPTITLE_
Matches a capitalised title.

_CHAPTER_
Matches a chapter number.

_DATE_
Matches a date in nn/nn/nn form.

_EDITOR_
Matches an editor's name.

_EPAGE_
Matches the last page in a page range.

_ISBN_
Matches an ISBN number.

_ISSN_
Matches an ISSN number.

_ISSUE_
Matches an issue number.

_PAGES_
Matches a page range in nn-nn form.

_PUBLICATION_
Matches a publication name.

_PUBLISHER_
Matches a publisher name.

_PUBLOC_
Matches the location of a publisher.

_SPAGE_
Matches the start page.

_SUBTITLE_
Matches a subtitle.

_TITLE_
Matches an article title.

_UCPUBLICATION_
Matches a publication in entirely upper-case (e.g. JOURNAL OF LEMURS).

_UCTITLE_
Matches a title in entirely upper-case.

_URL_
Matches a URL.

_VOLUME_
Matches a volume.

_YEAR_
Matches a year (4 digits).


HOW TO: Integrate ParaTools with EPrints 2

EPrints already contains ParaCite support, but using a specially built version of the module before it was part of ParaTools. To alter your cgi/paracite script to use ParaTools, you need to do the following:

First replace

 use Citation::Parser::Simple;

with

 use Biblio::Citation::Parser::Standard;

Next, replace this line:

 my $parser = new Citation::Parser::Simple();

with this line:

 my $parser = new Biblio::Citation::Parser::Standard();

This should work fine, although you can obviously integrate ParaCite more if you wish.


HOW TO: Create a New Parser

Creating a Citation Parser

All new citation parsers should be named Biblio::Citation::Parser::SomeName, where SomeName is replaced with a unique name (ideally the author's surname). The parser should extend the Biblio::Citation::Parser module like so:

 package Biblio::Citation::Parser::SomeName;
 require Exporter;
 @ISA = ("Exporter", "Biblio::Citation::Parser");
 our @EXPORT_OK = ( 'new', 'parse' );

You should then override the 'new' and 'parse' methods:

e.g.

 sub new
 {
         my($class) = @_;
         my $self = {};
         return bless($self, $class);
 }
 sub parse
 {
         my($self, $ref) = @_;
         my $hashout = $self->extract_metadata($ref);
         return $hashout;
 }

This makes it easy for users to swap out one reference parser for another.

 Biblio::Citation::Parser 1.10 Documentation - How-To Guides
libbiblio-citation-parser-perl-1.10+dfsg.orig/docs/html/reqsoftware.html0000644000175000017500000000666510115645542025740 0ustar gregoagregoa Biblio::Citation::Parser 1.10 Documentation - Required Software
 Biblio::Citation::Parser 1.10 Documentation - Required Software


What software does Biblio::Citation::Parser need?

Perl Modules

URI
URI is required for the OpenURL encoding functions in Biblio::Citation::Parser::Utils.

Text::Unidecode
Used by Biblio::Citation::Parser::Citebase to allow for matching on unicode strings.

URI::OpenURL (Optional)
If you wish to create valid OpenURLs, URI::OpenURL provides a set of functions for this purpose. The metadata produced by Biblio::Citation::Parser can be used with this module.

SOAP::Lite (Optional)
This module is required if you wish to use the ParaCite web services, but optional otherwise. This requires several other modules, which are available in the soap subdirectory of http://paracite.eprints.org/files/perlmods/.

There are also some dependencies for the above modules, including MIME::Base64, HTML::TagSet, and Digest::MD5. The latest versions of these can be obtained from http://www.cpan.org/

Installing Perl Modules

This describes the way to install a simple perl module, some require a bit more effort. We will use the non-existent FOO module as an example.

Unpack the archive:
 % tar xfvz FOO-5.2.34.tar.gz
Enter the directory this creates:
 % cd FOO-5.2.34
Run the following commands:
 % perl ./Build.PL
 % ./Build
 % ./Build test
 % ./Build install
 Biblio::Citation::Parser 1.10 Documentation - Required Software
libbiblio-citation-parser-perl-1.10+dfsg.orig/docs/html/refparsing.html0000644000175000017500000001074010115645542025523 0ustar gregoagregoa Biblio::Citation::Parser 1.10 Documentation - Reference Parsing
 Biblio::Citation::Parser 1.10 Documentation - Reference Parsing


Parsing References

Biblio::Citation::Parser is designed for parsing citations, and this can be done very simply:

 use Biblio::Citation::Parser::Standard;
 my $parser = new Biblio::Citation::Parser::Standard();
 my $metadata = $parser->parse("Jewell, M (2002) Parsing Examples");

The $metadata variable is a hash containing the information extracted from the reference.

If you'd prefer to use another parser, simply substitute the 'Standard' for the appropriate module. Biblio::Citation::Parser is distributed with the Jiao module, which is a slightly modified version of a module created by Zhuoan Jiao. To use this instead of the Standard module, you would do the following:

 use Biblio::Citation::Parser::Jiao;
 my $parser = new Biblio::Citation::Parser::Jiao();
 my $metadata = $parser->parse("Jewell, M (2002) Parsing Examples");

The Standard module provides slightly richer metadata than the Jiao module, but it does rely on templates (see Biblio::Citation::Parser::Templates) so requires updating as new citation formats are found.


Creating an OpenURL

Once you have the metadata from the reference, it is easy to create an OpenURL from it:

 use Biblio::Citation::Parser::Standard;
 use Biblio::Citation::Parser::Utils;
 my $parser = new Biblio::Citation::Parser::Standard();
 my $metadata = $parser->parse("Jewell, M (2002) Parsing Examples");
 my $openurl = create_openurl($metadata);

The OpenURLs created by Biblio::Citation::Parser do not have a Base URL prefixed, so this should be carried out before they are used (the ParaCite base URL is http://paracite.eprints.org/cgi-bin/openurl.cgi).

If you would like to try to extract more information from the metadata, you can use the decompose_openurl function:

 my ($enriched_metadata, @errors) = decompose_openurl($metadata);
 
This tries to extract information from SICIs, page ranges, etc, and also checks the fields for validity (the C<@errors> array contains any mistakes).

Note that the create_openurl has been superceded by URI::OpenURL, but the metadata returned by trim_openurl is in the correct format to be passed to this module.


Metadata Structure

Biblio::Citation::Parser supports all of the fields specified in Table 1 of the OpenURL specification (http://www.sfxit.com/openurl/openurl.html). Specific parsers can add their own fields, but these are not exported when OpenURLs are created. Biblio::Citation::Parser::Standard provides the following extra fields:

marked
A marked-up version of the reference. e.g. <author>Jewell, M</author> (<year>2002</year>) <title>A title</title>.

match
The template matched by Biblio::Citation::Parser::Standard

ref
The original reference

 Biblio::Citation::Parser 1.10 Documentation - Reference Parsing
libbiblio-citation-parser-perl-1.10+dfsg.orig/docs/pdf/0000755000175000017500000000000010115646330022274 5ustar gregoagregoalibbiblio-citation-parser-perl-1.10+dfsg.orig/docs/pdf/citeparser.pdf0000644000175000017500000034224310115645542025144 0ustar gregoagregoa%PDF-1.2 7 0 obj << /Type/Encoding /Differences[0/Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi/Omega/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/suppress/exclam/quotedblright/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/exclamdown/equal/questiondown/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/quotedblleft/bracketright/circumflex/dotaccent/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/endash/emdash/hungarumlaut/tilde/dieresis/suppress 160/space/Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi 173/Omega/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/suppress/dieresis] >> endobj 10 0 obj << /Encoding 7 0 R /Type/Font /Subtype/Type1 /Name/F1 /FontDescriptor 9 0 R /BaseFont/TPKZNX+CMR17 /FirstChar 33 /LastChar 196 /Widths[249.6 458.6 772.1 458.6 772.1 719.8 249.6 354.1 354.1 458.6 719.8 249.6 301.9 249.6 458.6 458.6 458.6 458.6 458.6 458.6 458.6 458.6 458.6 458.6 458.6 249.6 249.6 249.6 719.8 432.5 432.5 719.8 693.3 654.3 667.6 706.6 628.2 602.1 726.3 693.3 327.6 471.5 719.4 576 850 693.3 719.8 628.2 719.8 680.5 510.9 667.6 693.3 693.3 954.5 693.3 693.3 563.1 249.6 458.6 249.6 458.6 249.6 249.6 458.6 510.9 406.4 510.9 406.4 275.8 458.6 510.9 249.6 275.8 484.7 249.6 772.1 510.9 458.6 510.9 484.7 354.1 359.4 354.1 510.9 484.7 667.6 484.7 484.7 406.4 458.6 917.2 458.6 458.6 458.6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 576 772.1 719.8 641.1 615.3 693.3 667.6 719.8 667.6 719.8 0 0 667.6 525.4 499.3 499.3 748.9 748.9 249.6 275.8 458.6 458.6 458.6 458.6 458.6 693.3 406.4 458.6 667.6 719.8 458.6 837.2 941.7 719.8 249.6 458.6] >> endobj 13 0 obj << /Encoding 7 0 R /Type/Font /Subtype/Type1 /Name/F2 /FontDescriptor 12 0 R /BaseFont/YJYFCY+CMR12 /FirstChar 33 /LastChar 196 /Widths[272 489.6 816 489.6 816 761.6 272 380.8 380.8 489.6 761.6 272 326.4 272 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 272 272 272 761.6 462.4 462.4 761.6 734 693.4 707.2 747.8 666.2 639 768.3 734 353.2 503 761.2 611.8 897.2 734 761.6 666.2 761.6 720.6 544 707.2 734 734 1006 734 734 598.4 272 489.6 272 489.6 272 272 489.6 544 435.2 544 435.2 299.2 489.6 544 272 299.2 516.8 272 816 544 489.6 544 516.8 380.8 386.2 380.8 544 516.8 707.2 516.8 516.8 435.2 489.6 979.2 489.6 489.6 489.6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 611.8 816 761.6 679.6 652.8 734 707.2 761.6 707.2 761.6 0 0 707.2 571.2 544 544 816 816 272 299.2 489.6 489.6 489.6 489.6 489.6 734 435.2 489.6 707.2 761.6 489.6 883.8 992.6 761.6 272 489.6] >> endobj 15 0 obj << /Filter[/FlateDecode] /Length 186 >> stream x-M0 ໿-&w3LȇA <>}_BJx<DDRAۦCTOvimFD ~#V 9vt"UWaI(' #HrON 3ӶBડo45΋:7.)e<ӽ^B>:? endstream endobj 17 0 obj << /F1 10 0 R /F2 13 0 R >> endobj 6 0 obj << /ProcSet[/PDF/Text/ImageC] /Font 17 0 R >> endobj 22 0 obj << /Encoding 7 0 R /Type/Font /Subtype/Type1 /Name/F3 /FontDescriptor 21 0 R /BaseFont/NCPFTT+CMR10 /FirstChar 33 /LastChar 196 /Widths[277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8 444.4 500 1000 500 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 625 833.3 777.8 694.4 666.7 750 722.2 777.8 722.2 777.8 0 0 722.2 583.3 555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 500] >> endobj 23 0 obj << /Filter[/FlateDecode] /Length 59 >> stream xS030PHWS N!n zf !i zf& z@Kflk:e endstream endobj 24 0 obj << /F3 22 0 R >> endobj 19 0 obj << /ProcSet[/PDF/Text/ImageC] /Font 24 0 R >> endobj 29 0 obj << /Encoding 7 0 R /Type/Font /Subtype/Type1 /Name/F4 /FontDescriptor 28 0 R /BaseFont/LWVILM+CMBX12 /FirstChar 33 /LastChar 196 /Widths[342.6 581 937.5 562.5 937.5 875 312.5 437.5 437.5 562.5 875 312.5 375 312.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6 875 531.2 531.2 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8 675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5 687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.7 562.5 625 312.5 343.7 593.7 312.5 937.5 625 562.5 625 593.7 459.5 443.8 437.5 625 593.7 812.5 593.7 593.7 500 562.5 1125 562.5 562.5 562.5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 675.9 937.5 875 787 750 879.6 812.5 875 812.5 875 0 0 812.5 656.2 625 625 937.5 937.5 312.5 343.7 562.5 562.5 562.5 562.5 562.5 849.5 500 574.1 812.5 875 562.5 1018.5 1143.5 875 312.5 562.5] >> endobj 32 0 obj << /Encoding 7 0 R /Type/Font /Subtype/Type1 /Name/F5 /FontDescriptor 31 0 R /BaseFont/GEJGRR+CMBX10 /FirstChar 33 /LastChar 196 /Widths[350 602.8 958.3 575 958.3 894.4 319.4 447.2 447.2 575 894.4 319.4 383.3 319.4 575 575 575 575 575 575 575 575 575 575 575 319.4 319.4 350 894.4 543.1 543.1 894.4 869.4 818.1 830.6 881.9 755.6 723.6 904.2 900 436.1 594.4 901.4 691.7 1091.7 900 863.9 786.1 863.9 862.5 638.9 800 884.7 869.4 1188.9 869.4 869.4 702.8 319.4 602.8 319.4 575 319.4 319.4 559 638.9 511.1 638.9 527.1 351.4 575 638.9 319.4 351.4 606.9 319.4 958.3 638.9 575 638.9 606.9 473.6 453.6 447.2 638.9 606.9 830.6 606.9 606.9 511.1 575 1150 575 575 575 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 691.7 958.3 894.4 805.6 766.7 900 830.6 894.4 830.6 894.4 0 0 830.6 670.8 638.9 638.9 958.3 958.3 319.4 351.4 575 575 575 575 575 869.4 511.1 597.2 830.6 894.4 575 1041.7 1169.4 894.4 319.4 575] >> endobj 33 0 obj << /Filter[/FlateDecode] /Length 954 >> stream xXMoFW<~su)ES1hkeɔwvg#U '0s"E}o޼egy%6yYx#&2]$2"+T2e2)_I& }(@4Lәaý96qj2c*/$TdF+yFF #׫jeL A >Ӥ]sIt&|*Q 3_7u'`{uHHMy˜'vzʥ {(6Pa(m&lOB3)`h_NUlS@ vi>(&v5z ܦ.ghY߬v>?FgPM?T4 ֡%iaɔ 9AoŴk` G}Ouy$ p\b˥lskQri'%&ƚϻs 9$<6weuY(*Ig4ߡh9 c6բ*y5t0m¿OZvI,K0![HboǕ]%\˜P~rpʕy\vc{|Y W2`sJ7.~AR>d~J!9B[Uwul= endstream endobj 34 0 obj << /F4 29 0 R /F5 32 0 R /F3 22 0 R >> endobj 26 0 obj << /ProcSet[/PDF/Text/ImageC] /Font 34 0 R >> endobj 39 0 obj << /Encoding 7 0 R /Type/Font /Subtype/Type1 /Name/F6 /FontDescriptor 38 0 R /BaseFont/ANIKOX+CMSL10 /FirstChar 33 /LastChar 196 /Widths[277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8 444.4 500 1000 500 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 625 833.3 777.8 694.4 666.7 750 722.2 777.8 722.2 777.8 0 0 722.2 583.3 555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 808.6 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 500] >> endobj 40 0 obj << /Filter[/FlateDecode] /Length 264 >> stream xՑN1{XŽ]M"Q@,Q "h!g-Ts}(c(ܢTYj Z(D&7ϠTHSR/*Czȅ"2 5XaѿטH#mWSiwvTj~Yo W2K}OIsju> endobj 36 0 obj << /ProcSet[/PDF/Text/ImageC] /Font 41 0 R >> endobj 44 0 obj << /Type/Encoding /Differences[0/minus/periodcentered/multiply/asteriskmath/divide/diamondmath/plusminus/minusplus/circleplus/circleminus/circlemultiply/circledivide/circledot/circlecopyrt/openbullet/bullet/equivasymptotic/equivalence/reflexsubset/reflexsuperset/lessequal/greaterequal/precedesequal/followsequal/similar/approxequal/propersubset/propersuperset/lessmuch/greatermuch/precedes/follows/arrowleft/arrowright/arrowup/arrowdown/arrowboth/arrownortheast/arrowsoutheast/similarequal/arrowdblleft/arrowdblright/arrowdblup/arrowdbldown/arrowdblboth/arrownorthwest/arrowsouthwest/proportional/prime/infinity/element/owner/triangle/triangleinv/negationslash/mapsto/universal/existential/logicalnot/emptyset/Rfractur/Ifractur/latticetop/perpendicular/aleph/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/union/intersection/unionmulti/logicaland/logicalor/turnstileleft/turnstileright/floorleft/floorright/ceilingleft/ceilingright/braceleft/braceright/angbracketleft/angbracketright/bar/bardbl/arrowbothv/arrowdblbothv/backslash/wreathproduct/radical/coproduct/nabla/integral/unionsq/intersectionsq/subsetsqequal/supersetsqequal/section/dagger/daggerdbl/paragraph/club/diamond/heart/spade/arrowleft 161/minus/periodcentered/multiply/asteriskmath/divide/diamondmath/plusminus/minusplus/circleplus/circleminus 173/circlemultiply/circledivide/circledot/circlecopyrt/openbullet/bullet/equivasymptotic/equivalence/reflexsubset/reflexsuperset/lessequal/greaterequal/precedesequal/followsequal/similar/approxequal/propersubset/propersuperset/lessmuch/greatermuch/precedes/follows/arrowleft/spade] >> endobj 47 0 obj << /Encoding 44 0 R /Type/Font /Subtype/Type1 /Name/F7 /FontDescriptor 46 0 R /BaseFont/KNHISL+CMSY10 /FirstChar 33 /LastChar 196 /Widths[1000 500 500 1000 1000 1000 777.8 1000 1000 611.1 611.1 1000 1000 1000 777.8 275 1000 666.7 666.7 888.9 888.9 0 0 555.6 555.6 666.7 500 722.2 722.2 777.8 777.8 611.1 798.5 656.8 526.5 771.4 527.8 718.7 594.9 844.5 544.5 677.8 762 689.7 1200.9 820.5 796.1 695.6 816.7 847.5 605.6 544.6 625.8 612.8 987.8 713.3 668.3 724.7 666.7 666.7 666.7 666.7 666.7 611.1 611.1 444.4 444.4 444.4 444.4 500 500 388.9 388.9 277.8 500 500 611.1 500 277.8 833.3 750 833.3 416.7 666.7 666.7 777.8 777.8 444.4 444.4 444.4 611.1 777.8 777.8 777.8 777.8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 777.8 277.8 777.8 500 777.8 500 777.8 777.8 777.8 777.8 0 0 777.8 777.8 777.8 1000 500 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 1000 777.8 777.8 1000 777.8] >> endobj 48 0 obj << /Filter[/FlateDecode] /Length 1487 >> stream xڭWK6WV I^& R,E (=pe"K)n}f8#[Shz"9|QE/o/S$ l. leb/q`lqwAy2<6l،PwP?_8XqPE*jG]RTeƢk/$P.ʰX^.HrR+p+/R}gAv7x Q<^R|AMM\U4ݖ>{y6xJ`8cJX]K~ek {m]FƸzך 1QBC]|%vC챀-mz7|Fbt&ƹqq)⹞x<t+ZޡpN ė ̈́ޙ~)gSO2t:\>_`aLThj7Г9OF lc Wp7nmwƷ!|x0-mpa.[Pd"Wk7:O#ҖL ?+"֕iW-Z6S<͠fH b F MG1qcsP1ڊ kͤ^8c.|tOҼĴ'+[NmTbS[H"~Ii+)`k;Q37 ^`[ |\-PJz0e`> R*}XnC76|́J`F9 Nq.'G9m RH9>R|J)=&0/$ @ x+qgw#MK!"I" 1񝗳W#!P70t8Aoo)2,S縗7u<8n33♼? J·HH\2R]({q?$(rbS.wVxUCUV+Cybi8!eQB9JfES ?S` \<\d њ);{ RzC.-f NlI;N;tGC8T GF{a*Ag3{È=!>xBh.6}t#zO&b endstream endobj 49 0 obj << /F4 29 0 R /F3 22 0 R /F7 47 0 R >> endobj 43 0 obj << /ProcSet[/PDF/Text/ImageC] /Font 49 0 R >> endobj 52 0 obj << /Filter[/FlateDecode] /Length 1062 >> stream xڅVK6W1 8fkBjq,U0x133R_(C@mUT,< iyG6HVi$ALڛwcRD(Jqz e!ֿTCae&\$?[K6{ etVe.=DqxڠBYucFeZ5:gq!}*kb)=l0U%\O};ZutrH8 h{aVşv;&:}]fα'Y$̗NVn\3:֫(neBS !0&o{Pp$6eYѥ,HCL4R|¤RM2eĎ}!SJnUr߄J 4mD,U/,<{{dη ݌8Sy.T\!QŬ-shQbcZ:4JPj`dp^{ A l$Y; %7l& ;dxQ! DGC|S;|JbGF]04XC$rYLǮvT-+31w)8L!Qf&l <@J {kյ{e$˞V㝗"Ǟ.._FcQSp(AN+q4q_ F!a}'emC";i=N!NȄ)3D<&×+ nqѐȮoNSzכw_e~_U .n\Jk\w){Jg,n9Ë$o"&D,<ntt%x'2'7֜u5~qIΗ\“:LFk3tA+o؆3כ{~_̻^k) `8} :nPo6AB[0S-+G:N?,0 Hs0lCoŎop endstream endobj 53 0 obj << /F3 22 0 R /F6 39 0 R /F7 47 0 R /F4 29 0 R >> endobj 51 0 obj << /ProcSet[/PDF/Text/ImageC] /Font 53 0 R >> endobj 56 0 obj << /Filter[/FlateDecode] /Length 1137 >> stream xڕVMs6 WHDmi6dIC%1gdI%x c'D  Kٳz5ez%iʽ JH_bG#$Eb , b{/-)? 'Kq%f( t-rem0(Sm ܐLkX#&4)˺CU]HÍC4D .=% z& GV Q:7䶝:l3 e,"`xE,A%q̤Uï͠hc6#+&k3w&L$@qAUգ'P /3&0e+LsTcRdRQs-H׀4v݀J{[P<z:zX`yЁ>)Fsͪ 뀤:$=Am0=?j6y (@Ä+zKbF n_,eKs¡&T'E-B`kiv4c̮1WG80®=,+l1Yzn/͖*Jl7p]U]K*_]xIn ['ܐ Q9Ė Nbn\  Q"a5'̃K T pX,JTbX/֑:1s%1,s.喗>qK΍yvSƟ+Ӗ[aX-#@T}1:) v1rs K/¢p5ENsp;'k܎-i)N)yˇSԩ>{qM7>a7W7_dQqX\W_%??sF}KDBH̰::@\5 ʸBQ,kB>p?5KJf-χ2\#~kOgX'?~#QM+]6N8}p:r7v@9n3k'W̆u 2X=7f1 y0} KmDo'8Vno(PnN_c(Q^I B, endstream endobj 57 0 obj << /F4 29 0 R /F5 32 0 R /F3 22 0 R >> endobj 55 0 obj << /ProcSet[/PDF/Text/ImageC] /Font 57 0 R >> endobj 60 0 obj << /Type/Encoding /Differences[0/Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi/Omega/arrowup/arrowdown/quotesingle/exclamdown/questiondown/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/visiblespace/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde/dieresis/visiblespace 160/space/Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi 173/Omega/arrowup/arrowdown/quotesingle/exclamdown/questiondown/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/visiblespace/dieresis] >> endobj 63 0 obj << /Encoding 60 0 R /Type/Font /Subtype/Type1 /Name/F8 /FontDescriptor 62 0 R /BaseFont/GHNYOJ+CMTT10 /FirstChar 33 /LastChar 196 /Widths[525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 525 525 525 525 525 525 525 525 525 525 0 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] >> endobj 64 0 obj << /Filter[/FlateDecode] /Length 327 >> stream xڍn0} _*/q?MzzQC@[M#-rq^QA%s$=D97,{؋>rL~8M˜@` p>pU=2W80{ujf3煋ۥ섇SebK2ycY0I&w}ܦʊvgU4P\.,vbU$T^(\׋ƪLɴͥ)4ڹLf2TK,kYT 4W`ARVAo)Oݬ>8eՑyoo!2gQ5mZ&W?Gw endstream endobj 65 0 obj << /F3 22 0 R /F6 39 0 R /F5 32 0 R /F8 63 0 R >> endobj 59 0 obj << /ProcSet[/PDF/Text/ImageC] /Font 65 0 R >> endobj 68 0 obj << /Filter[/FlateDecode] /Length 915 >> stream xڝUMo8e Q26nvԗEVm"RTwȡlz87̐ b:pryqIL"X4UD,-h (-3/_9@F jZ9׿U2GW욓@뜀3z_Tsi_,n,4,i%- L) #ƒl Iօ$VZ4%cMb6~d$nHȹr`!eN4+]?(kO8VE?-%G{lVH]|do- 9QhiR]+t}ԣ= Y@Re>}Mϋ ݡQv-y=1ZsWz\忰JQE{dvGGW)NyK#`0~RFb^< |q\VbgNQ *h6Po׽=Rp(Ec@<ԆWZbi FvpF5a`[NjZ.7Q2N*G;1LmJ Sej_)0d@Ϟ,҄k\}۝wf2 ; -fBq̎BPkAp-IQ8sp˪IDdeMu{'aTU9y@p.Q`3HڝG}Fݿ6Գ⵴ ӒaK}kH;X>=~4o0كqz¼2Wspw$0pৰrGk\ ~gGlZ\̳!qq]hF㝾Y?_o+)cpb. _|`ceqڟً7WK;$d{Bjc|BbEMRIY갵_-s$P endstream endobj 69 0 obj << /F4 29 0 R /F3 22 0 R /F8 63 0 R >> endobj 67 0 obj << /ProcSet[/PDF/Text/ImageC] /Font 69 0 R >> endobj 72 0 obj << /Filter[/FlateDecode] /Length 145 >> stream x=0C~ōw!lBIAS"ug SoV MJҋ**'naW"_X# ò3y?\rNV!8ma ' endstream endobj 73 0 obj << /F3 22 0 R /F6 39 0 R >> endobj 71 0 obj << /ProcSet[/PDF/Text/ImageC] /Font 73 0 R >> endobj 76 0 obj << /Filter[/FlateDecode] /Length 1056 >> stream xVKo6W*Q,{6H^Z@[tD@\7;1=졧!3MI$}@_T (6T\AfEua͔PRPD$<.sd7ư]%BmGTřz,.3SqFi*Uc" 2uc:l.w!>vZ2oMDlRn<s)t[DtˬuRV]kN4.MP0M1#dR voN92d!"<#?إ鍜#+e.~dҚ#/y%VỗL;t>wF?]77h-d%dUȻ1EC}y6|:f٣CJ͑7MŗU3m4_`N0O/D}1ʧe AdO2 h%w9=u!q\MO*ESyL@ ȅbU4 5Pg P^`%-q"_,axz] 4 :7lOq2=@wXQ`;y^{OU~h҇%bkn[2cxi?-}ʟ:Q*|r(!,/SrqGʹ@dQOPG\[! k-Gs<|-ͺo1^|ggEǥEWVGaݿ endstream endobj 77 0 obj << /F4 29 0 R /F3 22 0 R /F8 63 0 R >> endobj 75 0 obj << /ProcSet[/PDF/Text/ImageC] /Font 77 0 R >> endobj 80 0 obj << /Type/Encoding /Differences[0/Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi/Omega/alpha/beta/gamma/delta/epsilon1/zeta/eta/theta/iota/kappa/lambda/mu/nu/xi/pi/rho/sigma/tau/upsilon/phi/chi/psi/omega/epsilon/theta1/pi1/rho1/sigma1/phi1/arrowlefttophalf/arrowleftbothalf/arrowrighttophalf/arrowrightbothalf/arrowhookleft/arrowhookright/triangleright/triangleleft/zerooldstyle/oneoldstyle/twooldstyle/threeoldstyle/fouroldstyle/fiveoldstyle/sixoldstyle/sevenoldstyle/eightoldstyle/nineoldstyle/period/comma/less/slash/greater/star/partialdiff/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/flat/natural/sharp/slurbelow/slurabove/lscript/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/dotlessi/dotlessj/weierstrass/vector/tie/psi 160/space/Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi 173/Omega/alpha/beta/gamma/delta/epsilon1/zeta/eta/theta/iota/kappa/lambda/mu/nu/xi/pi/rho/sigma/tau/upsilon/phi/chi/psi/tie] >> endobj 83 0 obj << /Encoding 80 0 R /Type/Font /Subtype/Type1 /Name/F9 /FontDescriptor 82 0 R /BaseFont/TZHOIT+CMMI10 /FirstChar 33 /LastChar 196 /Widths[622.5 466.3 591.4 828.1 517 362.8 654.2 1000 1000 1000 1000 277.8 277.8 500 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 777.8 500 777.8 500 530.9 750 758.5 714.7 827.9 738.2 643.1 786.2 831.3 439.6 554.5 849.3 680.6 970.1 803.5 762.8 642 790.6 759.3 613.2 584.4 682.8 583.3 944.4 828.5 580.6 682.6 388.9 388.9 388.9 1000 1000 416.7 528.6 429.2 432.8 520.5 465.6 489.6 477 576.2 344.5 411.8 520.6 298.4 878 600.2 484.7 503.1 446.4 451.2 468.7 361.1 572.5 484.7 715.9 571.5 490.3 465 322.5 384 636.5 500 277.8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 615.3 833.3 762.8 694.4 742.4 831.3 779.9 583.3 666.7 612.2 0 0 772.4 639.7 565.6 517.7 444.4 405.9 437.5 496.5 469.4 353.9 576.2 583.3 602.5 494 437.5 570 517 571.4 437.2 540.3 595.8 625.7 651.4 277.8] >> endobj 84 0 obj << /Filter[/FlateDecode] /Length 1563 >> stream xڝ]FE})anritwyhߙŵ|,c>w|<,,cepo7?&;ppO7wܘy~fͻ7eܽxe;^~,WϞq-T/~O+ͮk-tݵ'C=kіBsw@Q? Yr_I-J+csMnAPn.p$VFֲݨ@t򋽚AYˀqh?Ty>uZ7sePķãS]H]vm;M@%⛇"`c,zZ9O'Y;8wGhUiJ_bPjio> YtʒJ>$~x6kLdhIFAV)z=L CD\Euj9)XnM( Bb1#et@!sthJ:6WDH:i^Z=[#If+ @u ~ZHBu+4Ca)*2$ ђS6{Q}'Mm,պy;[',$ s΂|h{Q86 2:Ab&OO0WPP{UuQ#xTSPtw3)$vE1!xu{}-Sw-JK9.,EErJ_} ,ҢA)b .kϞ-K r%s l")+-*!j釚4`Q:NᏝNz,Q13,OM,Nw]Xn2Bh} Lt7\4 Xl_ҏ cY46 K|QJj 2=6Cp :%1^+GKa&, 88V鼠Xݒ;+N)i,,E7ӜBZ85{hμ.7d^M;Q?r#&V\+ LgTp NP!nq 4Om~D9%I)<0N8b~$KU_ 5rݲ~Tkd2Ua[ +tT֓l3eIS+;mIaP>|F<bF>6io+iE`Év/C<ﴔkeLVvgr u4dYI 09Ja ՋBeW贈`pJߴ-@}3gXM6L)hʧ1T-$:4N cmR&p fs9V|К5)G58yYJNQf,DפP~d<[sv4=0yzpة^,/u#O ^پ H_~ {%.gǥ;C'SA ~=F@cPɼU2C>E./l<'Z蝎P-vu^֭hkv_{O endstream endobj 85 0 obj << /F3 22 0 R /F6 39 0 R /F8 63 0 R /F4 29 0 R /F5 32 0 R /F9 83 0 R >> endobj 79 0 obj << /ProcSet[/PDF/Text/ImageC] /Font 85 0 R >> endobj 88 0 obj << /Filter[/FlateDecode] /Length 1258 >> stream xڭVn6}WB1c%-XHxuʒKQ}g8#YEr83l6NddMI"L8i4Y|]|ة6y"g yfiR›q(Ud5(chrYE8ai.HeL0Jb睤vnI)ˌF,+#=) e@΀Õ'\pR}0+ 2*>s52J`J`Z) clW,Q|,i1IzM[CHӲ uGa+!5Iad;tF'i( @%ZM;>b<ͣivØ /ɴ;t8L|>>+=V^R;n H k,pJ8 0~B(8~$ԱW-_&qǴݨ&f7^b"jNF+Yn6\(]r`T=]%ϤMJ&0q$&b9{eΔll(D +@Rק' &|$:=vv>&oV7bKwzz/m.Ca`Hj00$$߲Q(WA Fb5k'b49C1^ҟރ @ih Ű fӟɌ.śs^kjnOz ~<4dQ[6]4 >zTSx  a9ww( 3騆t&t\ĺ9@t.1_L [ jugep~50ijP~[0 7o޳WK JƧm8φw^33ky%\ʰ/Z}@H @h)xw\!Y? ik!| q٥QDO<' Mc=ܣ|@ w{ =keW4w?y$ZDpsQp/@};ڋ^{ZSa}GEy N.z`/hlccoNW1~⇿E endstream endobj 89 0 obj << /F4 29 0 R /F3 22 0 R /F8 63 0 R /F5 32 0 R >> endobj 87 0 obj << /ProcSet[/PDF/Text/ImageC] /Font 89 0 R >> endobj 92 0 obj << /Filter[/FlateDecode] /Length 1306 >> stream xW[o6~߯0>P@n)2h#և(hʒ'RI}P&쉗s?q;z^IhI';v8 yϼ0z}zoXWS/_] F; 9%l`%>]ތHٻKb췛>A&Dy~YiB6} \D/Wn <'Ӕͪ,rN[YeI6uيi3Q2'ŌS"HU-ZK+#XqOc'jb}m 6dMv'L޽sZkJM] !Q9;T`{ĞNkFbpv&WGäZl W?Jj v]Y،uJNOxxRXyS惜ݱE[C.GîGZ=S@?wpj& Thxt!/ "bpT\]nzs55G&bL/RhG8Ӱu^ 5BXT3L\E\Ec?.'^WNæ-Quɧ[C%N"zi o *%ʉu e[Wo16A&4cEh/R@SIU]չ<3 Ξa0mejDMǴ|b\\FUPQy<ƧSIkj^Ge/e,m{<\|YF5*}cS0tSML*H,wiıh^dUj&Dr'Rj"Id@^l6-I>q9'\Y:G_ 0|"o~"o'}[!'3VXpdڸ6HQò3XVTRkけ2D:NmagfM0}jib^ 3i@zK} F#A{"IKnS]#q`a.l{&k"$j?k%rnվG4G%1J Nßs.k endstream endobj 93 0 obj << /F3 22 0 R /F6 39 0 R /F4 29 0 R /F8 63 0 R >> endobj 91 0 obj << /ProcSet[/PDF/Text/ImageC] /Font 93 0 R >> endobj 96 0 obj << /Filter[/FlateDecode] /Length 1117 >> stream xڕVM6WhW-;a6T6$GR¢$y>}Ւ1L^zhN&.rzi4ZoLi4* lֿ~Ll6Y|L`WeeYjLY|_.VɿƟSL6F/h,W8? FU_"f|řn_rIK>$euZnvKx{DvTi0PǬ iҴ0:p31Գ{{Nơ({r=cJFy7Y8+0BBYt\rH8Ǐ4ZP-mp- 1g2饸#/<n8 u2be͝@q`}zÙNNifb]BJ%B;1NWY$ k)7?Z>#^=3{xL_u\E`h}(-ve2值#j[H%2H`ϣ+ #7t7MYFŒޖC^^\X`އq6xu f:bQ \uŅQlj^FUAdWG{C&,`Is\xKk@ @kKX_ΏU Y(mTbre>sq=z=hi_y"g޲0D316;*jw8S]ԇKO7h9JWt瞷*竝{Y4?lHu6$$?ϱ눬rU~ $Ғ3_O 7XAo`xBD:/ye I7며³<' 2CuN> endobj 95 0 obj << /ProcSet[/PDF/Text/ImageC] /Font 97 0 R >> endobj 100 0 obj << /Filter[/FlateDecode] /Length 314 >> stream xmPR09&iEqtd A=DI3272p}"FC(k4R@5R  nӉ8Q2^QXoj$*gD渙7$x> endobj 99 0 obj << /ProcSet[/PDF/Text/ImageC] /Font 101 0 R >> endobj 104 0 obj << /Filter[/FlateDecode] /Length 660 >> stream xuTMs Wfj, cK;fzhz 25 (m}wYؓIJ{<>d<˒]OnQ&Eƫ*鶉U.*^I{W6]Z*} Y-oBiY܍ 2fpܝ@BFPY * eHZV^!}_J!-jfx4e}Pؙq9RZ#1^[BYING+4)E9o mبvk kmKjTZ4̌!bT2 ܁_#KGGgFHZ[~zLokg;S7v{*mʟ(x+hz >VvD$\ x+dtO# @ԽV~|x]yEsv+ښYnC10e7h|e f 3!/ؔHńf ƾ)Q^Q zUi cy*Ent<>}}í B~2V!9)zVxOd8r(8.G&zl;SCЛv[Pu8ZDnhp)~SA%C Ɨ*|<;x?ɫ7, Ό:|^z endstream endobj 105 0 obj << /F4 29 0 R /F3 22 0 R >> endobj 103 0 obj << /ProcSet[/PDF/Text/ImageC] /Font 105 0 R >> endobj 108 0 obj << /Filter[/FlateDecode] /Length 115 >> stream xS030PHWS N!n zf !i zf& z@Kfl\X1 5HHLOSB#$H\?5?dk endstream endobj 109 0 obj << /F3 22 0 R /F6 39 0 R >> endobj 107 0 obj << /ProcSet[/PDF/Text/ImageC] /Font 109 0 R >> endobj 112 0 obj << /Filter[/FlateDecode] /Length 1415 >> stream xڍWo6_IQvI"mZP4EXJUI~wmP##8CO_zy:ҳʆehr?1H WmCqߨ :°0zψwsbq5wwW+ڹ>9:qOc"C'n5+276-Ss i[T$IO<8jqbTybžbX%gV Q *Zm=s)$B|6@p)s-)m)f.X_"x} S}Ir=c5W\Մ?TK%\gޫ vA\3MjJՉXDb͓К{ܬ>[z5Tb} ASZU12J!쟛 Hok܏sSUO|ИpЦ@BVfݟ)k=4=~f 5:zPB3 &wCWyqc_ V> endobj 111 0 obj << /ProcSet[/PDF/Text/ImageC] /Font 113 0 R >> endobj 116 0 obj << /Filter[/FlateDecode] /Length 973 >> stream xڕMo@'~IUZG5Qm4!%G6V~4%< ~wa%$S.WyzFH),R ؗ?cL~_>T%}q=M'40J4]$[\WV'f]T DGsܶxfVĭ;ݻ*=EfEFApËH`xYyo~a&ۗ^rm}YP>ow0Ȫ j 6Q-zC"giWϊȁaجB]Q=l?LTbVA6fq1hHbΩn-A(;k `rbg23|=٬rYM_qO3_]mNMbW9MhTv8R1R"w-a&<%a2 nuAz'Fh d^|.c.o&S"deեi.3%-aV'mf~HlR Dd!ibڶ@Vú>& ouDJVF H  &?`KQFo2~kE ؍,zP濁o:요fo @ endstream endobj 117 0 obj << /F3 22 0 R /F6 39 0 R /F5 32 0 R >> endobj 115 0 obj << /ProcSet[/PDF/Text/ImageC] /Font 117 0 R >> endobj 120 0 obj << /Filter[/FlateDecode] /Length 1195 >> stream xڕVMs6 W53OwzpR''8rw:u؜*G7_@#۲I> csk]%78gKz< I\p!2EȾٰ)Y2!Nv$X2D`neRЁ@Ȯ5ƊrߔU䰧]Ewެ,%MiBYfOEBV]u_Ж6zo Wk ^ AxBwJ3h p,^sHq_AB endstream endobj 121 0 obj << /F6 39 0 R /F3 22 0 R /F5 32 0 R /F4 29 0 R /F8 63 0 R >> endobj 119 0 obj << /ProcSet[/PDF/Text/ImageC] /Font 121 0 R >> endobj 124 0 obj << /Filter[/FlateDecode] /Length 763 >> stream xڕTko0_J8R 6ETPT05$IJQ> S?ھ9fbԦ\.:‰j`#ߎ.ڕwh>:[G8úy>鶇'mt{8fq ۓÎnX9碰%9rC`uDeU,iL&;d%-(iRAYPj$D5LB U6Kx P7lQLt 0 ( tNo(JVJ38͇]z. F1> endobj 123 0 obj << /ProcSet[/PDF/Text/ImageC] /Font 125 0 R >> endobj 128 0 obj << /Filter[/FlateDecode] /Length 1019 >> stream x}VK6 Whr 5SіOM̶vuC-6kYtI*[A Es>G(,Ces^reE-ɣW6ND:sC0yUč`Juk"c4"ʀy'iaܒBƌxELQÛrrg-w*HKhd?`#3zՠ^[$  tfŽxGJ=LNwꜥ4M}O8ɲh+ZVG;i0 &i5,5\M@7QQBW\-DzǍ:%FZY7CӠj7QNH)Do749P 0laVK1hB~rbjh(^[+ ܜhsczK@^gU=Ajc jŜ9/×0[ѹ+Hy:v Fݴ> endobj 127 0 obj << /ProcSet[/PDF/Text/ImageC] /Font 129 0 R >> endobj 9 0 obj << /Type/FontDescriptor /CapHeight 850 /Ascent 850 /Descent -200 /FontBBox[-33 -250 945 749] /FontName/TPKZNX+CMR17 /ItalicAngle 0 /StemV 53 /FontFile 8 0 R /Flags 4 >> endobj 8 0 obj << /Filter[/FlateDecode] /Length1 714 /Length2 3959 /Length3 533 /Length 4505 >> stream xgXۚ@("+!4%@ ].%@$$*A@D:Hޫ4 W){9s>g7|ﳞux8JH=.K d *:0ILHãG8%IK JNQLBFLJF@Tpnx3«(h;,Dǎr4q@ qh[Q` C P(#R HbrBc¿48_m?GPxK.%'rIa1$(< u?on~ѵsm;۹1!yPxc.5EŦB=\> aJX' "W ~B"ggE2?Z vh,_ְ/ "B""KS:hĐ`Ej;2WPL "(*.C$UgE?@iBEDD$:x(,ϿїP^(`jFvu]f+mJ ?\c?7щǼ :[{{L19~lX8)&85'nBE%kMzmzּRk+yYb3VdðVaOib) ը,|t0tqRO_W%}}-Jۀ瓗sm/_}-yHEV~?/.<ę6̤\ؒ_<{UQ(R}yM%C!GkVEU$oGiXi>{eLQrbRK-m` h֍[duP}hMd+T}GUʖ6ɇ?EvF!xPQչwz3Ϻ̒³;ǶQ&S붯lsoL6\dHԂo"pOȎLh; ^ VH:b_#=Iu; К1 y-`=^DH#`^W5;ÌQdn߰ĮOR3{/Xy`IB)(DXʀQ aEqM38$Ρ0k9S- %Z6uxRÕ\*fk>^J/NMӳkgk:7bVFhԗs.r)&Çb6&lZ6fqL U|SfHmNڟz6+3_Mc(Qh(CY0:_-/Xt?"- Ky~LFo&׃77$zt#~ب T.R_y ńqMY1:L8.OlSPIBVf"z,sèn-df֭)cX#{,n\晳ږSӇ%%E 7uW͒h+3#@<]֡qɶ-~rCݣ6v46g(j4tmh]c}VR$7ݏ!GTsAܭٟaNeޓC=mE?e=րM j$<^LiUEh~%V{CdQyG: lKP\qG Q]:HVԉЍ&rvbk5` YmMs%ƙ% w=AݯɎY.?:, aio)4\Y7UJ< K+)`0og5(y *^(4\-n$wVfRv] :kM\dpdͣEdst:\DcXE0$%P71_"MHzGnޯdM}=φm.V/CirSْFknJ;p"_s$RҺ+A=%{Il+I@DfI?R=NHQ(J(RTDM; (Yr՞aqY3<q3+nϛOlbR p6Cq2::y`(_+2"F/."Gm[=)Mহx0koeav:{EZ駄X{wqsOVuYI%̠攟,<8o;5pG$[/IeH\Jl35n)YJ)cw6A>qPKEh yҊLa.m[Y`%,9JT{^85gw~'{b=Fs|F-FzZ3B&+CFVޓ,?͓}UFY8A ] H_(+cTv!#z,ڶgLȕm@P O|xrM- =)VjTW =b0dD(P/M"5Y(bLy1鄫l]@o6k4o![\NCӌ/X3A?*k>5n#"j+e[NsGf/{ T`]eet+rSx~LwQudi_γlXp\վ)lCM RбU!!|iaE\u=z<kZOKܺȴUrIF|nE4ߋEpT>ڬ"ƖBA s|-uaљv00Q !ᴰqptt]]F(Q+'L(@tY^@> hT|-P5%1a8uREрMP힟)9t,s*Yx旤f]KyOںH}|BX!o֪~«~DDU:e5*[84='>p rocJ0s˹g"qM46jņfqd^_JHq99ezy+q;`jNkk+wD nkmtM)7j ]wU߆P8>}8KtrHюs]Q1"' 0(;<jwcH endstream endobj 12 0 obj << /Type/FontDescriptor /CapHeight 850 /Ascent 850 /Descent -200 /FontBBox[-34 -251 988 750] /FontName/YJYFCY+CMR12 /ItalicAngle 0 /StemV 65 /FontFile 11 0 R /Flags 4 >> endobj 11 0 obj << /Filter[/FlateDecode] /Length1 714 /Length2 3699 /Length3 533 /Length 4244 >> stream xgXۚ)ҕ"҂h -ٔ{o@B dSH/hҥ#(RD^Ewi眹f3k{YϺ}2Z]K˂!@X1B0Ձ XU uʃHYh7(Rjy"ph #g!pG# DY Phk C"d`  '"Xf_LXWP/gs8Q"pX"te3Ý/w{煠N1fHJP)r3'pNVT2"1Z]xu_0kYk 2|.O5!b;[- Qp&l`ih"R:F-;SvHm筫K?V 7+§d~P+zd1F 3ss'\mr@kVTrn͗]#*IVLގK>Ns4c>e+픤*;w1~ܟ .}Ubį2eX[N Q1}rSoFGek`\{5iΖ"_4iIrpzVϤgأ9٠rxԖr5E]D銢-!pFxKϛ+Rd^vȆ臰r%۷5 r8MMo8 b)@`Ї)ـ>O&ػBi4Xɾ ͋\.=Oiŋ?JYwʹ03FxSNܬuf<-qU͌3}O%}` F+K3,KѪLc*'kK`6WLewR&udքe +'ސ?4SY‚2z-y8h!?-J6tsͯݒ,D E_ϔc/:aNBV0}8~0߯{`cPBgXIϥn%، 9tg]#Du7*k+I*&#~Ɣz5\&P-}C\Dă$ls'`7`!ﭾDĎ1N#LkJ1c/<\oP6wCpH5Y˟Ӳ;Bۢz0>6P Ō|3]Ni}PNғزBuq@{].whDdMj?I WWեoa\N GR\Mf\1ӁARsDje$z+%:rdS8o, U赮>!MLřR3 rvжI.!Ak1EV(;NC't5_j >y]U~(1yŜ9:uQi!8,3oTT7i+Hdsb %Qx ̷nڽL*g.B}_!MK.sKR)@dA)=%J:, mH;7SzCvZtPNL#^bC=Vͷhg@VtIkM2脊qﶂxT/vNVZJWH׬ʶC BE`c|%k6ZR44yBϡ\, iXc;IPM6zLDףNRrħ>?=f=MMnp-dzَJ$uG -Hm)xlӠ3bMnyB~h7g+nM:Gi1j%cA%o~sOArF) $\[Nǽ#^OyФpF-J뺎 vUcALVB e% /-IsŨ<$gSؑ+(ݰϼ3x,^Ìg;U[cO}q<’wn~Z>i˔X.igRЈ*B=-1%+LS}U+ۛ/9F ƟGƫ?Ū\~{by\P.]+7E߸q0`W߂ 7IU$:LwSgC41AQɽjoWCm C&]lcH2uh)O-ix:TFIGBB~Ϊm:ըB Zྣ61už܉)Ȏ)ܰs,C|.6)m" dd\9oӡxEnQ'K.z-OmYY>+f"V@Nshw5./LX _fֱȲ^7,\ R_B[ ]Z,[@q0|L_H6|Ed%9ҍpo,Zʞ~#ć37VBHd;vd0 ̞]T!5Ia(P"5wM!Icvo DCΟcPX6V w-buzY`&=t,2VG`eM|v wJthr` wɭsLfq7ƊZ#&z~/&{\lU> endobj 20 0 obj << /Filter[/FlateDecode] /Length1 720 /Length2 14596 /Length3 533 /Length 15154 >> stream xc.֮Ym۶mUOl۶mmXesλtwω332{^9挘J¦&f. uo[͸1Ovóǚi.%_ ͞ɤ; X!dǍL\X#"䎹vAx>^W-_BM&6E2t5!zrI@댘VOD W8,53#Dȡ'oT,ݷݎмsbam-nܺ4r|w1=w(w[ Nnl3CȁR1f"LTxsGuqp!p,^0ys\\uFnXvN„/X ICǠ'G$LトA9;?59j+Ui*юVt- Iɤ9=ͥuv!DXzxch $M,Hlj9I[;>Uzt|v ,Eyj+M#3 *ÏTc:uDxZ^ջ15p+Hvtm4/~j-ʀGfVhI8Ǘ`FhF9;mXm+.9~"-JzcLs@V¬MѹD=`@1|$6drlRvK>&0:wh"$s 3IV:apM[57NU\sLW]Z]qت.Udwfύna,]woX9^8NO=ds*O:6:,+Db+y*,y[.mUm@oZco/iota m U>|w IQW4GMow0D+@'`U)ftѭBh/"5Cb(N >MZt:0)ܐ97G+>nı+u RdvWje$afx( ,U@To p+H 9X  F7/[ӄ)bU)LO˾"LP k*:u*<p4_iN:1*ɑ@jujrn\ϲm{/KYfiM)!b o*ޓ>B):-E#+LοSy͑x1zQo ā\,SW~>e!$x=TÖ `rȮy/!ϊY<˦xlQ!ee)>01ֻY?4]&vt?8EŽ^B\%9oT_#vئ@4oR^3Np WF5R/x2,f="' gha[C5`zµK^JLSdz+\wWVYCЀB~Z?A2SS[x1)Z3U[=62BBn 7@0rB-s8}5]AG̴) yiUߣ!hoG3~g NqgM\=LgiFe}t oO<S1z @7auXu1" 18ȹ^e?NJqnY^¯/ElL:Le 'u 8Q A('$LЙS[(vX~V5 K/ڵ?Xa=%['bd-{wYRtƈ-qI<:ُJ^J!EMUxBЈS~="eZd@zc˶=-HXN1mϾ7z6I"5čI}l/]E>77[ R{Ero&TZ*R]M\.`!t#GcS Xt, ;f3 3mWsslBe[o'HPd`v U彏 |U+*#{(zx3*禩3VW49mS/Ч?쿘"Ɖ!5F/54|qpm!N`If/ ;a͝5{ ,=:T4;?q.ȏxo`mHkuە߶">S0$Xx;8rnqA,]l}.j9c:&x=v̏* U!XCK1hM).^7Eł1䈚I}엤Vy2[;K7WY_] *@8mB#e[\!zv#lYC,Ψ $E~e7G&*Qfq&/_hLt*[7{QFc#6F-^1ᤞmL)v64͐Xվ_(' |W)'Xz(Oj]$ÎAô:IcW[-Ŵ 2-bnSz'>4A`x?+yIcY;B Rk0μjMʨ yu k6μFK38U[FrU3gZhM\xPo6JYE:ܣo3ѻi.])S=U ;P9-ѿ>#X9 :ŅJ.Or_4^#v7yMN=I񗀞rcv EHM%Qqj&$kz[~ذif'7=vzxͫoJI@)F 8U+oBMAy.oF +ΐq]܍kqgb&Tg(b ErMj ua6J/%hN--hgMfr}%<5+DTR/uxoeAr^Z}Kmz}1/:K-o"Mfl1jb@Y ӖT: ]0n^R-0^.VB8S֧$6EuSvZpX̖ymj{m%Sy$C^WIRt15Q b:y5tÐlE5E ¿8?IUՍ|_rXT"R؊-la`[D h?ۭ 6U/:9Uj+}]pR]<f%vEɫE#ǫ w2F^NA`Q FjVI\Ub8ylM_/^UoܣJdԷd4x`bԹf&Dؕ;T ?Nlo{߮rYZ$&l $Mo(n)Լ5R(G+2Po{RTnQFl%R":8?WNrt'ߞ ƶ q柞;ৱ,Tx1w =ޥK.Y)1@@Z='E+?`"AT9`}ō]2YƑ |"9G?&=i'ش5P{j@44`(Xz0UKcՊUG#L{ŅE-Q[eoe%L3|0tT%;=' |ߜփ ITNJYYg2s ,OKa& l5 8vlގ-X\+HoP5WczQx,;B'{DVt!PU|@9i۩j&R[ lB ;]_Ҫ fjzP+;v-KwHkG N췕WN %#yljz-獥d PAe>S H*JD-`%~\r=YB7¨!nO7s)*JRiDn./ÈO( D7z(qȆ-Em=1W]9: p6֤=&wKk*sk*L4&j>݊[BJ&9EJQa cH'B>1u9VL,=G\A* }1 ;TؼJG©v(<tϠ͎†px"uM]~{|YgϯuGi7 ]TV! =G)An8'0նo= M Njg)hM]VRO%mdz[یO`C6ʊ %~q9-Aj ȳPDՋR<mkoʙM$k5%tD9RW7~D$`pJKJ|S_Քfg#)%r?t ]!(BF=ʨC.VXv|Nf?45ҏEsxagY6v9%̪%?EI]GIDICG=שOb>`TK,(|g9{TsX7>WC}/ chĂؠE8vf8kh)&_ ZxIq@t["c+1OWI/6@ac'ƫb+\3Dr~iW{[3KY* bcp6RwiEcLD4 )OvY?I֣4Um; [MvNƐH$(@_M3ҹM) AG+(c?t{\Ƣ}&yh,ȾX}G:c'gsdC&h Me biu<jcwe?ؾ׹M?w-$M <%i6.[q-dg0e#P5W7]P0hgcCg]FS^B0<#Tvݵq~th4OG;>X |X+ujlqh4Yr(o^[:mSK }&T8G_*5lǢ5 BwSK~nsiZr}Pٝ0e${>Nk΢~YA457Zvh||J IzU, Z/+o7ՍpliBs~" SD` /R+"J˼>J(Z-g-0 ],Ӈ,j:Go#UID$iL_O1*޺mef _!so !wİ0.VkLa}+v|h" ӋĎnmp+SD4L*O)x-Hu6r2ڤwa|S]\C7BWu;I4`S[^  3Y2wtbK>\hZ+K$[AG5x>g;?ў!ق|5P1}*<>A2x3 PE1_jټ'~K<+ LVpdV.,]IF¨&u- !nE|<+n+1f"kMl+,Z8hzDWUĞQ֒O^|kp6| %OC1 q3T*$,#s}X+/s'wpTh L{tipFx?N6J^%ױ NQ0bp|e!yFYN~L5wș.?1X̸yg_kZi ~^> ̯n􇠶w<|,c BY)_g,ƪ+q:Z]c8\>A4W_"̾-RHN.O]Q.iIɼvHA)4鬳]eV.&\7ͱS!qpH,Y( 1*W]M; W_c}2+0rqvEf0og"QUxtT8="5i,qi@&"$-hOȤ{X6qt0!i;kI cT 9+xS@0wz87}-4d3Y\@Le?T ?YdoA4'|ƩsOJ'fR@=aip]D1;p;xLdl<]kx/>2`Y#"k&di?S3A1n~ x #GfuLR& :m#,&c9} - HŲPy8u8C773׳QIs"5gGt_|82F=%^E.q^p͚No5UFڱɶD5N#A2D2(x;6 x?= WTݡ59v]6ʅ )knO=r?k3SBbh\˭xGz]rK"is6G .=RdXq:.]7K{x-b3ee~Ԋ}Xqd6.,aE<_eG\~79+ cD[!Ev/xZH;m!C~S cAd ȇìo=s͘]taJ^싙- ؏/<"sZ曃Z|ߩ~j I}eZ< paRG?9yc:/sQ^@ؐ[Gtݾ{X,Cwƿ’x@ٖGVް 24O}$R|M9sh5܀?P)mfb~47k̢ci-P*hЊ_DŃj0cgϺ 8bkIt±U[5%=YPGKx~"_ ߁]uN94efeDV3t]b]$JA> dNkޛH;(UU (C7Iq*)7=0W{0$Iۉ%B6{͍]=I}w]JdNid]j|ˌ2U`׋c|>c*VE"ƕlkk~Qɝ)Aty^";D}*y{w>w©čͼķ6{1Dt֌o"9t!@ p}?'R_=%HXU|[r;)!/?SH;929RNyT\bMj["/M柹XYkYy~_TAh EA-F+u Dڞ'f{@iet)jJ@HC`T7x׆Tr[6%Yi>2H̀ʹ kFAܺ|ZUur+XmhT5p@8ד\8Ğ#ѥ_TfwF̍ƅ*_ƺt|_ۻt' |,e8~^>Re7j53΄|NOցu4h}(HNV砸l>[lh>,uc54GԆOEH93z=03Hu, [vnZY ,M !w!0ŀ{֠Ʋ:<ъqgh |U*EH#UQgEU|AaєZݪP[B ߛ.K [Xwێ?tf+GɉV! %ba;jzu1"hTBB-tȺҡoh!.qi\hk;H܅@SK!5vhņNhAǻ;nԳeQ˅\%K[I3[%~dN|xcヴH$d/'I519Arg@Z6P@V[Li]۔U4YvBo2MOnkU"+];ӶoN1tAJYҰ,tZ3>PHߡ-'#'ER5 >DpDRWH*7@J jBOȔff;Vg,.z)hwʡv&Orɽ, J>cf?_Y rRu9[BBs} ysl} Cqix)je~A"F+?WBXW* (EGd3LV@/xؕ~H.&'701(dGI3/O( 5 .! ?If5X"x/:](HuQJ7eԠ8;r#hҕo`XiegUGZ9")Be܆XXizwv,+-˿Nrɬ -RP=s痤ŒHQ/U06A?am\o0S/~0ⷘTVS)qn2`Ptr_źHd/8`Fz;~_3 ksr7_*j-s#VCa=KE!{9 Ke9yKysj݆֫&ʼnA*Ff=t3љP#$V. > 6lc a @ q؇"˨=$DMa5P N{8Cu>O6β f}kw/L'Ajɍ!4|\‹5jܕX;#G(p1bW%\ċJqM rB' Z=fd0&B4"- 2"˻6QE^2_wt!oԤ-rY bŀB]d>)Q +nd0R̵Π$>p_H"b8yjUCՄĈ#XvG Bõ'c^,]mBj1d2\ťBet- 29q {=#e^tV=+&M&&e; DA}p>?.Og04rЯ72:.kO 5VBhƻl&[FtS)ZP$^-L$m+nH;qgo.i7_^+/mi[#s;V8^pU B?^4S.2?mojrG.6д [c&@b~G: U'ӘbmNFlFiT!41ZxPkBpӃ+gFϥXdG~ߘ=>D¿E7C#w =ls Lrf> (/7s>8U;wƾ- 7MKJ7I \}AGBD j~$KfMg8((E^Hc rm؆]rW1SND]9dc(ts ˲; c>ol}&ųjfu]GT| +Σ3 "݇`7Flpwi;Do3m/ Ћ\h'Te+n֘tނ[e;\β˲$L2-/z^7Y‡8S8rd >Og)AeZQ+\`\@td~Bw $ Y%7G! vS.`H.oA4"|_,WT_CݝK  fy+7SshYQuoMÑ`pTxQQTTDYڧ2H}?emPEWjYʸ;AGߋ`zyoƴ<u͋/XUhc_؊T۬'Z?*ҹ $ IבcqXLjEugg֊JpX OYف-_3j)ASRu6eؤE*v evLVQ&.Khp>j^wΓa*5-=C&t[tണä&EP͵T@z1O_ /G5G ))sH{-痶Ż5o1TM H60FAlu"^hYn17ǃC^WѰ +s NʆnJ]D_ky|jr*A/X3z;[HaBfnEtOHo T5\Z_gKƔsA6PB1sBdw`=^nCxi^ 4ZX!S۾r<19f&UsRЮUS%iOi q4tzGâ" 筧*-\DGS8o'$f[]r@&'G85yMKU=l艸PwF^n} S;0g=]cc,# ;#1a_Uf=O3":Uώ.:(Bh& XY֏1_=j_x⊪Ul,\*i!!B9-I^3;L8290)-?N| H7(dҩ-kӭO[i9s ~v]vm-X'_.0Ⱦ u ]`1m}\SƺG,bwUk~XD`xkoxX$Îz)`tLw NXiVŷi^6 ]8pX,gce[7kH%e'OB*AԘ hAH:?>IA1{ΥP;eCk0F1e2dhIMpgfq!i^JW]1V\ר߮](t"|džY,> endobj 27 0 obj << /Filter[/FlateDecode] /Length1 716 /Length2 9463 /Length3 533 /Length 10013 >> stream xUT]Ѳwqwww wnANsιsG^VUo֜\MY$`.Te!QSK:\Rf ;??;@ `BBH:8z9]tP@`=@dhh8 W/@|/. ;Ȃ `AV`{$@[:xpsϒ;//'=/= `DbUq C2n?9V7CC` r(;X]俵w5V_) dvZ, .Awl`UіWRf-WU l_3f8=l,ll2n@ @JBӇ`gr}_Z`'7Y33 "eeァLHLo~PtL-!us͌^"C`YmBlnWPOԢD{yV1XNt T2a7CM }a7-]{ Z^~ZT34Ew~PLd1Uǁ.3MFYI0sƐLҸ~~&C>3fZ#bP\7 2O)iE|o´Ch,%¾`ZT 5723ʲ>9tbQO!QcP NVi8E>s;6&h YOjm l=']Υ/Le(>J%)[nS}-NMߓPGe;DžY˙W]z,9TUL 8u,Dl',oKlDdu}Vzب?O6|""/uMy'*~e|qz{tg,: t dy kڻ$# LdX.߿'r6e`ށ" H$?H D%oo,bG]c;-c?4n> \hZ˄$`ו\oDIS1љ2ݸo] *&ӨiES] ΋ybx_a1]zkIK]kv%QIL¨WiE66+lXF$}Z4J&ѥߦD[?a= IEʨp;RfpҟVsܚ<3 +z'۠B9JVASHƕnjʹn25L>\2A{7X(y]53B+t<{ee<жn3|×.D u6F?m Z66&aPAH{<ʜ{R?Më:x ?)2%ul"&',-[YR2q)_,.+ʡ9NkzzQCx9PDB"^D7/y5C{؁Ѣ*|HRV0)4d"|Z]|Wc5a(fribʼn%$/C≙ ɔ!jàLƉvC](at]N!mTM!_:<_|e0΍+yŎۜU .(#`l^;#_9%rF@k۪_>|IW!즔վ[mGMS@w?ʀ-1\R}!tN+; o=wc`2- FemRb)Dr "i*dz!#K,rY=PIWhV߸]'?$rO 5ۋ ҇ux?<|MWf Ϥw9do)!,y*+x\kOM]ZG 7͌]74ֻC6Wt H)__Ľk8MDOܻ1'fl)39qHj@*\-k \dm pQm'`nNUh)"eI13V{&h8we.+EԢE8ݯڀ3 hlniQ~Uk&wp!:bNBɃށ 4,!Ə~?CDm ʯͨbtKn0& W1#e_;7 ǐK2rcPy"=#"#VzaPVY5_?FdSAW>f[|_+jBG~O A0L(4`^B:C*E/N d\Ul m5oJ^P&ʯ0>7JO=p$y"(Q~J)n 1{&јrɢODeHe&ǒU :e9 ;QeoaWG rxg2&]A6GPȁ,ъt![+ rWMbU3cPhvGG<_ɉm8zЌbԷJH E; ZH13|aYP9/'NOC ">p]Zhg^c YE^C*h `Bx Uůqs¸Dl, |(%y M 7AllA:TqAp -t -!i]nW֎2OC^<wJ8ƽ$p &.b 04KW@Yu?M͗gU5bƴ⛆ݗ߷KfNmDha*&ɻtaP]=mb '^dFMPh ̻ M6q7_sߐ:obۮˋ~cUʔqQmMZov<7jT~]=4Uϟj/+j}w!NDm/te_&[bٰ'C9R?iq:v 6C('G/'HJ c~ӤS`0Ϧ/k:ŵWU`_ Nأ9(Ww5 ɩCvq:9Z)<]u%PK1ֶ΀_9hx9ςF5I9(G:/%|raM>Luڹ0ir!rEz`ĸIAFF_2-q|BWwcE`yғ`!]cO$w>2gCHI-TwO )޽}9OJz A^>^n(xxsR89u4PM L$X֭Wz(dn.}Vԩa~&nIk\5DD8,a.F6%'mIy+ȦhZ//DYlcC櫍ץX &Y Ó4SA6JOնcaH|?PZ}p( k%.I:MGҜ-)p0n>r1EgxN|aIޔ{f(^;͎a>WzG?[(UD?=WMVCN,2aTli]g pg<Pcye_[iJb`3&&s 0C?9˸m-dO}myLbL B~˹'>]x ؛%356؀xQH{Uܔ-o:/D>A~`]%W,x،k`m+1r WE/^W)bV*EbѰt|.gJr6 Zw߯{`R@)an֭H5܈@9t+FtA.FFa`2; ?CKr&֜QƼ/ZMNROnX J? pYF ?¥J2#{sɶ}3kҔ@@[ܔwv{SmD=MU\@A-> 8`hr9ݟ\͍(W ur{ kFda/ݍ&4͌f3kN$y0x䭛Qp,D{Ɲj ˬ TCvcw#14t`DN{0}ShJ Ks-vF?\qN)-Nt;{uȳex2qДl_<¥);BtM={<8 ?:?V#ޭ`Kq5ڱ͒-83[ʄ_!N%FibWo[BG^ #1Č>0E)nI$33}gaͤ]9ÃxP۠= 2~ 2aÕ :yz ddJTGkxӸVu0<J@Q5)_7 7?nh%DshO]M}Vخh'>)͊>E5lE15d5xezƍ e5X#\Lօ&R f%uk ?M_Ja,#I-:Fq=JԄ IfRȵ)z^:OMi YoڠpzHŤ N~JA|} Nr *y &qyFtpƯ2F!ν@*򍲏gEVQsxl=΅FMR)/)#_Qap/9L|&4HHes Hne0?s BaW('K` [q!YڷDOVb M$pV]=n5b@D9|Yb.ðXQ^oKNjRq7I"W8"6ї(T4 _Od?IrO&W9X%~Cu~ ;*ŇzocK}[&pӊH{@vrD)rvJ)מAC6+Fi';a%be7`yZb{vڎaR [ndoV5eXϣ8W]yF`,1π,ݚL/kw0?9QM L!|LLTui򞑤ԍ9<[/_Pj ڴ[hge?gU"-"R,7o#̃rt(Z#.&wꢟobN>5.N[0c"Ԁnoݬy^×P'وbgGxY |;1Nj ;HB7P6hr__\9[쯍Xф}BǸ8rrŅoN{ʙz2vU$eXlwq]}F:Ւ+u方2$ewvv`U-'N>ߣry#X܉zTsn'C!X?IlNxz}V؆0qpVs~.KGzBb+jfxNҥ+3K1@"IUX@.H\%2NF3 ̊[3wP""ϘEkCLҳǴU21qk?xEi1r?e>J0g\~E -W,ʕPQFg_nSp ]F%(,s% e2)ӋۢOcg} 8fdFJ=q͒TuIEԝeFrô2ט2|"cD i/3bȶ.\Vh֦qB_Tt ,^= 9hPYzcv;XЦa..C  %Bs$b%D"Ocaz d N|[ T͗8x5x؏#ɛ!3-%5mqCdsԳG'+ͳFO3臨 0?@ij#Ӄ/k{:Pyf.BV2oAjgWs=BiVyc(9xZc1>JyVd~8ݼ|2sTs.jеO%pcPc}TS8-6 9i'UxdsLۆ[Y] Td+b&Dg?wxT*t3iIcٍdxLXa?BoH4XQ$m)MFďzu'G>.O'fّ.S`!PcJwG/nEKU^@"00Sx}rb cJ)CQ~0QYA$~~8ڝ26k5-7@L2#f" AaΑᗇk,^* *eij=M,RW@%6sӅ]=0҈]knfY7y|b|_D I|r܏-(bIq)DnW&%3Dp 0\H8RJCu@G[6:H]+jNaMy,|յbXf(|ݐM Z],=ud]\u+IW d~  ѓO'35"4ZDZA]SC$N”pjNcpNx]' 7b}vCx2'u{BOWUfb@jט27 *̭ IE~$./`lEe:#u9qZE>Y#V(YMDo2dܬnY qVF{~p@f@' }DH|M1sF3MB}GTpL* ImýR}K 8uQrvȱT`uz} o=HA\KNZ'Y1lBЄ;[Am J;V7y@T*C}qVM5£CV~;^:uy% qnKcza.Y"UEOHnieHO,/vܻ%jXxҦԏrߨj7 }CVwҼVi26 SdBwM{>();Us;3_Tu (滵xBLK+#CMUdiiG_>q%>cG T據cӁfa3"C/*6S )K  B:OQ>u:mSe)TdШ,22l,VEf n|iX6_$@jKRS n~0AՍ.Yy@~>خL@yA.1s,!GlGvsvQz79,I=8 D@混L hE"øw祭-ٛt⸤W0䣏>KW֓m?%,*AKz| t8tI'Bp`lt;w_΃-Ft:{n(^' R-o4X x x4,gϵԹ2aB[Ơ=vk%j Ef!-Ӝ _Y5mdk+a.>2rIPP +#{u ?UB*3բB&;QgXfZ -߄6٣l?:xJ>] /;^Sr /O`lay,,Pqɹ؍!,7׽s /Yc7,cLhTվAh'hlsa8#Žy$C[M`b ~sl>Šy~{Ԙ ~-N]89u}.v `j*ZV<%8dnHWCVt͗N-f 㒩y=>}uB [m{J3VLm˼,2~e0!=̕;50(KV ]#$b 藨OyrO tc9 0B@fήvfζHH endstream endobj 31 0 obj << /Type/FontDescriptor /CapHeight 850 /Ascent 850 /Descent -200 /FontBBox[-301 -250 1164 946] /FontName/GEJGRR+CMBX10 /ItalicAngle 0 /StemV 114 /FontFile 30 0 R /Flags 4 >> endobj 30 0 obj << /Filter[/FlateDecode] /Length1 721 /Length2 12150 /Length3 533 /Length 12708 >> stream xweTep ~pp;w $MpOpwwwwMYs5fMwjݻkPj[A`' ;+@RIB`g%ih$]Af[$`H.\@dd$d r0s(Al@I,` [ěwp7: dEFfgXZ@ k['dȒsxtwϒ.?2;9x,AVl@ wriwe3ӬV7sur(-ANK῵9Z;Y;lݤm@ yKk?|QWgDxg?z e ߺ}r[:Y4 fNf$$^,X8;Ej9ٺ@ Y wWW䟓3k@PS?_T̼҇Fi9/5o 4#Ѽpc5T>d& -w 'FS~䪽YzAQ6`L4kw%u=@"9^~G6P.$ޔXeHPnr\Y]zh #4>x4;@wǶo.}5O3)䶮'tXujWgӷ&INDo r7(0HG \?rjA=Ba򦠻CA_yR-).-;]lӲJ$XÞͳ+lQ$1YAL KTd&K5y/86&5S“qAd:Tl` K5Φh8imPaayohtBuBqFs?B@T~*-=fpe8ѺI_U9>~C#ׅKpaKgFl4eBJ &RmwGG^Vԍ|k'Mm ~>$矸SInYڶm7a "M4mc<٪=̓6e~~v=hyJ7sB 6%;OQ-%忂>їa夈)j?B9aSP6@$'YwGF祥GQՃ`+.T)œ|N d|2;lVZ\*p-9՟\" l\m]]Eñ6T{M`99:6p8AA?qg|0 Ê!z})6/rBcߡInff![$]?ha7N^le~1YB4- D&}"ëNYĺF*!H܇'esi0#nuෝM g;'?T* ֜ɼM.J4oНLy: 7xaNEeZu{Z7N;G3ZS u 󤽯+s @Bg &@9ϫss'ΝF29O3Ni 9hԋx{"f?{E@[7bTAysVPCLI{zy'(560lӽ԰6N(\'-@QR#p)>xyW׭#%.*M6]@7{3;Eށ?MgqfuSyh+߲Zrs-{\P0#ZxMP6OUuBz8nvdU\L=i&Icst6Yu,񕱪RH;U#;0UE:cL_Lއa˦r?M96xImwYélX0Pa]DY =\#/B;!lsGS sBNr?=aGY?J~ ܱKp !c Mr-[q+Xݠ&)RfcQ~aj /j&hXBX;쯧?٬ʆnwZ5baX)vVqё,3_BoCkr-5 ?6]?0糼6 z`CjN=Ww(_i#-uQ hD~g]:Lsl t^'fIz:e@?PxkvaQmS/< KY2m" l 0y+S$XPN7cZiۻ9AX\g+Ity>lɏ$#X"+' 6d4u} -/g Cae$P:!T@(k7Ut7Y偊sqgTg@R&( y.8`9E4V9TjsFDy}M.~ ? ?Qg V#>!fc*Q=rۨd6X!?l2%C e2z!k)^Q}v-F[%~KI6ETMt58.z"9g0mgt;JU(MCQZh<=vF Χbh]{!~63nЮ.ǂ2"fkV!p]P-;G7 bOTA9Ry+IIU 3\-xbk#v"ƴmMӼ)6:!VIyw}Y Ìis !`X?N%6~/?$c.!'kRZ} jf"u9=vuG=HO@8Yޯ5SFc):E|v4~,Z,?B 8&Oq=M`+/h|L)UPK0:Mi;LH.{U9nƐwIfVe,Gƹ'8]Y_,c Ι`4\$"{66`)nDY4lIKq;iZGFH3m^p'[H0bA34WM;:k'D> i(@~LE{\VO=e/zy;l % l6^tXQњR\Efޝsv"kc!],gi~yt)M76,M/Z1lUNyuM?NCz0Ĭ &1^i|;7zPa4/j8ʣ9Ա rӁ1)f;F 7KUnƤ煖g_ (Xzk.l\Wͬ<l>nxIqP:jL3i]8E;OfIpec iD;.J!1&w@&V6궖y,w-Tor?y3ev&VNjl6}e-z-%%P-(2ǡշ ^^]3lH+ 0ΥdƁf_Ȣ@&  7zʫDKV9'$7Dt>f4Cy+Ehxv?,pJ./uьrٰ{ScO`?xGsWyi[-,9J?@ xJ=gA=َVg/<㼽Ú0e[9soUOҙ7 z-  YRb~m,VXpz:B ы#D=ά4B?aV)~JjWrrgULH1,J>E+_F,YJ݆C /xP` bbYHG{gfKNq%& Kn6bC b[3M|*t~Zs"JLn6f&j"[7^/1j=k'8PiPVOdipD<˫ #uJJ7(7 2i =R@L%ᨶ#O5PFnR_JS";209.}J{3d2)kZn8F,N=;۞G8EJɻ-%tŘt(BejOQøԝpY8 W|E8g)<ܲh)aÙl5"?-M!-0RUGQHT)o wяA -^c県B^d j?Zgȫr}"8r7VfэK X_k1[,fP-b융iؙ'+ &Ꮩ?!:_O.0RBMOSvO5.Dz/}a''+pxIED30& 'H 7(k:A6Io1O\7y_RoI8~cȯ-P :dX ?tfЈdll&f%2Y->)J70iT޾V2* %?d% bbT,WEAt)8)-I _MzKU\O2@]*_F-A `ZOyw7'f5D73%WdȺuM2^n  1Wi>?)GW[bRaI/S)FcEB 'q } W>{:+\\1m.<[`] e6j=^IJ2nBt nrʞ{%޺fwfiy}1RqC w*8˳tB *ω+*7$wB f9܀gN}>||So3m{_#_{r6=^!?g;%I2~Ȗ%k7|㛩ﶉ(?o}lV*s#IU^caFtPXS q"w\\-jzs0∹ۗ:̤jA-@_Uܘ1h3sKI w36Q{,V0ӸhX"- Psv2wO(tX6GVWXk;_ImӞ 8es5t=x"ѳ< -jb&Sf|*I_ppkm3W||_N۽CVh[i3< (2lFDjGm4ΗaF4|cC7~1H6_4RAcvrj^Ja=ǂT:FlIFm,*+Kb.L# ^ƛt>Gie'U*$vPOs#7āJH^M,\ 5o?L7Sլ s7jwdph1Ҋ&2 knJ|2=ih7vZTG](D%~`&a$D u~ ;Ou&0ko 7X5<K!x l87wt-?םԢ)?`-9FV}&"կ%qǺB|+9ڍ][Niexu<ib5 NJ5A{¢L:z|vrǺMWGa\y_f&֪Ve Ky鼱qOuTBCOrstY4#0ۃ6Wǖĵh?JL7Ư0* kr kKg#BU=gC԰~$\hx G)T7dfֻ*V/+t!W {iil.}UiK2(;AinM%z 7i(rw8_z\Lb(|X k8?9'09%x58{*D_rQak}:vFlJ Af*;9$OUkJhadZuȋUPNJjE/Lt25|Bo5r&PƐ0X'F0+2US؜~Rp@ h~R%ݴJ9f$$a5t!sk1cyYAERtTS鉮$rY/% JSHskD/8U JUDצ#24UrUc&$(y`S/}b"Ւ<3Q9E-+Rn8 Ի—*PtLNWIP";fs? sO e_$f,/ I)Q->#^)?y7 WФ-Aj)J',tM7DYqE?Nbk}$ՔUn,JQ|ajs=rDZަɒeJzs˵)#=g|DžVs'=*1 *gS*uܪ=VeS9wnDz5n/9zjnht0QGA>iNj'(qhIjWUP&GLn(zGZ Z#732JEΗ`F8"nxMue?tum")#`$=s$.uݜ~]q A&j/80Y3tGj ˩d>*ΩÍX&L0GT}6\/Yjz=9kNSj,JH4|O}>=/daGe^G=l!q oν}bܞK M1!ې^oS"/}Ƅ7,\W+A\w"G?yY&gX5=f7 RfiAL+38Wi()Ə잺Bjm[BT[X#?_ ?XwA]x@/+Nu|F~tinZ+!DEE V!1{\#eŴ*]CxRSe=<ʉBـFڷ; c ؛ѧ`n!pڐ-KC\B2\6L,E o Š=pĺ{fpf!8 Ik;X( Є]Unt~ٷvw\re5fP,/5s-; fP\xj0 ks]܊==ShTfzy=iJkuEqmy4Q´N{EJNz;86 :)~9i`G-2_qʩ U(&P((r 'ZؔPXI?1 `򚎌4旑xBJU1tgc9m&v< ӈF^t6(qd.#JS}s"ʟ7P3,[UQ7yr^tD߇%7귚pr2dWFh.7ء5( ].'Cޔ~A2U-/&=@2ȍ13YP<ȏ_23k 2cΧd75<]?٩n .bUWԠ!1iaI/Hnp_/gÁ xfK3@ ]d0ăpԯXXBhv஗E!rG[(#65+-S*e^etޙ-YK}7RM}P+5ImΟ :nzU?>,KKBF0 oR,Kr0/0:+GkbӈBQC3ynPX# W(Ʋm=P';'u0GįB= 3: k$R7F@9uxBĮz5YrdYNGTT7 x_ӣrtDWQ'C8fjB*"ׯf};>p)7]")ҕ=c $|Ds03 ,3b=l<8fmussjΥeCpRQ֥.R/6|o]qݲ1eQ 2y4rLd$JLr,/( 0ˊy#1)]T_ȫPb+B=+Vھ++l$M'8WV:1}B $a~H# ĉQi͝Z_(^n htFÂQ7ynQbйbweIDW [5sIt%w2МO\ULbRG`/8bȖat ~NWYy֯r=ULFG()ڒܦ77t}7GK~f _rI?zV2|vQ!\ YIsCfA*LP_+`pуpPyYP;kUF~Mr TZnRU- ,Ub8?$H$C1aȪ:ŀII6'F9Kcz<8 M?Fwxe0eZfQB(, kw f$̑CZl%WҾd}̞5Q0FdI 0Ɏ;MT-"%#OrB"l_%xj*c‰2WL8"ͭUTaL) !zYNj&geLn^}Z6))[y"i9jea=cF]QKdu|ʃM;a<ѥ& YOiԺ#OYC1tHH&Zn/ں('r&]qL|w J-Ǝ=ĬWk`$] Ђ?& YöP+G|1@WmW)1.nx ˒ʟ.2kIzGcrbS` ]ПvA>iK]SOH*̻-[Cph#?"Ihz,T;O9&.@,NZo`y*i:t/{xs7fllǩw0HŊTEZ nN…'j kA?(5Y1P7A-C ?6[VjvZΡ'7zd\"W2Ctxs^uh\Psyw e,KQ?DX|#U9 [޵,)KNȓ 4-`kNgH6hh?ՍR}'4 g7X.Q̣BeJ&CA%Xc6w=&/;JZBge!4yNXQc/߮ϛ7aRt>nsN:ífG5rw>*4(&:N;W cJ؉R zsImfs_]d)5e1i$~i+X*ѥTTq^m pBfU9 endstream endobj 38 0 obj << /Type/FontDescriptor /CapHeight 850 /Ascent 850 /Descent -200 /FontBBox[-62 -250 1123 750] /FontName/ANIKOX+CMSL10 /ItalicAngle -9.46 /StemV 79 /FontFile 37 0 R /Flags 68 >> endobj 37 0 obj << /Filter[/FlateDecode] /Length1 722 /Length2 6271 /Length3 533 /Length 6828 >> stream xUT!@݃K  . 44-%8A .}gk9ܝqnj{j7hԵ8, 9(#VRprc00H@@-"D<<)kn^n 4fkm0K%`@@XZP [܃rphg&sYrb`,m-s-P+(@🲥[ .NJK(` RY {?@ǿP B-A0߭©,m]*RkC?e[g9[w-`tp 30=AUWgH0[w!7'77W[MbX@%fz! xxݨur)R-\`0flrY`|IehNviv9M<?$,,ȄZE՛Yj1k,OZsb7Q^RU28SwAk .I Ȫ'ulB)U݅Qܾ-[j3E o @ Y:+7,2'%֠k>22}A.㹴i[Ы޸o ,[Oyyä,Wld\Lg#[g !#]f>a4oNḏ^/*;rp;e wŲC*W4#jV@bƅ%VFKl7ώ|5ٜ[VKS *Ϸ`qc /D]{?zsPI=/bqeF^?&x^L~q^ N38JPM6bve`]NjWrmk&m|9mLH//+}q\t5)2~E2roWtR{C꺨ͧ6"@@%x6_p&.$Ͱ~<*g 8O]H;$\0DvO]yo(ȼKCDr:}J>~.{=!|b\`fuX)?¾xnlHQeS]J} "ڭֽ lFLc ~ ļ{ĒԺ`&9T.(s`VC_sq&yzX:0 W\YLI-qTAwhа@krZ Ӝ ު0j@vWI>bs`6oqaOIoUPӁ`"I.~&b1y}ɋ3Ӊ߈ $8ôqWy"[CWF`?]`yڍ 6Bh֜0A|{1 k- 5j Ԯ>R7~rQ`Q_~-xJp>ڷX /|W\^b8$#vtҔ6Yu?J^d |o+9s5E<>DblzFSs7s#1NυFŰEQ@S:'RQ5*3)QWhϥڇ'b9h* AtDߗE$aost>2$BKԀxh=+@2b#=״;CD皬%c| 56Jַ V 9TcƦ?|,03),څ7B T]=EuA;vkiG={KH8UɁ9rDO!}F:KO[U9 *3Pr*'qv!yi99D%YnS$nS/$x?AC4ƈכ>^nۇ$u&>^OY׻9RyΆE 跌TZ0)$3ittp)F`C==ZEFװN]v>R=Cv?H*~/z#>=WOyMm$̧*a9n3K!BY؜ ߨ󝾰}3s;+zW*eaƲ@u1?ep_vԷ]q]nd eyx/ݎ[s<04EySϓp2 U(,!ܱ9A/P[Zqjlk [ɇRw^/)nJtTdz*6,%Z54|m珪0~G=|&⥨)~ΉY] e)ò2@'60[Q+(~@*Erj]- Dy=lCN :I=ř0BJN^;|KNABtE9ckeOTwhtƒ#6 [FXB𯞾bPв5(iO6Op]ij"٘>Td3oq,y%_*oȃ6Bl%̙խ<@'$T4LN|<;hܷP$L*K9*ZOsHIҰe^qPi8P򾕘}ޘNs(cr$FGͽ"/t+2|L&40H ?sX2aJTqS{6n`CkB]]6 qV|Hnb~ZaJ\ݏ>")8!rO!ˊ#ed}G *3v^xgt܊.zh]1dH0%:#ScKNȪK&d뽗80wyY1ym,(]>@ V/킦gq&s]$՞8Et=~h4Fd.sM;/[ՑUWN 5 *Py-UZ+CȈo&1d봬}9pЏ0?/m\c. 匤0v.m /ުBOF,x9W`2@X69ٝ!vWɱbj;V3$Iq1x{ؗG<$֋gΣYz DžTh({rg""B?W:F3F#vjqQ?D俭/m!ynI+cSxv 8j$=!p&@vu"6)ҽi fG}^ﵼxc^Vo[cmyJ%J}X8C(>nePw /'fěBط-RH_2JZUea85 T[j݃u&1Sݜ:ɦ X0d@ITyÁRFN8~mVӢyQĬ \c}<| YٜkBf|Dspmï9 ٘= MR4Vt נtltnH똃!/䒈:Wbϧg@ղۙ`we[Ca/6+,>+A ƿ>gFm3;91 4;G.cŷ>ˆwY*띶޼+=u@z lj >'9VELwLZdRy'Df䦷l0~N$ P~©{4A3+Nַ66_YƮ:V=G v I0ĞJi۩) );ΑݥhoCF:g&U9 .2b̥7U>~JP2u#zTF*MHŖ+M`&"-|W{#J ٞG~V[P|9EEf&?т?Qӎ*4$c џrv鄑QL('eFeQkA$$O--J)2 FP#?'/T }~^.o;1V{۾P*F } {HNFK4A?9ARӄn z^LFH6e0˦ud+!Aޯ߸(cXFdY`2, FM߶>, I=bbaxm[ ^3F :=wr9n|]?Z4x Ϳ;dRd28 //=X$j0; &#3܈ a+OI{P5U$Zg DsR~[y_1lWs^Y"HZTiޚ[y;F͇6O;RU4f<}:{B)t` ފV|DK}\ߦ^is@j[큶 $2sʮ,`zl$&\pL{Uj=nP8+!w|2ݓtf諪]]۪R_ ')Ccr܃m0$;}\V꨾ym3C6^!djJTvXDzaxQ}H[?r4F2mdށN|~N2*PaDT?}mE`1;e %;R֒NRɽ- { _9bƚP9"$^&0&zsm?΢,}zj)|bI>S{7b{m@O#WeTWgl $|:{j.:U.Fّ=$wğSq*P@\[NM'6򩑃otHFo/yؔ$F +&{̦J^#oX9i^D5,2j(~8͏( Qe'b|YJ3شj*BNfh;% Uw7$ˁ/9eIFTAc*y(4jڵdV֦ӛ0J{  }xy/#f^ES&26Obܵ>HqMG6Ò0⎲6zw1z ;7%ql"&,18-Cls&&h~E_(\r-OX808 c`v endstream endobj 46 0 obj << /Type/FontDescriptor /CapHeight 850 /Ascent 850 /Descent -200 /FontBBox[-29 -960 1116 775] /FontName/KNHISL+CMSY10 /ItalicAngle -14.035 /StemV 85 /FontFile 45 0 R /Flags 68 >> endobj 45 0 obj << /Filter[/FlateDecode] /Length1 724 /Length2 594 /Length3 533 /Length 1104 >> stream xSU uLOJu+53Rp 44P03RUu.JM,sI,IR04Tp,MW04U002225RUp/,L(Qp2WpM-LNSM,HZRRZZTeh\ǥrg^Z9D8&UZT tН @WT*qmKdgaqn99~ !S U[PZZZ4<8Ԕ\tYϒĜdǼT]C=cSDf[fEjJ@fIrBZbNq*X<5/);D3Gـ̼ʂTr0SQfB!P!Xh%d+$$0]_QkdkiLjf 榵 C2 KS=]L , L.-*J+'aL`(V&s͞##5ˁJNaz&CIMXǞ;w\[Žg40њ3;nY($ǝg0eXWҞ1Jԗ]aKuz]XU- ݣ%6 t6,`N|+Kgdq;)yAWpq3z]K&j؟u~x?˰ *wO٭\vwv%|3:YY}|v߿Xd?/ya^:-w^fys[Ӟ|g;} [ף~m7 {?hr=<ɩ qKݮ<:w}Լ8wÛK3?'lqf<|mlekϙߖ(mK|E*d4*9壦lM{]$k&/3xO(X X2p5b E*e\E4=wp⹣*ٱ gC~Qw^[Nfd iXZb)v*8x^b!I|^TZᬐ? (\ sRJs˥{* endstream endobj 62 0 obj << /Type/FontDescriptor /CapHeight 850 /Ascent 850 /Descent -200 /FontBBox[-4 -235 731 800] /FontName/GHNYOJ+CMTT10 /ItalicAngle 0 /StemV 69 /FontFile 61 0 R /Flags 4 >> endobj 61 0 obj << /Filter[/FlateDecode] /Length1 719 /Length2 12771 /Length3 533 /Length 13326 >> stream xSt.۶mvƶm6g۶9c'ַ}^{ߜvN;UuQc^UyȉTM%\yjjLf&&XrrQ9 pxX`aN^@kK+W(Ta{s@Sc; lgP#.ss,,33`bni/,i Gܜ{nt @oRj?fv^3s XF31?%eP8;f@jN]M,Lղv47Sv56w0O7 5U2vpUrfZ{t ?jfUWc3clT"">lzVv'+3;X;KؙXY5u\][X)l<&a5UGydP0:FqGƾof-/;j}T }pT¢߅FDr_ 8!g,\8#Jlƀ`Zc/⋖kO&vE2 U!ĥzSLi1u͜PO9gLuq8xb7PtW2Xn騙 dIK P("}/5+9ry*A+eq# c6tS֠tA /宪y"}(._~fGvd|~wzb#<iebPæ%[uMsvy)˸2ZgLɢFeV7QQ5N݁֗ Qm[ٻa: gѵ7Q S\;|$#afH2{ǀ?Q'.vWÞg>fL鯊68 w z^:*&v:ok<8倝+ڎNg ̒&]QR4Sl '* ^c6?"!Q٣+ TV8]s?g~\-˸ hf"9JS~ֽ4 |X~0&LF_m3(ьZޭeo1O[7>w61{z%^B_wM:c,PQ[@.Ue Bc`^]fN>fHtl؆ ʸ dW5#:ݓkJ d5$ySOݓ'KJ6C"RQwE 8̗[i৪]Kpn>pYH%njW9rOnnk =%{/\Iҷ!ctTvKT۶4Yֶ& %)9z$젞2@hfPN6vnbn&&>/Ռ,[lЅٹ5+^d49&4>xz+5zQL1\l#$!_,RձnaRr07o}{Y>AR.Pbxv< h2 v:Ӝ}T5`8LM6’fPs5d~ɚ4pi{ ) Ă}bW|>^$87a >C?DBUki+aq?c>0Q1aཛྷ3yތ(nNkPx場 {'S6H+2cY{4L9q"/W!8\k0q%F+7l)K`g". g!J:9ZO<A 3nuOd.♌OJ0Iy,@`s)f/ڇ:h>ݕo=Kn {g}%\kj u]bwdLC؜KT@A~HjKP-: Ed[D? |ۜv0MuHmN/ڬ'>Г ^歉5WǚmN⾛TlkQY}wَE[ ϋkk 拼"xo"vYQﶓW=T( Kj%"mzq[J8 0ff+XtЭ5&&w,т]4yimƟ& EtZ_k1~CzZB #:hF@M5俕`:YŞ%N'0OKgP0{CKBW>fűnVcJNΈ+~&ˮEU|!+/exĸ}HS]*|XosU;SQw<DŽ4Mϛw6:Մѓ_b+G_Y:V, c9 ůRw'rB\TPܖާf]S3@)# K@~/lE;G p7cJ9瞮:Aۍ.r17T):~E´hVRݧ-Bn0W9w(V 4*4ye{cc UEWlՒ9RH,[.',KFF H[-rj.ULh!5Z|u 0$P@~k5=x.]ݵ S") d?ygHN ȷ=N> (*{<" 'K~hZ`ӌ#-HlR aF?To??Ol'5YYIqEa7iR;/,ǍOv]vA]&knְ:"B*bœ<02 ;F(S+' #^Uth ɡ[ĴD *s5Fe.9s^$̨=f;pG (=ZTQo@TSSǿl"+_ d6VO+"Ã~.7JC>VFS}"f Ol=p99evLN^jbg~^/s>q*>$ Gӳ؃MV^6wnjhZΆ|iH<Lڍ΄66ݔdpRNQmUbO#BPօ*V~"UQHKxNr/*;ϨW0H%6ʛwYfI;̌«WLa$-6jCjNY`M-6@fza= SqB5> 9-Hǻ*k9 X()Gù+ZM ]Ϧp2*ԄP+ʚY Rvq\«HRm~Ȉu;J%(auLZ4Qs2 :nat4L?U(1HsOeu; ewPr5%VmWmH"vRɣ3uUv{e nF@5Av u1Ʋhp{7Bz!sXȌŘMV|ўd CoK nER?XVcr=?ό&,"` 9߃X;%.Z䖎 ?~PQC'ӱZ:X T}cy(4<Qa93VD{ 蟑nPnY+mYj)qG%_3;?{.@]MaIoK63I u`_;HL7訇£Q9*/`$E|쬋O9##A {Gg3LAb\78rvqU̠2̋["1-ؖ/U,uf<<$;Q'ZHk&cD+hXr9Ax 4~@]S3Zl8Oe'Fܶ6S7{ta3Xjz3>MYic[Q'_.^N\4o p]"N!1mG)3ʰ5B"GH$3 2SN@Hr6Ǭ%z"Ɵ`y Jhl5;^pi35]`Vt`ͮmgӵ >#,J\L&s :IPD*^ HQ{v21mjc,V~_}YӜ߮ dx9N3]Ul\o?s "b }#zvE|pB&.48;lFgԋ li'JW0wAg^?&]B cǠx)8e2oЅT\_Pnn`e^Ɏ1ÔuCjQf'~S"7xduLG)(%"܍ kg~9g<1B>Kguo+LutRl` b:m"D-_~iSdK\pfeFg]AS*34Ze$]hvv?|Y(=L ~.uk{(e"}YM$qƙO DIWnڍdvV6V>;[UJV{F޸zsCia"Jח/4g '@c+~n* 2p{/- A2қ6ϵTSY@GkYjޒ331U#Sa)&c=HzDf 8 +xjxQU|~]MJ Ɇ_6 k*ݕ!'QbTPWSZ<ͲVU@Ic|]Kɘ9qƅ/H$ɨ($SEY؜6mFnmLp \W6te0'/X/=%>s.ǚOگ${* 6-bP%(Z>6*_+lZm!YP~k$uai)ո י~YyV1\}9imTk뺎SB#0s3rWOIrL-5enW~k+V-x=^g0M ''X10&~jlUE(nM1pb9/Xwi;H[#j?!ZR둆ylXTDYaz-=٤c,_UE?E q#AScxq(R]'Ucd[Ѓkϧ|Ñ)D6' <焼עpBY ~0ݨhl~jCy1pQg/̃b|MR.e*q6Ncg8qbw@;P>C X=HQ@(i'tCmY3D_ߣYpWϓN*|v NT>,;\ZσϚNO0}\SfC$T8yw^^8g,FyX 60nGըflJ5lTaf#<1AgS~XTp-Y !1hط75r&l>AVE|ЊZRu'3Kl,< /]b~o,M_01'F uRmq3ovVyD;:?kǙsmtH!/+@ト羐 w z,l ȷ)Ch3s|-x_߫hњx%*Cm9| _x H#>tҨƽ~%Vex ¶'n.v0^\ ڒ1V~o/[i/ }3.dÓ95R4 X=]Od[RW# _> q5}mUfw 7>1?+~u-FP+BX&8=C@5f c/>}cަ@T 0 AR@f f5ePl&ӆɹb;56_}Rm(û8YFt>)zWQJK55,iŁ=owAt`Ѽʩ!+[[x48$q24b5Ş;:# ~I&d~N'sD%ٵgڠg;^U: ty2%t?fpU3YԴK H/z@ݝ] jsCY=LͲdlAgt#v91%E6&&;Wi)Ô00iqrd uT#6h}h o1:mrwM<.-;p7PþxQN7C@$3t"΃&/|;H0 U0˱s&O!ULò;"+NS 4#$*_2[vtvWJR5S٠:'8: 5 Gk@[bMs!ݱ(CYC OˊЕDx|zoc'wٽ>"W e-| uYW P4ZJxᮎ` _LZ~)W91hxU?K_fӤ*S{%.{M&D?&mS{Pe)֢snrȭ (Tk* 57'j+CAkjr'"!p/%;VZ@ 5x,IcRL ԥfB= wM*qn%Q*X&:OVDfv"hT|e2$B;9Ym uV2?Va][ gTR-adW i?αz4M.bPZtY p)kJɭ^tƑ5|5z@>enصW=;@ *&15*Iլȼgi3*v'U+Ȗk:"OG{@Tl+ݷ$MvfCG0ԭ~P:~.*PiGJ+C\+~8m};"9ᙫUzAAIÕO5vzst5d~[% Pj{<6)H*cMfƍ-8nܥi~Xsku&xy^:uy޼saK$V9}eS3Vn/h$]֜P}{0ع?`Զf$[Y-j?L_3V(<)rbN pviq:R:nk>.ILq6Rb%S HE{Rڑ*<eUSv i-|@_9'@)8 !P%IaΪrߝXC.c1G~H ۢPTV& 1>j<#S{5lB yFv2=ȲOe<#IYٸEseqF? P:AYŎӍf!2;!QQm>CПX !VX=O%?Fr XgOY=k dө׵P?b=2@wHTFl:H=ȇ=/v e ͌|Dߑ_7JHcrm.L&+Ir1BĬb]%75&CQgm gԼJuN(ҿmɖ(ngSnF@@%[v)uTl9zMgW+-#2њ@Tq4~Y֟ ]+ !f]桯[T4YOܑ^MK o_9Do4 NS*\K,Gd:1:2?ihII6uJ's uY}_"R5 CzuQ2P[&5= mt4_5&J8vEn0XgK#Ϗ ~ۢW_0ZAR#tSpF0bx_)(8zLdNoCИT흏4/9b${b&C1| \5wYtpYU<zH AeY%Yptq*4NdŮ'oNaԗװcP/E)&,sg]yz}/ٵMpl 7؋4!c#v\{dmԺIQj"g 1cK,%- T:GJ}4 Yf$(7sMPYqQ9Y;bo?0<+:ZQi iL}> cjReƢ {0k!m |7p<ߠ##_7ek`ؑNDOV 0tːsy>p6ͪD٧^T1ծ[XhQ.;UeyBcgK#3A%r:xóLԀL:!7ps4oL\T 0 7$R<: +v M@O7wn8/E$RuQ/"RMD/lTswTwy _mV>5hqb x |5H>q،FqYNBm;Z5/KL2Rs ;XyWsw y=뙃̘;цgD2㯠fe[|D̜}zǁB. fCufFP]soE{ ;HFJ\l }ȁ<)\9#!.Z".3*ue-OC?>%<, ,~pX ':MR؇jKvG Xi]=v?gg]w7R | ؙ'ڞAPMMbR0ȗptxj+j\q@Ǿ[|)ܬ j!l,  kfu~"XxizcC*Oc';&9E6̐*Dead_folx$xK.dbP#9N'cҘWj4v vMÙ)GZIEܟݤV9Sl!e^uu]:nD7?k8?CJx;,UXQB'4PE3r4TB^69&srֺ *^æ%YQ^Oj*hL^T؟}#FISXzt\>HβK3="Hl]F5t{z&A{ #8dxA#,_LVVWN.۲$apF xcaŔ;~%6 \-ruu.\!SiPk/;[?͋B#iim."~(l ?N/$ ray0037:maa/Y endstream endobj 82 0 obj << /Type/FontDescriptor /CapHeight 850 /Ascent 850 /Descent -200 /FontBBox[-32 -250 1048 750] /FontName/TZHOIT+CMMI10 /ItalicAngle -14.04 /StemV 72 /FontFile 81 0 R /Flags 68 >> endobj 81 0 obj << /Filter[/FlateDecode] /Length1 727 /Length2 1243 /Length3 533 /Length 1784 >> stream xiXSWǁI%Fb 4 `񰃘@  [ E Cr MLn0)ʢmIYd)C*" hUZQBAl:.8:_>s}ﱵ g|Q BPLeߐk gk+(,B(TOOw$W@3\ntĩ8!o\tBE@MW" dfl$q8*a 9b!"@+ewH"rRGA*C8P,.P1HTB{Xa)C1v~ Μ0׿΅*7BMNIV BjE#<F"|oT>>"H.nFy%?CŃᶠd AxX;$C<Zj1O!M<>$&*aa RR^~wqA\l?'ϲ[n0>:fDR;4 a즟 ~ѧG~BolS=Z]} b$hkox&[ZV`ѹVݽV??efO^lWbk!Sp v| ?gVSCWXz Ԇ3i-;UgUfEר>%DwOZԔl媫lϹ^gk# Buî^]GfAwv,1I ^4GmH#h5@ߧC6pZT%3ѝ7NowMs6q&wڒ;̛obSFw7A?A4x)AӶ譍 WvE)>՞d\ynf Uq7s9gҿļV{l7WsxM)myOX A0qVjv Iovrx\r]vV_ fh/U0:?bc3\19*%ʔH.t$?72j:ut~YK6qd=i_$xoڦCs$tʉ_dhMX0@),+2 ,_bZ=S|9c.*}Ih4cҌf4?s(g5Կ^g-p4~xvcK|&}eخC4ߙ[[䤪"߿.޿#w"hbu]lL HK!Oc.(GuM;FZ>}Wq*r̼ Tv z{x<[^3ghNʼn[K1E[uG1-8{C?LjNbE;ÅKf'A#CqWݴ*dCgוgj|pSW\I2 t endstream endobj 1 0 obj << /Creator( TeX output 2004.09.02:1733) /Producer(dvipdfm 0.13.2c, Copyright \251 1998, by Mark A. Wicks) /CreationDate(D:20040902173338+00'00') >> endobj 5 0 obj << /Type/Page /Resources 6 0 R /Contents[14 0 R 4 0 R 15 0 R 16 0 R] /Parent 130 0 R >> endobj 18 0 obj << /Type/Page /Resources 19 0 R /Contents[14 0 R 4 0 R 23 0 R 16 0 R] /Parent 130 0 R >> endobj 25 0 obj << /Type/Page /Resources 26 0 R /Contents[14 0 R 4 0 R 33 0 R 16 0 R] /Parent 130 0 R >> endobj 35 0 obj << /Type/Page /Resources 36 0 R /Contents[14 0 R 4 0 R 40 0 R 16 0 R] /Parent 131 0 R >> endobj 42 0 obj << /Type/Page /Resources 43 0 R /Contents[14 0 R 4 0 R 48 0 R 16 0 R] /Parent 131 0 R >> endobj 131 0 obj << /Type/Pages /Count 2 /Kids[35 0 R 42 0 R] /Parent 130 0 R >> endobj 130 0 obj << /Type/Pages /Count 5 /Kids[5 0 R 18 0 R 25 0 R 131 0 R] /Parent 3 0 R >> endobj 50 0 obj << /Type/Page /Resources 51 0 R /Contents[14 0 R 4 0 R 52 0 R 16 0 R] /Parent 132 0 R >> endobj 54 0 obj << /Type/Page /Resources 55 0 R /Contents[14 0 R 4 0 R 56 0 R 16 0 R] /Parent 133 0 R >> endobj 58 0 obj << /Type/Page /Resources 59 0 R /Contents[14 0 R 4 0 R 64 0 R 16 0 R] /Parent 133 0 R >> endobj 133 0 obj << /Type/Pages /Count 2 /Kids[54 0 R 58 0 R] /Parent 132 0 R >> endobj 66 0 obj << /Type/Page /Resources 67 0 R /Contents[14 0 R 4 0 R 68 0 R 16 0 R] /Parent 132 0 R >> endobj 70 0 obj << /Type/Page /Resources 71 0 R /Contents[14 0 R 4 0 R 72 0 R 16 0 R] /Parent 134 0 R >> endobj 74 0 obj << /Type/Page /Resources 75 0 R /Contents[14 0 R 4 0 R 76 0 R 16 0 R] /Parent 134 0 R >> endobj 134 0 obj << /Type/Pages /Count 2 /Kids[70 0 R 74 0 R] /Parent 132 0 R >> endobj 132 0 obj << /Type/Pages /Count 6 /Kids[50 0 R 133 0 R 66 0 R 134 0 R] /Parent 3 0 R >> endobj 78 0 obj << /Type/Page /Resources 79 0 R /Contents[14 0 R 4 0 R 84 0 R 16 0 R] /Parent 135 0 R >> endobj 86 0 obj << /Type/Page /Resources 87 0 R /Contents[14 0 R 4 0 R 88 0 R 16 0 R] /Parent 136 0 R >> endobj 90 0 obj << /Type/Page /Resources 91 0 R /Contents[14 0 R 4 0 R 92 0 R 16 0 R] /Parent 136 0 R >> endobj 136 0 obj << /Type/Pages /Count 2 /Kids[86 0 R 90 0 R] /Parent 135 0 R >> endobj 94 0 obj << /Type/Page /Resources 95 0 R /Contents[14 0 R 4 0 R 96 0 R 16 0 R] /Parent 135 0 R >> endobj 98 0 obj << /Type/Page /Resources 99 0 R /Contents[14 0 R 4 0 R 100 0 R 16 0 R] /Parent 137 0 R >> endobj 102 0 obj << /Type/Page /Resources 103 0 R /Contents[14 0 R 4 0 R 104 0 R 16 0 R] /Parent 137 0 R >> endobj 137 0 obj << /Type/Pages /Count 2 /Kids[98 0 R 102 0 R] /Parent 135 0 R >> endobj 135 0 obj << /Type/Pages /Count 6 /Kids[78 0 R 136 0 R 94 0 R 137 0 R] /Parent 3 0 R >> endobj 106 0 obj << /Type/Page /Resources 107 0 R /Contents[14 0 R 4 0 R 108 0 R 16 0 R] /Parent 138 0 R >> endobj 110 0 obj << /Type/Page /Resources 111 0 R /Contents[14 0 R 4 0 R 112 0 R 16 0 R] /Parent 139 0 R >> endobj 114 0 obj << /Type/Page /Resources 115 0 R /Contents[14 0 R 4 0 R 116 0 R 16 0 R] /Parent 139 0 R >> endobj 139 0 obj << /Type/Pages /Count 2 /Kids[110 0 R 114 0 R] /Parent 138 0 R >> endobj 118 0 obj << /Type/Page /Resources 119 0 R /Contents[14 0 R 4 0 R 120 0 R 16 0 R] /Parent 138 0 R >> endobj 122 0 obj << /Type/Page /Resources 123 0 R /Contents[14 0 R 4 0 R 124 0 R 16 0 R] /Parent 140 0 R >> endobj 126 0 obj << /Type/Page /Resources 127 0 R /Contents[14 0 R 4 0 R 128 0 R 16 0 R] /Parent 140 0 R >> endobj 140 0 obj << /Type/Pages /Count 2 /Kids[122 0 R 126 0 R] /Parent 138 0 R >> endobj 138 0 obj << /Type/Pages /Count 6 /Kids[106 0 R 139 0 R 118 0 R 140 0 R] /Parent 3 0 R >> endobj 3 0 obj << /Type/Pages /Count 23 /Kids[130 0 R 132 0 R 135 0 R 138 0 R] /MediaBox[0 0 595 842] >> endobj 14 0 obj << /Length 1 >> stream endstream endobj 16 0 obj << /Length 1 >> stream endstream endobj 4 0 obj << /Length 33 >> stream 1.00028 0 0 1.00028 72 769.82 cm endstream endobj 141 0 obj << >> endobj 142 0 obj null endobj 143 0 obj << >> endobj 2 0 obj << /Type/Catalog /Pages 3 0 R /Outlines 141 0 R /Threads 142 0 R /Names 143 0 R >> endobj xref 0 144 0000000000 65535 f 0000108909 00000 n 0000112815 00000 n 0000112460 00000 n 0000112665 00000 n 0000109073 00000 n 0000003126 00000 n 0000000009 00000 n 0000036691 00000 n 0000036507 00000 n 0000000913 00000 n 0000041495 00000 n 0000041309 00000 n 0000001906 00000 n 0000112565 00000 n 0000002823 00000 n 0000112615 00000 n 0000003082 00000 n 0000109176 00000 n 0000004268 00000 n 0000046041 00000 n 0000045853 00000 n 0000003187 00000 n 0000004104 00000 n 0000004235 00000 n 0000109281 00000 n 0000007294 00000 n 0000061500 00000 n 0000061311 00000 n 0000004330 00000 n 0000071818 00000 n 0000071628 00000 n 0000005276 00000 n 0000006212 00000 n 0000007239 00000 n 0000109386 00000 n 0000008668 00000 n 0000084835 00000 n 0000084642 00000 n 0000007356 00000 n 0000008276 00000 n 0000008613 00000 n 0000109491 00000 n 0000012913 00000 n 0000008730 00000 n 0000091972 00000 n 0000091777 00000 n 0000010346 00000 n 0000011297 00000 n 0000012858 00000 n 0000109770 00000 n 0000014177 00000 n 0000012975 00000 n 0000014111 00000 n 0000109875 00000 n 0000015505 00000 n 0000014239 00000 n 0000015450 00000 n 0000109980 00000 n 0000017754 00000 n 0000015567 00000 n 0000093375 00000 n 0000093189 00000 n 0000016544 00000 n 0000017288 00000 n 0000017688 00000 n 0000110166 00000 n 0000018859 00000 n 0000017816 00000 n 0000018804 00000 n 0000110271 00000 n 0000019183 00000 n 0000018921 00000 n 0000019139 00000 n 0000110376 00000 n 0000020430 00000 n 0000019245 00000 n 0000020375 00000 n 0000110657 00000 n 0000024117 00000 n 0000020492 00000 n 0000107011 00000 n 0000106817 00000 n 0000021446 00000 n 0000022392 00000 n 0000024029 00000 n 0000110762 00000 n 0000025577 00000 n 0000024179 00000 n 0000025511 00000 n 0000110867 00000 n 0000027085 00000 n 0000025639 00000 n 0000027019 00000 n 0000111053 00000 n 0000028404 00000 n 0000027147 00000 n 0000028338 00000 n 0000111158 00000 n 0000028910 00000 n 0000028466 00000 n 0000028854 00000 n 0000111264 00000 n 0000029752 00000 n 0000028973 00000 n 0000029707 00000 n 0000111549 00000 n 0000030050 00000 n 0000029816 00000 n 0000030005 00000 n 0000111657 00000 n 0000031682 00000 n 0000030114 00000 n 0000031604 00000 n 0000111765 00000 n 0000032849 00000 n 0000031746 00000 n 0000032793 00000 n 0000111956 00000 n 0000034261 00000 n 0000032913 00000 n 0000034183 00000 n 0000112064 00000 n 0000035229 00000 n 0000034325 00000 n 0000035162 00000 n 0000112172 00000 n 0000036443 00000 n 0000035293 00000 n 0000036387 00000 n 0000109677 00000 n 0000109596 00000 n 0000110562 00000 n 0000110085 00000 n 0000110481 00000 n 0000111454 00000 n 0000110972 00000 n 0000111372 00000 n 0000112363 00000 n 0000111873 00000 n 0000112280 00000 n 0000112747 00000 n 0000112770 00000 n 0000112792 00000 n trailer << /Size 144 /Root 2 0 R /Info 1 0 R >> startxref 112913 %%EOF libbiblio-citation-parser-perl-1.10+dfsg.orig/docs/ascii/0000755000175000017500000000000010115646330022613 5ustar gregoagregoalibbiblio-citation-parser-perl-1.10+dfsg.orig/docs/ascii/citeparser.txt0000644000175000017500000005024410115645540025524 0ustar gregoagregoa============================================================================== Biblio::Citation::Parser 1.10 Documentation ============================================================================== Contents: - Introduction - Required Software - How to Install Biblio::Citation::Parser - Reference Parsing - ParaCite Web Service - Troubleshooting - How-To Guides - Problems, Questions and Feedback ============================================================================== Introduction ============================================================================== What is ParaTools? ParaTools, short for ParaCite Toolkit, is a collection of Perl modules for reference parsing that is designed to be easily expanded and yet simple to use. The parsing modules make up the core of the package, but there are also useful modules to assist with OpenURL creation and the extraction of references from documents. The toolkit is released under the GNU Public License, so can be used freely as long as the source code is provided (see the COPYING file in the root directory of the distribution for more information). The toolkit came about as a result of the ParaCite resource, a reference search engine located at http://paracite.eprints.org, which uses a template-based reference parser to extract metadata from provided references and then provides search results based on this metadata. The ParaCite parser is provided directly as the Biblio::Citation::Parser::Standard module, with a separate Templates module that can be replaced as new reference templates are located. As well as providing examples for the provided parsing modules, ParaTools also includes examples for using the ParaCite web service. This is an alternate interface which provides access to ParaCite's search and parsing functionality for any language that supports the Web Services Description Language (WSDL). Who should use ParaTools? The ParaTools package has many applications, including: * Converting reference lists into valid OpenURLs * Converting existing metadata into valid OpenURLs * Collecting metadata from references to carry out internal searches * Extracting reference lists from documents * Carrying out searches using ParaCite The modularity of ParaTools means that it is very easy to add new techniques (and we would be very pleased to hear of new ones!). What will it run on? ParaTools should work on any platform that supports Perl 5.6.0 or higher, although testing was primarily carried out using Red Hat Linux 7.3 with Perl 5.6. Where possible platform-agnostic modules have been used for file functionality, so temporary files should be placed in the correct place for the operating system. Memory requirements for ParaTools are minimal, although the template parser and document parser will require more memory as the number of templates and sizes of documents increase. This Documentation This documentation is written in perl POD format and converted into Postscript (which is 2 pages to a sheet for printing), ASCII, PDF, and HTML. The latest version of this documentation can be obtained from http://paracite.eprints.org/files/docs/ ============================================================================== Required Software ============================================================================== What software does Biblio::Citation::Parser need? Perl Modules URI URI is required for the OpenURL encoding functions in Biblio::Citation::Parser::Utils. Text::Unidecode Used by Biblio::Citation::Parser::Citebase to allow for matching on unicode strings. URI::OpenURL (Optional) If you wish to create valid OpenURLs, URI::OpenURL provides a set of functions for this purpose. The metadata produced by Biblio::Citation::Parser can be used with this module. SOAP::Lite (Optional) This module is required if you wish to use the ParaCite web services, but optional otherwise. This requires several other modules, which are available in the soap subdirectory of http://paracite.eprints.org/files/perlmods/. There are also some dependencies for the above modules, including MIME::Base64, HTML::TagSet, and Digest::MD5. The latest versions of these can be obtained from http://www.cpan.org/ Installing Perl Modules This describes the way to install a simple perl module, some require a bit more effort. We will use the non-existent FOO module as an example. Unpack the archive: % tar xfvz FOO-5.2.34.tar.gz Enter the directory this creates: % cd FOO-5.2.34 Run the following commands: % perl ./Build.PL % ./Build % ./Build test % ./Build install ============================================================================== How to Install Biblio::Citation::Parser ============================================================================== Installation First unpack the Biblio::Citation::Parser archive: % tar xfvz .tar.gz Move into the unpacked folder, and then do the following: % perl Build.PL % ./Build You can optionally run % ./Build test which will carry out a few checks to ensure everything is working correctly. Finally, become root and do: % ./Build install This will install the modules and man pages into the correct locations. Examples The examples directory contains two categories of examples - parsing examples and web service examples. Note that the web service examples require the SOAP::Lite module (see Required Software for more information). To try out these samples after installation, simply cd into the directory and execute the example. More information about the examples is in the README file inside the examples directory. ============================================================================== Reference Parsing ============================================================================== Parsing References Biblio::Citation::Parser is designed for parsing citations, and this can be done very simply: use Biblio::Citation::Parser::Standard; my $parser = new Biblio::Citation::Parser::Standard(); my $metadata = $parser->parse("Jewell, M (2002) Parsing Examples"); The $metadata variable is a hash containing the information extracted from the reference. If you'd prefer to use another parser, simply substitute the 'Standard' for the appropriate module. Biblio::Citation::Parser is distributed with the Jiao module, which is a slightly modified version of a module created by Zhuoan Jiao. To use this instead of the Standard module, you would do the following: use Biblio::Citation::Parser::Jiao; my $parser = new Biblio::Citation::Parser::Jiao(); my $metadata = $parser->parse("Jewell, M (2002) Parsing Examples"); The Standard module provides slightly richer metadata than the Jiao module, but it does rely on templates (see Biblio::Citation::Parser::Templates) so requires updating as new citation formats are found. Creating an OpenURL Once you have the metadata from the reference, it is easy to create an OpenURL from it: use Biblio::Citation::Parser::Standard; use Biblio::Citation::Parser::Utils; my $parser = new Biblio::Citation::Parser::Standard(); my $metadata = $parser->parse("Jewell, M (2002) Parsing Examples"); my $openurl = create_openurl($metadata); The OpenURLs created by Biblio::Citation::Parser do not have a Base URL prefixed, so this should be carried out before they are used (the ParaCite base URL is http://paracite.eprints.org/cgi-bin/openurl.cgi). If you would like to try to extract more information from the metadata, you can use the "decompose_openurl" function: my ($enriched_metadata, @errors) = decompose_openurl($metadata); This tries to extract information from SICIs, page ranges, etc, and also checks the fields for validity (the @errors array contains any mistakes). Note that the create_openurl has been superceded by URI::OpenURL, but the metadata returned by "trim_openurl" is in the correct format to be passed to this module. Metadata Structure Biblio::Citation::Parser supports all of the fields specified in Table 1 of the OpenURL specification (http://www.sfxit.com/openurl/openurl.html). Specific parsers can add their own fields, but these are not exported when OpenURLs are created. Biblio::Citation::Parser::Standard provides the following extra fields: marked A marked-up version of the reference. e.g. Jewell, M (2002) A title. match The template matched by Biblio::Citation::Parser::Standard ref The original reference ============================================================================== ParaCite Web Service ============================================================================== The ParaCite Web Service The Biblio::Citation::Parser package includes several examples that demonstrate the ParaCite web service, as well as the WSDL definition file. This section explains the web service, and gives an introduction to using it. As ParaCite is written entirely in Perl, there are obvious issues if you wish to use Java, PHP, or another language. The ParaCite web services provides an interface into the reference parsing features of ParaCite, while remaining language agnostic. Using the Web Service from Perl To access the web service from Perl requires the SOAP::Lite module (see Required Software). Once this is present, this is all that is required to connect to the web service: my $service = SOAP::Lite -> service("http://paracite.eprints.org/paracite.wsdl"); Three functions are now available from the $service variable: doOpenURLConstruct($reference, $baseurl) This returns an OpenURL, prefixed by the base URL if one is provided. doReferenceParse($reference, $baseurl) This returns a hash containing the metadata in the reference, and an OpenURL formed using the metadata and the base URL. doParaciteSearch($reference, $baseurl) This returns an hash containing 'resultElements' (an array of search results), and 'metadata' (a hash of metadata). Web Service Examples The following code parses a reference, and stores the metadata in $metadata and the OpenURL in $openurl: use SOAP::Lite; my $service = SOAP::Lite -> service("http://paracite.eprints.org/paracite.wsdl"); my $base_url = "http://paracite.eprints.org/cgi-bin/openurl.cgi?"; my $result = $service -> doReferenceParse("Jewell, M (2002) Example", $base_url); my $metadata = $result->{metadata}; my $openurl = $result->{openURL}; If you do not want the metadata, and just want a link to an OpenURL resolver, the following will do that: use SOAP::Lite; my $service = SOAP::Lite -> service("http://paracite.eprints.org/paracite.wsdl"); my $base_url = "http://paracite.eprints.org/cgi-bin/openurl.cgi?"; my $open_url = $service -> doOpenURLConstruct("Jewell, M (2002) Example", $base_url); Finally, this example uses the doParaciteSearch method to get the first match on a reference: use SOAP::Lite; my $service = SOAP::Lite -> service("http://paracite.eprints.org/paracite.wsdl"); my $base_url = "http://paracite.eprints.org/cgi-bin/openurl.cgi?"; my $query = "Harnad, Stevan (1995) The PostGutenberg Galaxy."; my $result = $service -> doParaciteSearch($query, $base_url); my $first_result = $result->{resultElements}->[0]; print "First result is: ".$first_result->{URL}."\n"; The web service automatically adds Google, Scirus, and Vivissimo as resources to the search request, so if no resources match the publication or subject these will be used as fall-backs. Web Service Structures Most of the Paracite structures have been modelled very closely on the Google web service structures to allow some degree of standardisation. Some additions have been made, and some fields are not yet used, but these may change in future versions. ParaciteSearchResult resultElements This is an array of resources, along with the search URLs associated with them. See the ResultElement description later in this section. estimatedTotalResultsCount This returns the number of items in the resultElements array. estimateIsExact This currently always returns 1. searchQuery This contains the original reference. openURL This contains the OpenURL represented by the reference metadata (prefixed by base URL if one is supplied). metadata This is a Metadata object (see later in this section). ResultElement URL This is a URL that searches the current resource for the reference. template This contains the template of the matching resource interface that was used to generate the search URL. name The name of the resource (e.g. Google). description Some more information about the resource. tollfree A boolean value that is true if the results can be viewed without cost. fulltext A boolean value that is true if a resulting article from this resource will have the full text available. stratum An integer representing the stratum in which this resource lies. A complete list of the strata is available at http://paracite.eprints.org/cgi-bin/views/viewstrata.cgi Metadata All of the fields in Metadata are valid fields in OpenURL metadata. See Table 1 at http://www.sfxit.com/openurl/openurl.html for a complete list. ============================================================================== Troubleshooting ============================================================================== Troubleshooting If you cannot find a solution to your problem here, make sure you are using the latest version of the toolkit and ask on the ParaTools mailing list (see http://paracite.eprints.org/developers/). Reference Parsing Reference does not parse correctly If you are using the Standard parsing module, make sure that a template for the reference exists in the package. See the HOWTO for more information on how to do this. If you are using a contributed module, please email your query to the author of the module. ============================================================================== How-To Guides ============================================================================== HOW TO: Modify Templates in Biblio::Citation::Parser::Standard Adding new templates to the Standard parser is relatively easy: * Locate where your Templates.pm file has been installed. On Linux systems this should just involve doing 'locate Templates.pm', otherwise 'find / -name Templates.pm' should work. Alternatively, you can edit the Templates.pm in the Biblio/Citation/Parser/ directory of an unpacked distribution, and install it once you have finished. * Add the template to the list. If you are editing an already installed Templates.pm file you will probably have to be root to do this. If you are editing the Templates.pm inside an unpacked distribution, you will have to reinstall the modules once you are finished (see the Installation section). The Templates.pm file should contain a structure similar to this: $Biblio::Citation::Parser::Templates::templates = [ '_AUTHORS_, _PUBLICATION_, _YEAR_, _ISSUE_, _SPAGE_-_EPAGE_', ... ]; Each template is a string containing a set of placeholders. For example, '_AUTHORS_ (_YEAR_) _TITLE_' can match 'Jewell, M (2002) Title'. The following are valid field names: _ANY_ Matches anything. _AUFIRST_ Matches the first name of an author. _AULAST_ Matches the last name of an author. _AUTHORS_ Matches a list of authors. _CAPPUBLICATION_ Matches a capitalised publication title (e.g. "Journal of Lemurs"). _CAPTITLE_ Matches a capitalised title. _CHAPTER_ Matches a chapter number. _DATE_ Matches a date in nn/nn/nn form. _EDITOR_ Matches an editor's name. _EPAGE_ Matches the last page in a page range. _ISBN_ Matches an ISBN number. _ISSN_ Matches an ISSN number. _ISSUE_ Matches an issue number. _PAGES_ Matches a page range in nn-nn form. _PUBLICATION_ Matches a publication name. _PUBLISHER_ Matches a publisher name. _PUBLOC_ Matches the location of a publisher. _SPAGE_ Matches the start page. _SUBTITLE_ Matches a subtitle. _TITLE_ Matches an article title. _UCPUBLICATION_ Matches a publication in entirely upper-case (e.g. JOURNAL OF LEMURS). _UCTITLE_ Matches a title in entirely upper-case. _URL_ Matches a URL. _VOLUME_ Matches a volume. _YEAR_ Matches a year (4 digits). HOW TO: Integrate ParaTools with EPrints 2 EPrints already contains ParaCite support, but using a specially built version of the module before it was part of ParaTools. To alter your cgi/paracite script to use ParaTools, you need to do the following: First replace use Citation::Parser::Simple; with use Biblio::Citation::Parser::Standard; Next, replace this line: my $parser = new Citation::Parser::Simple(); with this line: my $parser = new Biblio::Citation::Parser::Standard(); This should work fine, although you can obviously integrate ParaCite more if you wish. HOW TO: Create a New Parser Creating a Citation Parser All new citation parsers should be named Biblio::Citation::Parser::SomeName, where SomeName is replaced with a unique name (ideally the author's surname). The parser should extend the Biblio::Citation::Parser module like so: package Biblio::Citation::Parser::SomeName; require Exporter; @ISA = ("Exporter", "Biblio::Citation::Parser"); our @EXPORT_OK = ( 'new', 'parse' ); You should then override the 'new' and 'parse' methods: e.g. sub new { my($class) = @_; my $self = {}; return bless($self, $class); } sub parse { my($self, $ref) = @_; my $hashout = $self->extract_metadata($ref); return $hashout; } This makes it easy for users to swap out one reference parser for another. ============================================================================== Problems, Questions and Feedback ============================================================================== Bug Report Policy There is currently no online bug tracking system. Known bugs are listed in the BUGLIST file in the distribution and a list will be kept on the http://paracite.eprints.org/developers/ site. If you identify a bug or "issue" (issues are not bugs, but are things which could be clearer or better), and it's not already listed on the site, please let us know at paracite@ecs.soton.ac.uk - include all the information you can: what version of Biblio::Citation::Parser (see VERSION if you're not sure), what operating system etc. Where to go with Questions and Suggestions There is a mailing list for ParaTools (encompassing Biblio::Citation::Parser) which may be the right place to ask general questions and start discussions on broad design issues. To subscribe send an email to majordomo@ecs.soton.ac.uk containing the text subscribe paratools libbiblio-citation-parser-perl-1.10+dfsg.orig/COPYING0000644000175000017500000004313110115165675021640 0ustar gregoagregoa GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. libbiblio-citation-parser-perl-1.10+dfsg.orig/TODO0000644000175000017500000000053010115351613021256 0ustar gregoagregoaTODO ==== This is a fairly informal list of things I'd like to add: - Check over documentation - Model a reference as an object (ParaTools::Reference). This would be returned by the parsers, and perhaps have methods like 'toOpenURL', etc. This would allow for changes in metadata in future, too. - Check over foreign character support. libbiblio-citation-parser-perl-1.10+dfsg.orig/lib/0000755000175000017500000000000010115646330021341 5ustar gregoagregoalibbiblio-citation-parser-perl-1.10+dfsg.orig/lib/Biblio/0000755000175000017500000000000010115646330022541 5ustar gregoagregoalibbiblio-citation-parser-perl-1.10+dfsg.orig/lib/Biblio/Citation/0000755000175000017500000000000010115646330024313 5ustar gregoagregoalibbiblio-citation-parser-perl-1.10+dfsg.orig/lib/Biblio/Citation/Parser/0000755000175000017500000000000010115646330025547 5ustar gregoagregoalibbiblio-citation-parser-perl-1.10+dfsg.orig/lib/Biblio/Citation/Parser/Utils.pm0000644000175000017500000002317310115644631027215 0ustar gregoagregoapackage Biblio::Citation::Parser::Utils; ###################################################################### # # Biblio::Citation::Parser::Utils; # ###################################################################### # # This file is part of ParaCite Tools (http://paracite.eprints.org/developers/) # # Copyright (c) 2004 University of Southampton, UK. SO17 1BJ. # # ParaTools is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # ParaTools is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with ParaTools; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # ###################################################################### use strict; use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; @ISA = qw(Exporter); @EXPORT = qw(&trim_openurl &decompose_openurl &create_openurl); my @validtags = ("sid", "id", "genre", "aulast", "aufirst", "auinit", "auinitm", "coden", "issn", "eissn", "isbn", "title", "stitle", "atitle", "volume", "part", "issue", "spage", "epage", "pages", "artnum", "sici", "bici", "ssn", "quarter", "date", "pid", "url", "subject", "year", "month", "day"); =pod =head1 NAME B - OpenURL utility functions =head1 DESCRIPTION This module contains methods for the parsing of reference metadata into OpenURLs. Although we have aimed to make it 1.0 compliant, there may well be errors (please let us know if there are!). =head1 METHODS =over 4 =item $openurl_hash = Biblio::Citation::Parser::Utils::trim_openurl($openurl) This method takes a hash of metadata, and returns a hash that contains only valid OpenURL fields. =cut sub trim_openurl { my($openurl) = @_; my $outdata = {}; foreach(@validtags) { $outdata->{$_} = $openurl->{$_}; } return $outdata; } =pod =item $openurl_hash = Biblio::Citation::Parser::Utils::decompose_openurl($openurl) This method aims to enrich an OpenURL metadata hash by applying various parsing techniques to the fields. It decomposes dates into years, months, and days if possible, fills in the appropriate fields if SICIs are present, and ensures URLs, ISBNs, etc, are valid. It returns a pointer to a hash containing the modified metadata, and an array of errors (if any). =cut sub decompose_openurl { my($openurl) = @_; my @errors = (); foreach(@validtags) { if (!$openurl->{$_}) { $openurl->{$_} = undef; } } # Do a little rehashing and validation # Split up 'date' if present if ($openurl->{date}) { if ($openurl->{date} =~ /^(\d{4})-(\d{2})-(\d{2})$/) { $openurl->{year} = $1; $openurl->{month} = $2; $openurl->{day} = $3; } elsif ($openurl->{date} =~ /^(\d{4})-(\d{2})$/) { $openurl->{year} = $1; $openurl->{month} = $2; } elsif ($openurl->{date} =~ /^(\d{4})$/) { $openurl->{year} = $1; } else { push @errors, "Invalid date: ".$openurl->{date}; } } # Parse SICI and merge with hash if ($openurl->{sici}) { my %sici = parse_sici($openurl->{sici}); foreach(("issn", "year", "month", "day")) { if (!$openurl->{$_} && $sici{$_}) { $openurl->{$_} = $sici{$_}; } } if ($sici{locn} && !$openurl->{spage}) { $openurl->{spage} = $sici{locn}; } } # # Check genre if ($openurl->{genre}) { if ($openurl->{genre} ne "journal" && $openurl->{genre} ne "book" && $openurl->{genre} ne "conference" && $openurl->{genre} ne "article" && $openurl->{genre} ne "preprint" && $openurl->{genre} ne "proceeding" && $openurl->{genre} ne "bookitem") { push @errors, "Invalid genre: ".$openurl->{genre}; delete $openurl->{genre}; } } # Validate issn if ($openurl->{issn}) { $openurl->{issn} =~ s/-//g; if ($openurl->{issn} =~ /^(\d{4})(\d{4})$/) { $openurl->{issn} = "$1-$2"; } if ($openurl->{issn} !~ /^\d{4}-\d{4}$/) { push @errors, "Invalid ISSN: ".$openurl->{issn}; delete $openurl->{issn}; } } # Validate eissn if ($openurl->{eissn}) { if ($openurl->{eissn} !~ //) { push @errors, "Invalid electronic ISSN: ".$openurl->{eissn}; delete $openurl->{eissn}; } } # Validate coden if ($openurl->{coden}) { if ($openurl->{coden} !~ //) { push @errors, "Invalid CODEN: ".$openurl->{coden}; delete $openurl->{coden}; } } # Validate ISBN if ($openurl->{isbn}) { $openurl->{isbn} =~ s/-//g; if ($openurl->{isbn} !~ /([\dX]{8})$/) { push @errors, "Invalid ISBN: ".$openurl->{isbn}; delete $openurl->{isbn}; } else { # More complex ISBN check based on Oshiro Naoki's code my @isbn = split('', $openurl->{isbn}); my @tmp = (); foreach my $n (@isbn) { $n = 10 if ($n eq "X"); push @tmp, $n; } if (!isbn_check(@tmp)) { push @errors, "Invalid ISBN: ".$openurl->{isbn}; } } } # Validate BICI if ($openurl->{bici}) { if ($openurl->{bici} !~ //) { push @errors, "Invalid BICI: ".$openurl->{bici}; delete $openurl->{bici}; } } # Split up 'pages' if present if ($openurl->{pages}) { if ($openurl->{pages} =~ /^(\d+)-(\d+)$/) { $openurl->{spage} = $1; $openurl->{epage} = $2; } else { push @errors, "Invalid page range: ".$openurl->{pages} } } if ($openurl->{ssn} && $openurl->{ssn} !~ /^(winter|spring|summer|fall)$/) { push @errors, "Invalid season: ".$openurl->{ssn}; delete $openurl->{ssn}; } if ($openurl->{quarter} && $openurl->{quarter} !~ /^[1234]$/) { push @errors, "Invalid quarter: ".$openurl->{quarter}; delete $openurl->{quarter}; } if ($openurl->{url} && $openurl->{url} !~ /^(ht|f)tp/) { $openurl->{url} = "http://".$openurl->{url}; } return ($openurl, @errors); } =pod =item $openurl = Biblio::Citation::Parser::create_openurl($metadata) This method creates and returns an OpenURL from a metadata hash. No base URLs are prepended to this, so this should be done before using it as a link. URI::OpenURL should be used to generate OpenURLs in place of this function. =cut sub create_openurl { my($data) = @_; if ($data->{captitle}) { $data->{atitle} = $data->{captitle}; } if ($data->{uctitle}) { $data->{atitle} = $data->{uctitle}; } ($data,undef) = decompose_openurl($data); my $openurl = "sid=paracite&"; my(@openurl_keys) = ("sici", "artnum", "spage", "stitle", "part", "date", "aufirst", "pid", "aulast", "auinitm", "volume", "quarter", "issue", "title", "pages", "ssn", "auinit", "sid", "genre", "eissn", "atitle", "id", "isbn", "bici", "issn", "epage", "coden", "url", "subject", "year", "month", "day"); my %data_hash = %$data; foreach my $key (@openurl_keys) { if ($data_hash{$key}) { if (ref $data_hash{$key} eq "ARRAY") { foreach my $el (@{$data_hash{$key}}) { $el =~ s/[ ]+/ /g; $openurl .= "$key=".Biblio::Citation::Parser::Utils::url_escape($el)."&"; } } else { $data_hash{$key} =~ s/[ ]+/ /g; $openurl .= "$key=".Biblio::Citation::Parser::Utils::url_escape($data_hash{$key})."&"; } } } chop $openurl; return $openurl; } =pod =item $valid_isbn = Biblio::Citation::Parser::Utils::isbn_check(@isbn_chars) This is a simple function that takes an array of ISBN characters, and returns true if it is a valid ISBN. =cut sub isbn_check { my(@isbn)=@_; my $i; for ($i=0; $i<$#isbn; $i++) { $isbn[$i+1]+=$isbn[$i]; } for ($i=0; $i<$#isbn; $i++) { $isbn[$i+1]+=$isbn[$i]; } return (($isbn[$#isbn]%11)==0); } =pod =item $sici_hash = Biblio::Citation::Parser::Utils::parse_sici($sici) This function takes a SICI string, and returns a hash of information parsed from it, including date information, issn numbers, etc. =cut sub parse_sici { my($sici) = @_; my %out = (); ($out{item}, $out{contrib}, $out{control}) = ($sici =~ /^(.*)<(.*)>(.*)$/); ($out{issn}, $out{chron}, $out{enum}) = ($out{item} =~ /^(\d{4}-\d{4})\((.+)\)(.+)/); ($out{site}, $out{title}, $out{locn}) = (split ":", $out{contrib}); ($out{csi}, $out{dpi}, $out{mfi}, $out{version}, $out{check}) = ($out{control} =~ /^(.+)\.(.+)\.(.+);(.+)-(.+)$/); ($out{year}, $out{month}, $out{day}, $out{seryear}, $out{seryear}, $out{sermonth}, $out{serday}) = ($out{chron} =~ /^(\d{4})?(\d{2})?(\d{2})?(\/(\d{4})?(\d{2})?(\d{2})?)?/); $out{enum} = [split ":", $out{enum}]; return %out; } =pod =item $bici_hash = Biblio::Citation::Parser::Utils::parse_bici($bici) This is not yet implemented, but will eventually be the BICI alternative for parse_sici. =cut sub parse_bici { my($bici) = @_; my %out = (); return %out; } =pod =item $escaped_url = ParaTools::Utils::url_escape($string) Simple function to convert a string into an encoded URL (i.e. spaces to %20, etc). Takes the unencoded URL as a parameter, and returns the encoded version. =cut sub url_escape { my( $url ) = @_; $url =~ s//%3E/g; $url =~ s/#/%23/g; $url =~ s/;/%3B/g; $url =~ s/&/%26/g; my $uri = URI->new( $url ); my $out = $uri->as_string; return $out; } 1; __END__ =pod =back =head1 AUTHOR Mike Jewell =cut libbiblio-citation-parser-perl-1.10+dfsg.orig/lib/Biblio/Citation/Parser/Jiao/0000755000175000017500000000000010115646330026431 5ustar gregoagregoalibbiblio-citation-parser-perl-1.10+dfsg.orig/lib/Biblio/Citation/Parser/Jiao/Utility.pm0000644000175000017500000002377610115644704030454 0ustar gregoagregoapackage Biblio::Citation::Parser::Jiao::Utility; ###################################################################### # # ParaTools::Citation::Parser::Jiao::Utility; # ###################################################################### # # This file is part of ParaCite Tools # Based on Zhuoan Jiao's (zj@ecs.soton.ac.uk) citation parser (available # at http://arabica.ecs.soton.ac.uk/code/doc/ReadMe.html) # # The code is relatively unchanged, except to bring into compliance # with the ParaCite metadata style, and to allow interoperability with # the other parsers. # # Copyright (c) 2002 University of Southampton, UK. SO17 1BJ. # # ParaTools is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # ParaTools is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with ParaTools; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # ###################################################################### use strict; use vars qw($VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; @ISA = qw(Exporter); @EXPORT = qw(&normalisation &normalise_html &normalise_name &normalise_date &normalise_journal &num_of_figures); $VERSION = '0.01'; # # Normalisation utilities # sub normalisation { my($Text) = @_; # replace embedded '\n' with ' ' $Text =~ s/^\s+//s; $Text =~ s/\s+$//s; $Text =~ s/\s+/ /g; # Use single space # while ($Text =~ /.+?\n.+?/g) { # $Text =~ s/(.+?)\n(.+?)/$1 $2/ # }; $Text =~ s/``(.*?)''/"$1"/sg; # Replace ``A Paper Title'' with "A Paper Title" $Text =~ s/\s*-\s*/-/g; # remove space around '-' $Text =~ s/\s*'\s*/'/g; # remove space around ' $Text =~ s/\s*:\s*/:/g; # remove space around : $Text =~ s/\(\s+/\(/g; # ( 1998) ==> (1998) $Text =~ s/\s+\)/\)/g; # (1998 ) ==> (1998) # while ($Text =~/--/g) {$Text =~ s/--/-/}; # use single '-'. $Text =~ s/--+/-/g; $Text =~ s/~//g; # remove '~' (e.g. C.~B.~Hanna) $Text =~ s/[,;\s]+$//; # remove last ',;\s' on a line # 'Nr.' caused error in 'find_jnl_name', i.e. it became as # 'journal name' if not removed. (see: arXiv:quant-ph/9905016) $Text =~ s/([,;])\s*Nr\.\s*(\d+[,;])/$1$2/i; # "[12] For example, R. Machleidt, ...Phys. Rep. 149, 1 (1987) $Text =~ s/^([^a-z]+)for example\W+/$1/i; # '[18] *** G. Do Dang, ... (arXiv:nucl-th/9911081) $Text =~ s/\*+//g; # Phys. Rev. D56 => Phys. Rev. D. 56 $Text =~ s/phys.{1,6}rev.{1,6}([a-z])(\d+)/PHYS. REV. $1 $2/ig; # Physica 34 D => Physic D 34 $Text =~ s/physica\s+(\d+)\s+([a-z])/PHYSICA $2 $1/ig; # Nucl. Phys. B567 => Nucl. Phys. B $Text =~ s/nuc.{1,6}phys.{1,6}\s+([a-z])(\d+)/NUCL. PHYS. $1 $2/ig; return $Text; }; sub chr_valid { my $c = shift; if( $c < 128 || $c > 255 ) { return chr($c); } else { return ' '; } } sub normalise_html { my($Text) = @_; use utf8; # remove
tag $Text =~ s/
//ig; # Convert HTML entities to Unicode $Text =~ s/\&#x(\w+);/chr_valid(hex($1))/eg; $Text =~ s/\&#(\d+);/chr_valid($1)/eg; $Text =~ s/&(\w)acute[;,]/$1/g; # a ' on top of (\w) $Text =~ s/&(\w)cedil[;,]/$1/g; # a 'tail' under (\w), e.g Francios $Text =~ s/&(\w)grave[;,]/$1/g; # a ` on top of (\w) $Text =~ s/&(\w)tilde[;,]/$1/g; $Text =~ s/&(\w)uml[;,]/$1e/g; # a '..' on top of (\w) $Text =~ s/&(\w)slash[;,]/$1/g; #$Text =~ s/&#-88;(\w)/$1/g; # as &(\w)uml (see astro-ph/9811179) $Text =~ s/&#-\d+;\s*(\w)/$1/g; $Text =~ s/ß[;,]/ss/g; $Text =~ s/&[;,]/ and /g; $Text =~ s/\s*(\w)/$1/g; # a ~ on top of (\w) $Text =~ s/\/?i>//g; # cogprints $Text =~ s/&[a-z]+;//g; # otherwise ';' cause ref line break. # $Text =~ s/&#\d+;//g; # e.g. '' in 'hep-th/0001001 [99]'. $Text =~ s/\\"(\w)/$1e/g; # G\"unter => Gueter $Text =~ s/\^//g; # remove ^ $Text =~ s/([A-Z])\s*&\s*([A-Z])/$1 and $2/g; # replace '&' with 'and' $Text =~ s/[, ]+& / and /; # remove HTML markups ( etc.) $Text =~ s/<[a-z\/]{1,3}>//ig; return $Text } sub normalise_name { my($Text) = @_; my $Suffix = ''; $Text =~ s/~//; # remove typo # Jr. if ($Text =~ s/[, \.]+(Jr|Sr|Snr)\.?\s*$//i){ $Suffix = $1 } elsif ($Text =~ s/([, \.]+)(Jr|Sr|Snr)[. ]/$1/i){ $Suffix = $2 }; # van der Buren D => D van der Buren" if ($Text =~ /^\s*(((van|von|de|den|der)\s+)+)(\S\S+)\s+(.+)/i) { $Text = "$5 $1 $4" }; $Text =~ s/\s+/ /g; # single space $Text =~ s/^\W+//; $Text =~ s/\s+$//; # "A. Smith" => "A.Smith" $Text =~ s/([a-z])s+\./$1\./ig; # Ghisellini G. A. ==> G.A. Ghisellini # Konenkov D. Yu. => D.Yu. Konenkov if ($Text =~ /^([^\s.]{2,})\s+(([A-Z][a-zA-Z]?\W+)*)([A-Z][a-zA-Z]?)\W*$/) { $Text = "$2$4 $1" }; $Text = "$Text $Suffix" if ($Suffix); $Text = tdb_normalise_name($Text); return $Text; }; # Based on Tim's Authors::splitauthors and Authors::_cmonauthor(); # This subroutine is called simply because we want the author names # to be transformed to a same style used by Tim's programs. Otherwise # a join on author names in Publication and Reference tables will # miss a lot of targets. sub tdb_normalise_name{ my $author = shift; # Strip any brackets $author =~ s/\s*\([^\)]*\)\s*//g; # Get rid of any dashes (except for dashes like Hu-Su) $author =~ s/(\W)-/$1/g; # Remove any "the"s, e.g. The OPAL Collaboration $author =~ s/\bthe\s+//ig; # Sort out Jr/Jr. $author =~ s/,?\sJr\.?/_Jr/ig; $author =~ s/[\{\}]//g; # Remove any specialisations $author =~ s/\\.//g; # Remove any escapes # Convert Convert Hawking S. to S.Hawking (already done - zj) # ($author =~ /(\w\w+)\s+([\.\w\s]+\.)$/) && ($author = $2.$1); $author =~ s/\.\s/\./g; # Convert S.W. Hawking to S.W.Hawking $author =~ s/([A-Z])\s/$1\./g; # Convert S W Hawking to S.W.Hawking ($author = lc($author)) && ($author =~ s/\b(\w)/\U$1/g); # Convert STEPHEN_HAWKING to Stephen_Hawking $author =~ s/\s/_/g; # Convert Stephen W.Hawking to Stephen_W.Hawking $author =~ s/\.\.+/\./g; # Remove double dots return $author; } sub normalise_date { my($Text) = @_; # 12-14 Dec. $Text =~ s/[^\w\/][0-3][0-9]?[a-z]*?(\s*\-\s*[0-3][0-9]?[a-z]*?)?\s+ (Jan[\.\s]|January\b|Feb[\.\s]|February\b| Mar[\.\s]|March\b|Apr[\.\s]|April\b|May| Jun[\.\s]|June\b|Jul[\.\s]|July\b|Aug[\.\s]|August\b| Sep[\.\s]|September\b|Oct[\.\s]|October\b| Nov[\.\s]|November\b|Dec[\.\s]|December\b)//xig; # Dec 12-14 $Text =~ s/(Jan[\.\s]|January\b|Feb[\.\s]|February\b| Mar[\.\s]|March\b|Apr[\.\s]|April\b|May| Jun[\.\s]|June\b|Jul[\.\s]|July\b|Aug[\.\s]|August\b| Sep[\.\s]|September\b|Oct[\.\s]|October\b| Nov[\.\s]|November\b|Dec[\.\s]|December\b) [^\w\/]*[0-3][0-9]?[a-z]*?(\s*\-\s*[0-3][0-9]?[a-z]*?)?\b//xig; return $Text; }; sub normalise_journal { my($Text) = @_; $Text =~ s/^in\s+//i; # "in ..." $Text =~ s/^(see )?also\s+//i; # "also ..."; $Text =~ s/\s*:\s*/:/g; $Text =~ s/\s\s/ /g; # single space; $Text =~ s/\.\s/\./g; # "J. Physics" => "J.Physics" $Text =~ s/\.\(/\. \(/g; $Text =~ s/^\W+//; $Text =~ s/[^\w.]+$//; # remove anything in brackets at the end. $Text =~ s/\s*\([^)]+$//; # e.g. R. Ram, J. Phys. (Paris $Text =~ s/^[^(]+\)\s*//; # e.g. a) R. Ram, J. Phys. 10, 120, 1998 # unify cases #($Text = lc($Text)) && ($Text =~ s/\b(\w)/\U$1/g); $Text = uc($Text); return $Text; }; sub num_of_figures { my($Text) = @_; my($N, @Nlist); $N = 0; @Nlist =(); $Text = normalisation($Text); # e.g. "p. 24-26" regarded as one number. # ignore 'N = 2' kind of equations, and # ignore '25th' kinds (e.g. Proc. 25th ICRC). # ignore 'protein Aquaporin-1 in ...' # ignore 'hep-th/9901001' # ignore ' ... 1.55, ...' while ($Text =~ /(?:^|\b)[a-z]*(\d+)([a-z]*) (?:-[a-z]*\d+[a-z]*)* (?:\b|$)/gix) { next if ($2 =~ /^th$/i); next if ($' =~ /^\.\d+/); next if ($` =~ /\d+\.$/); next if ($` =~ /[=<>\/-]\s*$/); push(@Nlist, $1); }; $N = scalar(@Nlist); return $N } sub remove_extra_spc { my($Text) = @_; $Text =~ s/^\s+//; $Text =~ s/\s+$//; $Text =~ s/\s\s+/ /g; return $Text }; 1; __END__ =head1 NAME ParaTools::Citation::Parser::Jiao::Utility - Perl module containing text processing subroutines. =head1 SYNOPSIS use ParaTools::Citation::Parser::Jiao::Utility; =head1 DESCRIPTION This module is called by ParaTools::Citation::Parser::Jiao.pm. =head1 AUTHOR Original Author: Zhuoan Jiao =cut libbiblio-citation-parser-perl-1.10+dfsg.orig/lib/Biblio/Citation/Parser/Standard.pm0000644000175000017500000003325010115644614027653 0ustar gregoagregoapackage Biblio::Citation::Parser::Standard; ###################################################################### # # Biblio::Citation::Parser::Standard; # ###################################################################### # # This file is part of ParaCite Tools (http://paracite.eprints.org/developers/) # # Copyright (c) 2004 University of Southampton, UK. SO17 1BJ. # # ParaTools is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # ParaTools is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with ParaTools; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # ###################################################################### require Exporter; @ISA = ("Exporter", "Biblio::Citation::Parser"); use strict; use Biblio::Citation::Parser::Templates; our @EXPORT_OK = ( 'parse', 'new' ); =pod =head1 NAME B - citation parsing functionality =head1 SYNOPSIS use Biblio::Citation::Parser::Standard; # Parse a simple reference $parser = new Biblio::Citation::Parser::Standard; $metadata = $parser->parse("M. Jewell (2004) Citation Parsing for Beginners. Journal of Madeup References 4(3)."); print "The title of this article is ".$metadata->{atitle}."\n"; =head1 DESCRIPTION Biblio::Citation::Parser::Standard uses a relatively simple template matching technique to extract metadata from citations. The Templates.pm module currently provides almost 400 templates, with more being added regularly, and the parser returns the metadata in a form that is easily massaged into OpenURLs (see the Biblio::OpenURL module for an even easier way). =cut my %factors = ( "_AUFIRST_" => 0.6, "_AULAST_" => 0.6, "_ISSN_" => 0.95, "_AUTHORS_" => 0.65, "_EDITOR_" => 0.6, "_DATE_" => 0.95, "_YEAR_" => 0.8, "_SUBTITLE_" => 0.6, "_TITLE_" => 0.6, "_UCTITLE_" => 0.7, "_CAPTITLE_" => 0.7, "_PUBLICATION_" => 0.65, "_PUBLISHER_" => 0.65, "_PUBLOC_" => 0.65, "_UCPUBLICATION_" => 0.74, "_CAPPUBLICATION_" => 0.7, "_CHAPTER_" => 0.8, "_VOLUME_" => 0.8, "_ISSUE_" => 0.8, "_PAGES_" => 0.9, "_ANY_" => 0.05, "_ISBN_" => 0.95, "_ISSN_" => 0.95, "_SPAGE_" => 0.8, "_EPAGE_" => 0.8, "_URL_" => 0.9, ); =pod =head1 METHODS =over 4 =item $parser = Biblio::Citation::Parser::Standard-Enew() The new() method creates a new parser. =cut sub new { my($class) = @_; my $self = {}; return bless($self, $class); } =pod =item $reliability = Biblio::Citation::Parser::Standard::get_reliability($template) The get_reliability method returns a value that acts as an indicator of the likelihood of a template matching correctly. Fields such as page ranges, URLs, etc, have high likelihoods (as they follow rigorous patterns), whereas titles, publications, etc have lower likelihoods. The method takes a template as a parameter, but you shouldn't really need to use this method much. =cut sub get_reliability { my( $template ) = @_; my $reliability = 0; foreach(keys %factors) { if ($template =~ /$_/) { while($template =~ /$_/) { $reliability += $factors{$_}; $template =~ s/$_//; } } } return $reliability; } =pod =item $concreteness = Biblio::Citation::Parser::Standard::get_concreteness($template) As with the get_reliability() method, get_concreteness() takes a template as a parameter, and returns a numeric indicator. In this case, it is the number of non-field characters in the template. The more 'concrete' a template, the higher the probability that it will match well. For example, '_PUBLICATION_ Vol. _VOLUME_' is a better match than '_PUBLICATION_ _VOLUME_', as _PUBLICATION_ is likely to subsume 'Vol.' in the second case. =cut sub get_concreteness { my( $template ) = @_; my $concreteness = 0; foreach(keys %factors) { $template =~ s/$_//g; } return length($template); } =pod =item $string = Biblio::Citation::Parser::Standard::strip_spaces(@strings) This is a helper function to remove spaces from all elements of an array. =cut sub strip_spaces { my(@bits) = @_; foreach(@bits) { s/^[[:space:]]*(.+)[[:space:]]*$/$1/;} return @bits; } =pod =item $templates = Biblio::Citation::Parser::Standard::get_templates() Returns the current template list from the Biblio::Citation::Parser::Templates module. Useful for giving status lists. =cut sub get_templates { return $Biblio::Citation::Parser::Templates::templates; } =pod =item @authors = Biblio::Citation::Parser::Standard::handle_authors($string) This (rather large) function handles the author fields of a reference. It is not all-inclusive yet, but it is usably accurate. It can handle author lists that are separated by semicolons, commas, and a few other delimiters, as well as &, and, and 'et al'. The method takes an author string as a parameter, and returns an array of extracted information in the format '{family => $family, given => $given}'. =cut sub handle_authors { my($authstr) = @_; my @authsout = (); $authstr =~ s/\bet al\b//; # Handle semicolon lists if ($authstr =~ /;/) { my @auths = split /[[:space:]]*;[[:space:]]*/, $authstr; foreach(@auths) { my @bits = split /[,[:space:]]+/; @bits = strip_spaces(@bits); push @authsout, {family => $bits[0], given => $bits[1]}; } } elsif ($authstr =~ /^[[:upper:]\.]+[[:space:]]+[[:alnum:]]/) { my @bits = split /[[:space:]]+/, $authstr; @bits = strip_spaces(@bits); my $fam = 0; my($family, $given); foreach(@bits) { next if ($_ eq "and" || $_ eq "&" || /^[[:space:]]*$/); s/,//g; if ($fam) { $family = $_; push @authsout, {family => $family, given => $given}; $fam = 0; } else { $given = $_; $fam = 1; } } } elsif ($authstr =~ /^.+[[:space:]]+[[:upper:]\.]+/) { # Foo AJ, Bar PJ my $fam = 1; my $family = ""; my $given = ""; my @bits = split /[[:space:]]+/, $authstr; @bits = strip_spaces(@bits); foreach(@bits) { s/[,;\.]//g; s/\bet al\b//g; s/\band\b//; s/\b&\b//; next if /^[[:space:]]*$/; if ($fam == 1) { $family = $_; $fam = 0; } else { $given = $_; $fam = 1; push @authsout, {family => $family, given => $given}; } } } elsif ($authstr =~ /^.+,[[:space:]]*.+/ || $authstr =~ /.+\band\b.+/) { my $fam = 1; my $family = ""; my $given = ""; my @bits = split /[[:space:]]*,|\band\b|&[[:space:]]*/, $authstr; @bits = strip_spaces(@bits); foreach(@bits) { next if /^[[:space:]]*$/; if ($fam) { $family = $_; $fam = 0; } else { $given = $_; push @authsout, {family => $family, given => $given}; $fam = 1; } } } elsif ($authstr =~ /^[[:alpha:][:space:]]+$/) { $authstr =~ /^([[:alpha:]]+)[[:space:]]*([[:alpha:]]*)$/; my $given = ""; my $family = ""; if (defined $1 && defined $2) { $given = $1; $family = $2; } if (!defined $2 || $2 eq "") { $family = $1; $given = ""; } push @authsout, {family => $family, given => $given}; } elsif( $authstr =~ /[[:word:]]+[[:space:]]+[[:word:]]?[[:space:]]*[[:word:]]+/) { my @bits = split /[[:space:]]+/, $authstr; my $rest = $authstr; $rest =~ s/$bits[-1]//; push @authsout, {family => $bits[-1], given => $rest}; } else { } return @authsout; } =pod =item %metadata = $parser-Extract_metadata($reference) This is the key method in the Standard module, although it is not actually called directly by users (the 'parse' method provides a wrapper). It takes a reference, and returns a hashtable representing extracted metadata. A regular expression map is present in this method to transform '_AUFIRST_', '_ISSN_', etc, into expressions that should match them. The method then finds the template which best matches the reference, picking the result that has the highest concreteness and reliability (see above), and returns the fields in the hashtable. It also creates the marked-up version, that is useful for further formatting. =cut sub extract_metadata { my($self, $ref) = @_; # Skip to the first Alpha char if ($ref !~ /^[[:digit:]]-X\.]+$/) { $ref =~ s/^[^[:alpha:]]+//; } $ref =~ s/[[:space:]\*]+$//; $ref =~ s/[[:space:]]{2}[[:space:]]+/ /g; $ref =~ s/^[[:space:]\*]*(.+)[[:space:]\*]*$/$1/; my %metaout = (); $metaout{ref} = $ref; $metaout{id} = []; # Pull out doi addresses if ($ref =~ s/doi:(.+)\b//) { push @{$metaout{id}}, "doi:$1"; } if ($ref =~ s/((astro-ph|cond-mat|gr-qc|hep-ex|hep-lat|hep-ph|hep-th|math-th|nucl-ex|nucl-th|physics|quant-ph|math|nlin|cs)\/\d+\b)//) { push @{$metaout{id}}, "arxiv:$1"; } my @specific_pubs = ( # Put any specific publications in here ); my $spec_pubs = ""; if (scalar @specific_pubs > 0) { $spec_pubs = join("|", @specific_pubs); $spec_pubs = "|".$spec_pubs; } my $initial_match = "(?:\\b[[:alpha:]]\\.|\\b[[:alpha:]]\\b)"; my $name_match = "(?:(?:[[:alpha:],;&-]+)\\b)"; my $conjs = "(?:\\s+und\\s+|\\s+band\\s+|\\s|,|&|;)"; my %matches = ( "_AUFIRST_" => "([[:alpha:]\.]+)", "_AULAST_" => "([[:alpha:]-]+)", "_ISSN_" => "([[:digit:]-]+)", "_AUTHORS_" => "((?:$initial_match|$name_match|$conjs)+?)", "_DATE_" => "([[:digit:]]{2}/[[:digit:]]{2}/[[:digit]]{2})", "_YEAR_" => "([[:digit:]]{4})", "_TITLE_" => "(.+?[a-zA-Z]+.+?)", "_SUBTITLE_" => "(.+)", "_CHAPTER_" => "([[:digit:]]+)", "_UCTITLE_" => "([^[:lower:]]+)", "_CAPTITLE_" => "([[:upper:]][^[:upper:]]+)", "_PUBLICATION_" => "([^0-9\(\);\"']{4,}$spec_pubs)", "_PUBLISHER_" => "(.+)", "_PUBLOC_" => "(.+)", "_EDITOR_" => "([[:alpha:]\\.,;\\s&-]+)", "_UCPUBLICATION_" => "([^[:lower:]]+)", "_CAPPUBLICATION_" => "([[:upper:]][^[:upper:]]+)", "_VOLUME_" => "([[:digit:]]+)", "_ISSUE_" => "([[:digit:]]+)", "_PAGES_" => "([[:digit:]]+-{1,2}[[:digit:]]+?)", "_ANY_" => "(.+?)", "_ISBN_" => "([[:digit:]X-]+)", "_ISSN_" => "([[:digit:]X-]+)", "_SPAGE_" => "([[:digit:]]+)", "_EPAGE_" => "([[:digit:]]+)", "_URL_" => "(((http(s?):\\/\\/(www\\.)?)|(\\bwww\\.)|(ftp:\\/\\/(ftp\\.)?))([-\\w\\.:\\/\\s]+)(\\/|\\.\\S+|#\\w+))", ); my(@newtemplates) = (); foreach my $template (@$Biblio::Citation::Parser::Templates::templates) { $_ = $template; s/\\/\\\\/g; s/\(/\\\(/g; s/\)/\\\)/g; s/\[/\\\[/g; s/\]/\\\]/g; s/\./\\\./g; s/ /\[\[:space:\]\]+/g; s/\?/\\\?/g; foreach my $key (keys %matches) { s/$key/$matches{$key}/g; } $_ .= "[.]?"; push @newtemplates,$_; } my $index = 0; my @vars = (); my @matchedvars = (); my $curr_conc = 0; my $curr_rel = 0; my $max_conc = 0; my $max_rel = 0; my $best_match = ""; my $best_orig = ""; foreach my $currtemplate (@newtemplates) { my $original = $Biblio::Citation::Parser::Templates::templates->[$index]; if ($ref =~ /^$currtemplate$/) { $curr_rel = get_reliability($original); $curr_conc = get_concreteness($original); if ($curr_rel > $max_rel) { $best_match = $currtemplate; $best_orig = $original; $max_conc = $curr_conc; $max_rel = $curr_rel; } elsif ($curr_rel == $max_rel && $curr_conc > $max_conc) { $best_match = $currtemplate; $best_orig = $original; $max_conc = $curr_conc; $max_rel = $curr_rel; } } $index++; } $metaout{match} = $best_orig; @vars = ($best_orig =~ /_([A-Z]+)_/g); @matchedvars = ($ref =~ /^$best_match$/); $index = 0; if (scalar @matchedvars > 0) { foreach(@vars) { $matchedvars[$index] =~ s/^\s*(.+)\s*$/$1/; $metaout{lc $_} = $matchedvars[$index]; $index++; } } foreach(keys %metaout) { if (/^uc/) { my $alt = $_; $alt =~ s/^uc//; if (!defined $metaout{$alt} || $metaout{$alt} eq "") { $metaout{$alt} = $metaout{$_}; } } } # Create a marked-up version my $in_ref = $ref; my $in_tmp = $best_orig; my $in_tmp2 = $best_orig; foreach(keys %metaout) { next if (!defined $metaout{$_} || $metaout{$_} eq "" || $_ eq "any"); my $toreplace = "_".(uc $_)."_"; $in_tmp =~ s/$toreplace/<$_>$metaout{$_}<\/$_>/g; $in_tmp2 =~ s/$toreplace/$metaout{$_}/g; } # Fix any _ANY_s $in_tmp2 =~ s/\\/\\\\/g; $in_tmp2 =~ s/\(/\\\(/g; $in_tmp2 =~ s/\)/\\\)/g; $in_tmp2 =~ s/\[/\\\[/g; $in_tmp2 =~ s/\]/\\\]/g; $in_tmp2 =~ s/\./\\\./g; $in_tmp2 =~ s/ /\[\[:space:\]\]+/g; $in_tmp2 =~ s/\?/\\\?/g; $in_tmp2 =~ s/_ANY_/(.+)/g; my(@anys) = ($in_ref =~ /$in_tmp2/g); foreach(@anys) { $in_tmp =~ s/_ANY_/$_<\/any>/; } $metaout{marked} = $in_tmp; # Map to OpenURL if (defined $metaout{authors}) { $metaout{authors} = [handle_authors($metaout{authors})]; $metaout{aulast} = $metaout{authors}[0]->{family}; $metaout{aufirst} = $metaout{authors}[0]->{given}; } if (defined $metaout{publisher} && !defined $metaout{publication}) { $metaout{genre} = "book"; } $metaout{atitle} = $metaout{title}; $metaout{title} = $metaout{publication}; if (defined $metaout{cappublication}) { $metaout{title} = $metaout{cappublication} }; $metaout{date} = $metaout{year}; return %metaout; } =pod =item $metadata = $parser-Eparse($reference); This method provides a wrapper to the extract_metadata function. Simply pass a reference string, and a metadata hash is returned. =cut sub parse { my($self, $ref) = @_; my $hashout = {$self->extract_metadata($ref)}; return $hashout; } 1; __END__ =pod =back =head1 NOTES The parser provided should not be seen as exhaustive. As new techniques are implemented, further modules will be released. =head1 AUTHOR Mike Jewell =cut libbiblio-citation-parser-perl-1.10+dfsg.orig/lib/Biblio/Citation/Parser/Jiao.pm0000644000175000017500000014445710115644600027004 0ustar gregoagregoapackage Biblio::Citation::Parser::Jiao; ###################################################################### # # Biblio::Citation::Parser::Jiao; # ###################################################################### # # This file is part of ParaCite Tools (http://paracite.eprints.org/developers/) # Based on Zhuoan Jiao's (zj@ecs.soton.ac.uk) citation parser (available # at http://arabica.ecs.soton.ac.uk/code/doc/ReadMe.html) # # The code is relatively unchanged, except to bring into compliance # with the ParaCite metadata style, and to allow interoperability with # the other parsers. # # Copyright (c) 2004 University of Southampton, UK. SO17 1BJ. # # ParaTools is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # ParaTools is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with ParaTools; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # ###################################################################### use strict; use vars qw(@ISA @EXPORT @EXPORT_OK); # This provides various utility functions. use Biblio::Citation::Parser::Jiao::Utility; use Biblio::Citation::Parser::Utils; require Exporter; @ISA = ("Exporter", "Biblio::Citation::Parser"); our @EXPORT_OK = ( 'parse', 'new' ); =pod =head1 NAME B - citation parsing using Zhuoan Jiao's parsing module. =head1 SYNOPSIS use Biblio::Citation::Parser::Jiao; # Parse a simple reference $parser = new Biblio::Citation::Parser::Jiao; $metadata = $parser->parse("M. Jewell (2002) Citation Parsing for Beginners. Journal of Madeup References 4(3)."); print "The title of this article is ".$metadata->{atitle}."\n"; =head1 DESCRIPTION Biblio::Citation::Parser::Jiao uses a reference parsing module written by Zhuoan Jiao (zj@ecs.soton.ac.uk). This is a good module to use if titles are not required (if they are in double-quotes they will be picked up, however). For more information see: http://arabica.ecs.soton.ac.uk/code/doc/ref/Parser/about_Citation_module.html The module has been repackaged to comply with the ParaCite metadata style and uses the Citation parser interface to preserve interoperability with the other modules. =head1 METHODS =over 4 =item $parser = Biblio::Citation::Parser::Jiao-Enew() The new() method creates a new parser. =cut sub new { my $class = shift; my $cite = {}; bless $cite, $class; } =pod =item $metadata = $parser-Eparse($reference, [$notrim]); This method provides a wrapper to the functions within the Jiao module that carry out the parsing. Simply pass a reference string, and a metadata hash is returned. Note that this is trimmed to comply to OpenURL standards (thus removing some information that you may wish to keep). To prevent this from occurring, ensure that $notrim is non-zero. =cut sub parse { my($self, $ref, $notrim) = @_; my $cite = {}; bless $cite, "Biblio::Citation::Parser::Jiao"; $cite->initialize($ref); $cite->{auinit} = $cite->{aufirst}; $cite->{date} = $cite->{year}; $cite = _debless($cite); my $metadata = ($notrim ? $cite : trim_openurl($cite)); return $metadata; } sub _debless { my($hash) = @_; my $out = {}; foreach(keys %$hash) { $out->{$_} = $hash->{$_}; } return $out; } sub initialize { my $cite = shift; my $text = shift || return; $cite->{'text'} = $text; $cite->{'rest_text'} = $cite->{'text'}; $cite->{'aufull'} = ''; $cite->{'aulast'} = ''; $cite->{'aufirst'}= ''; $cite->{'authors'}= ''; $cite->{'atitle'} = ''; $cite->{'title'} = ''; $cite->{'volume'} = ''; $cite->{'issue'} = ''; $cite->{'supl'} = ''; $cite->{'spage'} = ''; $cite->{'year'} = ''; $cite->{'targetURL'} = ''; $cite->{'featureID'} = ''; $cite->{'jnl_spos'} = 0; $cite->{'jnl_epos'} = 0; $cite->{'num_of_fig'}= 0; $cite->find_metadata(); $cite->find_featureID(); } # # Actions # sub pre_process { my $cite = shift; my $Text = $cite->{'text'}; $Text = normalisation($Text); $Text = normalise_date($Text); $Text = normalise_html($Text); # remove front label to get accurate $nFig # (Note: do not perform this for arXiv ref. like: "46(4), 90 (1993)") # [Smith, 1998], [1], (1), (1a) ... $Text =~ s/^\s*[\[(]\s* # bracket ([^\])]+?)\s* # content [\])]\s*//x; # bracket # "1. Gary Smith, ...." $Text =~ s/^\d+\s*\.\s+//; # "1 Gary Smith, ...." $Text =~ s/^\s*\d+ ([A-Z])/$1/; # "2) Brand, P. ..." $Text =~ s/^[\[\(]?\s*\w+\s*[\])]\s*//; $cite->{'rest_text'} = $Text; my $nFig = num_of_figures($Text); $cite->{'num_of_fig'} = $nFig; } sub find_metadata { my $cite = shift; return 0 if (!defined($cite->{'text'})); $cite->pre_process(); # find URL $cite->find_url(); my $nFig = $cite->{'num_of_fig'}; # find the authors if ($cite->find_authors()) { $cite->find_first_author() }; # find article titile $cite->find_atitle(); # only process references to 'journal' articles. return 0 if ($nFig == 0) ; # no number, ignore. return 0 if ($nFig >= 8); # too many numbers, maybe an error, ignore. # return 0 if ($cite->{'rest_text'} =~ /\W(proc.|proceedings) of /i); # extract 'supplement' first before find_vol_no_pg_year() $cite->find_supplement(); if ($cite->find_vol_no_pg_year() or $cite->find_vol_pg_year()) { $cite->find_jnl_name(); return 1 }; if ($cite->guess_vol_no_pg()) { $cite->find_jnl_name(); return 1; }; if ($cite->find_vol_no() or $cite->find_vol_supl()) { $cite->find_jnl_name(); $cite->find_page(); $cite->find_year(); return 1; }; if ($cite->guess_vol_pg()) { $cite->find_year(); $cite->find_jnl_name(); return 1; }; if ($cite->guess_vol_year()) { $cite->find_page(); $cite->find_jnl_name(); return 1; }; my $Count = 0; $Count++ if ($cite->find_vol()); $Count++ if ($cite->find_issue()); $Count++ if ($cite->find_supplement()); $Count++ if ($cite->find_jnl_name()); $Count++ if ($cite->find_page()); $Count++ if ($cite->find_year()); return 1 if ($Count >=2 ); # too few metadata return 0 } sub find_atitle { my $cite = shift; my $Text = $cite->{'rest_text'}; # title is quoted. # return 0 if ($Text !~ /(['"])/); # # my $Qt = $1; # ignore ' case, because author nams may contain ', e.g. # A. I. L'vov, V. A. Petrun'kin, and M. Schumacher, # Phys. Rev. C 55, 359 (1997) return 0 if ($Text !~ /"/); if ($Text =~ /"(.+?)"\s*\.?/ and word_count($1) >= 2) { my $Guess_title = $1; return 0 if ($Guess_title =~ /^http:/i); $cite->{'atitle'} = $Guess_title; # use ';' ! # $Text =~ s/$Qt(.+?)$Qt\s*\.?/;/o; # $Text =~ s/"[^"]+"\s*\.?/;/; $Text =~ s/"[^"]+"/" "/; # $Text =~ s/[,;.]\s*[,;.]/,/g; # doesn't work while ($Text =~ /[,;.]\s*[,;.]/g) { $Text =~ s/[,;.]\s*[,;.]/,/ }; $Text =~ s/^[;" ]+//; $cite->{'rest_text'} = $Text; return 1 }; return 0 } # for the OpCit Project . sub find_featureID { my $cite = shift; my $featureID = ''; $featureID .= "v$cite->{'volume'}" if ($cite->{'volume'}); $featureID .= ":n$cite->{'issue'}" if ($cite->{'issue'}); $featureID .= ":s$cite->{'supl'}" if ($cite->{'supl'}); $featureID .= ":p$cite->{'spage'}" if ($cite->{'spage'}); $featureID .= ":y$cite->{'year'}" if ($cite->{'year'}); # tidy up # $featureID =~ s/:[nsp]\s*:/:/g; # doesn't work. while ($featureID =~ /:[nsp]\s*:/g) { $featureID =~ s/:[nsp]\s*:/:/ }; $featureID =~ s/^://; $featureID =~ s/\s+//g; my @Features = split(':', $featureID); # ignore those having too few metadata if (scalar(@Features) >= 2) { # standardize $featureID = lc($featureID); $cite->{'featureID'} = $featureID; }; } sub find_authors { my $cite = shift; my $Text = $cite->{'rest_text'}; my $aText = locate_authors($Text); return 0 if ($aText eq '' or $aText =~ /^\W+$/); my @Chunks = (); @Chunks = split(/\s*[,;:]\s*/, $aText); # ignore text longer than 4 words (don't count initials) return 0 if (word_count($Chunks[0])>4 and no_initials($Chunks[0])); my($author, $Authors) = ('',''); while (@Chunks) { if (scalar(@Chunks)==1) { last if !full_name($Chunks[0]); $author = normalise_name($Chunks[0]); $Authors = "$Authors:$author"; last }; # (1) forename and surname are not separated by [,;]. if (full_name($Chunks[0])){ if ($Chunks[1] =~ /^\s*Jr\.?\s*$/i) { $author = "$Chunks[0], $Chunks[1]"; $author = normalise_name($author); $Authors = "$Authors:$author"; splice(@Chunks, 0, 2); # remove the first two next } elsif (!only_initials($Chunks[1])) { $author = normalise_name($Chunks[0]); $Authors = "$Authors:$author"; shift(@Chunks); next } } elsif (full_name($Chunks[1])) { # $Chunks[0] is not a name, skip. shift @Chunks; next }; # (2) forename and surname are separated by [,;]. # Ignore text containing too many words. my $aFull = "$Chunks[0] $Chunks[1]"; my @abbr = (); last if (word_count($aFull) > 4); last if ($aFull =~ /[\d\/]+/); # journal title maybe mixed up with the name last if (@abbr = ($aFull =~ /\w\w\./g) and (@abbr >= 2)); # surname first. # "Oemler, A., Jr. and Lynds, C. R. 1975, ApJ, 199, 558" if (scalar(@Chunks) > 2) { if (is_surname($Chunks[0]) and has_initials($Chunks[1]) and $Chunks[2] =~ /^\s*Jr\.?\s*$/i) { $author = "$Chunks[1] $Chunks[0], Jr"; $author = normalise_name($author); $Authors = "$Authors:$author"; splice(@Chunks, 0, 3); # remove the first three next }; }; # surname first # "Reisenegger, A. and Miralda-Escude, J. 1995, ApJ, 449, 476 if (is_surname($Chunks[0]) and has_initials($Chunks[1])) { if ($Chunks[1] =~ /(.+?\.?)\s*Jr\.?\s*$/i){ $author = "$1 $Chunks[0], Jr"; } else { $author = "$Chunks[1] $Chunks[0]"; }; $author = normalise_name($author); $Authors = "$Authors:$author"; splice(@Chunks, 0, 2); # remove the first two next }; # forename first if (only_initials($Chunks[0]) and is_surname($Chunks[1])) { if ($Chunks[0] =~ /(.+?[. ])\s*Jr\.?\s*$/i){ $author = "$1 $Chunks[1], Jr"; } else { $author = $aFull }; $author = normalise_name($author); $Authors = "$Authors:$author"; splice(@Chunks, 0, 2); # remove the first two next }; # 'Liu, Gong', hard to tell which is the surname; if (no_initials($Chunks[0]) and no_initials($Chunks[1])) { if (word_count($aFull) <= 4 ) { $author = normalise_name($aFull); $Authors = "$Authors:$author"; splice(@Chunks, 0, 2); # remove the first two next } }; # cannot determin the author name last }; # end of while return 0 if ($Authors eq ''); $Authors =~ s/^://; $cite->{'authors'} = $Authors; } sub find_first_author { my $cite = shift; return 0 if ($cite->{'authors'} eq ''); my @Authors = split(':', $cite->{'authors'}); $cite->{'aufull'} = shift @Authors; if ($cite->{'aufull'} =~ /./) { ($cite->{'aufirst'}, $cite->{'aulast'}) = ($cite->{'aufull'} =~ /^(.+)\.(.+)$/); } else { ($cite->{'aufirst'}, $cite->{'aulast'}) = ($cite->{'aufull'} =~ /^(.+)\s+(.+)$/); } } # locate_authors sub locate_authors { my $Text = shift; $Text =~ s/^\s*For .*?review(s)?\W+//i; $Text =~ s/^\s*(see )?also //i; $Text =~ s/^\s*see[, ]\s*for example\W+//i; $Text =~ s/^\s*see e\.g\.\W+//i; my $aText = $Text; # author name(s) is assumed to be in front of a consecutive # 4 words, e.g. J. A. Harvey. String Duality and Non-supersymmetric # Strings. # if ($Text =~ /\b([\w\-'`"]+\s+){3,}[\w\-'"]+\b/){ if ($Text =~ /\.\s+([\w\-'`"]+\s+){3,}[\w\-'"]{2,}\b/){ $aText = $`; }; if ($Text =~ /[,;]\s*([\w\-'`"]{2,}\s+){3,}[\w\-'"]{2,}\b/) { $aText = $`; }; # the above has truncated too much. # "S. Popescu and Sudbery G. A. Multi-particle entanglement ..." if (only_initials($aText)) { $aText = $Text }; if ($aText =~ /[,:; ]\s*[a-z][\w\-'"]*\s+([a-z0-9\-'"]+\s+)*?[a-z0-9\-'"]{4,}(\b|$)/) { # "[6] M.Gotay, Constraints, reduction and quantization, # J. Math. Phys. (1986) 2051. $aText = $`; }; # Or before the following sybmols. # if ($aText =~ /["\[\(]/) { if ($aText =~ /[:"\[\(]/) { $aText = $` }; # before '/', e.g. "Halzen F. astro-ph/0001001" if ($aText =~ /\S+\//) { $aText = $` }; # before any number if ($aText =~ /\d+/i) { $aText = $` }; # "14. A. J. Leggett, in Percolation, Localization and ..." if ($aText =~ /[,;: ]\s*in /i) { $aText = $` }; # last author name after 'and'. if ($aText =~ /[,; ]\s*and ([^,;:]+)[,:;]([^,;:]+)/i) { my $Aft1 = $1; my $Aft2 = $2; if (full_name($Aft1)) { $aText = $` .", $Aft1"; } else { $aText = $` .", $Aft1, $Aft2" } }; # # tidy up # # remove non-alphabets $aText =~ s/^[^a-z]+//i; $aText =~ s/^by //i; $aText =~ s/[,; ]+and /,/i; $aText =~ s/[,; ]+et\.?\s+al\.?([,; ]+|$)/,et al,/i; #$aText =~ s/[,;:.]+\s*$//; $aText =~ s/[,;:]+\s*$//; return $aText }; # This subroutine needs re-written; not in use now. sub locate_book { my $cite = shift; my $Text = $cite->{'rest_text'}; if ($Text =~ /\W+in\s+(.+?)\W+(ed|eds|edited)\.?(\W|$)/) { $$cite{book} = $1; return 1 }; return 0 } sub find_vol_no { my $cite = shift; my $Text = $cite->{'rest_text'}; if ($Text =~ s/[,;. ]\s*(?:volume|vol|v)?\.?\s*(\d+)\s*[ ,;]\s*(?:n|no|issue|\#)\.?\s*(\d+)\b/$1/is) { $cite->{'volume'} = $2; $cite->{'issue'} = $3; $cite->{'jnl_epos'} = length($`); $cite->{'rest_text'} = $Text; return 1 } else { return 0} } sub find_vol_supl { my $cite = shift; my $Text = $cite->{'rest_text'}; if ($Text =~ s/(\s|,|;|\.)\s*(?:volume|vol|v)?\.?\s*(\d+)\s*[\s,;]\s*(?:supl|supplement)\.?\s*(\d+)\b/$1/is) { $cite->{'volume'} = $2; $cite->{'supl'} = $3; $cite->{'jnl_epos'} = length($`); $cite->{'rest_text'} = $Text; } } sub find_vol { my $cite = shift; my $Text = $cite->{'rest_text'}; if ($Text =~ s/[,;:. ]\s*(?:volume|vol)[. ]\s*([a-z]*\d+[a-z]*)\b//i) { $cite->{'volume'} = $1; $cite->{'rest_text'} = $Text; return }; # "..., Vol9 ..." if ($Text =~ s/[,;:. ]\s*(?:volume|vol)(\d+[a-z]*)\b//i) { $cite->{'volume'} = $1; $cite->{'rest_text'} = $Text; return }; if ($Text =~ s/[,;:. ]\s*(?:volume|vol)(\d+[a-z]*)\b//i) { $cite->{'volume'} = $1; $cite->{'rest_text'} = $Text; return }; # beware: "Smith, V. 1990, Phys. Rev. A. v. 10 ..." while ($Text =~ /[,;. ]\s*V\s*[. ]\s*([a-z]*\d+[a-z]*)\b/ig){ my $Guess_vol = $1; next if ($Guess_vol =~ /(19|20)\d\d/); $cite->{'volume'} = $Guess_vol; $Text =~ s/[,;. ]\s*V\s*[. ]\s*[a-z]*\d+[a-z]\b//i; $cite->{'rest_text'} = $Text; return }; # "... v10, ..." if ($Text =~ s/[,;:. ]\s*V(\d+[a-z]*)\b//i) { $cite->{'volume'} = $1; $cite->{'rest_text'} = $Text; return }; } sub find_issue { my $cite = shift; my $Text = $cite->{'rest_text'}; if ($Text =~ s/[,;:. ]\s*(?:number|issue|num|no|Nr|\#)[. ]\s*([a-z]*\d+[a-z]*)\b//i) { $cite->{'issue'} = $1; $cite->{'rest_text'} = $Text; return }; # e.g. " ...No10, ..." if ($Text =~ s/[,;:. ]\s*(?:number|issue|num|no|Nr)(\d+[a-z]*)\b//i) { $cite->{'issue'} = $1; $cite->{'rest_text'} = $Text; return }; while ($Text =~ /[,;:. ]\s*N\s*[. ]\s*([a-z]*\d+[a-z]*)\b/ig){ my $Guess_issue = $1; next if ($Guess_issue =~ /(19|20)\d\d/); $cite->{'issue'} = $Guess_issue; $Text =~ s/[,;. ]\s*N\s*[. ]\s*[a-z]*\d+[a-z]*\b//i; return }; if ($Text =~ s/[,;:. ]\s*(?:n|\#|\#\s+)(\d+[a-z]*)\b//i) { $cite->{'issue'} = $1; $cite->{'rest_text'} = $Text; return }; } sub find_supplement { my $cite = shift; my $Text = $cite->{'rest_text'}; if ($Text =~ s/[,;:. ]\s*(?:suppl|supplement)\.?\s*(\d+)\b//i) { $cite->{'supl'} = $1; $cite->{'num_of_fig'} = $cite->{'num_of_fig'} - 1; $cite->{'rest_text'} = $Text } } sub find_url { my $cite = shift; my $Text = $cite->{'rest_text'}; if ($Text =~ s/\b(http:\/\/[^\s]+)/ /i){ my $url = $1; $url =~ s/\W*$//; $cite->{'targetURL'} = $url; $cite->{'rest_text'} = $Text; return 1 }; if ($Text =~ s/\b(http:\/\/[^\s>]+)(?:\s|$)/ /i){ $cite->{'targetURL'} = $1; $cite->{'targetURL'} =~ s/[.,;]$//; $cite->{'rest_text'} = $Text; return 1 }; return 0 } sub find_page { my $cite = shift; my $Text = $cite->{'rest_text'}; # keep the order of the pattern matching. # '... p.20, p 20, ...' if ($Text =~ s/[,;:. ]\s*(?:pages|page|pp)\s*[.# ]\s*([a-z]*\d+[a-z]*)\b//i) { $cite->{'spage'} = $1; $cite->{'rest_text'} = $Text; return }; # " ... pp20, ..." if ($Text =~ s/[,;:. ]\s*(?:pages|page|pp)(\d+[a-z]*)\b//i) { $cite->{'spage'} = $1; $cite->{'rest_text'} = $Text; return }; # ... p. 1990-1993 if ($Text =~ s/[,;. ]\s*(?:p)\s*[. ]\s* ([a-z]*\d+[a-z]*)\s*\-\s*[a-z]*d+[a-z]*\b//xi) { $cite->{'spage'} = $1; $cite->{'rest_text'} = $Text; return }; # Beaware "Smith P. 1990, ..., p. 100" while ($Text =~ /[,;. ]\s*p\s*[. ]\s*([a-z]*\d+[a-z]*)\s*(?!\-)/ig){ my $Guess_page = $1; next if ($Guess_page =~ /(19|20)\d\d/); $cite->{'spage'} = $Guess_page; $Text =~ s/[,;. ]\s*p\s*[. ]\s*[a-z]*\d+[a-z]*\s*(?!\-)//i; $cite->{'rest_text'} = $Text; return }; # " ... p20, ..." if ($Text =~ s/[,;:. ]\s*p(\d+[a-z]*)\b//i) { $cite->{'spage'} = $1; $cite->{'rest_text'} = $Text; return }; } sub find_year { my $cite = shift; return 1 if ($cite->{'year'}); my $Text = $cite->{'rest_text'}; # priority is given to (1989) type. if ($Text =~ s/\(((19|20)\d\d)\w?\)//) { $cite->{'year'} = $1; $cite->{'rest_text'} = $Text; return 1 }; # year like numbers not before/after a '-' # e.g. 1966-1988 may indicate a page range. if ($Text =~ /[^\w\-"]((19|20)\d\d)\w?([^\w\-"]|$)/i) { $cite->{'year'} = $1; $Text =~ "\Q$` $'\E"; $cite->{'rest_text'} = $Text; return 1 }; return 0; } # Apt'e, C., et al. ACM Transactions on Information Systems 12, 3, 233-251 sub guess_vol_no_pg { my $cite = shift; return 1 if ($cite->{'volume'} and $cite->{'issue'} and $cite->{'spage'}); return 0 if ($cite->{'num_of_fig'} < 3); my $Text = $cite->{'rest_text'}; # change (1,1) alike to (). $Text =~ s/\(\d+\s*,\s*\d+\s*\)/\(\)/g; $Text =~ s/\(\d+\s*;\s*\d+\s*\)/\(\)/g; if ($Text =~ /[^\w\/.-](?:volume|vol\.?|v\.?)?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+(?:n|no|number|issue|\#)?\.?\s*([a-z]*?\d+[a-z]*?) # issue [^\w\/.-]+(?:pages|page|pp|p)?\.? \s*([a-z]*?\d+[a-z]*?)(?:\s*-\s*[a-z]*?\d+[a-z]*?)? (\W*|$)/xi) { $cite->{'volume'} = $1; $cite->{'issue'} = $2; $cite->{'spage'} = $3; $cite->{'jnl_epos'} = length($`) + 1; return 1 }; return 0 } # '15:190' (15A:190-195, 14-15:190-180, or "Astrophys. J. 8, 103"); # Called this after '{find_vol_{no}_pg_year}' failed. sub guess_vol_pg { my $cite = shift; return 1 if ($cite->{'volume'} and $cite->{'spage'}); return 0 if ($cite->{'num_of_fig'} < 2); my $Text = $cite->{'rest_text'}; # change (1,1) alike to (). $Text =~ s/\(\d+\s*,\s*\d+\s*\)/\(\)/g; $Text =~ s/\(\d+\s*;\s*\d+\s*\)/\(\)/g; # 15A:190-195 type if ($Text =~ s/[^\w\/.-]([a-z]*?\d+[a-z]*?)\s*:\s*([a-z]*?\d+[a-z]*?)\s* (-\s*[a-z]*?\d+[a-z]*?)?(\W|$)/$4/xi) { $cite->{'volume'} = $1; $cite->{'spage'} = $2; $cite->{'jnl_epos'} = length($`) + 1; $cite->{'rest_text'} = $Text; return 1 }; # Astrophys. J. Lett., 452, p.L91-L93 # AIP, vol 307, p.117, New York (1994). # Pub. Astron. Soc. Japan, 2000, p.52 if ($Text =~ /[^\w\/.-](?:volume|vol\.?|v\.?)?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]*,\s*(?:p|pp|page|pages)[. ]\s*([a-z]*?\d+[a-z]*?)\s* (-\s*[a-z]*?\d+[a-z]*?)?(?:\W|$)/xi) { my $Guess_vol = $1; $cite->{'spage'} = $2; my $Guess_jnl_epos = length($`) + 1; # prematch if ($Guess_vol =~ /^(19|20)\d\d[a-z]?$/i) { $cite->{'year'} = $Guess_vol; $cite->{'rest_text'} =~ s/([^\w\/.-])(?:volume|vol\.?|v\.?)?\s*[a-z]*?\d+[a-z]*?\s*,\s*(?:p|pp|page|pages)\s*\.?[a-z]*?\d+[a-z]*?\s*(-\s*[a-z]*?\d+[a-z]*?)?(\W|$)/$1/i; return 0 }; $cite->{'volume'} = $Guess_vol; $cite->{'jnl_epos'} = $Guess_jnl_epos; $cite->{'rest_text'} =~ s/([^\w\/.-])[a-z]*?\d+[a-z]*?\s*,\s*(?:p|pp|page|pages)\s*\.?[a-z]*?\d+[a-z]*?\s*(-\s*[a-z]*?\d+[a-z]*?)?(\W|$)/$1/i; return 1 }; # Elias, J. 1994, NOAO Newsletter, No. 37, 1 if ($Text =~ /[^\w\/.-](?:n|no|num|issue)[. ]\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]*,\s*(?:p|pp|page|pages)?\.?\s*([a-z]*?\d+[a-z]*?)\s* (-\s*[a-z]*?\d+[a-z]*?)?(?:\W|$)/xi) { $cite->{'issue'} = $1; $cite->{'spage'} = $2; $cite->{'jnl_epos'} = length($`) + 1; # prematch $cite->{'rest_text'} =~ s/([^\w\/.-])(?:n|no|num|issue)[. ]\s*[a-z]*?\d+[a-z]*?[^\w\/.-]*,\s*(?:p|pp|page|pages)?\.?\s*([a-z]*?\d+[a-z]*?)\s*(-\s*[a-z]*?\d+[a-z]*?)?(?:\W|$)/$1/i; return 1 }; # match page range. # Phys. Rev. A 4, 52-60 # Pub. Astron. Soc. Japan, 1998, 52-60 if ($Text =~ /[^\w\/.-]([a-z]*?\d+[a-z]*?) # volume or year [^\w\/.-]*[, ]\s*([a-z]*?\d+[a-z]*?)\s* # pages -\s*[a-z]*?\d+[a-z]*?(?:[^\w-]|$)/xi) { my $Guess_vol = $1; $cite->{'spage'} = $2; my $Guess_jnl_epos = length($`) + 1; # prematch if ($Guess_vol =~ /^(19|20)\d\d[a-z]?$/i) { $cite->{'year'} = $Guess_vol; $cite->{'rest_text'} =~ s/([^\w\/.-])[a-z]*?\d+[a-z]*?\s*[, ]\s*([a-z]*?\d+[a-z]*?)\s*-\s*[a-z]*?\d+[a-z]*?(?:[^\w\/.-]|$)/$1/i; return 0 }; $cite->{'volume'} = $Guess_vol; $cite->{'jnl_epos'} = $Guess_jnl_epos; $cite->{'rest_text'} =~ s/([^\w\/.-])[a-z]*?\d+[a-z]*?\s*,\s*([a-z]*?\d+[a-z]*?)\s*-\s*[a-z]*?\d+[a-z]*?(?:[^\w\/.-]|$)/$1/i; return 1 }; # Phys. Rev. B 38, 2297. (Phys. Rev. B 38 2297) # Pub. Astron. Soc. Japan, 2000, 52. if ($Text =~ /[^\w\/.-]([a-uw-z]*?\d+[a-z]*?) [^\w\/.-]*[, ]\s*([a-z]?\d+[a-z]?)(?:[^\w\/.-]|$)/xi) { my $Guess_vol = $1; my $Guess_page = $2; $cite->{'jnl_epos'} = length($`) + 1; if ($Guess_vol =~ /^(19|20)\d\d[a-z]?$/i) { $cite->{'year'} = $Guess_vol; } else { $cite->{'volume'} = $Guess_vol; }; if ($Guess_page =~ /^(19|20)\d\d[a-z]?$/i) { $cite->{'year'} = $Guess_page; } else { $cite->{'spage'} = $Guess_page; }; $cite->{'rest_text'} =~ s/([^\w\/.-])[a-z]*?\d+[a-z]*?[^\w\/.-]*[, ]\s*[a-z]*?\d+[a-z]*?(?:[^\w\/.-]|$)/$1/i; return 1 if ($cite->{'volume'} and $cite->{'spage'}); return 0 }; return 0 }; # # G. Smith and H. Gray; Pub. Astron. Soc. Japan, 2000, vol. 52 # To find $cite->{'jnl_epos'} currectly. Note that '2000' may be # regarded as the journal name (by subroutine find_vol). sub guess_vol_year { my $cite = shift; return 0 if ($cite->{'num_of_fig'} < 2); my $Text = $cite->{'rest_text'}; # change (1,1) alike to (). $Text =~ s/\(\d+\s*,\s*\d+\s*\)/\(\)/g; $Text =~ s/\(\d+\s*;\s*\d+\s*\)/\(\)/g; if ($Text =~ /[^\w\/.-]\(?((19|20)\d\d)\w?\)?[^\w\/.-]* (?:volume|vol|v)\W*([a-oq-z]*?\d+[a-z]*?)(\W|$)/xis) { $cite->{'year'} = $1; $cite->{'volume'} = $3; $cite->{'jnl_epos'} = length($`); return 1 }; # be aware: "Workshop on ..., p30 (1999)." if ($Text =~ /[^\w\/.-](?:volume|vol|v)?\W*([a-oq-z]?\d+[a-z]?) [^\w\/.-]+\(?((19|20)\d\d)\w?\)?(\W|$)/xis) { $cite->{'volume'} = $1; $cite->{'year'} = $2; $cite->{'jnl_epos'} = length($`); return 1 }; return 0 }; sub find_vol_no_pg_year { my $cite = shift; return 1 if ($cite->{'volume'} and $cite->{'issue'} and $cite->{'spage'} and $cite->{'year'}); return 0 if ($cite->{'num_of_fig'} < 4); my $Text = $cite->{'rest_text'}; # change (1,1) alike to (). $Text =~ s/\(\d+\s*,\s*\d+\s*\)/\(\)/g; $Text =~ s/\(\d+\s*;\s*\d+\s*\)/\(\)/g; # Keep the following order of texting $Text; # Important: check 'year' at the end first. # (A.1): # 'year' is at the end, within bracket. # ..., v.517, no. 1, p.190-200, (1999) # ..., 11(2), 100-105, (1999) if ($Text =~ /[^\w\/.-](?:volume|vol\.?|v\.?)?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+(?:n|no|number|issue|\#)?\.?\s*([a-z]*?\d+[a-z]*?) # issue [^\w\/.-]+(?:pages|page|pp|p)?\.? \s*([a-z]*?\d+[a-z]*?)(?:\s*-\s*[a-z]*?\d+[a-z]*?)? \W*\(((19|20)\d\d)[a-z]*?\)(\W|$)/xi) { $cite->{'volume'} = $1; $cite->{'issue'} = $2; $cite->{'spage'} = $3; $cite->{'year'} = $4; $cite->{'jnl_epos'} = length($`) + 1; return 1 }; # (A.2) 'year' is in the middle, within bracket. # ..., 4(2), (1999), 100-105 if ($Text =~ /[^\w\/.-](?:volume|vol\.?|v\.?)?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+(?:n|no|number|issue|\#)?\.?\s*([a-z]*?\d+[a-z]*?) # issue \W*\(((19|20)\d\d)[a-z]*?\) # year \W*(?:pages|page|pp|p)?\.?\s*([a-z]*?\d+[a-z]*?)(\W|$)/xi) { $cite->{'volume'} = $1; $cite->{'issue'} = $2; $cite->{'year'} = $3; $cite->{'spage'} = $5; $cite->{'jnl_epos'} = length($`) + 1; return 1 }; # (A.3.1) 'year' is at the beginning, within bracket, after # journal title; # ...., (1999), 517, no. 1, p.190-200 if ($Text =~ /\(((19|20)\d\d)[a-z]*?\)[,.;\s:]* # year (?:volume|vol|v)?\.?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+(?:n|no|number|issue|\#)?\.?\s*([a-z]*?\d+[a-z]*?) # issue [^\w\/.-]+(?:pages|page|pp|p)?\.?\s*([a-z]*?\d+[a-z]*?)(\W|$)/ix) { $cite->{'year'} = $1; $cite->{'volume'} = $3; $cite->{'issue'} = $4; $cite->{'spage'} = $5; $cite->{'jnl_epos'} = length($`); return 1; }; # (A.3.2) 'year' is at the beginning, within bracket, before # journal title; # ..., (1999),..., 517, no. 1, p.190-200 if ($Text =~ /\(((19|20)\d\d)[a-z]*?\) # year ([^(]+?) [^\w\/.-](?:volume|vol|v)?\.?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+(?:n|no|number|issue|\#)?\.?\s*([a-z]*?\d+[a-z]*?) # issue [^\w\/.-]+(?:pages|page|pp|p)?\.?\s*([a-z]*?\d+[a-z]*?)(\W|$)/ix){ $cite->{'year'} = $1; $cite->{'volume'} = $4; $cite->{'issue'} = $5; $cite->{'spage'} = $6; # $cite->{'jnl_spos'} = length($`); # $cite->locate_jnl_epos(); $cite->{'jnl_epos'} = length($`) + length($1) + length($3); return 1; }; # (B.1): # 'year' is at the end, but not in bracket; # ..., v.517, no. 1, p.190-200, 1999 # ..., 517, no. 1, p.190-200, 1999 if ($Text =~ /[^\w\/.-](?:volume|vol\.?|v\.?)?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+(?:n|no|number|issue|\#)?\.?\s*([a-z]*?\d+[a-z]*?) # issue [^\w\/.-]+(?:pages|page|pp|p)?\.? \s*([a-z]*?\d+[a-z]*?)(?:\s*-\s*[a-z]*?\d+[a-z]*?)? [^\w(:\/.-]+?((19|20)\d\d)[a-z]?\s*(?![)-])/xi) { $cite->{'volume'} = $1; $cite->{'issue'} = $2; $cite->{'spage'} = $3; $cite->{'year'} = $4; $cite->{'jnl_epos'} = length($`) + 1; return 1 }; # (B.2): 'year' is in the middle, but not in bracket. # 4(2), 1999, 100-105 if ($Text =~ /[^\w\/.-](?:volume|vol\.?|v\.?)?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+(?:n|no|number|issue|\#)?\.?\s*([a-z]*?\d+[a-z]*?) # issue [^\w(:\/.-]+?\s*((19|20)\d\d)[a-z]? # year \s*[^\w\/.)-]+?\s*(?:pages|page|pp|p)?\.?\s*([a-z]*?\d+[a-z]*?)(\W|$)/xi) { $cite->{'volume'} = $1; $cite->{'issue'} = $2; $cite->{'year'} = $3; $cite->{'spage'} = $5; $cite->{'jnl_epos'} = length($`) + 1; return 1 }; # (B.3.1): 'year' is at beginning, not in bracket, after title; # ..., 1999, v.517, no. 1, p.190-200 # " ... 1890-1999", MNRAS, 2000, 4:1, p 1990 if ($Text =~ /[^"(\/.-]\s*((19|20)\d\d)[a-z]?[,;\.\s]+ # year (?:volume|vol|v)?\.?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+?(?:n|no|number|issue|\#)?\.?\s*([a-z]*?\d+[a-z]*?) [^\w\/.-]+(?:pages|page|pp|p)?\.?\s*([a-z]*?\d+[a-z]*?)(\W|$)/ix) { $cite->{'year'} = $1; $cite->{'volume'} = $3; $cite->{'issue'} = $4; $cite->{'spage'} = $5; $cite->{'jnl_epos'} = length($`) + 1; return 1 }; # (B.3.2): 'year' is at beginning, not in bracket, before title; # 1999, ..., v.517, no. 1, p.190-200 # 1999, ..., 517, no. 1, p.190-200 # 1999, ..., 517(1), 190-200 # NB: 1999, "... 1.5 factor ....", 517(1), 190-200 # NB: B. Greene, editors, "Fields, Strings and Duality, TASI 1996", # pages 421-540, World Scientific, 1997. # " ... 1890-1999", MNRAS, 2000, 4:1, p 1990 if ($Text =~ /(?:^|[^"(\/.-])\s*((19|20)\d\d)[a-z]? # year [^\w:")(\/-][^(]*? [^\w\/.-](?:volume|vol|v)?\.?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+?(?:n|no|number|issue|\#)?\.?\s*([a-z]?\d+[a-z]?) [^\w\/.-]+(?:pages|page|pp|p)?\.?\s*([a-z]*?\d+[a-z]*?)(\W|$)/ix) { $cite->{'year'} = $1; $cite->{'volume'} = $3; $cite->{'issue'} = $4; $cite->{'spage'} = $5; $cite->{'jnl_spos'} = length($`); $cite->locate_jnl_epos(); return 1 }; return 0 }; # For cases where 'vol, page, year' can be identified correctly. sub find_vol_pg_year { my $cite = shift; return 1 if ($cite->{'volume'} and $cite->{'spage'} and $cite->{'year'}); return 0 if ($cite->{'num_of_fig'} < 3); my $Text = $cite->{'rest_text'}; # change (1,1) alike to (). $Text =~ s/\(\d+\s*,\s*\d+\s*\)/\(\)/g; $Text =~ s/\(\d+\s*;\s*\d+\s*\)/\(\)/g; # (A.1) 'year' is at the end, within bracket. # ......, vol.8:100, (1999) # ......, 8:100, (1999) # ~~~~ if ($Text =~ /(?:^|[^\w\/.-])(?:volume|vol\.?|v\.?)?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+(?:pages|page|pp|p)?\.? \s*([a-z]?\d+[a-z]?)(?:\s*-\s*[a-z]?\d+[a-z]?)? \W*\(((19|20)\d\d)[a-z]?\)(\W|$)/xi) { $cite->{'volume'} = $1; $cite->{'spage'} = $2; $cite->{'year'} = $3; $cite->{'jnl_epos'} = length($`) + 1; return 1 }; # (A.2) 'year' is in the middle, within bracket. # ......, 8, (1999), 100-105 if ($Text =~ /(?:^|[^\w\/.-])(?:volume|vol\.?|v\.?)?\s*([a-z]*?\d+[a-z]*?) # volume \W*\(((19|20)\d\d)[a-z]?\) # year \W*(?:pages|page|pp|p)?\.? \s*([a-z]?\d+[a-z]?)(?:\s*-\s*[a-z]?\d+[a-z]?)?(\W|$)/xi) { $cite->{'volume'} = $1; $cite->{'year'} = $2; $cite->{'spage'} = $4; $cite->{'jnl_epos'} = length($`) + 1; return 1 }; # (A.3.1.) 'year' is at beginning, within bracket, after title; # ......, (1999) 517, 190-200 if ($Text =~ /\(((19|20)\d\d)[a-z]?\)[,;\.\s]* # year (?:volume|vol|v)?\.?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+(?:pages|page|pp|p)?\.?\s*([a-z]?\d+[a-z]?)(\W|$)/ix){ $cite->{'year'} = $1; $cite->{'volume'} = $3; $cite->{'spage'}= $4; $cite->{'jnl_epos'} = length($`); return 1; }; # (A.3.1.1) 'year' is at beginning, within bracket, after title; # not 'vol', buy 'No.@, e.g."..., (1999) No. 517, 190-200 if ($Text =~ /\(((19|20)\d\d)[a-z]?\)[,;\.\s]* # year (?:number|no|n)\.?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+(?:pages|page|pp|p)?\.?\s*([a-z]?\d+[a-z]?)(\W|$)/ix){ $cite->{'year'} = $1; $cite->{'volume'} = $3; $cite->{'spage'}= $4; $cite->{'jnl_epos'} = length($`); return 1; }; # (A.3.2.) 'year' is at beginning, within bracket, before title; # ..., (1999),..., 517, p.190-200 if ($Text =~ /\(((19|20)\d\d)[a-z]?\) # year [^(]+? [^\w\/.-](?:volume|vol|v)?\.?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+(?:pages|page|pp|p)?\.?\s*([a-z]?\d+[a-z]?)(\W|$)/ix){ $cite->{'year'} = $1; $cite->{'volume'} = $3; $cite->{'spage'} = $4; $cite->{'jnl_spos'} = length($`); $cite->locate_jnl_epos(); return 1; }; # (B.1) 'year' is at the end, but not in bracket. # ......, vol.8:100, 1999 # ......, 8:100, 1999 # NB: ..., 1999, 8(1900) # ~~~~ if ($Text =~ /[^\w\/.-](?:volume|vol\.?|v\.?)?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+(?:pages|page|pp|p)?\.? \s*([a-z]?\d+[a-z]?)(?:\s*-\s*[a-z]?\d+[a-z]?)? # page [^\w:(\/.-]+\s*((19|20)\d\d)[a-z]?\s*(?![)-])/xi) { $cite->{'volume'} = $1; $cite->{'spage'} = $2; $cite->{'year'} = $3; $cite->{'jnl_epos'} = length($`) + 1; return 1 }; # (B.2) 'year' is in the middle, but not in brackets; # ... 8, 1999, p.100 # ... 8, 1999, 100-105 if ($Text =~ /[^\w\/.-](?:volume|vol\.?|v\.?)?\s*([a-z]*?\d+[a-z]*?) # volume [^\w:(\/.-]+?\s*((19|20)\d\d)[a-z]? # year [^\w\/.)-]+(?:pages|page|pp|p)?\.?\s*([a-z]?\d+[a-z]?)(\W|$)/xi) { $cite->{'volume'} = $1; $cite->{'year'} = $2; $cite->{'spage'} = $4; $cite->{'jnl_epos'} = length($`) + 1; return 1 }; # (B.3.1) 'year' is at the beginning,not in bracket, after title; # ..., 1999, 8, p1990 if ($Text =~ /[^\w\/.(-]\s*((19|20)\d\d)[a-z]?[,;\.\s]+ (?:volume|vol|v)?\.?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+(?:pages|page|pp|p)?\.?\s*([a-z]?\d+[a-z]?)(\W|$)/ix){ $cite->{'year'} = $1; $cite->{'volume'} = $3; $cite->{'spage'} = $4; $cite->{'jnl_epos'} = length($`)+1; return 1 }; # (B.3.1.1) 'year' is at the beginning,not in bracket, after title; # no 'vol', but 'no.' e.g. ..., 1999, No. 8, p1990 if ($Text =~ /[^\w\/.(-]\s*((19|20)\d\d)[a-z]?[,;\.\s]+ (?:number|no|n)\.?\s*([a-z]*?\d+[a-z]*?) # no volume, but issues [^\w\/.-]+(?:pages|page|pp|p)?\.?\s*([a-z]?\d+[a-z]?)(\W|$)/ix){ $cite->{'year'} = $1; $cite->{'issue'} = $3; $cite->{'spage'} = $4; $cite->{'jnl_epos'} = length($`)+1; return 1 }; # (B.3.2) 'year' is at beginning, not in bracket, before title; # 1999, ..., 8(100) if ($Text =~ /((^|[^"\/.(-])\s*)(((19|20)\d\d)[a-z]?) # year ([^\w:")(\/][^(]*?) [^\w\/.-](?:volume|vol|v)?\.?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+(?:pages|page|pp|p)?\.?\s*([a-z]?\d+[a-z]?)(\W|$)/ix){ $cite->{'year'} = $4; $cite->{'volume'} = $7; $cite->{'spage'} = $8; # $cite->{'jnl_spos'} = length($`); # $cite->locate_jnl_epos(); $cite->{'jnl_epos'} = length($`) + length($1) + length($3) + length($6); return 1 }; return 0 } # This subroutine is only called when the journal title is between # 'year' and 'vol/page', e.g. (a lot in astro-ph/) # Barnes, J., Efstathiou, G., 1987, ApJ, 319, 575 # For other cases, the cite{'jnl_epos'} is determined while trying to # find out the vol, page, year, i.e. in 'find_vol_no_pg_year' kind # of subroutines. # sub locate_jnl_epos { my $cite = shift; my $sPos = $cite->{'jnl_spos'}; my $Text = substr($cite->{'rest_text'}, $sPos); # $Text =~ s/(\W+)(?:pages|page|pp|p)\W*(\d+)/$1$2/; # $Text =~ s/-\d+[a-z]*?//; # pp100-105 # Before 'volume' if ($Text =~ /\b(?:volume|vol\.?|v\.?)\s*[a-z]*?\d+[a-z]*?(?![.0-9])/i) { $cite->{'jnl_epos'} = length($`) + $sPos; return 1 }; # (1997) Phys. Rev. E56, No.3, 2875 # (1997) Phys. Rev. A50, p.160 if ($Text =~ / [^\w\/.-](?:volume|vol\.?|v\.?)?\s*[a-z]*?\d+[a-z]*? # volume [^\w\/.-]+(?:n |n.|no |no.|number |issue |\#|p |p.|pp.|page )\s*[a-z]*?\d+[a-z]*? (?:\W|$)/xi) { $cite->{'jnl_epos'} = length($`) + $sPos + 1 ; return 1 }; # Before any two consecutive numbers, but not '123-127' style page. # Bertelli, G., 1999, ApJ, 517(1), .... # ApJ, 517:1, ... # ApJ, 517:367-380. #Beaware: J.K. Lanyi. 1999. Structure of bacteriorhodopsin at 1.55 # angstrom resolution J. Mol. Bio. 291:899-911 ~~~~! if ($Text =~ /[^\w\/.-][a-z]*?\d+[a-z]*?\s*[,:(\s]\s* [a-z]?\d+[a-z]?(\W|$)/xi) { $cite->{'jnl_epos'} = length($`) + $sPos + 1; return 1 }; return 0 }; sub find_jnl_name { my $cite = shift; return 1 if ($cite->{'title'}); return 0 if (! $cite->{'jnl_epos'}); # Assumption: journal name usually starts after a ',;' # or " which is used to enclose the article title, # and does not contain those symbols (i.e. ,;") # my $Text = substr($cite->{'rest_text'}, 0, $cite->{'jnl_epos'}); my $Guess_jnl; # Linden, N., et al. quantph/9711016 and Fortsch. Phys. 46, 567 (1998) #if ($Text =~ m{[^/]+/\w+\s*(.+)$}) { # $Text = $1 # }; LOOP: # remove trailing symbols $Text =~ s/\s*[,;":\/\[\(]*\s*$//s; # ignore anything in brackets (head/tail position) $Text =~ s/\W*\([^\)]+\)?\W*$//; $Text =~ s/^\s*\([^\)]+\)\W+//; return 0 if ($Text eq ''); # quite many citations are like this: # "P. Reiter, et al:Phys. Rev. Lett. 82 (1999) 509" # hard to separate name from journal title. Other cases # are: '..., J.PHY.G:NUCL.PART.PHY.'. Have to compramise. if ($Text =~ /([^,;":?\/\[]+)$/) { $Guess_jnl = $1; $Guess_jnl =~ s/^['`]?\s*//; $Guess_jnl =~ s/\s+$//; # ignore things in brackets $Guess_jnl =~ s/\W*\([^\)]+\)?\W*$//; $Guess_jnl =~ s/^\([^\)]+\)\W*//; # journal name should begin and contain alphabet, # not only numbers; and should be longer than one # character. First remove 'year' $Guess_jnl =~ s/^.*?\(?(19|20)\d\d\w*\)?\W*//; if ($Guess_jnl =~ /^[a-z]\W*$/i) { $Text =~ s/[^,;":?\/\[]+$//; goto LOOP }; # No captital letters if ($Guess_jnl !~ /[A-Z]/) { $Text =~ s/[^,;":?\/\[]+$//; goto LOOP }; # "Report of ... Conf.:1. Introduction. Canadian Medical Association Journal" if ($Guess_jnl !~ /^[a-z]+/i) { my @gWords = split(/\s+/, $Guess_jnl); if (scalar(@gWords) <= 3) { $Text =~ s/[^,;":?\/]+$//; goto LOOP } }; $Text = $Guess_jnl; } else { $Text =~ s/^[`']?\s*//; $Text =~ s/\s*$//; # 'title' is after 'year' (other cases are dealt by # $cite->{'jnl_epos'} in 'find_vol_{no}_pg_year()'.. if ($Text =~ /[,\s\(]+(19|20)\d\d[,\s\)]+\s*/) { $Text = $' }; }; my $end_dot = 0; $end_dot = 1 if ($Text =~ /\.$/); my @Title_words = (); my @Words = (); my $i = 0; # process from the end of the $Text to see if # a $Parts[$i] is (still) a part of a journal name. my @Parts = split(/\s*\.\s*/, $Text); for ($i = $#Parts; $i>=0; $i--) { next if ($Parts[$i] !~ /[a-z]/i); # author name may be mixed into the journal title # e.g. "Popescu S. and G. A. Sudbery. J. of Phy ..." if ($i > 0 and $Parts[$i-1] =~ /^([A-Z][a-z]* )*and\s+[A-Z]$/) { last }; if ($i > 1 and $Parts[$i-2] =~ /^([A-Z][a-z]* )*and\s+[A-Z]$/) { last if ($Parts[$i-1] =~ /^[A-Z]$/); }; # author name may be mixed into the journal title # e.g. "and Sudbery A. Multi-particle ..." if ($i > 0 and $Parts[$i] =~ /^[A-Z]$/) { # less than 4 words. if ($Parts[$i-1] =~ /^\S+\s+\S+(\s+\S+){0,2}$/ and $Parts[$i-1] =~ /^(and )?[A-Z].+?[A-Z]$/){ last } }; push(@Title_words, $Parts[$i]); last if $i == 0; # necessary test last if ($Parts[$i-1] =~ /et\s+al$/i); last if ($Parts[$i-1] =~ /^\s*\d+$/); @Words = split(/\s+/, $Parts[$i-1]); # stop if more than 4 words in $Parts[$i-1], # i.e. $Parts[$i-1] seems to contain article title, # not the journal name. However, be aware of: # "... method for propagating interfaces J. Comput. Phys." # next if (scalar(@Words) <= 2 and next if (scalar(@Words) <= 2 and $Parts[$i-1] !~ /^\d/); if (scalar(@Words) <= 4 and $Parts[$i-1] =~ /^([A-Z][a-z]*\s+){0,3}[A-Z][a-z]*$/){ next }; my $w = pop(@Words); # if ($w =~ /^[A-Z]$/ or $w =~ /^[A-Z][a-z]+$/) { # if ($w =~ /^J$/ or $w =~ /^[A-Z][a-z]+$/) { if ($w =~ /^J$/){ push(@Title_words, $w) }; last }; if (scalar(@Title_words) == 1) { $cite->{'title'} = $Title_words[0] } else { my @Title_words_real = reverse(@Title_words); $cite->{'title'} = join('.', @Title_words_real); }; $cite->{'title'} = "$cite->{'title'}\." if ($end_dot == 1); # normalise it $cite->{'title'} = normalise_journal($cite->{'title'}); return 1 }; sub full_name { my $Text = shift; $Text =~ s/(^|s*)Jr[. ]//i; return 1 if ($Text =~ /^\s*et al\s*$/i); return 0 if ($Text =~/^in /i); return 0 if ($Text !~ /[A-Z]/); # no upper case letter return 0 if ($Text =~ /\d+/); # $Text contains title. return 0 if ($Text =~ / (e-print|archive)s? /i); return 0 if ($Text =~ /\b(Collaboration|Review)\b/i); my $wCount = word_count($Text); return 0 if $wCount > 4; # "van Albada" or "van den Bergh" (surname only) return 0 if ($Text =~ /^((v\.|von|van|de|den|der)\s+)+\S\S+\s*$/i); # "van Buren D" return 1 if ($Text =~ /^(von|van|de|den|der)\s+\S\S+\s+([a-z]+\s*)+$/i); # (journal name) return 0 if ($Text =~ /\b(Phy\.|Physics|Journal|The)\b/i); # "J. Mod. Phys. D"; "Prog.Theor.Phys." return 0 if ($Text =~ /^([a-z]+\.\s*)+[a-z]?\s*$/i); # "Phys Rev A" # return 0 if ($Text =~ /^([a-z][a-z]+(\.| )){2,}[a-z]\.?\s*$/i); my @Abbr = (); # "Class. Quantum Grav." return 0 if (@Abbr = ($Text =~ /\S\S+?\./g) and scalar(@Abbr) >1); # "Nuovo Cim. B 44, 1 (1966)." return 0 if ($Text =~ /\w\w\w+\./); # 'W. B. Burton', 'Burton W. B.', 'W B Burton', etc. if (has_surname($Text) and has_initials($Text) and $wCount >= 1 and $wCount < 5 ) { return 1 }; # 'Vivek Agrawal', 'Liu Xin' types; hard to distinguish # surname/firstname. if ($wCount >= 2 and $wCount <= 3 and no_initials($Text)) { return 1 }; return 0 }; sub no_initials { my $Text = shift; # do not count 'Jr.' $Text =~ s/(\W)Jr\.?\s*$/$1/i; return 0 if ($Text =~ /(^| )[a-z]\./i); return 0 if ($Text =~ /(^| )[a-z]( |$)/i); return 1; }; sub only_initials { my $Text = shift; return 0 if ($Text =~ /^[a-z]{2,} /i); return 0 if ($Text =~ /\.?\s*[a-z][a-z]+$/i); my @Words = split(/[\.\s]/, $Text); my $Word; foreach $Word (@Words) { return 0 if (length($Word) >= 2)}; return 1 }; sub is_surname { my ($Text) = @_; $Text =~ s/ Jr\W+$//i; return 0 if ($Text =~ / (e-print|archive)s? /i); return 0 if ($Text =~ /\bCollaboration\b/i); return 1 if ($Text =~ /^(\s*[a-z][\-'a-z]+){1,3}$/i); # return 1 if ($Text =~ /^\s*[a-z]+[\-'a-z]+\s*$/i); return 0 } sub has_surname { my $Text = shift; return 0 if ($Text =~ /\d+/); return 1 if ($Text =~ /^[a-z]{2,}[\s\-']/i); # return 1 if ($Text =~ /[a-z]{2,}$/i); return 1 if ($Text =~ /[\-'\s.][a-z][a-z]+(\s+Jr\.?)?\s*$/i); return 0 } sub has_initials { my $Text = shift; return 0 if ($Text =~ /\d+/); return 1 if ($Text =~ /^\s*[']?\s*[A-Z](\s|\.|$)/); return 1 if ($Text =~ /(^|\s|\.)[a-z](\s|\.|$)/i); return 0 } # mainly used to count 'words' in author names sub word_count { my ($Text) = @_; #$Text =~ s/^[\s.]+//; #my @Words = split(/[\s.]+/, $Text); # return scalar(@Words); $Text =~ s/ (von|van|de|den|der) //g; $Text =~ s/^\s+//; $Text =~ s/\s+$//; my @Words_all = split(/\s+/, $Text); # ignore initials in names. # e.g. "C.A.R. Sa de Melo" is a name my @Words; my $W; while (@Words_all) { $W = shift @Words_all; push(@Words, $W) if ($W !~ /^[a-z]\.?$/i); }; return scalar(@Words); }; 1; __END__ =pod =back =head1 AUTHOR Original Author: Zhuoan Jiao Ported to Biblio interface by: Mike Jewell =cut libbiblio-citation-parser-perl-1.10+dfsg.orig/lib/Biblio/Citation/Parser/Citebase.pm0000644000175000017500000020146210115644570027635 0ustar gregoagregoapackage Biblio::Citation::Parser::Citebase; ###################################################################### # # Biblio::Citation::Parser::CiteBase; # ###################################################################### # # This file is part of ParaCite Tools (http://paracite.eprints.org/developers/) # # Copyright (c) 2004 University of Southampton, UK. SO17 1BJ. # # ParaTools is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # ParaTools is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with ParaTools; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # ###################################################################### =pod =head1 NAME Biblio::Citation::Parser::Citebase - Citebase's citation parsing module =head1 DESCRIPTION This module is an updated (and hopefully improved) version of Zhuoan Jiao's citation-parsing modules. =head1 SYNOPSIS use Biblio::Citation::Parser::Citebase; $parser = new Biblio::Citation::Parser::Citebase([$source_identifier]); $metadata = $parser->parse($citation); print "Author: ", $metadata->{aufirst}, " ", $metadata->{aulast}, "\n"; =cut use strict; use utf8; use Time::localtime; # optional, used by OpCit project. use vars qw(@ISA @EXPORT @EXPORT_OK); use Biblio::Citation::Parser::Jiao::Utility qw(normalisation normalise_html); use Text::Unidecode; # Used so we can just use a-z to match lowercase letters use Exporter; @ISA = qw(Exporter); @EXPORT = qw(); @EXPORT_OK = qw(&normalise_name &normalise_date &num_of_figures &print_out); #@EXPORT_OK = qw(&normalise_name &normalisation &normalise_date # &normalise_html &num_of_figures &print_out); =pod =item $p = new Biblio::Citation::Parser::Citebase([$citation],[$source_identifier]); Create a new citation parser, optionally parsing $citation with $source_identifier. If a citation is given the return blessed hash will contain the structured data. =cut sub new { my ($class,$citation,$sidentifier) = @_; $class = ref $class ? $class->{'_class'} : $class; # I'm sure there's a better way of doing this my $self; if( $citation ) { my %args = ( _class=>$class, sourceID=>$sidentifier, text=>$citation, rest_text=>$citation, ); @args{qw( aufull aulast aufirst auinit authors atitle title volume issue supl spage year targetURL rest_text date targetID featureID jnl_spos jnl_epos num_of_fig )} = (); $self = bless \%args, $class; $self->find_metadata(); $self->find_featureID(); # OpenURL mapping $self->{'id'} = $self->{'targetID'}; $self->{'pages'} = $self->{'spage'}; } else { $self = bless {_class=>$class}, $class; } return $self; } =pod =item $md = $p->parse($citation, [$source_identifier]); Parses a string, $citation, and returns a blessed hash of the structured data. =cut # This is a very nasty hack to allow this method sub parse { new(@_) } sub initialize { my $cite = shift; my $text = shift || die "Requires citation text to parse"; my $sidentifier = shift; $cite->{'text'} = $text; $cite->{'aufull'} = undef; $cite->{'aulast'} = undef; $cite->{'aufirst'}= undef; $cite->{'auinit'} = undef; $cite->{'authors'}= undef; $cite->{'atitle'} = undef; $cite->{'title'} = undef; $cite->{'volume'} = undef; $cite->{'issue'} = undef; $cite->{'supl'} = undef; $cite->{'spage'} = undef; $cite->{'year'} = undef; $cite->{'targetURL'} = undef; $cite->{'rest_text'} = $text; $cite->{'date'} = undef; $cite->{'sourceID'} = $sidentifier; $cite->{'targetID'} = undef; $cite->{'featureID'} = undef; $cite->{'jnl_spos'} = undef; $cite->{'jnl_epos'} = undef; $cite->{'num_of_fig'}= undef; $cite->find_metadata(); $cite->find_featureID(); # OpenURL mapping $cite->{'id'} = $cite->{'targetID'}; $cite->{'pages'} = $cite->{'spage'}; } # # Actions # sub pre_process { my $cite = shift; my $Text = shift || $cite->{'text'}; $Text = normalisation($Text); $Text = normalise_date($Text); $Text = normalise_html($Text); # remove front label to get accurate $nFig # (Note: do not perform this for arXiv ref. like: "46(4), 90 (1993)") # [Smith, 1998], [1], (1), (1a) ... $Text =~ s/^\s*[\[(]\s* # bracket ([^\])]+?)\s* # content [\])]\s*//x; # bracket # "1. Gary Smith, ...." $Text =~ s/^\d+\s*\.\s+//; # "1 Gary Smith, ...." $Text =~ s/^\s*\d+ ([A-Z])/$1/; # "2) Brand, P. ..." $Text =~ s/^[\[\(]?\s*\w+\s*[\])]\s*//; $cite->{'rest_text'} = $Text; my $nFig = num_of_figures($Text); $cite->{'num_of_fig'} = $nFig; return $Text; } sub find_metadata { my $cite = shift; return 0 if (!defined($cite->{'text'})); my $Text = $cite->pre_process($cite->{'text'}); $cite->{'targetID'} = $cite->complete_targetID($cite->find_targetID($cite->{'text'})); # find URL $cite->find_url(); my $nFig = $cite->{'num_of_fig'}; # find the authors if ($cite->find_authors()) { $cite->find_first_author() }; # find article titile $cite->find_atitle(); # only process references to 'journal' articles. return 0 if ($nFig == 0) ; # no number, ignore. return 0 if ($nFig >= 8); # too many numbers, maybe an error, ignore. # return 0 if ($cite->{'rest_text'} =~ /\W(proc.|proceedings) of /i); # extract 'supplement' first before find_vol_no_pg_year() $cite->find_supplement(); if ($cite->find_vol_no_pg_year() or $cite->find_vol_pg_year()) { $cite->find_jnl_name(); return 1 }; if ($cite->guess_vol_no_pg()) { $cite->find_jnl_name(); return 1; }; if ($cite->find_vol_no() or $cite->find_vol_supl()) { $cite->find_jnl_name(); $cite->find_page(); $cite->find_year(); return 1; }; if ($cite->guess_vol_pg()) { $cite->find_year(); $cite->find_jnl_name(); return 1; }; if ($cite->guess_vol_year()) { $cite->find_page(); $cite->find_jnl_name(); return 1; }; my $Count = 0; $Count++ if ($cite->find_year()); $Count++ if ($cite->find_vol()); $Count++ if ($cite->find_issue()); $Count++ if ($cite->find_supplement()); $Count++ if ($cite->find_jnl_name()); $Count++ if ($cite->find_page()); return 1 if ($Count >=2 ); # Last-ditch get any three numbers $cite->three_figs if $nFig <= 4; # too few metadata return 0 } sub three_figs { my $self = shift; my $Text = $self->{'text'}; # Remove the year return unless $Text =~ s/\(((?:19|20)\d{2})\)//; $self->{year} = $1; return unless $self->{year} or $Text =~ s/((?:19|20)\d{2})//; $self->{year} = $1; return unless $Text =~ s/(\d+)\s*-\s*[a-z]{0,2}(\d+)//i; $self->{spage} = $1; $self->{epage} = $2; return unless $` =~ /(\d+)\D+/; $self->{volume} = $1; return 1; } my @arXiv = qw(astro-ph cond-mat gr-qc hep-ex hep-lat hep-ph hep-th math-ph nucl-ex nucl-th physics quant-ph adap-org alg-geom chao-dyn chem-ph cmp-lg comp-gas cs dg-ga funct-an math mtrl-th neuro-cel neuro-dev neuro-sys nlin nlin-sys patt-sol plasm-ph q-alg solv-int supr-con math.AG math.AT math.AP math.CT math.CA math.CO math.CV math.DG math.DS math.FA math.GM math.GN math.GT math.GR math.HO math.KT math.LA math.LO math.MP math.MG math.NT math.NA math.OA math.OC math.PR math.QA math.RT math.RA math.SC math.SP math.SG); my %subarXiv; my $subarXivre = ''; foreach my $sa (@arXiv) { my $re = $sa; $re =~ s/(\W)/$1?/g; $subarXivre .= "(?:$re)|"; $re =~ s/\W//g; $sa =~ s/^math(\.\w\w)/math/i; # Fix to make maths identifiers match $subarXiv{$re} = $sa; } chop($subarXivre); $subarXivre = "($subarXivre)\\s*.\\s*(\\d{7})"; sub complete_targetID { my $self = shift; my $tid = shift || return; return $tid if $tid =~ /^oai:/; my $sid = $self->{'sourceID'}; if( !defined($sid) && $tid =~ /^$subarXivre.*$/oi ) { my ($sa,$no) = ($1,$2); $sa =~ s/\W//g; return "oai:arXiv.org:".$subarXiv{$sa}."/".$no; } if( !$sid ) { warn "Warning: Unable to expand \"$tid\" as no sourceID given"; return; } return unless ($sid =~ /oai\:([^\:]+)\:([^\:\/]+)/); my ($axv, $subaxv) = ($1,$2); $tid =~ s/.(\d{7})/\/$1/; if( $tid =~ /^[a-zA-Z]{2}/ && $tid =~ /^$subarXivre.*$/oi ) { my ($sa,$no) = ($1,$2); $sa =~ s/\W//g; return "oai:$axv:".$subarXiv{$sa}."/".$no; # normalise subarXiv component } if( $tid =~ /^\d/ ) { return "oai:$axv:$subaxv\/$tid"; } return; } # Copied (mostly) from Parser::arXivCite sub find_targetID { my ($self,$cite) = @_; # remove multiple spacing/tabs etc. $cite =~ s/\s+/ /sg; # remove space around '.' (math. DG => math.DB) $cite =~ s/\s*\.\s*/\./sg; # e.g. cond-mat/9910162 if( $cite =~ /\b((?:\w+-\w+).\d{7})(?:v\d+)?\b/ && $1 =~ /($subarXivre)/oi ) { return $1; } # e.g. math.GB/9912001 if( $cite =~ /\b((?:\w+\.\w+).\d{7})(?:v\d+)?\b/ && $1 =~ /($subarXivre)/oi ) { return $1; } # e.g. math/AG0206084, see oai:arXiv.org:math/0301128 if( $cite =~ /\b((?:\w+\/\w\w)\d{7})(?:v\d+)?\b/ ) { my $id = $1; $id =~ s/(\w+)\/(\D+)/$1.$2\//; if( $id =~ /($subarXivre)/oi ) { return $1; } } # e.g. physics/9912001 if( $cite =~ /\b((?:\w+).\d{7})(?:v\d+)?\b/ && $1 =~ /($subarXivre)/oi ) { return $1; } # e.g. 9912001 if( $cite =~ /\b(\d{2})([01][0-9])(\d{3})\b/ ) { my ($year, $month, $i) = ($1,$2,$3); if( $year < 91 ) { $year += 2000; } else { $year += 1900; } my $cyear = localtime->year() + 1900; if( $month >= 1 && $month <= 12 && $year <= $cyear ) { return $1.$2.$3; } } return; } sub find_atitle { my $cite = shift; my $Text = $cite->{'rest_text'}; # title is quoted. # return 0 if ($Text !~ /(['"])/); # # my $Qt = $1; # ignore ' case, because author nams may contain ', e.g. # A. I. L'vov, V. A. Petrun'kin, and M. Schumacher, # Phys. Rev. C 55, 359 (1997) return 0 if ($Text !~ /"/); if ($Text =~ /"(.+?)"\s*\.?/ and word_count($1) >= 2) { my $Guess_title = $1; return 0 if ($Guess_title =~ /^http:/i); $cite->{'atitle'} = $Guess_title; # use ';' ! # $Text =~ s/$Qt(.+?)$Qt\s*\.?/;/o; # $Text =~ s/"[^"]+"\s*\.?/;/; $Text =~ s/"[^"]+"/" "/; # $Text =~ s/[,;.]\s*[,;.]/,/g; # doesn't work while ($Text =~ /[,;.]\s*[,;.]/g) { $Text =~ s/[,;.]\s*[,;.]/,/ }; $Text =~ s/^[;" ]+//; $cite->{'rest_text'} = $Text; return 1 }; return 0 } # for the OpCit Project . sub find_featureID { my $cite = shift; my $featureID = ''; $featureID .= "v$cite->{'volume'}" if ($cite->{'volume'}); $featureID .= ":n$cite->{'issue'}" if ($cite->{'issue'}); $featureID .= ":s$cite->{'supl'}" if ($cite->{'supl'}); $featureID .= ":p$cite->{'spage'}" if ($cite->{'spage'}); $featureID .= ":y$cite->{'year'}" if ($cite->{'year'}); # tidy up # $featureID =~ s/:[nsp]\s*:/:/g; # doesn't work. while ($featureID =~ /:[nsp]\s*:/g) { $featureID =~ s/:[nsp]\s*:/:/ }; $featureID =~ s/^://; $featureID =~ s/\s+//g; my @Features = split(':', $featureID); # ignore those having too few metadata if (scalar(@Features) >= 2) { # standardize $featureID = lc($featureID); $cite->{'featureID'} = $featureID; }; } sub create_refID { my $cite = shift; my $refID; if ($cite->{'targetID'}) { $cite->{refID} = $cite->{'sourceID'}.':'.$cite->{'targetID'}; } elsif ($cite->{'featureID'}) { $cite->{refID} = $cite->{'sourceID'}.':'.$cite->{'featureID'}; }; } sub find_authors { my $cite = shift; my $Text = $cite->{'rest_text'}; my $aText = locate_authors($Text); return 0 if ($aText eq '' or $aText =~ /^\W+$/); my @Chunks = (); @Chunks = split(/\s*[,;:\&]\s*/, $aText); # ignore text longer than 4 words (don't count initials) return 0 if (word_count($Chunks[0])>4 and no_initials($Chunks[0])); my($author, $Authors) = ('',''); while (@Chunks) { if (scalar(@Chunks)==1) { last if !full_name($Chunks[0]); $author = normalise_name($Chunks[0]); $Authors = "$Authors:$author"; last }; # (1) forename and surname are not separated by [,;]. if (full_name($Chunks[0])){ if ($Chunks[1] =~ /^\s*Jr\.?\s*$/i) { $author = "$Chunks[0], $Chunks[1]"; $author = normalise_name($author); $Authors = "$Authors:$author"; splice(@Chunks, 0, 2); # remove the first two next } elsif (!only_initials($Chunks[1])) { $author = normalise_name($Chunks[0]); $Authors = "$Authors:$author"; shift(@Chunks); next } } elsif (full_name($Chunks[1])) { # $Chunks[0] is not a name, skip. shift @Chunks; next }; # (2) forename and surname are separated by [,;]. # Ignore text containing too many words. my $aFull = "$Chunks[0] $Chunks[1]"; my @abbr = (); last if (word_count($aFull) > 4); last if ($aFull =~ /[\d\/]+/); # journal title maybe mixed up with the name last if (@abbr = ($aFull =~ /\w\w\./g) and (@abbr >= 2)); # surname first. # "Oemler, A., Jr. and Lynds, C. R. 1975, ApJ, 199, 558" if (scalar(@Chunks) > 2) { if (is_surname($Chunks[0]) and has_initials($Chunks[1]) and $Chunks[2] =~ /^\s*Jr\.?\s*$/i) { $author = "$Chunks[1] $Chunks[0], Jr"; $author = normalise_name($author); $Authors = "$Authors:$author"; splice(@Chunks, 0, 3); # remove the first three next }; }; # surname first # "Reisenegger, A. and Miralda-Escude, J. 1995, ApJ, 449, 476 if (is_surname($Chunks[0]) and has_initials($Chunks[1])) { if ($Chunks[1] =~ /(.+?\.?)\s*Jr\.?\s*$/i){ $author = "$1 $Chunks[0], Jr"; } else { $author = "$Chunks[1] $Chunks[0]"; }; $author = normalise_name($author); $Authors = "$Authors:$author"; splice(@Chunks, 0, 2); # remove the first two next }; # forename first if (only_initials($Chunks[0]) and is_surname($Chunks[1])) { if ($Chunks[0] =~ /(.+?[. ])\s*Jr\.?\s*$/i){ $author = "$1 $Chunks[1], Jr"; } else { $author = $aFull }; $author = normalise_name($author); $Authors = "$Authors:$author"; splice(@Chunks, 0, 2); # remove the first two next }; # 'Liu, Gong', hard to tell which is the surname; if (no_initials($Chunks[0]) and no_initials($Chunks[1])) { if (word_count($aFull) <= 4 ) { $author = normalise_name($aFull); $Authors = "$Authors:$author"; splice(@Chunks, 0, 2); # remove the first two next } }; # cannot determin the author name last }; # end of while return 0 if ($Authors eq ''); $Authors =~ s/^://; $cite->{'authors'} = $Authors; } sub find_first_author { my $cite = shift; return 0 if (!defined($cite->{'authors'})); my ($author) = split(':', $cite->{'authors'}, 2); $cite->{'aufull'} = $author; if( $author =~ /(.*)[\s\._]([^\s\.]+)/ ) { $cite->{'aulast'} = $2; $cite->{'aufirst'} = $1; } } # locate_authors sub locate_authors { my $Text = shift; $Text =~ s/^\s*For .*?review(s)?\W+//i; $Text =~ s/^\s*(see )?also //i; $Text =~ s/^\s*see[, ]\s*for example\W+//i; $Text =~ s/^\s*see e\.g\.\W+//i; my $aText = $Text; # author name(s) is assumed to be in front of a consecutive # 4 words, e.g. J. A. Harvey. String Duality and Non-supersymmetric # Strings. # if ($Text =~ /\b([\w\-'`"]+\s+){3,}[\w\-'"]+\b/){ if ($Text =~ /\.\s+([\w\-'`"]+\s+){3,}[\w\-'"]{2,}\b/){ $aText = $`; }; if ($Text =~ /[,;]\s*([\w\-'`"]{2,}\s+){3,}[\w\-'"]{2,}\b/) { $aText = $`; }; # the above has truncated too much. # "S. Popescu and Sudbery G. A. Multi-particle entanglement ..." if (only_initials($aText)) { $aText = $Text }; if ($aText =~ /[,:; ]\s*[a-z][\w\-'"]*\s+([a-z0-9\-'"]+\s+)*?[a-z0-9\-'"]{4,}(\b|$)/) { # "[6] M.Gotay, Constraints, reduction and quantization, # J. Math. Phys. (1986) 2051. $aText = $`; }; # Or before the following sybmols. # if ($aText =~ /["\[\(]/) { if ($aText =~ /[:"\[\(]/) { $aText = $` }; # before '/', e.g. "Halzen F. astro-ph/0001001" if ($aText =~ /\S+\//) { $aText = $` }; # before any number if ($aText =~ /\d+/i) { $aText = $` }; # "14. A. J. Leggett, in Percolation, Localization and ..." # or "M. Göckeler, et al., hep-lat/9608033." if ($aText =~ /[,;: ]\s*(?:in )|(?:et\.?\s+al\.?\b)/i) { $aText = $` }; # last author name after 'and'. if ($aText =~ /[,; ]\s*and ([^,;:]+)[,:;]([^,;:]+)/i) { my $Aft1 = $1; my $Aft2 = $2; if (full_name($Aft1)) { $aText = $` .", $Aft1"; } else { $aText = $` .", $Aft1, $Aft2" } }; # # tidy up # # remove non-alphabets $aText =~ s/^[^a-z]+//i; $aText =~ s/^by //i; $aText =~ s/[,; ]+and /,/i; $aText =~ s/[,; ]+et\.?\s+al\.?([,; ]+|$)/, et al,/i; $aText =~ s/[,;:.]+\s*$//; return $aText }; # This subroutine needs re-written; not in use now. sub locate_book { my $cite = shift; my $Text = $cite->{'rest_text'}; if ($Text =~ /\W+in\s+(.+?)\W+(ed|eds|edited)\.?(\W|$)/) { $$cite{book} = $1; return 1 }; return 0 } sub find_vol_no { my $cite = shift; my $Text = $cite->{'rest_text'}; if ($Text =~ s/[,;. ]\s*(?:volume|vol|v)?\.?\s*(\d+)\s*[ ,;]\s*(?:n|no|issue|\#)\.?\s*(\d+)\b/$1/is) { $cite->{'volume'} = $2; $cite->{'issue'} = $3; $cite->{'jnl_epos'} = length($`); $cite->{'rest_text'} = $Text; return 1 } else { return 0} } sub find_vol_supl { my $cite = shift; my $Text = $cite->{'rest_text'}; if ($Text =~ s/(\s|,|;|\.)\s*(?:volume|vol|v)?\.?\s*(\d+)\s*[\s,;]\s*(?:supl|supplement)\.?\s*(\d+)\b/$1/is) { $cite->{'volume'} = $2; $cite->{'supl'} = $3; $cite->{'jnl_epos'} = length($`); $cite->{'rest_text'} = $Text; } } sub find_vol { my $cite = shift; my $Text = $cite->{'rest_text'}; if ($Text =~ s/[,;:\. ]\s*(?:volume|vol)[\. ]\s*([a-z]*\d+[a-z]*)\b//i) { $cite->{'volume'} = $1; $cite->{'rest_text'} = $Text; return }; # "..., Vol9 ..." if ($Text =~ s/[,;:\. ]\s*(?:volume|vol)(\d+[a-z]*)\b//i) { $cite->{'volume'} = $1; $cite->{'rest_text'} = $Text; return }; if ($Text =~ s/[,;:\. ]\s*(?:volume|vol)(\d+[a-z]*)\b//i) { $cite->{'volume'} = $1; $cite->{'rest_text'} = $Text; return }; # beware: "Smith, V. 1990, Phys. Rev. A. v. 10 ..." while ($Text =~ /[,;\. ]\s*V\s*[\. ]\s*([a-z]*\d+[a-z]*)\b/ig){ my $Guess_vol = $1; next if ($Guess_vol =~ /(19|20)\d\d/); $cite->{'volume'} = $Guess_vol; $Text =~ s/[,;\. ]\s*V\s*[\. ]\s*[a-z]*\d+[a-z]\b//i; $cite->{'rest_text'} = $Text; return }; # "... v10, ..." if ($Text =~ s/[,;:\. ]\s*V(\d+[a-z]*)\b//i) { $cite->{'volume'} = $1; $cite->{'rest_text'} = $Text; return }; } sub find_issue { my $cite = shift; my $Text = $cite->{'rest_text'}; if ($Text =~ s/[,;:. ]\s*(?:number|issue|num|no|Nr|\#)[. ]\s*([a-z]*\d+[a-z]*)\b//i) { $cite->{'issue'} = $1; $cite->{'rest_text'} = $Text; return }; # e.g. " ...No10, ..." if ($Text =~ s/[,;:. ]\s*(?:number|issue|num|no|Nr)(\d+[a-z]*)\b//i) { $cite->{'issue'} = $1; $cite->{'rest_text'} = $Text; return }; while ($Text =~ /[,;:. ]\s*N\s*[. ]\s*([a-z]*\d+[a-z]*)\b/ig){ my $Guess_issue = $1; next if ($Guess_issue =~ /(19|20)\d\d/); $cite->{'issue'} = $Guess_issue; $Text =~ s/[,;. ]\s*N\s*[. ]\s*[a-z]*\d+[a-z]*\b//i; return }; if ($Text =~ s/[,;:. ]\s*(?:n|\#|\#\s+)(\d+[a-z]*)\b//i) { $cite->{'issue'} = $1; $cite->{'rest_text'} = $Text; return }; } sub find_supplement { my $cite = shift; my $Text = $cite->{'rest_text'}; if ($Text =~ s/[,;:. ]\s*(?:suppl|supplement)\.?\s*(\d+)\b//i) { $cite->{'supl'} = $1; $cite->{'num_of_fig'} = $cite->{'num_of_fig'} - 1; $cite->{'rest_text'} = $Text } } sub find_url { my $cite = shift; my $Text = $cite->{'rest_text'}; if ($Text =~ s/\b(http:\/\/[^\s]+)['"]>/ /i){ $cite->{'targetURL'} = $1; $cite->{'rest_text'} = $Text; return 1 }; if ($Text =~ s/\b(http:\/\/[^\s>]+)(?:\s|$)/ /i){ $cite->{'targetURL'} = $1; $cite->{'targetURL'} =~ s/[.,;]$//; $cite->{'rest_text'} = $Text; return 1 }; return 0 } sub find_page { my $cite = shift; my $Text = $cite->{'rest_text'}; # keep the order of the pattern matching. # '... p.20, p 20, ...' if ($Text =~ s/[,;:. ]\s*(?:pages|page|pp)\s*[.# ]\s*([a-z]*\d+[a-z]*)\b//i) { $cite->{'spage'} = $1; $cite->{'rest_text'} = $Text; return }; # " ... pp20, ..." if ($Text =~ s/[,;:. ]\s*(?:pages|page|pp)(\d+[a-z]*)\b//i) { $cite->{'spage'} = $1; $cite->{'rest_text'} = $Text; return }; # ... p. 1990-1993 if ($Text =~ s/[,;. ]\s*(?:p)\s*[. ]\s* ([a-z]*\d+[a-z]*)\s*\-\s*[a-z]*d+[a-z]*\b//xi) { $cite->{'spage'} = $1; $cite->{'rest_text'} = $Text; return }; # Beaware "Smith P. 1990, ..., p. 100" while ($Text =~ /[,;. ]\s*p\s*[. ]\s*([a-z]*\d+[a-z]*)\s*(?!\-)/ig){ my $Guess_page = $1; next if ($Guess_page =~ /(19|20)\d\d/); $cite->{'spage'} = $Guess_page; $Text =~ s/[,;. ]\s*p\s*[. ]\s*[a-z]*\d+[a-z]*\s*(?!\-)//i; $cite->{'rest_text'} = $Text; return }; # " ... p20, ..." if ($Text =~ s/[,;:. ]\s*p(\d+[a-z]*)\b//i) { $cite->{'spage'} = $1; $cite->{'rest_text'} = $Text; return }; } sub find_year { my $cite = shift; return 1 if ($cite->{'year'}); my $Text = $cite->{'rest_text'}; # priority is given to (1989) type. if ($Text =~ s/\(((19|20)\d\d)\w?\)//) { $cite->{'year'} = $1; $cite->{'rest_text'} = $Text; return 1 }; # year like numbers not before/after a '-' # e.g. 1966-1988 may indicate a page range. if ($Text =~ /[^\w\-"]((19|20)\d\d)\w?([^\w\-"]|$)/i) { $cite->{'year'} = $1; $Text =~ "\Q$` $'\E"; $cite->{'rest_text'} = $Text; return 1 }; return 0; } # Apt'e, C., et al. ACM Transactions on Information Systems 12, 3, 233-251 sub guess_vol_no_pg { my $cite = shift; return 1 if ($cite->{'volume'} and $cite->{'issue'} and $cite->{'spage'}); return 0 if ($cite->{'num_of_fig'} < 3); my $Text = $cite->{'rest_text'}; # change (1,1) alike to (). $Text =~ s/\(\d+\s*,\s*\d+\s*\)/\(\)/g; $Text =~ s/\(\d+\s*;\s*\d+\s*\)/\(\)/g; if ($Text =~ /[^\w\/.-](?:volume|vol\.?|v\.?)?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+(?:n|no|number|issue|\#)?\.?\s*([a-z]*?\d+[a-z]*?) # issue [^\w\/.-]+(?:pages|page|pp|p)?\.? \s*([a-z]*?\d+[a-z]*?)(?:\s*-\s*[a-z]*?\d+[a-z]*?)? (\W*|$)/xi) { $cite->{'volume'} = $1; $cite->{'issue'} = $2; $cite->{'spage'} = $3; $cite->{'jnl_epos'} = length($`) + 1; return 1 }; return 0 } # '15:190' (15A:190-195, 14-15:190-180, or "Astrophys. J. 8, 103"); # Called this after '{find_vol_{no}_pg_year}' failed. sub guess_vol_pg { my $cite = shift; return 1 if ($cite->{'volume'} and $cite->{'spage'}); return 0 if ($cite->{'num_of_fig'} < 2); my $Text = $cite->{'rest_text'}; # change (1,1) alike to (). $Text =~ s/\(\d+\s*,\s*\d+\s*\)/\(\)/g; $Text =~ s/\(\d+\s*;\s*\d+\s*\)/\(\)/g; # 15A:190-195 type if ($Text =~ s/[^\w\/.-]([a-z]*?\d+[a-z]*?)\s*:\s*([a-z]*?\d+[a-z]*?)\s* (-\s*[a-z]*?\d+[a-z]*?)?(\W|$)/$4/xi) { $cite->{'volume'} = $1; $cite->{'spage'} = $2; $cite->{'jnl_epos'} = length($`) + 1; $cite->{'rest_text'} = $Text; return 1 }; # Astrophys. J. Lett., 452, p.L91-L93 # AIP, vol 307, p.117, New York (1994). # Pub. Astron. Soc. Japan, 2000, p.52 if ($Text =~ /[^\w\/.-](?:volume|vol\.?|v\.?)?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]*,\s*(?:p|pp|page|pages)[. ]\s*([a-z]*?\d+[a-z]*?)\s* (-\s*[a-z]*?\d+[a-z]*?)?(?:\W|$)/xi) { my $Guess_vol = $1; $cite->{'spage'} = $2; my $Guess_jnl_epos = length($`) + 1; # prematch if ($Guess_vol =~ /^(19|20)\d\d[a-z]?$/i) { $cite->{'year'} = $Guess_vol; $cite->{'rest_text'} =~ s/([^\w\/.-])(?:volume|vol\.?|v\.?)?\s*[a-z]*?\d+[a-z]*?\s*,\s*(?:p|pp|page|pages)\s*\.?[a-z]*?\d+[a-z]*?\s*(-\s*[a-z]*?\d+[a-z]*?)?(\W|$)/$1/i; return 0 }; $cite->{'volume'} = $Guess_vol; $cite->{'jnl_epos'} = $Guess_jnl_epos; $cite->{'rest_text'} =~ s/([^\w\/.-])[a-z]*?\d+[a-z]*?\s*,\s*(?:p|pp|page|pages)\s*\.?[a-z]*?\d+[a-z]*?\s*(-\s*[a-z]*?\d+[a-z]*?)?(\W|$)/$1/i; return 1 }; # Elias, J. 1994, NOAO Newsletter, No. 37, 1 if ($Text =~ /[^\w\/.-](?:n|no|num|issue)[. ]\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]*,\s*(?:p|pp|page|pages)?\.?\s*([a-z]*?\d+[a-z]*?)\s* (-\s*[a-z]*?\d+[a-z]*?)?(?:\W|$)/xi) { $cite->{'issue'} = $1; $cite->{'spage'} = $2; $cite->{'jnl_epos'} = length($`) + 1; # prematch $cite->{'rest_text'} =~ s/([^\w\/.-])(?:n|no|num|issue)[. ]\s*[a-z]*?\d+[a-z]*?[^\w\/.-]*,\s*(?:p|pp|page|pages)?\.?\s*([a-z]*?\d+[a-z]*?)\s*(-\s*[a-z]*?\d+[a-z]*?)?(?:\W|$)/$1/i; return 1 }; # match page range. # Phys. Rev. A 4, 52-60 # Pub. Astron. Soc. Japan, 1998, 52-60 if ($Text =~ /[^\w\/.-]([a-z]*?\d+[a-z]*?) # volume or year [^\w\/.-]*[, ]\s*([a-z]*?\d+[a-z]*?)\s* # pages -\s*[a-z]*?\d+[a-z]*?(?:[^\w-]|$)/xi) { my $Guess_vol = $1; $cite->{'spage'} = $2; my $Guess_jnl_epos = length($`) + 1; # prematch if ($Guess_vol =~ /^(19|20)\d\d[a-z]?$/i) { $cite->{'year'} = $Guess_vol; $cite->{'rest_text'} =~ s/([^\w\/.-])[a-z]*?\d+[a-z]*?\s*[, ]\s*([a-z]*?\d+[a-z]*?)\s*-\s*[a-z]*?\d+[a-z]*?(?:[^\w\/.-]|$)/$1/i; return 0 }; $cite->{'volume'} = $Guess_vol; $cite->{'jnl_epos'} = $Guess_jnl_epos; $cite->{'rest_text'} =~ s/([^\w\/.-])[a-z]*?\d+[a-z]*?\s*,\s*([a-z]*?\d+[a-z]*?)\s*-\s*[a-z]*?\d+[a-z]*?(?:[^\w\/.-]|$)/$1/i; return 1 }; # Phys. Rev. B 38, 2297. (Phys. Rev. B 38 2297) # Pub. Astron. Soc. Japan, 2000, 52. if ($Text =~ /[^\w\/.-]([a-uw-z]*?\d+[a-z]*?) [^\w\/.-]*[, ]\s*([a-z]?\d+[a-z]?)(?:[^\w\/.-]|$)/xi) { my $Guess_vol = $1; my $Guess_page = $2; $cite->{'jnl_epos'} = length($`) + 1; if ($Guess_vol =~ /^(19|20)\d\d[a-z]?$/i) { $cite->{'year'} = $Guess_vol; } else { $cite->{'volume'} = $Guess_vol; }; if ($Guess_page =~ /^(19|20)\d\d[a-z]?$/i) { $cite->{'year'} = $Guess_page; } else { $cite->{'spage'} = $Guess_page; }; $cite->{'rest_text'} =~ s/([^\w\/.-])[a-z]*?\d+[a-z]*?[^\w\/.-]*[, ]\s*[a-z]*?\d+[a-z]*?(?:[^\w\/.-]|$)/$1/i; return 1 if ($cite->{'volume'} and $cite->{'spage'}); return 0 }; return 0 }; # # G. Smith and H. Gray; Pub. Astron. Soc. Japan, 2000, vol. 52 # To find $cite->{'jnl_epos'} currectly. Note that '2000' may be # regarded as the journal name (by subroutine find_vol). sub guess_vol_year { my $cite = shift; return 0 if ($cite->{'num_of_fig'} < 2); my $Text = $cite->{'rest_text'}; # change (1,1) alike to (). $Text =~ s/\(\d+\s*,\s*\d+\s*\)/\(\)/g; $Text =~ s/\(\d+\s*;\s*\d+\s*\)/\(\)/g; if ($Text =~ /[^\w\/.-]\(?((19|20)\d\d)\w?\)?[^\w\/.-]* (?:volume|vol|v)\W*([a-oq-z]*?\d+[a-z]*?)(\W|$)/xis) { $cite->{'year'} = $1; $cite->{'volume'} = $3; $cite->{'jnl_epos'} = length($`); return 1 }; # be aware: "Workshop on ..., p30 (1999)." if ($Text =~ /[^\w\/.-](?:volume|vol|v)?\W*([a-oq-z]?\d+[a-z]?) [^\w\/.-]+\(?((19|20)\d\d)\w?\)?(\W|$)/xis) { $cite->{'volume'} = $1; $cite->{'year'} = $2; $cite->{'jnl_epos'} = length($`); return 1 }; return 0 }; sub find_vol_no_pg_year { my $cite = shift; return 1 if ($cite->{'volume'} and $cite->{'issue'} and $cite->{'spage'} and $cite->{'year'}); return 0 if ($cite->{'num_of_fig'} < 4); my $Text = $cite->{'rest_text'}; # change (1,1) alike to (). $Text =~ s/\(\d+\s*,\s*\d+\s*\)/\(\)/g; $Text =~ s/\(\d+\s*;\s*\d+\s*\)/\(\)/g; # Keep the following order of texting $Text; # Important: check 'year' at the end first. # (A.1): # 'year' is at the end, within bracket. # ..., v.517, no. 1, p.190-200, (1999) # ..., 11(2), 100-105, (1999) if ($Text =~ /[^\w\/.-](?:volume|vol\.?|v\.?)?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+(?:n|no|number|issue|\#)?\.?\s*([a-z]*?\d+[a-z]*?) # issue [^\w\/.-]+(?:pages|page|pp|p)?\.? \s*([a-z]*?\d+[a-z]*?)(?:\s*-\s*[a-z]*?\d+[a-z]*?)? \W*\(((19|20)\d\d)[a-z]*?\)(\W|$)/xi) { $cite->{'volume'} = $1; $cite->{'issue'} = $2; $cite->{'spage'} = $3; $cite->{'year'} = $4; $cite->{'jnl_epos'} = length($`) + 1; return 1 }; # (A.2) 'year' is in the middle, within bracket. # ..., 4(2), (1999), 100-105 if ($Text =~ /[^\w\/.-](?:volume|vol\.?|v\.?)?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+(?:n|no|number|issue|\#)?\.?\s*([a-z]*?\d+[a-z]*?) # issue \W*\(((19|20)\d\d)[a-z]*?\) # year \W*(?:pages|page|pp|p)?\.?\s*([a-z]*?\d+[a-z]*?)(\W|$)/xi) { $cite->{'volume'} = $1; $cite->{'issue'} = $2; $cite->{'year'} = $3; $cite->{'spage'} = $5; $cite->{'jnl_epos'} = length($`) + 1; return 1 }; # (A.3.1) 'year' is at the beginning, within bracket, after # journal title; # ...., (1999), 517, no. 1, p.190-200 if ($Text =~ /\(((19|20)\d\d)[a-z]*?\)[,.;\s:]* # year (?:volume|vol|v)?\.?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+(?:n|no|number|issue|\#)?\.?\s*([a-z]*?\d+[a-z]*?) # issue [^\w\/.-]+(?:pages|page|pp|p)?\.?\s*([a-z]*?\d+[a-z]*?)(\W|$)/ix) { $cite->{'year'} = $1; $cite->{'volume'} = $3; $cite->{'issue'} = $4; $cite->{'spage'} = $5; $cite->{'jnl_epos'} = length($`); return 1; }; # (A.3.2) 'year' is at the beginning, within bracket, before # journal title; # ..., (1999),..., 517, no. 1, p.190-200 if ($Text =~ /\(((19|20)\d\d)[a-z]*?\) # year ([^(]+?) [^\w\/.-](?:volume|vol|v)?\.?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+(?:n|no|number|issue|\#)?\.?\s*([a-z]*?\d+[a-z]*?) # issue [^\w\/.-]+(?:pages|page|pp|p)?\.?\s*([a-z]*?\d+[a-z]*?)(\W|$)/ix){ $cite->{'year'} = $1; $cite->{'volume'} = $4; $cite->{'issue'} = $5; $cite->{'spage'} = $6; # $cite->{'jnl_spos'} = length($`); # $cite->locate_jnl_epos(); $cite->{'jnl_epos'} = length($`) + length($1) + length($3); return 1; }; # (B.1): # 'year' is at the end, but not in bracket; # ..., v.517, no. 1, p.190-200, 1999 # ..., 517, no. 1, p.190-200, 1999 if ($Text =~ /[^\w\/.-](?:volume|vol\.?|v\.?)?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+(?:n|no|number|issue|\#)?\.?\s*([a-z]*?\d+[a-z]*?) # issue [^\w\/.-]+(?:pages|page|pp|p)?\.? \s*([a-z]*?\d+[a-z]*?)(?:\s*-\s*[a-z]*?\d+[a-z]*?)? [^\w(:\/.-]+?((19|20)\d\d)[a-z]?\s*(?![)-])/xi) { $cite->{'volume'} = $1; $cite->{'issue'} = $2; $cite->{'spage'} = $3; $cite->{'year'} = $4; $cite->{'jnl_epos'} = length($`) + 1; return 1 }; # (B.2): 'year' is in the middle, but not in bracket. # 4(2), 1999, 100-105 if ($Text =~ /[^\w\/.-](?:volume|vol\.?|v\.?)?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+(?:n|no|number|issue|\#)?\.?\s*([a-z]*?\d+[a-z]*?) # issue [^\w(:\/.-]+?\s*((19|20)\d\d)[a-z]? # year \s*[^\w\/.)-]+?\s*(?:pages|page|pp|p)?\.?\s*([a-z]*?\d+[a-z]*?)(\W|$)/xi) { $cite->{'volume'} = $1; $cite->{'issue'} = $2; $cite->{'year'} = $3; $cite->{'spage'} = $5; $cite->{'jnl_epos'} = length($`) + 1; return 1 }; # (B.3.1): 'year' is at beginning, not in bracket, after title; # ..., 1999, v.517, no. 1, p.190-200 # " ... 1890-1999", MNRAS, 2000, 4:1, p 1990 if ($Text =~ /[^"(\/.-]\s*((19|20)\d\d)[a-z]?[,;\.\s]+ # year (?:volume|vol|v)?\.?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+?(?:n|no|number|issue|\#)?\.?\s*([a-z]*?\d+[a-z]*?) [^\w\/.-]+(?:pages|page|pp|p)?\.?\s*([a-z]*?\d+[a-z]*?)(\W|$)/ix) { $cite->{'year'} = $1; $cite->{'volume'} = $3; $cite->{'issue'} = $4; $cite->{'spage'} = $5; $cite->{'jnl_epos'} = length($`) + 1; return 1 }; # (B.3.2): 'year' is at beginning, not in bracket, before title; # 1999, ..., v.517, no. 1, p.190-200 # 1999, ..., 517, no. 1, p.190-200 # 1999, ..., 517(1), 190-200 # NB: 1999, "... 1.5 factor ....", 517(1), 190-200 # NB: B. Greene, editors, "Fields, Strings and Duality, TASI 1996", # pages 421-540, World Scientific, 1997. # " ... 1890-1999", MNRAS, 2000, 4:1, p 1990 if ($Text =~ /(?:^|[^"(\/.-])\s*((19|20)\d\d)[a-z]? # year [^\w:")(\/-][^(]*? [^\w\/.-](?:volume|vol|v)?\.?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+?(?:n|no|number|issue|\#)?\.?\s*([a-z]?\d+[a-z]?) [^\w\/.-]+(?:pages|page|pp|p)?\.?\s*([a-z]*?\d+[a-z]*?)(\W|$)/ix) { $cite->{'year'} = $1; $cite->{'volume'} = $3; $cite->{'issue'} = $4; $cite->{'spage'} = $5; $cite->{'jnl_spos'} = length($`); $cite->locate_jnl_epos(); return 1 }; return 0 }; # For cases where 'vol, page, year' can be identified correctly. sub find_vol_pg_year { my $cite = shift; return 1 if ($cite->{'volume'} and $cite->{'spage'} and $cite->{'year'}); return 0 if ($cite->{'num_of_fig'} < 3); my $Text = $cite->{'rest_text'}; # change (1,1) alike to (). $Text =~ s/\(\d+\s*,\s*\d+\s*\)/\(\)/g; $Text =~ s/\(\d+\s*;\s*\d+\s*\)/\(\)/g; # (A.1) 'year' is at the end, within bracket. # ......, vol.8:100, (1999) # ......, 8:100, (1999) # ~~~~ if ($Text =~ /(?:^|[^\w\/.-])(?:volume|vol\.?|v\.?)?\s*([a-z]*\d+[a-z]*) # volume [^\w\/.-]+(?:pages|page|pp|p)?\.? \s*([a-z]?\d+[a-z]?)(?:\s*-\s*[a-z]?\d+[a-z]?)? \W*\(((19|20)\d\d)[a-z]?\)(\W|$)/xi) { $cite->{'volume'} = $1; $cite->{'spage'} = $2; $cite->{'year'} = $3; $cite->{'jnl_epos'} = length($`) + 1; return 1 }; # (A.2) 'year' is in the middle, within bracket. # ......, 8, (1999), 100-105 if ($Text =~ /(?:^|[^\w\/.-])(?:volume|vol\.?|v\.?)?\s*([a-z]*?\d+[a-z]*?) # volume \W*\(((19|20)\d\d)[a-z]?\) # year \W*(?:pages|page|pp|p)?\.? \s*([a-z]?\d+[a-z]?)(?:\s*-\s*[a-z]?\d+[a-z]?)?(\W|$)/xi) { $cite->{'volume'} = $1; $cite->{'year'} = $2; $cite->{'spage'} = $4; $cite->{'jnl_epos'} = length($`) + 1; return 1 }; # (A.3.1.) 'year' is at beginning, within bracket, after title; # ......, (1999) 517, 190-200 if ($Text =~ /\(((19|20)\d\d)[a-z]?\)[,;\.\s]* # year (?:volume|vol|v)?\.?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+(?:pages|page|pp|p)?\.?\s*([a-z]?\d+[a-z]?)(\W|$)/ix){ $cite->{'year'} = $1; $cite->{'volume'} = $3; $cite->{'spage'}= $4; $cite->{'jnl_epos'} = length($`); return 1; }; # (A.3.1.1) 'year' is at beginning, within bracket, after title; # not 'vol', buy 'No.@, e.g."..., (1999) No. 517, 190-200 if ($Text =~ /\(((19|20)\d\d)[a-z]?\)[,;\.\s]* # year (?:number|no|n)\.?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+(?:pages|page|pp|p)?\.?\s*([a-z]?\d+[a-z]?)(\W|$)/ix){ $cite->{'year'} = $1; $cite->{'volume'} = $3; $cite->{'spage'}= $4; $cite->{'jnl_epos'} = length($`); return 1; }; # (A.3.2.) 'year' is at beginning, within bracket, before title; # ..., (1999),..., 517, p.190-200 if ($Text =~ /\(((19|20)\d\d)[a-z]?\) # year [^(]+? [^\w\/.-](?:volume|vol|v)?\.?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+(?:pages|page|pp|p)?\.?\s*([a-z]?\d+[a-z]?)(\W|$)/ix){ $cite->{'year'} = $1; $cite->{'volume'} = $3; $cite->{'spage'} = $4; $cite->{'jnl_spos'} = length($`); $cite->locate_jnl_epos(); return 1; }; # (B.1) 'year' is at the end, but not in bracket. # ......, vol.8:100, 1999 # ......, 8:100, 1999 # NB: ..., 1999, 8(1900) # ~~~~ if ($Text =~ /[^\w\/.-](?:volume|vol\.?|v\.?)?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+(?:pages|page|pp|p)?\.? \s*([a-z]?\d+[a-z]?)(?:\s*-\s*[a-z]?\d+[a-z]?)? # page [^\w:(\/.-]+\s*((19|20)\d\d)[a-z]?\s*(?![)-])/xi) { $cite->{'volume'} = $1; $cite->{'spage'} = $2; $cite->{'year'} = $3; $cite->{'jnl_epos'} = length($`) + 1; return 1 }; # (B.2) 'year' is in the middle, but not in brackets; # ... 8, 1999, p.100 # ... 8, 1999, 100-105 if ($Text =~ /[^\w\/.-](?:volume|vol\.?|v\.?)?\s*([a-z]*?\d+[a-z]*?) # volume [^\w:(\/.-]+?\s*((19|20)\d\d)[a-z]? # year [^\w\/.)-]+(?:pages|page|pp|p)?\.?\s*([a-z]?\d+[a-z]?)(\W|$)/xi) { $cite->{'volume'} = $1; $cite->{'year'} = $2; $cite->{'spage'} = $4; $cite->{'jnl_epos'} = length($`) + 1; return 1 }; # (B.3.1) 'year' is at the beginning,not in bracket, after title; # ..., 1999, 8, p1990 if ($Text =~ /[^\w\/.(-]\s*((19|20)\d\d)[a-z]?[,;\.\s]+ (?:volume|vol|v)?\.?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+(?:pages|page|pp|p)?\.?\s*([a-z]?\d+[a-z]?)(\W|$)/ix){ $cite->{'year'} = $1; $cite->{'volume'} = $3; $cite->{'spage'} = $4; $cite->{'jnl_epos'} = length($`)+1; return 1 }; # (B.3.1.1) 'year' is at the beginning,not in bracket, after title; # no 'vol', but 'no.' e.g. ..., 1999, No. 8, p1990 if ($Text =~ /[^\w\/.(-]\s*((19|20)\d\d)[a-z]?[,;\.\s]+ (?:number|no|n)\.?\s*([a-z]*?\d+[a-z]*?) # no volume, but issues [^\w\/.-]+(?:pages|page|pp|p)?\.?\s*([a-z]?\d+[a-z]?)(\W|$)/ix){ $cite->{'year'} = $1; $cite->{'issue'} = $3; $cite->{'spage'} = $4; $cite->{'jnl_epos'} = length($`)+1; return 1 }; # (B.3.2) 'year' is at beginning, not in bracket, before title; # 1999, ..., 8(100) if ($Text =~ /((^|[^"\/.(-])\s*)(((19|20)\d\d)[a-z]?) # year ([^\w:")(\/][^(]*?) [^\w\/.-](?:volume|vol|v)?\.?\s*([a-z]*?\d+[a-z]*?) # volume [^\w\/.-]+(?:pages|page|pp|p)?\.?\s*([a-z]?\d+[a-z]?)(\W|$)/ix){ $cite->{'year'} = $4; $cite->{'volume'} = $7; $cite->{'spage'} = $8; # $cite->{'jnl_spos'} = length($`); # $cite->locate_jnl_epos(); $cite->{'jnl_epos'} = length($`) + length($1) + length($3) + length($6); return 1 }; return 0 } # This subroutine is only called when the journal title is between # 'year' and 'vol/page', e.g. (a lot in astro-ph/) # Barnes, J., Efstathiou, G., 1987, ApJ, 319, 575 # For other cases, the cite{'jnl_epos'} is determined while trying to # find out the vol, page, year, i.e. in 'find_vol_no_pg_year' kind # of subroutines. # sub locate_jnl_epos { my $cite = shift; my $sPos = $cite->{'jnl_spos'}; my $Text = substr($cite->{'rest_text'}, $sPos); # $Text =~ s/(\W+)(?:pages|page|pp|p)\W*(\d+)/$1$2/; # $Text =~ s/-\d+[a-z]*?//; # pp100-105 # Before 'volume' if ($Text =~ /\b(?:volume|vol\.?|v\.?)\s*[a-z]*?\d+[a-z]*?(?![.0-9])/i) { $cite->{'jnl_epos'} = length($`) + $sPos; return 1 }; # (1997) Phys. Rev. E56, No.3, 2875 # (1997) Phys. Rev. A50, p.160 if ($Text =~ / [^\w\/.-](?:volume|vol\.?|v\.?)?\s*[a-z]*?\d+[a-z]*? # volume [^\w\/.-]+(?:n |n.|no |no.|number |issue |\#|p |p.|pp.|page )\s*[a-z]*?\d+[a-z]*? (?:\W|$)/xi) { $cite->{'jnl_epos'} = length($`) + $sPos + 1 ; return 1 }; # Before any two consecutive numbers, but not '123-127' style page. # Bertelli, G., 1999, ApJ, 517(1), .... # ApJ, 517:1, ... # ApJ, 517:367-380. #Beaware: J.K. Lanyi. 1999. Structure of bacteriorhodopsin at 1.55 # angstrom resolution J. Mol. Bio. 291:899-911 ~~~~! if ($Text =~ /[^\w\/.-][a-z]*?\d+[a-z]*?\s*[,:(\s]\s* [a-z]?\d+[a-z]?(\W|$)/xi) { $cite->{'jnl_epos'} = length($`) + $sPos + 1; return 1 }; return 0 }; sub find_jnl_name { my $cite = shift; return 1 if ($cite->{'title'}); return 0 if (! $cite->{'jnl_epos'}); # Assumption: journal name usually starts after a ',;' # or " which is used to enclose the article title, # and does not contain those symbols (i.e. ,;") # my $Text = substr($cite->{'rest_text'}, 0, $cite->{'jnl_epos'}); my $Guess_jnl; # Linden, N., et al. quantph/9711016 and Fortsch. Phys. 46, 567 (1998) #if ($Text =~ m{[^/]+/\w+\s*(.+)$}) { # $Text = $1 # }; LOOP: # remove trailing symbols $Text =~ s/\s*[,;":\/\[\(]*\s*$//s; # ignore anything in brackets (head/tail position) $Text =~ s/\W*\([^\)]+\)?\W*$//; $Text =~ s/^\s*\([^\)]+\)\W+//; return 0 if ($Text eq ''); # quite many citations are like this: # "P. Reiter, et al:Phys. Rev. Lett. 82 (1999) 509" # hard to separate name from journal title. Other cases # are: '..., J.PHY.G:NUCL.PART.PHY.'. Have to compramise. if ($Text =~ /([^,;":?\/\[]+)$/) { $Guess_jnl = $1; $Guess_jnl =~ s/^['`]?\s*//; $Guess_jnl =~ s/\s+$//; # ignore things in brackets $Guess_jnl =~ s/\W*\([^\)]+\)?\W*$//; $Guess_jnl =~ s/^\([^\)]+\)\W*//; # journal name should begin and contain alphabet, # not only numbers; and should be longer than one # character. First remove 'year' $Guess_jnl =~ s/^.*?\(?(19|20)\d\d\w*\)?\W*//; if ($Guess_jnl =~ /^[a-z]\W*$/i) { $Text =~ s/[^,;":?\/\[]+$//; goto LOOP }; # No captital letters if ($Guess_jnl !~ /[A-Z]/) { $Text =~ s/[^,;":?\/\[]+$//; goto LOOP }; # "Report of ... Conf.:1. Introduction. Canadian Medical Association Journal" if ($Guess_jnl !~ /^[a-z]+/i) { my @gWords = split(/\s+/, $Guess_jnl); if (scalar(@gWords) <= 3) { $Text =~ s/[^,;":?\/]+$//; goto LOOP } }; $Text = $Guess_jnl; } else { $Text =~ s/^[`']?\s*//; $Text =~ s/\s*$//; # 'title' is after 'year' (other cases are dealt by # $cite->{'jnl_epos'} in 'find_vol_{no}_pg_year()'.. if ($Text =~ /[,\s\(]+(19|20)\d\d[,\s\)]+\s*/) { $Text = $' }; }; my $end_dot = 0; $end_dot = 1 if ($Text =~ /\.$/); my @Title_words = (); my @Words = (); my $i = 0; # process from the end of the $Text to see if # a $Parts[$i] is (still) a part of a journal name. my @Parts = split(/\s*\.\s*/, $Text); for ($i = $#Parts; $i>=0; $i--) { next if ($Parts[$i] !~ /[a-z]/i); # author name may be mixed into the journal title # e.g. "Popescu S. and G. A. Sudbery. J. of Phy ..." if ($i > 0 and $Parts[$i-1] =~ /^([A-Z][a-z]* )*and\s+[A-Z]$/) { last }; if ($i > 1 and $Parts[$i-2] =~ /^([A-Z][a-z]* )*and\s+[A-Z]$/) { last if ($Parts[$i-1] =~ /^[A-Z]$/); }; # author name may be mixed into the journal title # e.g. "and Sudbery A. Multi-particle ..." if ($i > 0 and $Parts[$i] =~ /^[A-Z]$/) { # less than 4 words. if ($Parts[$i-1] =~ /^\S+\s+\S+(\s+\S+){0,2}$/ and $Parts[$i-1] =~ /^(and )?[A-Z].+?[A-Z]$/){ last } }; push(@Title_words, $Parts[$i]); last if $i == 0; # necessary test last if ($Parts[$i-1] =~ /et\s+al$/i); last if ($Parts[$i-1] =~ /^\s*\d+$/); @Words = split(/\s+/, $Parts[$i-1]); # stop if more than 4 words in $Parts[$i-1], # i.e. $Parts[$i-1] seems to contain article title, # not the journal name. However, be aware of: # "... method for propagating interfaces J. Comput. Phys." # next if (scalar(@Words) <= 2 and next if (scalar(@Words) <= 2 and $Parts[$i-1] !~ /^\d/); if (scalar(@Words) <= 4 and $Parts[$i-1] =~ /^([A-Z][a-z]*\s+){0,3}[A-Z][a-z]*$/){ next }; my $w = pop(@Words); # if ($w =~ /^[A-Z]$/ or $w =~ /^[A-Z][a-z]+$/) { if ($w =~ /^J$/ or $w =~ /^[A-Z][a-z]+$/) { push(@Title_words, $w) }; last }; if (scalar(@Title_words) == 1) { $cite->{'title'} = $Title_words[0] } else { my @Title_words_real = reverse(@Title_words); $cite->{'title'} = join('.', @Title_words_real); }; $cite->{'title'} = "$cite->{'title'}\." if ($end_dot == 1); # normalise it $cite->{'title'} = normalise_journal($cite->{'title'}); return 1 }; sub full_name { my $Text = shift; $Text =~ s/(^|s*)Jr[. ]//i; return 1 if ($Text =~ /^\s*et al\s*$/i); return 0 if ($Text =~/^in /i); return 0 if ($Text !~ /[A-Z]/); # no upper case letter return 0 if ($Text =~ /\d+/); # $Text contains title. return 0 if ($Text =~ / (e-print|archive)s? /i); return 0 if ($Text =~ /\b(Collaboration|Review)\b/i); my $wCount = word_count($Text); return 0 if $wCount > 4; # "van Albada" or "van den Bergh" (surname only) return 0 if ($Text =~ /^((von|van|de|den|der)\s+)+\S\S+\s*$/i); # "van Buren D" return 1 if ($Text =~ /^(von|van|de|den|der)\s+\S\S+\s+([a-z]+\s*)+$/i); # (journal name) return 0 if ($Text =~ /\b(Phy\.|Physics|Journal|The)\b/i); # "J. Mod. Phys. D"; "Prog.Theor.Phys." return 0 if ($Text =~ /^([a-z]+\.\s*)+[a-z]?\s*$/i); # "Phys Rev A" # return 0 if ($Text =~ /^([a-z][a-z]+(\.| )){2,}[a-z]\.?\s*$/i); my @Abbr = (); # "Class. Quantum Grav." return 0 if (@Abbr = ($Text =~ /\S\S+?\./g) and scalar(@Abbr) >1); # "Nuovo Cim. B 44, 1 (1966)." return 0 if ($Text =~ /\w\w\w+\./); # 'W. B. Burton', 'Burton W. B.', 'W B Burton', etc. if (has_surname($Text) and has_initials($Text) and $wCount >= 1 and $wCount < 5 ) { return 1 }; # 'Vivek Agrawal', 'Liu Xin' types; hard to distinguish # surname/firstname. if ($wCount >= 2 and $wCount <= 3 and no_initials($Text)) { return 1 }; return 0 }; sub no_initials { my $Text = shift; # do not count 'Jr.' $Text =~ s/(\W)Jr\.?\s*$/$1/i; return 0 if ($Text =~ /(^| )[a-z]\./i); return 0 if ($Text =~ /(^| )[a-z]( |$)/i); return 1; }; sub only_initials { my $Text = shift; return 0 if ($Text =~ /^[a-z]{2,} /i); return 0 if ($Text =~ /\.?\s*[a-z][a-z]+$/i); my @Words = split(/[\.\s]/, $Text); my $Word; foreach $Word (@Words) { return 0 if (length($Word) >= 2)}; return 1 }; sub is_surname { my ($Text) = @_; $Text =~ s/ Jr\W+$//i; return 0 if ($Text =~ / (e-print|archive)s? /i); return 0 if ($Text =~ /\bCollaboration\b/i); return 1 if ($Text =~ /^(\s*[a-z][\-'a-z]+){1,3}$/i); # return 1 if ($Text =~ /^\s*[a-z]+[\-'a-z]+\s*$/i); return 0 } sub has_surname { my $Text = unidecode(shift); return 0 if ($Text =~ /\d+/); return 1 if ($Text =~ /^[a-z]{2,}[\s\-\']/i); # return 1 if ($Text =~ /[a-z]{2,}$/i); return 1 if ($Text =~ /[\-\'\s.][a-z][a-z]+(\s+Jr\.?)?\s*$/i); return 0 } sub has_initials { my $Text = unidecode(shift); return 0 if ($Text =~ /\d+/); return 1 if ($Text =~ /^\s*[']?\s*[A-Z](\s|\.|$)/); return 1 if ($Text =~ /(^|\s|\.)[a-z](\s|\.|$)/i); return 0 } # mainly used to count 'words' in author names sub word_count { my ($Text) = @_; #$Text =~ s/^[\s.]+//; #my @Words = split(/[\s.]+/, $Text); # return scalar(@Words); $Text =~ s/ (von|van|de|den|der) //g; $Text =~ s/^\s+//; $Text =~ s/\s+$//; my @Words_all = split(/\s+/, $Text); # ignore initials in names. # e.g. "C.A.R. Sa de Melo" is a name my @Words; my $W; while (@Words_all) { $W = shift @Words_all; push(@Words, $W) if ($W !~ /^[a-z]\.?$/i); }; return scalar(@Words); }; # # Normalisation utilities # sub normalisation_old { die; my($Text) = @_; # replace embedded '\n' with ' ' $Text =~ s/^\s+//s; $Text =~ s/\s+$//s; while ($Text =~ /.+?\n.+?/sg) { $Text =~ s/(.+?)\n(.+?)/$1 $2/s }; $Text =~ s/\s*-\s*/-/g; # remove space around '-' $Text =~ s/\s*'\s*/'/g; # remove space around ' $Text =~ s/\s*:\s*/:/g; # remove space around : $Text =~ s/\(\s+/\(/g; # ( 1998) ==> (1998) $Text =~ s/\s+\)/\)/g; # (1998 ) ==> (1998) while ($Text =~/--/g) {$Text =~ s/--/-/}; # use single '-'. $Text =~ s/~//g; # remove '~' (e.g. C.~B.~Hanna) $Text =~ s/\s+/ /g; # use single space; $Text =~ s/[,;\s]+$//; # remove last ',;\s' on a line # 'Nr.' caused error in 'find_jnl_name', i.e. it became as # 'journal name' if not removed. (see: arXiv:quant-ph/9905016) $Text =~ s/([,;])\s*Nr\.\s*(\d+[,;])/$1$2/i; # "[12] For example, R. Machleidt, ...Phys. Rep. 149, 1 (1987) $Text =~ s/^([^a-z]+)for example\W+/$1/i; # '[18] *** G. Do Dang, ... (arXiv:nucl-th/9911081) $Text =~ s/\*+//g; # Phys. Rev. D56 => Phys. Rev. D. 56 $Text =~ s/phys.{1,6}rev.{1,6}([a-z])(\d+)/Phys. Rev. $1 $2/ig; return $Text; }; sub normalise_html_old { die; my($Text) = @_; # remove
tag $Text =~ s/
//ig; $Text =~ s/&(\w)acute[;,]/$1/g; # a ' on top of (\w) $Text =~ s/&(\w)cedil[;,]/$1/g; # a 'tail' under (\w), e.g Francios $Text =~ s/&(\w)grave[;,]/$1/g; # a ` on top of (\w) $Text =~ s/&(\w)tilde[;,]/$1/g; $Text =~ s/&(\w)uml[;,]/$1e/g; # a '..' on top of (\w) $Text =~ s/&(\w)slash[;,]/$1/g; #$Text =~ s/&#-88;(\w)/$1/g; # as &(\w)uml (see astro-ph/9811179) $Text =~ s/&#-\d+;\s*(\w)/$1/g; $Text =~ s/ß[;,]/ss/g; $Text =~ s/&[;,]/ and /g; $Text =~ s/\s*(\w)/$1/g; # a ~ on top of (\w) $Text =~ s/\/?i>//g; # cogprints $Text =~ s/&[a-z]+;//g; # otherwise ';' cause ref line break. $Text =~ s/&#\d+;//g; # e.g. '' in 'hep-th/0001001 [99]'. $Text =~ s/\\"(\w)/$1e/g; # G\"unter => Gueter $Text =~ s/\^//g; # remove ^ $Text =~ s/([A-Z])\s*&\s*([A-Z])/$1 and $2/g; # replace '&' with 'and' # remove HTML markups ( etc.) $Text =~ s/<[a-z\/]{1,3}>//ig; return $Text }; sub normalise_name { my($Text) = @_; my $Suffix = ''; $Text =~ s/~//; # remove typo # Jr. if ($Text =~ s/[, \.]+(Jr|Sr|Snr)\.?\s*$//i){ $Suffix = $1 } elsif ($Text =~ s/([, \.]+)(Jr|Sr|Snr)[. ]/$1/i){ $Suffix = $2 }; # van der Buren D => D van der Buren" if ($Text =~ /^\s*(((van|von|de|den|der)\s+)+)(\S\S+)\s+(.+)/i) { $Text = "$5 $1 $4" }; $Text =~ s/\s+/ /g; # single space $Text =~ s/^\W+//; $Text =~ s/\s+$//; # "A. Smith" => "A.Smith" $Text =~ s/(\w)\.\s+/\U$1\./ig; # Ghisellini G. A. ==> G.A. Ghisellini # Konenkov D. Yu. => D.Yu. Konenkov if ($Text =~ /^([^\s.]{2,})\s+(([A-Z][\w]?\W+)*)([A-Z][\w]?)\W*$/) { $Text = "$2$4 $1" }; $Text = "$Text $Suffix" if ($Suffix); $Text = tdb_normalise_name($Text); return $Text; }; # Based on Tim's Authors::splitauthors and Authors::_cmonauthor(); # This subroutine is called simply because we want the author names # to be transformed to a same style used by Tim's programs. Otherwise # a join on author names in Publication and Reference tables will # miss a lot of targets. sub tdb_normalise_name{ my $author = shift; # Strip any brackets $author =~ s/\s*\([^\)]*\)\s*//g; # Get rid of any dashes (except for dashes like Hu-Su) $author =~ s/(\W)-/$1/g; # Remove any "the"s, e.g. The OPAL Collaboration $author =~ s/\bthe\s+//ig; # Sort out Jr/Jr. $author =~ s/,?\sJr\.?/_Jr/ig; $author =~ s/[\{\}]//g; # Remove any specialisations $author =~ s/\\.//g; # Remove any escapes # Convert Convert Hawking S. to S.Hawking (already done - zj) # ($author =~ /(\w\w+)\s+([\.\w\s]+\.)$/) && ($author = $2.$1); $author =~ s/\.\s/\./g; # Convert S.W. Hawking to S.W.Hawking $author =~ s/([A-Z])\s/$1\./g; # Convert S W Hawking to S.W.Hawking # Can't handle case reliably in international character sets # $author = lc($author); # $author =~ s/\b(\w)/\U$1/g; # Convert STEPHEN_HAWKING to Stephen_Hawking $author =~ s/\s/_/g; # Convert Stephen W.Hawking to Stephen_W.Hawking $author =~ s/\.\.+/\./g; # Remove double dots return $author; } sub normalise_date { my($Text) = @_; # 12-14 Dec. $Text =~ s/[^\w\/][0-3][0-9]?[a-z]*?(\s*\-\s*[0-3][0-9]?[a-z]*?)?\s+ (Jan[\.\s]|January\b|Feb[\.\s]|February\b| Mar[\.\s]|March\b|Apr[\.\s]|April\b|May| Jun[\.\s]|June\b|Jul[\.\s]|July\b|Aug[\.\s]|August\b| Sep[\.\s]|September\b|Oct[\.\s]|October\b| Nov[\.\s]|November\b|Dec[\.\s]|December\b)//xig; # Dec 12-14 $Text =~ s/(Jan[\.\s]|January\b|Feb[\.\s]|February\b| Mar[\.\s]|March\b|Apr[\.\s]|April\b|May| Jun[\.\s]|June\b|Jul[\.\s]|July\b|Aug[\.\s]|August\b| Sep[\.\s]|September\b|Oct[\.\s]|October\b| Nov[\.\s]|November\b|Dec[\.\s]|December\b) [^\w\/]*[0-3][0-9]?[a-z]*?(\s*\-\s*[0-3][0-9]?[a-z]*?)?\b//xig; return $Text; }; sub normalise_journal { my($Text) = @_; $Text =~ s/^in\s+//i; # "in ..." $Text =~ s/^(see )?also\s+//i; # "also ..."; $Text =~ s/\s*:\s*/:/g; $Text =~ s/\s\s/ /g; # single space; $Text =~ s/\.\s/\./g; # "J. Physics" => "J.Physics" $Text =~ s/\.\(/\. \(/g; $Text =~ s/^\W+//; $Text =~ s/[^\w.]+$//; # remove anything in brackets at the end. $Text =~ s/\s*\([^)]+$//; # e.g. R. Ram, J. Phys. (Paris $Text =~ s/^[^(]+\)\s*//; # e.g. a) R. Ram, J. Phys. 10, 120, 1998 # unify cases #($Text = lc($Text)) && ($Text =~ s/\b(\w)/\U$1/g); $Text = uc($Text); return $Text; }; sub num_of_figures { my($Text) = @_; my($N, @Nlist); $N = 0; @Nlist =(); $Text = normalisation($Text); # e.g. "p. 24-26" regarded as one number. # ignore 'N = 2' kind of equations, and # ignore '25th' kinds (e.g. Proc. 25th ICRC). # ignore 'protein Aquaporin-1 in ...' # ignore 'hep-th/9901001' # ignore ' ... 1.55, ...' while ($Text =~ /(?:^|\b)[a-z]*(\d+)([a-z]*) (?:-[a-z]*\d+[a-z]*)* (?:\b|$)/gix) { next if ($2 =~ /^th$/i); next if ($' =~ /^\.\d+/); next if ($` =~ /\d+\.$/); next if ($` =~ /[=<>\/-]\s*$/); push(@Nlist, $1); } $N = scalar(@Nlist); return $N } sub remove_extra_spc { my($Text) = @_; $Text =~ s/^\s+//; $Text =~ s/\s+$//; $Text =~ s/\s\s/ /g; return $Text }; # # To assist accessing of the citation meta data. # sub srcText { my $cite = shift; return $cite->{'text'}; } sub targetIdentifier { return $_[0]->{'targetID'}; } sub targetURL { return $_[0]->{'targetURL'}; } sub authors { return $_[0]->{'authors'}; } sub list_authors { my $cite = shift; return $cite->{'authors'} } sub aufull { return $_[0]->{'aufull'}; } sub first_author { my $cite = shift; return $cite->{'aufull'}; } sub aulast { my $cite = shift; return $cite->{'aulast'}; } sub aufirst { my $cite = shift; return $cite->{'aufirst'}; } sub auinit { my $cite = shift; return $cite->{'auinit'}; } # journal title sub title { my $cite = shift; return $cite->{'title'}; } # article title sub atitle { my $cite = shift; return $cite->{'atitle'}; } sub volume { my $cite = shift; return $cite->{'volume'}; } sub issue { my $cite = shift; return $cite->{'issue'}; } sub supplement { my $cite = shift; return $cite->{'supl'}; } sub year { my $cite = shift; return $cite->{'year'}; } sub startpage { my $cite = shift; return $cite->{'spage'}; } sub endpage { return $_[0]->{'epage'}; } sub journal { my $cite = shift; return $cite->{'title'}; } sub featureID { my $cite = shift; return $cite->{'featureID'} } sub mysql_load_file { my $cite = shift; my $tm = localtime; my ($year,$mon,$mday); $year = $tm->year + 1900; $mon = $tm->mon + 1; $mday = $tm->mday; my $TimeStamp = $year.'-'.$mon.'-'.$mday; $cite->{'date'} = $TimeStamp; print "$cite->{'date'}\t"; print "$cite->{'sourceID'}\t"; ($cite->{'featureID'}) ? print "$cite->{'featureID'}\t" : print "\\N\t"; ($cite->{'targetID'}) ? print "$cite->{'targetID'}\t" : print "\\N\t"; ($cite->{refID}) ? print "$cite->{refID}\t" : print "\\N\t"; ($cite->{'targetURL'}) ? print "$cite->{'targetURL'}\t" : print "\\N\t"; ($cite->{'text'}) ? print "$cite->{'text'}\t" : print "\\N\t"; ($cite->{'aufull'}) ? print "$cite->{'aufull'}\t" : print "\\N\t"; ($cite->{'aulast'}) ? print "$cite->{'aulast'}\t" : print "\\N\t"; ($cite->{'aufirst'}) ? print "$cite->{'aufirst'}\t" : print "\\N\t"; ($cite->{'auinit'}) ? print "$cite->{'auinit'}\t" : print "\\N\t"; ($cite->{'atitle'}) ? print "$cite->{'atitle'}\t" : print "\\N\t"; ($cite->{'title'}) ? print "$cite->{'title'}\t" : print "\\N\t"; ($cite->{'volume'}) ? print "$cite->{'volume'}\t" : print "\\N\t"; ($cite->{'issue'}) ? print "$cite->{'issue'}\t" : print "\\N\t"; ($cite->{'supl'}) ? print "$cite->{'supl'}\t" : print "\\N\t"; ($cite->{'spage'}) ? print "$cite->{'spage'}\t" : print "\\N\t"; ($cite->{'year'}) ? print "$cite->{'year'}" : print "\\N"; print "\n"; } sub print_out { my $cite = shift; return if (!defined($cite->{'text'})); print '-'x70,"\n"; print "$cite->{'text'} \n", '-'x70, "\n"; print "sourceID: \t$cite->{'sourceID'}\n" if ($cite->{'sourceID'}); print "Authors: \t$cite->{'authors'}\n" if ($cite->{'authors'}); print "First Author: \t$cite->{'aufull'}\n" if ($cite->{'aufull'}); print "Article title:\t$cite->{'atitle'}\n" if ($cite->{'atitle'}); print "Journal: \t$cite->{'title'}\n" if ($cite->{'title'}); print "Volume: \t$cite->{'volume'}\n" if ($cite->{'volume'}); print "Issue: \t$cite->{'issue'} \n" if ($cite->{'issue'}); print "Supplement: \t$cite->{'supl'} \n" if ($cite->{'supl'}); print "Start Page: \t$cite->{'spage'}\n" if ($cite->{'spage'}); print "Year: \t\t$cite->{'year'}\n" if ($cite->{'year'}); print "targetURL: \t$cite->{'targetURL'}\n" if ($cite->{'targetURL'}); print "featureID: \t$cite->{'featureID'}\n" if ($cite->{'featureID'}); print "targetID: \t$cite->{'targetID'}\n" if ($cite->{'targetID'}); }; 1; libbiblio-citation-parser-perl-1.10+dfsg.orig/lib/Biblio/Citation/Parser/Templates.pm0000644000175000017500000010715310115644620030052 0ustar gregoagregoapackage Biblio::Citation::Parser::Templates; ###################################################################### # # Biblio::Citation::Parser::Templates; # ###################################################################### # # This file is part of ParaCite Tools (http://paracite.eprints.org/developers/) # # Copyright (c) 2004 University of Southampton, UK. SO17 1BJ. # # ParaTools is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # ParaTools is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with ParaTools; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # ###################################################################### =pod =head1 NAME Biblio::Citation::Parser::Templates - citation templates collection =head1 DESCRIPTION This package contains a list of templates that are used to parse citations. Updates will be made available at http://paracite.eprints.org/developers/ (hopefully with a merging tool to ensure you don't lose any changes). To add new fields, edit Standard.pm. =cut $Biblio::Citation::Parser::Templates::templates = [ '_AUTHORS_ (_YEAR_) Precis of "_TITLE_". _PUBLICATION_ _VOLUME_(_ISSUE_)', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLICATION_ _VOLUME_(_ISSUE_)', '_AUTHORS_ (_YEAR_). _TITLE_. _PUBLICATION_ _VOLUME_(_ISSUE_)', '_AUTHORS_. (_YEAR_) Precis of: "_TITLE_" _PUBLICATION_ _VOLUME_(_ISSUE_)', '_AUTHORS_. (_YEAR_)_ANY_"_TITLE_" _PUBLICATION_ _VOLUME_(_ISSUE_)', '_PUBLICATION_. _YEAR_;_VOLUME_(_ISSUE_):_PAGES_', '_AUTHORS_. _TITLE_ in Proceedings of _PUBLICATION_ (_YEAR_)._ANY_', '_AUTHORS_. _TITLE_, edited _ANY_ by _EDITOR_. _PUBLISHER_. _PUBLOC_, _YEAR_', '_AUTHORS_. _TITLE_. _PUBLICATION_, (_ANY_ _YEAR_), _SPAGE_-_EPAGE_', '_AUTHORS_. _CAPTITLE_ in Proceedings of _PUBLICATION_ (_PUBLOC_,_ANY_, _YEAR_), _SPAGE_-_EPAGE_', '_AUTHORS_. _TITLE_. in _PUBLICATION_, _PUBLISHER_ (_YEAR_)', '_AUTHORS_. _TITLE_. In _PUBLICATION_ (_YEAR_)', '_AUTHORS_. _TITLE_. _ANY_. _PUBLISHER_ (_YEAR_)', '_AUTHORS_. _TITLE_. _PUBLICATION_, _VOLUME_(_ISSUE_):_SPAGE__ANY__EPAGE_, _YEAR_', '_AUTHORS_. _TITLE_. In _EDITOR_, editor, _PUBLICATION_. _PUBLISHER_, _YEAR_', '_EDITOR_ and _ANY_, editors. _TITLE_. _PUBLISHER_, _PUBLOC_, _YEAR_', '_AUTHORS_. _TITLE_. In _PUBLICATION_, pages _SPAGE__ANY__EPAGE_, _YEAR_', '_AUTHORS_. _TITLE_. In _EDITOR_ and _ANY_, editors, _PUBLICATION_, pages _SPAGE__ANY__EPAGE_. _PUBLISHER_, _PUBLOC_, _YEAR_', "_AUTHORS_. _TITLE_. In _PUBLICATION_ '_ANY_, _ANY_, _YEAR_", '_AUTHORS_. _TITLE_. _PUBLICATION_, _VOLUME_(_ISSUE__ANY_):_SPAGE__ANY__EPAGE_, _YEAR_', '_AUTHORS_. _TITLE_. In _PUBLICATION_, pages _SPAGE__ANY__EPAGE_, _YEAR_', '_AUTHORS_. _TITLE_. In _EDITOR_, editor, _PUBLICATION_, pages _SPAGE__ANY__EPAGE_. _PUBLISHER_, _PUBLOC_, _YEAR_', '_AUTHORS_. _TITLE_. _PUBLICATION_, _ISSUE_:_SPAGE__ANY__EPAGE_, _YEAR_', '_AUTHORS_. _TITLE_. _PUBLISHER_, _PUBLOC_, _YEAR_', '_AUTHORS_ (_YEAR_) _TITLE_? _PUBLICATION_ _VOLUME_(_ISSUE_-_ANY_): _PAGES_', '_AUTHORS_ _TITLE_. _PUBLICATION_ _ISSUE_, _PAGES_ (_YEAR_)', '_AUTHORS_ (_YEAR_). _TITLE_. _PUBLICATION_, _VOLUME_(_ISSUE_):_PAGES_', '_AUTHORS_, _PUBLICATION_, _YEAR_, _ISSUE_, _SPAGE_-_EPAGE_', '_AUTHORS_, _PUBLICATION_, _YEAR_, _VOLUME_, _ISSUE_', '_AUTHORS_, _PUBLICATION_, _YEAR_, _ISSUE_, _SPAGE_-', '_AUTHORS_. _PUBLICATION_. _VOLUME_, _ISSUE_ (_YEAR_)', '_AUTHORS_. _YEAR_. _TITLE_. _PUBLICATION_. _ISSUE_:_SPAGE_', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLICATION_ _ISSUE_:_SPAGE_- _EPAGE_', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLICATION_ _ISSUE_: _PAGES_. _URL_', '_AUTHORS_ (_YEAR_) _CAPTITLE_ _PUBLICATION_ _ISSUE_: _PAGES_', '_AUTHORS_ (_YEAR_) _TITLE_" _PUBLICATION_ _VOLUME_ (_ISSUE_): _PAGES_ _URL_', '_AUTHORS_ (_YEAR_). _TITLE_. _PUBLICATION_ _VOLUME_ (_ISSUE_): _PAGES_. _URL_', '_AUTHORS_ (_YEAR_) _TITLE_, _PUBLICATION_ _ISSUE_:_PAGES_', '_AUTHORS_, _PUBLICATION_, in press', '_AUTHORS_, _PUBLICATION_ _VOLUME_, _ISSUE_ (_YEAR_). _ANY_', '_AUTHORS_, _PUBLICATION_ _VOLUME_, _ISSUE_ (_YEAR_)', '_ANY_ _URL_ _ANY_', '_AUTHORS_, _TITLE_, _YEAR_ _PUBLICATION_, _PUBLOC_, _ANY_ (_ANY_ _ANY_)', '_AUTHORS_, _TITLE_ (_PUBLISHER_ _YEAR_)', '_AUTHORS_, _TITLE_, _PUBLICATION_ _VOLUME_(_ISSUE_) (_YEAR_)', '_AUTHORS_, _TITLE_ (_PUBLISHER_, _PUBLOC_, _ANY_, _YEAR_)', '_EDITOR_ (ed), _TITLE_, (_PUBLISHER_, _PUBLOC_, _ANY_, _YEAR_)', '_AUTHORS_, _CAPTITLE_, _PUBLICATION_ _ISSUE_, _EDITOR_ and _ANY_ (eds) (_ANY_ _YEAR_) _PAGES_', '_AUTHORS_, _CAPTITLE_, _PUBLICATION_, _PUBLOC_, _ANY_ (_ANY_ _YEAR_)', '_AUTHORS_, _TITLE_, _PUBLICATION_, _PUBLOC_, _ANY_ (_ANY_ _YEAR_) _PAGES_', '_AUTHORS_, _TITLE_, _PUBLICATION_-_ANY_, _PUBLOC_ (_ANY_ _YEAR_) _PAGES_', '_AUTHORS_, _TITLE_, _PUBLICATION_ _ISSUE_ (_ANY_ _YEAR_)', '_AUTHORS_, _TITLE_, _PUBLICATION_, _PUBLOC_, _ANY_ (_YEAR_) _PAGES_', '_AUTHORS_, _TITLE_, _ANY_ Thesis in _ANY_ (_ANY_ _YEAR_)', '_AUTHORS_, _TITLE_, _ANY_ Term Paper in _ANY_ (_ANY_ _YEAR_)', '_AUTHORS_, _TITLE_, _PUBLICATION_ _ISSUE_ (_YEAR_) _PAGES_', '_AUTHORS_, _TITLE_, _ANY_ Workshop, _PUBLOC_, _ANY_ (_ANY_ _YEAR_)', '_AUTHORS_, _TITLE_, _PUBLICATION_, _VOLUME_(_ISSUE_) (_ANY_ _YEAR_) _PAGES_', '_AUTHORS_, _TITLE_, _PUBLICATION_ \'_ANY_, _PUBLOC_, _ANY_ (_YEAR_) _PAGES_', '_AUTHORS_ _CAPTITLE_ _ANY_-_ANY_-_YEAR_, _PUBLICATION_ Issue _ISSUE_, _URL_', '_AUTHORS_, _TITLE_, _ANY_ Vol. _VOLUME_ _PUBLICATION_, _PUBLOC_ (_ANY_ _YEAR_) _PAGES_', '_AUTHORS_: _TITLE_, _PUBLICATION_ _ISSUE_ (_ANY_ _YEAR_)', '_AUTHORS_, _TITLE_, _ANY_ _ISSUE_ (_ANY_ _YEAR_)', '_AUTHORS_, _TITLE_. _PUBLICATION_ _VOLUME_(_ISSUE_) (_YEAR_) _PAGES_', '_TITLE_ - _URL_', '_TITLE_: _URL_', '_ANY_, _YEAR_ _AUTHORS_. _TITLE_. _PUBLICATION_, _ISSUE_:_PAGES_, _YEAR_.', '_AUTHORS_ (_YEAR_): "_TITLE_", _PUBLICATION_, _ANY_, _EDITOR_ & _ANY_ (eds.), (_PUBLISHER_, _PUBLOC_)', '_AUTHORS_ (_YEAR_): "_TITLE_", _PUBLICATION_.', '_AUTHORS_ (_YEAR_): "_TITLE_", _PUBLICATION_ _ISSUE_, p. _PAGES_ _ANY_', '_AUTHORS_ (_YEAR_): _TITLE_, (Ph.D. Thesis, _ANY_).', '_AUTHORS_ (_YEAR_): "_TITLE_", in: _PUBLICATION_ _ANY_, _EDITOR_ (ed.), (_ANY_, _PUBLOC_), p. _PAGES_.', '_AUTHORS_ (_YEAR_). _TITLE_. Available online _URL_', '_AUTHORS_ (_YEAR_). _TITLE_. _PUBLICATION_, _VOLUME_(_ISSUE_). Available online: _URL_', '_AUTHORS_ (_YEAR_). _TITLE_. _PUBLICATION_, _VOLUME_ (_ISSUE_), _PAGES_ _ANY_ _YEAR_', '_AUTHORS_ (_YEAR_). _TITLE_. In _PUBLICATION_ _ISSUE_. Proceedings of _ANY_.', '_AUTHORS_ (_YEAR_). _TITLE_. _PUBLICATION_,_VOLUME_(_ISSUE_), _PAGES_', '_AUTHORS_ (_YEAR_). _TITLE_. _PUBLICATION_ _VOLUME_, _PAGES_', '_AUTHORS_ (_YEAR_). _TITLE_. _PUBLISHER_', '_AUTHORS_, _TITLE_, _PUBLICATION_ (_PUBLOC_). _VOLUME_ (_YEAR_) _PAGES_', '_AUTHORS_, _TITLE_, _PUBLICATION_ (_PUBLOC_). _VOLUME_ (_YEAR_) _PAGES_', '_AUTHORS_. _TITLE_. Presentation at _PUBLICATION_, _ANY_. _YEAR_', '_AUTHORS_. _TITLE_. Presentation at _PUBLICATION_, _ANY_. _YEAR_', '_AUTHORS_, _TITLE_, _UCPUBLICATION_, _YEAR_', '_AUTHORS_, _TITLE_, _PUBLICATION_ _YEAR_/_ANY_, _PUBLOC_, _ANY_ _YEAR_', '_AUTHORS_: _TITLE_. _PUBLICATION_ _YEAR_', '_AUTHORS_: _TITLE_', '_ANY_. _PUBLICATION_: _TITLE_ _ISSUE_: _PAGES_', '_PUBLICATION_,No._ISSUE_,pp._PAGES_,_YEAR_', '_PUBLICATION_-_ISSUE_, _PUBLOC_, pp. _PAGES_', '_AUTHORS_ (_YEAR__ANY_). _TITLE_. _PUBLICATION_ _ISSUE_, _PAGES_', '_AUTHORS_ _YEAR_. _TITLE_. _PUBLICATION_ _VOLUME_ _ISSUE_: _PAGES_', '_AUTHORS_ (_YEAR_). _TITLE_. _PUBLICATION_ [_ANY_] _ISSUE_, _PAGES_', '_AUTHORS_ _TITLE_. _PUBLISHER_, _PUBLOC_, _YEAR_', '_PUBLICATION_, _ISSUE_, pp _PAGES_', '_AUTHORS_ (_YEAR_). _TITLE_. (_ANY_) _PUBLISHER_, _PUBLOC_', '_AUTHORS_ (_YEAR_) _TITLE_. In _ANY_ (ed.) _TITLE_ pp. _PAGES_, _PUBLOC_ : _PUBLISHER_', '_AUTHORS_, _YEAR_. _TITLE_? _PUBLICATION_, _ISSUE_: _PAGES_', '_AUTHORS_, _YEAR_. _TITLE_. _PUBLICATION_, _ISSUE_: _PAGES_', '_AUTHORS_: _TITLE_. _PUBLICATION_, _YEAR_', '_AUTHORS_ (_YEAR_). _TITLE_. In _ANY_ (Eds.). _PUBLICATION_. _PUBLOC_: _PUBLISHER_', '_AUTHORS_ (_YEAR_, _SPAGE_ - _EPAGE_)', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLICATION_, _ISSUE_,_PAGES_', '_PUBLICATION_, _VOLUME_, _ISSUE_, _PAGES_', '_AUTHORS_ _YEAR_. _TITLE_. _PUBLICATION_ Vol. _VOLUME_ _ANY_ _PAGES_', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLICATION_ _VOLUME_(_ISSUE_)', '_YEAR_ _TITLE_. _PUBLICATION_ _VOLUME_:_PAGES_. _ANY_, p. _SPAGE_', '_AUTHORS_ (_YEAR_). . _TITLE_: _PUBLICATION_, _ISSUE_, _PAGES_', '_AUTHORS_ (_YEAR_) _TITLE_, _PUBLICATION_, _VOLUME_ (_YEAR_), _PAGES_', '_TITLE_, _PUBLICATION_, _ANY_ issue', '_TITLE_. _PUBLICATION. _ISSUE_: _PAGES_', '_AUTHORS_ (_YEAR_). _TITLE_. In: _ANY_', '_AUTHORS_ (_YEAR_) _TITLE_ (_PUBLISHER_)', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLISHER_', '_AUTHORS_. _YEAR_. _TITLE_. _PUBLICATION_ _ISSUE_:_PAGES_', '_PUBLICATION_, _VOLUME_, _PAGES_', '_AUTHORS_. _TITLE_ . _PUBLICATION_, _PUBLOC_, _YEAR_', '_AUTHORS_. _YEAR_. _TITLE_. _PUBLISHER_', '_TITLE_. _PUBLICATION_, _VOLUME_(_ISSUE_),', '_AUTHORS_ (_YEAR_) _TITLE_, _PUBLICATION_, _ISSUE_, _PAGES_', '_PUBLICATION_ _ISSUE_: _SPAGE_ - _EPAGE_', '_AUTHORS_, _PUBLICATION_ _VOLUME_, _ISSUE_ (_YEAR_)', '_AUTHORS_. _YEAR_. _TITLE_. _PUBLICATION_ _VOLUME_: _PAGES_', '_AUTHORS_ _YEAR_. "_TITLE_" in _PUBLICATION_. Edited by _ANY_. _PUBLOC_: _PUBLISHER_', '_AUTHORS_. _TITLE_. _PUBLICATION_ _ISSUE_ (_YEAR_)', '_AUTHORS_ (Eds.) _TITLE_', '_AUTHORS_ _YEAR_. _TITLE_. _PUBLICATION_ _VOLUME_ (_ISSUE_) _PAGES_', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLOC_: _PUBLISHER_', '_AUTHORS_ _YEAR_. _TITLE_. _PUBLOC_: _PUBLISHER_', '_TITLE_. _PUBLICATION_ _ISSUE_:_PAGES_', '_AUTHORS_ (_YEAR_) _TITLE_. In Proceedings of the _PUBLICATION_, _PUBLOC_. _ANY_', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLOC_: _PUBLISHER_', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLICATION_ _ISSUE_:_SPAGE_"_EPAGE_', '_TITLE_, pages _PAGES_. _AUTHORS_, _PUBLOC_: _PUBLISHER_', '_AUTHORS_. _YEAR_. _TITLE_. _PUBLICATION_. _VOLUME_(_ISSUE_/_ANY_)._ANY_', '_AUTHORS_ _TITLE_ _PUBLICATION_(_ISSUE_)', '_AUTHORS_ _YEAR_. _TITLE_. _PUBLOC_: _PUBLISHER_', '_TITLE_ (_PUBLISHER_)', '_AUTHORS_. _TITLE_ _PUBLICATION_(_ISSUE_). _URL_', '_TITLE_. _PUBLICATION_ _VOLUME_(_ISSUE_):_PAGES_', '_AUTHORS_ (_YEAR_). _TITLE_. _PUBLICATION_,_VOLUME_, _PAGES_', '_AUTHORS_ (_YEAR_) _TITLE_ (_PUBLOC_: _PUBLISHER_)', '_AUTHORS_ (_YEAR_) _TITLE_, _VOLUME_, _PAGES_', '_AUTHORS_ (_YEAR_), _TITLE_', '_AUTHORS_. _YEAR_: _TITLE_. _PUBLOC_: _PUBLISHER_', '_AUTHORS_ (_YEAR_). _TITLE_. _PUBLICATION_, _VOLUME_, _PAGES_._ANY_', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLICATION_ _VOLUME_(_ANY_):', '_AUTHORS_ _VOLUME_ (_YEAR_), _PAGES_', '_AUTHORS_, _TITLE_, _PUBLOC_, _ANY_ (_YEAR_)', '_AUTHORS_, _PUBLICATION_. _ANY__VOLUME_, _ISSUE_ (_YEAR_)', '_AUTHORS_, _PUBLICATION_. _ANY__VOLUME_, _ISSUE_ (_YEAR_)', '_AUTHORS_, _TITLE_, hep-th/_ANY_ (_YEAR_)', '_AUTHORS_, _TITLE_, hep-th/_ANY_ (_YEAR_)', '_PUBLICATION_ _VOLUME_ (_ISSUE_), _YEAR_: _PAGES_', '_AUTHORS_. _TITLE_. _PUBLICATION_, v. _VOLUME_, n_ISSUE_ (_YEAR_): _PAGES_. ISSN _ISSN_', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLICATION_ _VOLUME_:_ISSUE_', '_AUTHORS_ (in press). _TITLE_. In _ANY_ (Ed.), _PUBLICATION_. _PUBLOC_: _PUBLISHER_', '"_TITLE_," _SUBTITLE_, Edited by _ANY_, _PUBLICATION_, pp. _PAGES_, _YEAR_', '_ISSN_._VOLUME_._ISSUE_._SPAGE_', '_AUTHORS_, _PUBLICATION_ _VOLUME_, _SPAGE_ (_YEAR_)', '_AUTHORS_. _TITLE_. _PUBLICATION_, _VOLUME_: _PAGES_ (_YEAR_)', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLICATION_, _VOLUME_(_ISSUE_): _PAGES_', '_AUTHORS_ (_YEAR_). _TITLE_. In _ANY_, _PUBLICATION_, _PUBLOC_: _PUBLICATION_, _PAGES_', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLICATION_ _VOLUME_: _PAGES_', '_AUTHORS_ (_YEAR_) "_TITLE_," _PUBLICATION_ _VOLUME_, pp. _PAGES_', '_AUTHORS_ (_YEAR_). _TITLE_? _PUBLICATION_, _VOLUME_, _PAGES_', '_AUTHORS_, _YEAR_, _TITLE_, _PUBLISHER_, _PUBLOC_', '_AUTHORS_, _YEAR_, ``_TITLE_", _SUBTITLE_,', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLICATION_ _VOLUME_ _PAGES_', '_AUTHORS_. _TITLE_ (_PUBLISHER_, _PUBLOC_, _YEAR_)', '_AUTHORS_, _TITLE_, _PUBLISHER_, _PUBLOC_, _YEAR_, _SPAGE_ pp', '_AUTHORS_ (_YEAR_) _TITLE_, _PUBLOC_: _PUBLISHER_', '_PUBLICATION_ (_YEAR_). _TITLE_, ed. _AUTHORS_, _PUBLICATION_, _VOLUME_, _PAGES_', '_AUTHORS_ (_YEAR_) _TITLE_. In _ANY_ (Eds.) _SUBTITLE_. _PUBLOC_: _PUBLISHER_. _PAGES_', '_AUTHORS_ [_YEAR_]: _TITLE_, _PUBLICATION_, _VOLUME_, pp. _PAGES_', '_AUTHORS_ (_YEAR_) _TITLE_. _SUBTITLE, _PUBLOC_', '_AUTHORS_ (ed) (_YEAR_) _TITLE_/_PUBLISHER_, _PUBLOC_', '_AUTHORS_ (eds.) (_YEAR_). _TITLE_', '_AUTHORS_ (_YEAR_), _TITLE_, _PUBLICATION_, _ANY_, pp. _PAGES_', '_AUTHORS_ _YEAR_. _TITLE_? _PUBLICATION_, _VOLUME_', '_AUTHORS_ (_YEAR_). _TITLE_. _PUBLICATION_, _VOLUME_, _PAGES_._ANY_', '_AUTHORS_. _TITLE_. _PUBLICATION_, _YEAR_, _VOLUME_, _PAGES_', '_AUTHORS_ (_YEAR_). "_TITLE_" _PUBLICATION_,', '_TITLE_. _PUBLICATION_, _VOLUME_, _PAGES_', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLICATION_, _ANY_ (_PUBLOC_: _PUBLICATION_), pp. _PAGES_', '_AUTHORS_. _TITLE_. _PUBLICATION_ _YEAR_', '_AUTHORS_ (_YEAR_). "_TITLE_" _PUBLICATION_, _ISSUE_:_PAGES_', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLICATION_, _VOLUME_, _PAGES_', '_AUTHORS_ _YEAR_. _TITLE_. _ANY_', '_PUBLICATION_ (_YEAR_). _TITLE_. _PUBLOC_: _ANY_', 'TI: Title _TITLE_ AU: Author _AUTHORS_ SO: Source _PUBLICATION_; _VOLUME_ _YEAR_, p._PAGES_ IS: ISSN _ISSN_', '_AUTHORS_, "_TITLE_" _PUBLICATION_, Vol. _VOLUME_, No. _ISSUE_, pp. _PAGES_,_ANY__YEAR_', '_AUTHORS_, "_TITLE_" _PUBLICATION_, Vol. _VOLUME_, No. _ANY_, pp. _PAGES_,_ANY__YEAR_', '_TITLE_ _PUBLICATION_, Volume _VOLUME_, Issue _ISSUE_, _ANY_ _YEAR_, Pages _PAGES_ _AUTHORS_', '_ANY_ Volume _VOLUME_: _PUBLICATION_ _YEAR_ _ANY_ ISBN _ISBN_ _ANY_ _TITLE_', '_TITLE_ _AULAST_, _AUFIRST_ _PUBLICATION_, _VOLUME_, _ISSUE_, _PAGES_, _ANY_ _YEAR_', '_TITLE_ _AUFIRST_ _AULAST_, _ANY_ _PUBLICATION_, _VOLUME_, _PAGES_, _ANY_ _YEAR_', '_AUTHORS_ (_YEAR_). _TITLE_. _PUBLICATION_ _VOLUME_(_ISSUE_) _PAGES_', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLICATION_ _VOLUME_(_ISSUE_):_PAGES_', '_AUTHORS_. _TITLE_. _PUBLICATION_. _YEAR_;_ISSUE_:_PAGES_', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLICATION_ _ISSUE_:_PAGES_.?', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLICATION_ _ISSUE_:_PAGES_', '_AUTHORS_, _YEAR_, _TITLE_, _PUBLISHER_', '_AUTHORS_ (_YEAR_), _TITLE_ (_PUBLOC_: _PUBLISHER_)', '_AUTHORS_ (_YEAR_) _TITLE_ _PUBLICATION_ _ISSUE_:_PAGES_', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLICATION_ _ISSUE_:_PAGES_', '_AUTHORS_ (_YEAR_). _TITLE_. _PUBLICATION_, _VOLUME_, _SPAGE_-- _EPAGE_', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLICATION_ _VOLUME_(_ISSUE_):_PAGES_', '_ANY_ _AUFIRST_ _AULAST_ Pages _PAGES_ of: _PUBLICATION_, _ANY_ _YEAR_', '_AUTHORS_. _TITLE_. _PUBLICATION_, _ISSUE_:_PAGES_, _YEAR_', '_AUTHORS_ (_YEAR_). _TITLE_, _PUBLICATION_, _VOLUME_(_ISSUE_):_PAGES_', '_AUTHORS_. _TITLE_ _UCPUBLICATION_ _VOLUME_ (_ISSUE_): _PAGES_ _ANY_ _YEAR_', '_AUTHORS_, _TITLE_. In: _ANY_. _PUBLICATION_ _YEAR_, _ANY_, _PAGES_', '_AUTHORS_. _TITLE_. _PUBLICATION_. _YEAR_ _ANY_;_VOLUME_(_ISSUE_):_PAGES_', '_AUTHORS_. _TITLE_. _PUBLICATION_ _YEAR_;_VOLUME_(_ISSUE_):_PAGES_', '_AUTHORS_. _TITLE_. _PUBLICATION_._YEAR_ _ANY_;_VOLUME_(_ISSUE_):_PAGES_', '_AUTHORS_. _TITLE_. _PUBLICATION_, v. _VOLUME_, n_ISSUE_: _PAGES_. ISSN _ISSN_', '_AUTHORS_ _CAPTITLE_ _CAPPUBLICATION_ _ANY_, _YEAR_ Volume _VOLUME_, no. _ISSUE_', '_TITLE_; _ANY_ _YEAR_; _AUTHORS_; Issue: _ISSUE_ Start Page: _SPAGE_ ISSN: _ISSN__ANY_', '_AUTHORS_, _TITLE_; _ANY_ _YEAR_; Issue: _ISSUE_ Start Page: _SPAGE_ ISSN: _ISSN__ANY_', '_AUTHORS_ (_YEAR_). _TITLE_. In _ANY_, _CAPPUBLICATION_ _ANY_: _ANY_', '_AUTHORS_ in _PUBLICATION_ _YEAR_. _TITLE_. _PAGES_', '_AUTHORS_. (_YEAR_) "_TITLE_". _PUBLICATION_, _ANY_ _PAGES_', '_AUTHORS_; _PUBLICATION_ [_ANY_] _YEAR_, _VOLUME_(_ISSUE_), _PAGES_', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLICATION_ _VOLUME_: _PAGES_', '_AUTHORS_ (_YEAR_) _TITLE_ _PUBLICATION_ _ANY_ _VOLUME_: _PAGES_', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLICATION_ _VOLUME_(_ISSUE_) _PAGES_', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLICATION_ _VOLUME_(_ISSUE_) _PAGES_', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLICATION_ B_ISSUE_:_PAGES_', '_AUTHORS_ (_YEAR_)_TITLE_. _PUBLICATION_ B_ISSUE_:_PAGES_', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLICATION_ _VOLUME_(_ISSUE_)', '_AUTHORS_ (_YEAR_). _TITLE_. _PUBLICATION_, _VOLUME_, _PAGES_', '_AUTHORS_ (_YEAR_).\? _TITLE_. _PUBLICATION_ _VOLUME_(_ISSUE_):_PAGES_', '_AUTHORS_. (_YEAR_). _TITLE_. _PUBLICATION_ _VOLUME_(_ISSUE_) pp._PAGES_', '_AUTHORS_ (_YEAR_). _TITLE_. _PUBLICATION_, _VOLUME_ (_ISSUE_, _ANY_)', '_AUTHORS_. (_YEAR_). _TITLE_. _PUBLICATION_ _VOLUME_ (_ANY_)', '_AUTHORS_. (_YEAR_). _TITLE_. _ANY_ _VOLUME_(_ISSUE__ANY_) pp._PAGES_', '_AUTHORS_. _YEAR_. _TITLE_. _PUBLICATION_: _ANY_. _VOLUME_(_ISSUE_): _PAGES_', '_AUTHORS_ _PUBLICATION_ _YEAR_, _PAGES_', '_AUTHORS_;_PUBLICATION_ _YEAR_, _VOLUME_(_ISSUE_), _ANY_', '_AUTHORS_ _TITLE_, _PUBLICATION_ _VOLUME_ (_YEAR_) pp. _PAGES_', '_AUTHORS_ _TITLE_. _PUBLICATION_. _YEAR_; _VOLUME_(_ISSUE_):_SPAGE_', '_AUTHORS_, _TITLE_, _PUBLICATION_, _VOLUME_ (_YEAR_) p_PAGES_', '_AUTHORS_ _PUBLICATION_ (_YEAR_) p_PAGES_', '_AUTHORS_ _TITLE_. _PUBLICATION_. _VOLUME_ (_YEAR_) pp. _PAGES_', '_PUBLICATION_ V._VOLUME_ #_ISSUE_ _YEAR_ p._PAGES_ _TITLE_ Au: _AUTHORS_', '_AUTHORS_. _TITLE_. _PUBLICATION_ _ISSUE_:_PAGES_. _YEAR_', '_AUTHORS_ _PUBLICATION_ [_ANY_] _YEAR_, _VOLUME_ (_ISSUE_), _PAGES_', '_AUTHORS_. _TITLE_. _PUBLICATION_. _ANY_ _YEAR_. _VOLUME_', '_AUTHORS_ (_YEAR_) _PUBLICATION_ _VOLUME_ _YEAR_-_ANY_', '_AUTHORS_. _TITLE_. _PUBLICATION_ _VOLUME_, _YEAR_', '_AUTHORS_. _TITLE_. _PUBLICATION_. _ANY_. _ANY_, _YEAR_', '_AUTHORS_ (_YEAR_). "_TITLE_" _PUBLICATION_ _VOLUME_', '_AUTHORS_. _TITLE_. _PUBLICATION_ _YEAR_. _ANY_', '_AUTHORS_. _TITLE_. _PUBLICATION_, _YEAR_', '_AUTHORS_ (_YEAR_) _TITLE_. _ANY_:_PUBLICATION_', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLICATION_ (_ANY_', '_AUTHORS_: "_TITLE_" _PUBLICATION_', '_TITLE_ Pages _PAGES_ _AUTHORS_', '_PUBLICATION_, _ANY_ _YEAR_ v_VOLUME_ i_ISSUE_ p_SPAGE_(_ANY_) _TITLE_ (_ANY_) _AUTHORS__ANY_', '_TITLE_ _AUTHORS_ _PUBLICATION_, v _VOLUME_, n _ISSUE_, (_ANY_ _YEAR_), p _PAGES_', '_TITLE_; _AUTHORS_; _PUBLICATION_, _ANY_; _ANY_ _YEAR_; Vol. _VOLUME_, Iss. _ISSUE_; pg. _SPAGE_', '_TITLE_; _AUTHORS_; _PUBLICATION_; _ANY_, _YEAR_; Vol. _VOLUME_, Iss. _ISSUE_; pg. _SPAGE_', '_TITLE_; By: _AUTHORS_, _PUBLICATION_, _YEAR_, Vol. _VOLUME_ Issue _ISSUE_, p_SPAGE_, _ANY_', '_TITLE_, _AUTHORS_, _PUBLICATION_ _VOLUME_, _ISSUE__ANY_ _PAGES_ (_YEAR_)', '_AUTHORS_ (_YEAR_). _TITLE_\? _PUBLICATION_, _VOLUME_(_ISSUE_), _PAGES_', '_AUTHORS_ (_YEAR_). _TITLE_. _PUBLICATION_, _VOLUME_(_ISSUE_), _PAGES_', '_PUBLICATION_ Vol _VOLUME_(_ISSUE_), _ANY_ _YEAR_, _PAGES_', '_AUTHORS_; _PUBLICATION_, v_VOLUME_ n_ISSUE_ p_PAGES_ _ANY_ _YEAR_', '_AUTHORS_ (_YEAR_). _TITLE_. _PUBLICATION_, _VOLUME_(_ISSUE_), _PAGES_', '_AUTHORS_ (_YEAR_). _TITLE_._ANY_ (_ANY_pp. _PAGES_). _ANY_', '_PUBLICATION_, v_VOLUME_ n_ISSUE_ p_SPAGE_ _ANY_ _YEAR_', '_AUTHORS_ (_YEAR_). _TITLE_. _PUBLOC_: _PUBLISHER_', '_AUTHORS_ (_YEAR_). _TITLE_. _PUBLISHER_', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLICATION_ _ISSUE_, _PAGES_', '_AUTHORS_. _TITLE_, (Vol. _VOLUME_): _PUBLICATION_. _YEAR_', '_AUTHORS_. _YEAR_. _TITLE_? _PUBLICATION_ _ISSUE_:_PAGES_', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLISHER_, _PUBLOC_', '_AUTHORS_ (_YEAR_). _TITLE_? _PUBLICATION_ _ISSUE_, pp. _PAGES_', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLISHER_', '_AUTHORS_ (_YEAR_). _TITLE_, _PUBLICATION_, _ISSUE_, _PAGES_', '_AUTHORS_. _YEAR_. _TITLE_. _PUBLICATION_ _ISSUE_: _PAGES_', '_AUTHORS_ (_YEAR_). _TITLE_. _PUBLICATION_ _VOLUME_, _ISSUE_: _PAGES_', '_AUTHORS_. _TITLE_, In _EDITOR_ and _ANY_ eds., _TITLE_. _PUBLISHER_, _YEAR_, _PAGES_', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLICATION_, _ISSUE_, pp. _PAGES_', '_AUTHORS_. _YEAR_. _TITLE_. In _EDITOR_ (ed.) _PUBLICATION_: _PAGES_. _PUBLISHER_, _PUBLOC_._ANY_', '_AUTHORS_(_YEAR_). _TITLE_. _PUBLICATION_, _ISSUE_, _PAGES_', '_AUTHORS_. _YEAR_. _TITLE_. In _EDITOR_, ed., _PUBLICATION_, _PUBLISHER_', '_AUTHORS_ _YEAR_. _TITLE_, trans. _ANY_. _PUBLOC_: _PUBLISHER_', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLICATION_, _VOLUME_, _PAGES_', '_AUTHORS_(_YEAR_). _TITLE_. _ANY_', '_AUTHORS_. _TITLE_. _PUBLICATION_. _YEAR_', '_TITLE_; _ANY_ _YEAR_; _AUTHORS_', '_TITLE_ by _AUTHORS_ _ANY_', '_AUTHORS_ (_YEAR_). _TITLE_. In _ANY_', '_AUTHORS_ (_YEAR_). _TITLE_._ANY_', '_AUTHORS_ (_YEAR_) _TITLE_. _PUBLICATION_', '_AUTHORS_ (_YEAR_) _TITLE_', '_PUBLICATION_ volume _VOLUME_ page _SPAGE_', '_AUTHORS_, "_TITLE_", _PUBLICATION_ _VOLUME_ (_YEAR_) pp. _PAGES__ANY_', '_PUBLICATION_ (_YEAR_). _TITLE_. _ANY_', '_PUBLICATION_ _VOLUME_: _PAGES_', '_AUTHORS_. _TITLE_. _PUBLICATION_ _VOLUME_: _PAGES_. _YEAR_', '_TITLE_, _PUBLICATION_, _ANY_ _YEAR_', '_AUTHORS_, _TITLE_, _PUBLICATION_, _ANY_, _YEAR__ANY_', '_PUBLICATION_ _YEAR_ _TITLE_', '_AUTHORS_ (_YEAR_): _TITLE_. _PUBLICATION.', '_PUBLICATION_ _AUTHORS_ _TITLE_', '_AUTHORS_. _TITLE_', '_AUTHORS_, _TITLE_', '_AUTHORS_ _TITLE_', '_TITLE_', '_AUTHORS_ (_YEAR_). _TITLE_. _PUBLICATION_: _ANY_, _VOLUME_, _PAGES_', '_AUTHORS_ (_ANY_/_YEAR_). _TITLE_. _PUBLOC_: _PUBLISHER_', '_AUTHORS_ (_YEAR_). _TITLE_. _PUBLICATION_ (pp._PAGES_). _PUBLISHER_', '_AUTHORS_ (_YEAR_). _TITLE_. _PUBLICATION_ (pp. _PAGES_). _PUBLISHER_', '_AUTHORS_ (_YEAR_). _TITLE_. In _ANY_, _PUBLICATION_: _ANY_. _PUBLOC_: _PUBLISHER_', '_AUTHORS_ (_YEAR_). _TITLE_. _PUBLICATION_ (pp. _PAGES_). _PUBLOC_: _PUBLISHER_', '_AUTHORS_ (_YEAR_). _TITLE_\? _PUBLICATION_: _ANY_, _VOLUME_, _PAGES_', '_AUTHORS_ (submitted). _TITLE_', '_AUTHORS_ (_YEAR_). _TITLE_\? _PUBLICATION_, _VOLUME_, _PAGES_', '_AUTHORS_ (_YEAR_). _TITLE_', '_AUTHORS_ (_YEAR_). _TITLE_._ANY_', '_AUTHORS_ (_YEAR_). _TITLE_. _PUBLICATION_, _VOLUME_, _ISSUE_', '_AUTHORS_ (in press). _TITLE_. _PUBLICATION_', '_AUTHORS_ (_YEAR_). _TITLE_. In _ANY_, _PUBLICATION_ (pp._PAGES_). _PUBLOC_: _PUBLISHER_', '_PUBLICATION_: _TITLE_, (pp. _ANY_). _PUBLOC_: _PUBLISHER_', '_AUTHORS_ (_YEAR_). _TITLE_\? _PUBLICATION_, _VOLUME_, _PAGES_', '_AUTHORS_ (_YEAR_). _TITLE_. _PUBLICATION_, _VOLUME_,, _PAGES_', '_AUTHORS_ (_YEAR_). _TITLE_. Master\'s thesis, _PUBLOC_', '_AUTHORS_ (in press). _TITLE_. In _ANY_, _PUBLICATION_. _PUBLOC_: _PUBLISHER_', '_AUTHORS_ (_YEAR_). _TITLE_. _PUBLICATION_, _VOLUME_, (sup.), _PAGES_', '_AUTHORS_ (_YEAR_). _TITLE_. _PUBLICATION_, _VOLUME_, _PAGES_', '_AUTHORS_ (_YEAR_). _TITLE_. In _ANY_, _PUBLICATION_ (pp. _PAGES_). _PUBLISHER_', '_AUTHORS_, _YEAR_, _TITLE_ in _ANY_, _YEAR_, pp. _PAGES_', '_AUTHORS_, _YEAR_, "_TITLE_," _PUBLICATION_, _VOLUME_, _ISSUE_', '_AUTHORS_, _YEAR_, "_TITLE_," in _ANY_, _PUBLICATION_, _PUBLOC_: _PUBLISHER_, pp. _PAGES_', '_AUTHORS_, _YEAR_, _TITLE_, _PUBLOC_: _PUBLISHER_', '_AUTHORS_, _YEAR_, "_TITLE_," _PUBLICATION_ _VOLUME_, p._PAGES_', '_AUTHORS_, _YEAR_, _TITLE_, _PUBLOC_: _PUBLISHER_, _ANY_, "_SUBTITLE_," _PUBLICATION_, _VOLUME_, pp._PAGES_', '_AUTHORS_, _YEAR__ANY_, "_TITLE_," _PUBLICATION_, _VOLUME_, pp._PAGES_', '_AUTHORS_, _YEAR_, "_TITLE_," in _ANY_, _PUBLICATION_, _PUBLOC_: _PUBLISHER_, pp._PAGES_', '_AUTHORS_, _YEAR_, "_TITLE_," _PUBLICATION_, _VOLUME_, p._PAGES_', '_AUTHORS_ _YEAR_, "_TITLE_" _PUBLICATION_, _VOLUME_, _PAGES_', '_AUTHORS_, _YEAR_, "_TITLE_," ch. _CHAPTER_ (pp. _PAGES_), in _ANY_, _PUBLICATION_, _PUBLOC_: _PUBLISHER_', '_AUTHORS_, _YEAR_, _TITLE_, _PUBLICATION_, p._PAGES_', '_AUTHORS_, _YEAR_, "_TITLE_," _PUBLICATION_, _VOLUME_, pp._PAGES_. _ANY_, _ANY_, _PUBLICATION_, _PUBLOC_: _PUBLISHER_', '_AUTHORS_ _YEAR_, "_TITLE_," _PUBLICATION_ _VOLUME_,pp_PAGES_', '_AUTHORS_, _YEAR_, "_TITLE_," _PUBLICATION_ _VOLUME_, p. _PAGES_', '_AUTHORS_, _YEAR_, "_TITLE_," _PUBLICATION_, _VOLUME_, pp _PAGES_', '_AUTHORS_, _YEAR_, "_TITLE_," _PUBLICATION_, _VOLUME_, pp._PAGES_', '_AUTHORS_, _YEAR_, "_TITLE_," _PUBLICATION_, _VOLUME_, pp. _PAGES_', '_AUTHORS, _YEAR_,"_TITLE_," _PUBLICATION_, _VOLUME_, pp._PAGES_', '_AUTHORS_, _YEAR_, "_TITLE_" _PUBLICATION_, _VOLUME_, pp._PAGES_', '_AUTHORS_, _YEAR_, _TITLE_, _PUBLOC_: _PUBLISHER_', '_AUTHORS_, _YEAR_, "_TITLE_," _PUBLICATION_, _VOLUME_, p._SPAGE_- _EPAGE_', '_AUTHORS_, _YEAR_, presentation _ANY_, _PUBLOC_', '_AUTHORS_, _YEAR_, "_TITLE_,", _PUBLICATION_, _VOLUME_, pp._PAGES_', '_AUTHORS_, _YEAR_, "_TITLE_," _PUBLICATION_, _VOLUME_, p. _SPAGE_', '_AUTHORS_, _YEAR_, "_TITLE_," _PUBLICATION_ _VOLUME_,pp._PAGES_', '_AUTHORS_ _YEAR_, "_TITLE_," _PUBLICATION_, _VOLUME_, p._PAGES_', '_AUTHORS_, _YEAR_, "_TITLE_," _PUBLICATION_ _VOLUME_, pp._SPAGE_- _EPAGE_', '_AUTHORS_, _YEAR_, "_TITLE_," _PUBLICATION_ _VOLUME_, pp. _PAGES_', '_AUTHORS_, _YEAR_, "_TITLE_," in _ANY_, eds., _TITLE_, _PUBLOC_: _PUBLISHER_', '_AUTHORS_, _YEAR_, "_TITLE_," _PUBLICATION_, _VOLUME_, pp._PAGES_', '_AUTHORS_, _YEAR_, "_TITLE_," _PUBLICATION_, _VOLUME_, pp. _PAGES_', '_AUTHORS_, _YEAR_, "_TITLE_," _PUBLICATION_, _VOLUME_, _PAGES_', '_AUTHORS_, _YEAR_, "_TITLE_," _PUBLICATION_, _VOLUME_, p_PAGES_', '_AUTHORS_, _YEAR__ANY_, "_TITLE_," _PUBLICATION_, _VOLUME_, p._PAGES_', '_AUTHORS_, _YEAR_, "_TITLE_" _PUBLICATION_ _VOLUME_, p._PAGES_', '_AUTHORS_, _YEAR_, "_TITLE_" _PUBLICATION_, _VOLUME_, p[._PAGES_', '_AUTHORS_, _YEAR_, "_TITLE_," _PUBLICATION_ _VOLUME_,pp _PAGES_', '_AUTHORS_, _YEAR_, "_TITLE_," _PUBLICATION_ _VOLUME_, p_SPAGE_', '_AUTHORS_, _YEAR_, _PUBLOC_: _PUBLISHER_', '_AUTHORS_, _YEAR_, "_TITLE_" _PUBLICATION_, _VOLUME_,, pp._PAGES_', '_AUTHORS_ _YEAR_, _TITLE_, _PUBLOC_: _PUBLISHER_', '_AUTHORS_, _YEAR_, "_TITLE_," in _ANY_, ed., _PUBLICATION_, _PUBLISHER_, pp._PAGES_', '_AUTHORS_, _YEAR_, _ANY_, translated as _TITLE_, _PUBLOC_: _PUBLISHER_, _ANY_', '_AUTHORS_, _YEAR_, "_TITLE_" _PUBLICATION_, _VOLUME_, pp._PAGES_', '_AUTHORS_, _YEAR_, "_TITLE_," _PUBLICATION_, _VOLUME_, pp. _PAGES_', '_AUTHORS_, _YEAR_, "_TITLE_," _PUBLICATION_ _VOLUME_, pp._PAGES_', '_AUTHORS_, _YEAR_, "_TITLE_," _PUBLICATION_, _VOLUME_, No. _ISSUE_', '_AUTHORS_, _YEAR_, "_TITLE_" _PUBLICATION_, _VOLUME_, p._SPAGE_', '_AUTHORS_, _YEAR_, "_TITLE_," _PUBLICATION_, _VOLUME_, pp._PAGES_, (_YEAR_) _ISSUE_, pp._PAGES_', '_AUTHORS_, _YEAR__ANY_, _TITLE_, _PUBLOC_: _PUBLISHER_' ]; 1; __END__ =pod =head1 AUTHOR Mike Jewell =cut libbiblio-citation-parser-perl-1.10+dfsg.orig/lib/Biblio/Citation/Parser.pm0000644000175000017500000000421210115644546026113 0ustar gregoagregoapackage Biblio::Citation::Parser; ###################################################################### # # Biblio::Citation::Parser; # ###################################################################### # # This file was originally part of ParaCite Tools, based at # http://paracite.eprints.org/developers/ # # # Copyright (c) 2004 University of Southampton, UK. SO17 1BJ. # # ParaTools is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # ParaTools is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with ParaTools; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # ###################################################################### use strict; use vars qw($VERSION); require Exporter; our @ISA = qw(Exporter); our @EXPORT_OK = ( 'parse', 'new' ); $VERSION = "1.10"; =pod =head1 NAME B - citation parsing framework =head1 DESCRIPTION Biblio::Citation::Parser provides generic methods for reference parsers. This class should not be used directly, but rather be overridden by specific parsers. Parsers that extend the Parser class must provide at least the two methods defined here to ensure compatibility. =head1 METHODS =over 4 =item $cite_parser = Biblio::Citation::Parser-Enew() The new() method creates a new parser instance. =cut sub new { my($class) = @_; my $self = {}; return bless($self, $class); } =pod =item $metadata = $parser-Eparse($reference) The parse() method takes a reference and returns the extracted metadata. =cut sub parse { my($self, $ref) = @_; die "This method should be overridden.\n"; } 1; __END__ =pod =back =head1 AUTHOR Mike Jewell =cut libbiblio-citation-parser-perl-1.10+dfsg.orig/t/0000755000175000017500000000000010115646330021036 5ustar gregoagregoalibbiblio-citation-parser-perl-1.10+dfsg.orig/t/01-citeparse.t0000644000175000017500000000245210115645050023421 0ustar gregoagregoa#!/bin/env perl BEGIN { unless(grep /blib/, @INC) { chdir 't' if -d 't'; unshift @INC, '../lib' if -d '../lib'; } } use Test; BEGIN { plan tests => 7 } use Biblio::Citation::Parser::Standard; { # check 'use ...' print "'use Biblio::Citation::Parser...' test(s)...\n"; eval "use Biblio::Citation::Parser 99.99"; ok($@ =~ /99\.99 required/); } # Check a simple ref { my $ref = "Jewell, M (2002) Making Examples for Reference Parsers. Journal of Example Writing 3:100-150."; my $cit_parser = new Biblio::Citation::Parser::Standard; my $metadata = $cit_parser->parse($ref); ok(scalar keys %$metadata == 14); ok($metadata->{pages} eq "100-150"); ok($metadata->{title} eq "Journal of Example Writing"); # Do a few OpenURL util checks use Biblio::Citation::Parser::Utils; # Add a spurious key $metadata->{foo} = "bar"; $metadata = trim_openurl($metadata); ok(!$metadata->{foo}); ($metadata,undef) = decompose_openurl($metadata); ok($metadata->{spage} eq "100"); } # Test the Jiao module { use Biblio::Citation::Parser::Jiao; my $ref = "Jewell, M (2002) Making Examples for Reference Parsers. Journal of Example Writing 3:100-150."; my $cit_parser = new Biblio::Citation::Parser::Jiao; my $metadata = $cit_parser->parse($ref); ok($metadata->{spage} eq "100"); } libbiblio-citation-parser-perl-1.10+dfsg.orig/Build.PL0000644000175000017500000000042310115645370022071 0ustar gregoagregoause Module::Build; Module::Build->new ( module_name => 'Biblio::Citation::Parser', license => 'gpl', requires => { 'URI' => 0, 'Text::Unidecode' => 0, }, recommends => { 'URI::OpenURL' => 0, 'SOAP::Lite' => 0, }, )->create_build_script; libbiblio-citation-parser-perl-1.10+dfsg.orig/MANIFEST0000644000175000017500000000173411300037153021723 0ustar gregoagregoaREADME t/01-citeparse.t examples/parsing/simpleparser.pl examples/parsing/complexparser.pl examples/parsing/openurl2.pl examples/parsing/openurl.pl examples/webservice/make_html.pl examples/webservice/ref_search.pl examples/webservice/make_openurl.pl examples/webservice/parse_reference.pl examples/webservice/referencelist.txt examples/webservice/paracite.wsdl examples/README lib/Biblio/Citation/Parser/Utils.pm lib/Biblio/Citation/Parser.pm lib/Biblio/Citation/Parser/Citebase.pm lib/Biblio/Citation/Parser/Standard.pm lib/Biblio/Citation/Parser/Templates.pm lib/Biblio/Citation/Parser/Jiao.pm lib/Biblio/Citation/Parser/Jiao/Utility.pm docs/ascii/citeparser.txt docs/pdf/citeparser.pdf docs/html/contact.html docs/html/howto.html docs/html/index.html docs/html/installation.html docs/html/intro.html docs/html/refparsing.html docs/html/reqsoftware.html docs/html/troubleshooting.html docs/html/webservice.html COPYING CHANGELOG BUGLIST Build.PL MANIFEST INSTALL VERSION TODO META.yml libbiblio-citation-parser-perl-1.10+dfsg.orig/examples/0000755000175000017500000000000010115646330022411 5ustar gregoagregoalibbiblio-citation-parser-perl-1.10+dfsg.orig/examples/webservice/0000755000175000017500000000000010115646330024547 5ustar gregoagregoalibbiblio-citation-parser-perl-1.10+dfsg.orig/examples/webservice/paracite.wsdl0000755000175000017500000001477610115165675027264 0ustar gregoagregoa libbiblio-citation-parser-perl-1.10+dfsg.orig/examples/webservice/ref_search.pl0000755000175000017500000000067510115165675027230 0ustar gregoagregoa#!/usr/bin/perl -w use SOAP::Lite; my $query = "Harnad, Stevan (1995) The PostGutenberg Galaxy: How to Get There From Here. Information Society 11(4):285-292."; my $baseurl = "http://paracite.eprints.org/cgi-bin/openurl.cgi?"; my $result = SOAP::Lite -> service("http://paracite.eprints.org/paracite.wsdl") -> doParaciteSearch($query, $baseurl); print "Results of search on $query:\n"; use Data::Dumper; print Dumper($result); libbiblio-citation-parser-perl-1.10+dfsg.orig/examples/webservice/referencelist.txt0000644000175000017500000000052510115165675030154 0ustar gregoagregoaJewell, M (2002) Making Examples for Reference Parsers. Journal of Example Writing 3:100-150. Harnad, Stevan (1995) The PostGutenberg Galaxy: How to Get There From Here. Information Society 11(4):285-292. Gastroenterology V.81 #1 1994 p.79-84 "Treatment of nonulcer dyspepsia with famotidine and sodium alginate." Au: Castillo M; Gimenez JC libbiblio-citation-parser-perl-1.10+dfsg.orig/examples/webservice/make_html.pl0000755000175000017500000000105510115165675027061 0ustar gregoagregoa#!/usr/bin/perl -w use SOAP::Lite; # A more involved example - creates a chunk of HTML # with links to the OpenURLs for each reference in # referencelist.txt. my $baseurl = "http://paracite.eprints.org/cgi-bin/openurl.cgi?"; my $service = SOAP::Lite -> service("http://paracite.eprints.org/paracite.wsdl"); open(FIN, "referencelist.txt"); print "
    \n"; foreach() { chomp; $openurl = $service->doOpenURLConstruct($_, $baseurl); print '
  • '.$_.'
  • ',"\n"; } print "
\n"; close FIN; libbiblio-citation-parser-perl-1.10+dfsg.orig/examples/webservice/make_openurl.pl0000755000175000017500000000053510115165675027603 0ustar gregoagregoa#!/usr/bin/perl -w use SOAP::Lite; my $query="Jewell, M (2002) Making Examples for Reference Parsers. Journal of Example Writing 3:100-150."; my $result = SOAP::Lite -> service("http://paracite.eprints.org/paracite.wsdl") -> doOpenURLConstruct($query, "http://paracite.eprints.org/cgi-bin/openurl.cgi?"); print "OpenURL for $query: $result\n"; libbiblio-citation-parser-perl-1.10+dfsg.orig/examples/webservice/parse_reference.pl0000755000175000017500000000102710115165675030247 0ustar gregoagregoa#!/usr/bin/perl -w use SOAP::Lite; use Data::Dumper; my $query = "Jewell, M (2002) Making Examples for Reference Parsers. Journal of Example Writing 3:100-150."; my $baseurl = "http://paracite.eprints.org/cgi-bin/openurl.cgi?"; my $result = SOAP::Lite -> service("http://paracite.eprints.org/paracite.wsdl") -> doReferenceParse($query, $baseurl); my $metadata = $result->{metadata}; my $openurl = $result->{openURL}; print "Metadata for $query:\n"; print Dumper($metadata); print "OpenURL:\n"; print Dumper($openurl); libbiblio-citation-parser-perl-1.10+dfsg.orig/examples/README0000644000175000017500000000213510115223312023261 0ustar gregoagregoaExample Descriptions ==================== NB: These examples will only work once the Perl module is installed (see INSTALL for more information). parsing/ - Examples using the ParaTools API parsing/complexparser.pl - Shows some detailed metadata from a parsed reference parsing/openurl.pl - Creates an OpenURL address from a parsed reference parsing/openurl2.pl - Decomposes and trims OpenURL metadata then displays the result. parsing/simpleparser.pl - Displays the basic metadata of a parsed reference webservice - Examples using the WSDL web service. These require the SOAP::Lite Perl module. webservice/make_html.pl - Creates a list of ParaCite links using the provided reference list. webservice/make_openurl.pl - Generates an OpenURL via the web service. webservice/parse_reference.pl - Extracts the metadata from a reference over the web service. webservice/ref_search.pl - Searches the ParaCite engine on a reference and displays the results. webservice/paracite.wsdl - The ParaCite WSDL document. webservice/referencelist.txt - The reference list used by make_html.pl libbiblio-citation-parser-perl-1.10+dfsg.orig/examples/parsing/0000755000175000017500000000000010115646330024054 5ustar gregoagregoalibbiblio-citation-parser-perl-1.10+dfsg.orig/examples/parsing/openurl2.pl0000755000175000017500000000125210115644762026171 0ustar gregoagregoa#!/usr/bin/perl # This (slightly more involved) example parses a reference, # decomposes it (to get spage, epage, etc), trims it to remove # any non-OpenURL fields, and then dumps the metadata. use Biblio::Citation::Parser::Standard; use Biblio::Citation::Parser::Utils; use Data::Dumper; $ref = "Jewell, M (2002) Making Examples for Reference Parsers. Journal of Example Writing 3:100-150."; my $cit_parser = new Biblio::Citation::Parser::Standard; print "- Parsing $ref\n"; $metadata = $cit_parser->parse($ref); print "- Decomposing and trimming metadata\n"; $metadata = trim_openurl(decompose_openurl($metadata)); print "- Metadata dump follows:\n"; print Dumper($metadata); libbiblio-citation-parser-perl-1.10+dfsg.orig/examples/parsing/simpleparser.pl0000755000175000017500000000116310115644763027133 0ustar gregoagregoa#!/usr/bin/perl use Biblio::Citation::Parser::Standard; $ref = "Jewell, M (2002) Making Examples for Reference Parsers. Journal of Example Writing 3:100-150."; print "- Parsing '$ref'\n"; my $cit_parser = new Biblio::Citation::Parser::Standard; $metadata = $cit_parser->parse($ref); print "- Metadata follows:\n"; print "First name: ".$metadata->{aufirst}."\n"; print "Last name: ".$metadata->{aulast}."\n"; print "Title: ".$metadata->{atitle}."\n"; print "Publication: ".$metadata->{title}."\n"; print "Year: ".$metadata->{year}."\n"; print "Issue: ".$metadata->{issue}."\n"; print "Page range: ".$metadata->{pages}."\n"; libbiblio-citation-parser-perl-1.10+dfsg.orig/examples/parsing/complexparser.pl0000755000175000017500000000141110115645001027267 0ustar gregoagregoa#!/usr/bin/perl use Biblio::Citation::Parser::Standard; # Get a little extra info out of the metadata. $ref = "Jewell, M (2002) Making Examples for Reference Parsers. Journal of Example Writing 3:100-150."; print "- Parsing '$ref'\n"; my $cit_parser = new Biblio::Citation::Parser::Standard; $metadata = $cit_parser->parse($ref); print "- Metadata follows:\n"; print "First name: ".$metadata->{aufirst}."\n"; print "Last name: ".$metadata->{aulast}."\n"; print "Title: ".$metadata->{atitle}."\n"; print "Publication: ".$metadata->{title}."\n"; print "Year: ".$metadata->{year}."\n"; print "Issue: ".$metadata->{issue}."\n"; print "Page range: ".$metadata->{pages}."\n"; print "Matched template: ".$metadata->{match}."\n"; print "Marked result: ".$metadata->{marked}."\n"; libbiblio-citation-parser-perl-1.10+dfsg.orig/examples/parsing/openurl.pl0000755000175000017500000000133710115644757026117 0ustar gregoagregoa#!/usr/bin/perl # This example creates an OpenURL address from a parsed reference. use Biblio::Citation::Parser::Standard; use Biblio::Citation::Parser::Utils; use URI::OpenURL; $ref = "Jewell, M (2002) Making Examples for Reference Parsers. Journal of Example Writing 3:100-150."; print "- Parsing $ref\n"; my $cit_parser = new Biblio::Citation::Parser::Standard; $metadata = $cit_parser->parse($ref); print "- Creating OpenURL (BaseURL set to http://paracite.eprints.org/cgi-bin/openurl.cgi)\n"; print URI::OpenURL->new('http://paracite.eprints.org/cgi-bin/openurl.cgi')->referent(%$metadata)->as_string(); my($openurl,@errors) = create_openurl($metadata); print "http://paracite.eprints.org/cgi-bin/openurl.cgi?".$openurl."\n"; libbiblio-citation-parser-perl-1.10+dfsg.orig/VERSION0000644000175000017500000000003310115225524021635 0ustar gregoagregoaParaTools 1.10 (SellADoor) libbiblio-citation-parser-perl-1.10+dfsg.orig/BUGLIST0000644000175000017500000000122710115165675021641 0ustar gregoagregoa====================================================================== Known Bugs & Issues in current ParaTools release ====================================================================== See the docs for how to submit a bug/issue. ---------------------------------------------------------------------- Internationalisation ---------------------------------------------------------------------- - Need to add proper unicode support ---------------------------------------------------------------------- Parsing ---------------------------------------------------------------------- - Need to find a PDF-to-text tool that works properly on all PDF files. libbiblio-citation-parser-perl-1.10+dfsg.orig/README0000644000175000017500000000060510115645525021461 0ustar gregoagregoaBiblio::Citation::Parser README Biblio::Citation::Parser is a set of modules for citation parsing. Documentation for the API is available in the docs/ directory in HTML, plain text, and PDF flavours. There is also a ParaTools Developers area on the http://paracite.eprints.org website at http://paracite.eprints.org/developers/ which includes an FAQ and the docs in this distribution. libbiblio-citation-parser-perl-1.10+dfsg.orig/CHANGELOG0000644000175000017500000000451010115645444022012 0ustar gregoagregoa====================================================================== 2004-09-02 - ParaTools 1.10 (SellADoor) Released ====================================================================== - Renamed to Biblio::Citation::Parser - Forgot to add Citebase.pm (oops!) 2004-09-01 - ParaTools split into Biblio::CiteParser and Biblio::DocParser - Merged Utils, OpenURL, and Intl - Switched to Build.PL - Updated docs to reflect split ParaCite Toolkit Changelog 2003-03-07 - Jiao module updated (Phys Rev stuff) 2003-03-06 - Citebase parser added 2003-02-01 - Brody docparser added 2003-01-30 - Fixed $currtemplate vs $original bug in CiteParser::Standard 2003-01-29 - Now using -raw flag in pdftotext 2003-01-28 - Taken out Timer::HiRes for now - Added AUTHORS file ====================================================================== 2002-12-27 - ParaTools 1 (CellarDoor) Released ====================================================================== 2003-01-27 - Changed $trim to $notrim - Turned off texinfo for now - Also require File::Temp - Lowered version requirement - Added docs for File::Temp - Altered notrim docs - Replaced 'get_references' with 'parse' for consistency. - Replaced 'get_lines' with 'get_content'. - 'get_references' now takes a string, 'get_content' returns one. - Removed line count check from docparse tests - Added %options to parse methods - Switched 'parse' and 'new' in the docs - Fixed the module list and links in INSTALL - Added the other dependencies to reqsoftware.pod 2003-01-25 - Added Parser Creation HOW TO - Increased maxlen from 5 to 6 in DocParser - Added texinfo docs 2003-01-24 - Added mv lines to mkdocs to tidy things - Updated MANIFEST - Correct pstotext docs - Converted docs to nice pod - Now using E instead of > for compatibility - Lowered publication min length to 4 (5 knocked out 'Mind') - Added a new template - Documentation, documentation, documentation 2003-01-23 - CVS started. 2003-01-21 - Author regexp improved in CiteParser::Standard 2003-01-20 - Jiao module added to CiteParser ====================================================================== 2002-12-26 - ParaTools 1 Alpha Released ====================================================================== libbiblio-citation-parser-perl-1.10+dfsg.orig/META.yml0000644000175000017500000000157110115646330022050 0ustar gregoagregoa--- #YAML:1.0 name: Biblio-Citation-Parser version: 1.10 license: gpl distribution_type: module requires: Text::Unidecode: 0 URI: 0 recommends: SOAP::Lite: 0 URI::OpenURL: 0 build_requires: {} conflicts: {} provides: Biblio::Citation::Parser: file: lib/Biblio/Citation/Parser.pm version: 1.10 Biblio::Citation::Parser::Citebase: file: lib/Biblio/Citation/Parser/Citebase.pm Biblio::Citation::Parser::Jiao: file: lib/Biblio/Citation/Parser/Jiao.pm Biblio::Citation::Parser::Jiao::Utility: file: lib/Biblio/Citation/Parser/Jiao/Utility.pm version: 0.01 Biblio::Citation::Parser::Standard: file: lib/Biblio/Citation/Parser/Standard.pm Biblio::Citation::Parser::Templates: file: lib/Biblio/Citation/Parser/Templates.pm Biblio::Citation::Parser::Utils: file: lib/Biblio/Citation/Parser/Utils.pm generated_by: Module::Build version 0.19