Biblio-Citation-Parser
view release on metacpan or search on metacpan
lib/Biblio/Citation/Parser/Jiao.pm view on Meta::CPAN
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 = '';
lib/Biblio/Citation/Parser/Jiao.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.429 second using v1.01-cache-2.11-cpan-364913b4093 )