The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# --*-Perl-*--
# $Id: InderScience.pm 23 2005-07-17 19:28:02Z tandler $
#

package PBib::BibItemStyle::InderScience;
use strict;
use warnings;
#use English;

=head1 package PBib::BibItemStyle::InderScience;

Based on the sample files from http://www.inderscience.com/
Adapted from the ElsevierJSS style:
- title with singleQuotes
- year with ()
- spaceConnect for authors, year, title
- use Vol. v, No. n, instead of v(n) for journals

=cut

# for debug:
#use Data::Dumper;

BEGIN {
    use vars qw($Revision $VERSION);
	my $major = 1; q$Revision: 23 $ =~ /: (\d+)/; my ($minor) = ($1); $VERSION = "$major." . ($minor<10 ? '0' : '') . $minor;
}

# superclass
use base qw(PBib::BibItemStyle);
#  use vars qw(@ISA);
#  @ISA = qw(PBib::BibItemStyle);

# used modules
#use ZZZZ;

# module variables
#use vars qw(mmmm);

#
#
# constructor
#
#

sub new {
  my $self = PBib::Style::new(@_);
  $self->{'keywords'} = $self->InderScience_keywords();
  return $self;
}


#
#
# access methods
#
#

sub InderScience_keywords {
  return {
	'editor' => 'Ed.',
	'editors' => 'Eds.',
	"page" => "p.",
	"pages" => "pp.",
	"volume" => "Vol.",
	"number" => "No.",
	"chapter" => "ch.",
	"PhD thesis" => "Ph.D. thesis",
	"Technical Report" => "Tech. Rep.",
	};
}

sub includeLabel { my ($self) = @_;
# should the Cite label be included in the bibliography?
#
# overwrite to set default to 0
#
  return $self->option("include-label") || 0;
}

#
#
# format methods for entries
#
#

sub format_names { my ($self, $names) = @_;
  return () unless( defined($names) );
  return $self->format_names_last_initials($names);
}

sub format_editors { my ($self, $check) = @_;
  my $eds = $self->entry('Editors', $check);
  return undef unless defined $eds;
  my $num = $self->num_names($eds);
  return $num == 0 ? () :
	($self->format_names($eds) .
	 " (" .
	 $self->format_keyword($num == 1 ? "editor" : "editors") .
	 ")"
	);
}

sub format_title { my ($self, $check) = @_;
  my $Title = $self->outDoc()->singleQuotes($self->entry('Title', $check));
  return $Title;
}
sub format_journal { my ($self) = @_;
  return $self->entry('Journal', 1);
}

sub format_date { my ($self, $check) = @_;
  my $Year = $self->entry('Year', $check);
  return () unless defined($Year);
  my $postfix = $self->labelStyle()->postfix($self->refID());
  return "($Year$postfix)";
}

sub format_in_ed_booktitle { my ($self, $check) = @_;
  my $Booktitle = $self->entry('SuperTitle', $check);
  return () unless $Booktitle;
  $Booktitle = $self->outDoc()->italic($Booktitle);
  return
	$self->entryNotEmpty('Editors') ?
		$self->format_editors() . ", $Booktitle" :
		$Booktitle;
}

sub format_vol_num_pages { my ($self) = @_;
# return "volume(number):pages" or "pp. pages"
	my $Volume = $self->entry('Volume');
	my $Number = $self->entry('Number');
	return $self->format_pages()
		unless ($Volume || $Number);
	my $Pages = $self->outDoc->formatRange($self->entry('Pages'));
	return (
		$self->tieOrSpaceConnect(
			$self->format_keyword("volume"),
			$Volume),
		$self->tieOrSpaceConnect(
			$self->format_keyword("number"),
			$Number),
		$self->format_pages(),
		);
}

sub format_addr_pub { my ($self, $check) = @_;
  my $Publisher = $self->entry('Publisher', $check);
  my $Address = $self->entry('Address');
  return () unless ($Publisher);
  return $Address ?
	"$Publisher, $Address" :
	$Publisher;
}

#
#
# sorting ...
#
#


sub sortkey_names { my ($self, $names) = @_;
  my @all_names = $self->split_names($names);
  return () unless( @all_names );
  @all_names = map( $self->last_name($_), @all_names );
  return join(" ", @all_names);
}

#
#
# formating methods for different bib types
#
#


sub format_article { my ($self) = @_;
  return [
	[
		[
			$self->spaceConnect(
				$self->format_authors(1),
				$self->format_date(1),
				$self->format_title(1),
			),
			$self->format_journal(1),
			$self->format_vol_num_pages(),
			$self->format_language(),
		]
	],
	$self->format_trailer(),
	];
}
sub format_book { my ($self) = @_;
  return [
	[
		[
			$self->spaceConnect(
				$self->format_authors_or_editors(),
				$self->format_date(1),
				$self->format_title(1),
			),
			$self->format_volume_number_series(),
			$self->format_addr_pub(1),
			$self->format_edition(),
			$self->format_language(),
		],
	],
	$self->format_trailer(),
	];
}

