Biblio-Citation-Parser
view release on metacpan or search on metacpan
lib/Biblio/Citation/Parser/Citebase.pm view on Meta::CPAN
$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) {
lib/Biblio/Citation/Parser/Citebase.pm view on Meta::CPAN
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) {
( run in 1.163 second using v1.01-cache-2.11-cpan-7fcb06a456a )