sub format_booklet { my ($self) = @_;
### this is simplyfied: always generate a new block
### between title and howpublished/address ...
  return [
	[ $self->format_authors() ],
	[ [
		$self->format_title(1),
		$self->format_howpublished(),
		$self->format_address(),
		$self->format_date(),
		$self->format_language(),
	] ],
	$self->format_trailer(),
	];
}


sub format_inbook { my ($self) = @_;
  return [
	[
		[
			$self->spaceConnect(
				$self->format_authors_or_editors(),
				$self->format_date(1),
				$self->format_title(1),
			),
			$self->format_volume_number_series(),
			$self->format_addr_pub(1),
			$self->format_edition(),
			$self->format_chapter_pages(),
			$self->format_language(),
		]
	],
	$self->format_trailer(),
	];
}

sub format_incollection { my ($self) = @_;
  return [
	[
		[
			$self->spaceConnect(
				$self->format_authors(1),
				$self->format_date(1),
				$self->format_title(1),
			),
#		], [
			$self->format_in_ed_booktitle(1),
			$self->format_volume_number_series(),
			$self->format_addr_pub(1),
			$self->format_edition(),
			$self->format_chapter_pages(),
			$self->format_language(),
		]
	],
	$self->format_trailer(),
	];
}

sub format_inproceedings { my ($self) = @_;
  return $self->format_incollection();
}

sub sortkey_manual { my ($self) = @_; return $self->sortkey_authors(); }
sub format_manual { my ($self) = @_;
  ## well, free-style ...
  return [
	[ [
		$self->spaceConnect(
			$self->format_authors(),
			$self->format_title_for_book(1),
			$self->format_volume_number_series(),
		),
	#  ] ],
	#  [ [
		$self->format_organization(),
		$self->format_address(),
		$self->format_edition(),
		$self->format_date(),
		$self->format_language(),
	] ],
	$self->format_trailer(),
	];
}

sub format_thesis { my ($self, $default_type) = @_;
  return [
	[
		[
			$self->spaceConnect(
				$self->format_authors(1),
				$self->format_date(1),
				$self->format_title(1),
			),
			$self->format_type($default_type || "thesis"),
			$self->format_school(1),
			$self->format_address(),
			$self->format_language(),
		]
	],
	$self->format_trailer(),
	];
}

#sub format_masterthesis { my ($self) = @_;
#  return $self->format_thesis("Master's thesis");
#}

sub format_misc { my ($self) = @_;
  return [
	[
		[
			$self->spaceConnect(
				$self->format_authors(),
				$self->format_date(1),
				$self->format_title(),
			),
			$self->format_howpublished(),
			$self->format_language(),
		]
	],
	$self->format_trailer(),
	];
}

#sub format_phdthesis { my ($self) = @_;
#  return $self->format_thesis("PhD thesis");
#}

sub format_proceedings { my ($self) = @_;
  return $self->format_book();
}

sub format_report { my ($self) = @_;
  return [
	[
		[
			$self->spaceConnect(
				$self->format_authors(1),
				$self->format_date(1),
				$self->format_title(1),
			),
			$self->format_techrep_number(),
			$self->format_institution(1),
			$self->format_address(),
			$self->format_language(),
		]
	],
	$self->format_trailer(),
	];
}

sub format_unpublished { my ($self) = @_;
  return $self->format_misc();
}

sub format_talk { my ($self) = @_;
# a talk here is just like a conference paper, but with
# an optional publisher.
# I'd recommend to use this for workshop position paper etc.
  return [
	[
		[
			$self->spaceConnect(
				$self->format_authors(1),
				$self->format_date(1),
				$self->format_title(1),
			),
		#  ], [
			$self->format_in_ed_booktitle(1),
			$self->format_volume_number_series(),
			$self->format_addr_pub(),
			$self->format_edition(),
			$self->format_chapter_pages(),
			$self->format_language(),
		]
	],
	$self->format_trailer(),
	];
}


1;

#
# $Log: ElsevierJSS.pm,v $
# Revision 1.3  2003/05/22 11:56:06  tandler
# the "talk" is now formatted just like a inproceedings (paper), but with optional publisher.
#
# Revision 1.2  2002/11/05 18:30:44  peter
# format vol/nr (space/tie connect)
# minor fixes
#
# Revision 1.1  2002/11/03 22:16:07  peter
# new JSS style (Elsevier)
#