summaryrefslogtreecommitdiff
path: root/support/biblio/biblist.pl
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/biblio/biblist.pl
Initial commit
Diffstat (limited to 'support/biblio/biblist.pl')
-rwxr-xr-xsupport/biblio/biblist.pl896
1 files changed, 896 insertions, 0 deletions
diff --git a/support/biblio/biblist.pl b/support/biblio/biblist.pl
new file mode 100755
index 0000000000..6af7495de5
--- /dev/null
+++ b/support/biblio/biblist.pl
@@ -0,0 +1,896 @@
+#!/usr/bin/perl
+use strict;
+
+my $BIBLIST_VERSION = '1.2';
+
+my @REFS_FILES = ('refers.db');
+
+my @REFS;
+$REFS[0]='';
+
+my @ALLREFS;
+my %REFSORDERED;
+my %ALLFORMATSTRINGS;
+my $CITE_FORMAT;my $REF_FORMAT;
+
+my $ORDERING=''; #must contain key-field, like AUTHORL, or TITLE
+
+my $reservedLABEL='LABEL';
+my $reservedTYPE ='TYPE' ;
+my $reservedURL='URL';
+
+
+my $reservedAUTHOR ='AUTHOR'; #must be in the form '5;' - 5=five authors must be shown.
+ # ';'=1st author from the 2nd should be separated by ';'
+my $reservedAND_SEPARATOR='|'; #what have to be put before the last author goes after this!!!
+my $reservedET_AL='{ \it{et al}}'; #if number of authors more than shown will be added after the last one.
+
+
+my $reservedDOLLAR = '$';
+my $reservedARRAYSEP = '|';
+my $reservedCOMMENTSYMBOL = '%';
+my $SEPARATOR = "----------\n";
+
+my $reservedHASH_KEY = 'HASH_KEY_';
+my $reservedEMTY_FIELD_SIGN = '???'; #will be written instead of emty fields
+my $reservedNONUMBER = 'NONUMBER'; # if NONUMBER is given in the ref_format or cite_format, then no number will be put in the output.
+ # for example
+ # Normally: [4] Author, F.M. Interesting Articles' Journal
+ # NONUMBER Author, ....
+#--------------------------------------
+my $BIBITEM = '%'."\n".'\item'."\n".'% {';
+
+my $reservedBEGINBIBLIO='begin{biblio}'; #options for biblio starts like this
+my $reservedENDBIBLIO ='end{biblio}'; #and end like this!
+my $reservedLEFTSTART ='['; #TYPE[FORMAT_STRING]
+my $reservedRIGHTEND =']'; #so, example:
+ # ARTICLE[$AUTHOR0FL, M; $/ {\bf $YEAR$}, $VOL$]
+my $reservedCITE_FORMAT='cite_format='; #must be in the form cite_format=^{%s}
+my $reservedREF_FORMAT ='ref_format='; # the same
+my $reservedORDERING ='ordering='; #must be in the form ordering=AUTHORL. If no this field is given, then "asis" implied
+my $reservedS_STRING ='%s';
+my $reservedS_STRING1 ='\%s';
+my $reservedSTANDARD_CITE_FORMAT = "[$reservedS_STRING]"; # default values
+my $reservedSTANDARD_REF_FORMAT = "[$reservedS_STRING]"; # for references formats
+
+my %HASH_REFS; #CHANGE IT LATER!!!
+
+my $verbosity_level=1; # 5 is max
+my $optionsINSERT_EMPTY_FIELDS_SIGN = 1;
+my $optionsKEEP_BIBITEM_AND_CITE = 1;
+my $optionsHTML_OUTPUT = 0;
+
+my $optionsABBREVIATIONS =0; # use abbreviations tex-file
+
+my $httpprefix='';
+
+my $OUT_TEX =''; #'allrefs.tex';
+my $FORMAT_NAME ='';#'macromolecules';#$TEX_NAME; # file where all rules are!
+my $ABBR_NAME = 'abbr.tex'; #abbreviations file
+
+##############################################3
+
+
+&read_inline_arguments;
+&check_for_important_arguments;
+
+if ($verbosity_level > 0)
+{print "\nThis is biblist utility version $BIBLIST_VERSION\n";
+ print 'Author R.Stepanyan <rstepanyan@yahoo.com>',"\n\n"};
+print "output file is <$OUT_TEX>;\n";
+print "formats are in <$FORMAT_NAME>;\n";
+print 'refs databases are <';
+foreach my $qq (@REFS_FILES) {print "$qq "};
+print ">.\n\n";
+
+my $REFS_FILE;
+foreach $REFS_FILE (@REFS_FILES)
+{
+ &make_list_of_refs_in_dbase($REFS_FILE); #makes list of all refs in @REFS
+ if($verbosity_level > 4)
+ {print "read_ref_datafile <$REFS_FILE> first time: done...\n";}
+};
+
+
+my $i=0;
+for($i=0; $i<scalar(@REFS); $i++)
+{
+ $REFS[$i] = $REFS[$i+1];
+};
+$#REFS--; #now $REFS[0] is also used!!!!
+
+&read_formats_and_speak_to_me;
+
+
+foreach $REFS_FILE (@REFS_FILES)
+{ #print $REFS_FILE, "-------\n";
+ &read_ref_datafile($REFS_FILE); # all data will be stored in @ALLREFS - array of hashes
+ if($verbosity_level > 4)
+ {print "read_ref_datafile <$REFS_FILE> done...\n";}
+};
+if($verbosity_level > 4){print "\n";}
+
+&order_this_list;
+if($verbosity_level > 4)
+ {print "ordering of refs is done...\n";}
+
+
+if($optionsHTML_OUTPUT)
+{
+ open(OUTTEX, "> $OUT_TEX");
+ print OUTTEX '<html>',"\n";
+ print OUTTEX '<head>',"\n";
+ print OUTTEX ' <meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">',"\n";
+ print OUTTEX ' <meta NAME="Generator" CONTENT="biblist.pl">',"\n";
+ print OUTTEX ' <title>The bibliography list</title>',"\n";
+ print OUTTEX '</head>',"\n";
+ print OUTTEX '',"\n";
+ &insert_abbreviations_of_journals;
+ print OUTTEX '<dl compact><dd>',"\n";
+ &print_all_references_into_tex_in_html_format;
+ print OUTTEX '</dl>',"\n";
+ print OUTTEX '',"\n";
+ print OUTTEX '',"\n";
+ print OUTTEX '',"\n";
+ print OUTTEX '',"\n";
+ print OUTTEX '',"\n";
+ print OUTTEX '',"\n";
+ print OUTTEX '</html>',"\n";
+ close(OUTTEX);
+
+}
+else
+{
+ open(OUTTEX, "> $OUT_TEX");
+
+ print OUTTEX '\documentstyle[12pt,a4]{article}',"\n";
+ #print OUTTEX '\documentstyle[aps,manuscript]{revtex}',"\n";
+ print OUTTEX '\title{List of references \\\ Generated by "biblist.pl"}',"\n";
+ print OUTTEX '\date{\today}',"\n";
+ print OUTTEX '\begin{document}\maketitle',"\n";
+
+ &insert_abbreviations_of_journals;
+
+ print OUTTEX 'This list of references is generated from the following data-files:\newline',"\n",'\begin{center}{\it{';
+ for(my $RI=0; $RI<scalar(@REFS_FILES);$RI++)
+ { if($RI+1<scalar(@REFS_FILES)){print OUTTEX "$REFS_FILES[$RI], "}
+ else {print OUTTEX "$REFS_FILES[$RI]"};
+ };
+ print OUTTEX '}}\end{center}',"\n";
+ #print OUTTEX '\begin{thebibliography}',"\n";
+ print OUTTEX '\newcounter{bibliocounterrr}';
+ print OUTTEX '\begin{list}';
+ print OUTTEX '{\bfseries\upshape', '\arabic{bibliocounterrr}}';
+ print OUTTEX '{\usecounter{bibliocounterrr}',"\n";
+ print OUTTEX '\setlength{\labelwidth}{1cm}\setlength{\leftmargin}{0cm}',"\n";
+ print OUTTEX '\setlength{\labelsep}{0.5cm}\setlength{\rightmargin}{0cm}',"\n";
+ print OUTTEX '\setlength{\parsep}{0.5ex plus0.2ex minus0.1ex}',"\n";
+ print OUTTEX '\setlength{\itemsep}{1ex plus0.2ex}',"\n";
+ print OUTTEX '%\slshape',"\n";
+ print OUTTEX '}',"\n";
+ &print_all_references_into_tex_in_bibitem_format;
+ print OUTTEX '\end{list}',"\n";
+ #print OUTTEX '\end{thebibliography}',"\n";
+
+ print OUTTEX '\end{document}';
+ close(OUTTEX);
+}
+
+
+exit(0);
+
+
+
+
+
+
+
+
+################################################
+sub print_all_references_into_tex_in_html_format
+{ my ($item1, $item); my $thecounter=1;
+ #print OUTTEX '%Generated by biblio',"\n";
+ for(my $i=0;$i<scalar(@REFS);$i++)
+ {$item = @REFS[$i];
+ foreach $item1 (@ALLREFS) #loop 1
+ {if($item eq ${$item1}{"$reservedLABEL"})
+ { my $thetype=uc(${$item1}{"$reservedTYPE"}); # IN THE UPPER CASE!
+ if($ALLFORMATSTRINGS{"$thetype"} eq '')
+ { print OUTTEX '<dt> <a name="',${$item1}{"$reservedLABEL"} ,'">',$thecounter,'</a></dt>',"\n";
+ $thecounter++;
+ print OUTTEX "No format string for TYPE \"$thetype\". Skipping record \"$item\"!\n";
+ print STDERR "No format string for TYPE <$thetype>. Skipping record <$item>!\n";
+ last;
+ };
+
+
+ print OUTTEX "\n",'<dt> <a name="',${$item1}{"$reservedLABEL"} ,'">',$thecounter,'</a></dt>',"\n";
+ $thecounter++;
+ #print $thetype,"-->",$ALLFORMATSTRINGS{"$thetype"}, "\n";
+
+ print OUTTEX '<dd> ';
+ &formated_output($ALLFORMATSTRINGS{"$thetype"},%{$item1}); #CHANGE $FORMAT_STRING1 HERE!!!
+ if(${$item1}{"$reservedURL"} ne '')
+ {
+ print OUTTEX '<br><a href="';
+ my $theurl=${$item1}{"$reservedURL"};
+ if($theurl =~ m/http:\/\//)
+ {print OUTTEX $theurl,'">';}
+ else{print OUTTEX $httpprefix,$theurl,'">';}
+ print OUTTEX ${$item1}{"$reservedURL"};
+ print OUTTEX '</a>';
+ };
+ print OUTTEX '<br> &nbsp; </dd>',"\n";
+ #next;
+
+ last; #this is last for loop 1
+ }
+ };
+
+ };
+ #print OUTTEX '%',"\n",'%End of Generated by biblio',"\n";
+
+}
+#-----------------------------------------------------------
+sub print_all_references_into_tex_in_bibitem_format
+{ my ($item1, $item);
+ print OUTTEX '%Generated by biblio',"\n";
+ for(my $i=0;$i<scalar(@REFS);$i++)
+ {$item = @REFS[$i];
+ foreach $item1 (@ALLREFS) #loop 1
+ {if($item eq ${$item1}{"$reservedLABEL"})
+ { my $thetype=uc(${$item1}{"$reservedTYPE"}); # IN THE UPPER CASE!
+ if($ALLFORMATSTRINGS{"$thetype"} eq '')
+ { print OUTTEX $BIBITEM,$item,'}',"\n";
+ print OUTTEX "No format string for TYPE \"$thetype\". Skipping record \"$item\"!\n";
+ print STDERR "No format string for TYPE <$thetype>. Skipping record <$item>!\n";
+ last;
+ };
+
+ print OUTTEX $BIBITEM,$item,'}',"\n"; #,$CITE_FORMAT;
+
+ #print $thetype,"-->",$ALLFORMATSTRINGS{"$thetype"}, "\n";
+
+ &formated_output($ALLFORMATSTRINGS{"$thetype"},%{$item1}); #CHANGE $FORMAT_STRING1 HERE!!!
+ print OUTTEX "\n";
+ #next;
+
+ last; #this is last for loop 1
+ }
+ };
+
+ };
+ print OUTTEX '%',"\n",'%End of Generated by biblio',"\n";
+
+}
+#-----------------------------------------------------------
+sub order_this_list
+{ #??? TO BE DONE!!!!!!!
+ #for(my $i=0; $i<scalar(@REFS); $i++){ print "$i ->>> $REFS[$i] --\n"};
+
+ unless($ORDERING eq '')
+ {
+ my $do_ordering=1;
+ while($do_ordering)
+ { $do_ordering=0;
+ for(my $i=1; $i<scalar(@REFS); $i++)
+ {
+ if(&keyfield($REFS[$i-1]) gt &keyfield($REFS[$i]) )
+ {($REFS[$i-1], $REFS[$i]) = ($REFS[$i], $REFS[$i-1]); $do_ordering =1 }
+ }
+ };
+ };
+
+ for(my $i=0; $i<scalar(@REFS); $i++){ $REFSORDERED{"$REFS[$i]"} = $i+1};
+ #foreach $item (keys %REFSORDERED){ print $item,"--->",$REFSORDERED{"$item"},"\n"}
+};
+
+sub keyfield
+{
+ my $a = @_[0];
+
+ foreach my $item (@ALLREFS)
+ {
+ # print ${$item}{"LABEL"},"-->",${$item}{"VOL"},"\n";
+ if(${$item}{"$reservedLABEL"} eq $a) {return uc(${$item}{"$ORDERING"})}
+ };
+ return '';
+};
+#---------------------------------------------------
+sub read_ref_datafile
+#________________________________________________
+#reads references file. Data stored in @ALLREFS
+#structure of the refs-file:
+#LABEL=3dFlex
+#TYPE=article
+#AUTHORL=subbotin
+#TITLE={Microphase separation within comb-like copolymer with attractive side-chains: computer simulations1.}
+#JOURNAL= Macromol. Theory and Simul1.
+#----------<10pieces>
+#
+#At the end should be Enter, so better to put EOF after it in the
+#next line
+#
+{ my $current_ref_number=0; my $line;
+ my @fields; my %CURRENT_RECORD;
+
+ my $it_is_label=1; my $save_current_field=0;
+
+ my $item;
+ my $REFS_FILE = @_[0];
+
+ open(RF, $REFS_FILE)|| die "Could not open $REFS_FILE: $!";
+ while($line = <RF>)
+ { next if $line =~ /^\s*$/; # skip blank lines
+ next if (substr(trim($line),0,1) eq $reservedCOMMENTSYMBOL);
+ if($line ne $SEPARATOR)
+ {
+ $line=trim($line);
+ @fields = split(/=/, $line);
+
+ @fields = trim(@fields);
+
+ if($fields[0] eq $reservedLABEL)
+ {
+ foreach $item (@REFS)
+ { if($item eq $fields[1]) #this label is in REFS
+ { $save_current_field = 1 }
+ }
+ };
+
+ if($save_current_field)
+ { if($fields[0] eq $reservedLABEL){$CURRENT_RECORD{$fields[0]} = $fields[1]; }
+ else
+ {
+ if($CURRENT_RECORD{$fields[0]} ne '')
+ {
+ $fields[1]=trim($fields[1]);
+ $CURRENT_RECORD{$fields[0]}="$CURRENT_RECORD{$fields[0]}$reservedARRAYSEP$fields[1]" ;
+ }
+ else
+ {$CURRENT_RECORD{$fields[0]} = trim($fields[1]); }
+ };
+ #MUST change it to read fields with many '=' in the body text!!!
+ #print "$fields[0] == $CURRENT_RECORD{$fields[0]}\n";
+ }
+ }
+ else
+ {
+ if($save_current_field)
+ { %{$ALLREFS[$current_ref_number]} = %CURRENT_RECORD;
+ # Now erase everything from the hash!!!
+ my @allkeysfromhash = keys %CURRENT_RECORD;
+ foreach $item (@allkeysfromhash){delete($CURRENT_RECORD{$item})};
+
+ $current_ref_number++; #print "-------\n";
+ };
+ $save_current_field = 0;
+ };
+ };
+ close(RF);
+};
+
+#----------------------------------------------------------
+sub read_formats_and_speak_to_me
+#calls read_format_string and also produces output about results
+{
+&read_format_strings;
+if($verbosity_level > 3)
+{print "\nread_format_strings from <$FORMAT_NAME> done...\n\n";
+ printf("%16s | %s\n","TYPE","FORMAT STRING");
+ printf("%15s--+-%s\n","---------------","---------------------------------------------------");
+ foreach my $key (keys %ALLFORMATSTRINGS)
+ { printf("%16s | %s\n",$key,$ALLFORMATSTRINGS{$key})};
+ for(my $i=0;$i<70;$i++){print "-";};print "\n";
+};
+if($CITE_FORMAT eq '')
+{ print STDERR "Citation format not found or wrong in <$FORMAT_NAME>. Assuming default!\n";
+ $CITE_FORMAT = $reservedSTANDARD_CITE_FORMAT
+};
+if(uc($CITE_FORMAT) eq $reservedNONUMBER){$CITE_FORMAT='';}; #????????
+if($REF_FORMAT eq '')
+{ print STDERR "Citation reference format not found or wrong in <$FORMAT_NAME>. Assuming default!\n";
+ $REF_FORMAT = $reservedSTANDARD_REF_FORMAT
+};
+
+#print "$CITE_FORMAT $REF_FORMAT \n";
+if($verbosity_level > 0)
+ { print "\n!!! Citation format:$CITE_FORMAT. Reference format=$REF_FORMAT.\n Ordering:";
+ if($ORDERING eq ''){print "as is\n\n"}else {print " key field is <$ORDERING>\n\n"}
+ };
+
+}
+
+#----------------------------
+sub read_format_strings
+# this function reads formats for references from file $FORMAT_NAME
+# this can be just header in the decument (tex-file) or separate file!
+{my $line='';
+ my $start_interpreting=0; # 0 - not started yet
+ # 1 - interpreting
+
+ my @justarray;
+
+ if($verbosity_level > 3){print "Format strings are in <$FORMAT_NAME>\n\n"}
+
+ open(FRM, "$FORMAT_NAME") || die "Could not open $FORMAT_NAME: $!";
+ while(<FRM>)
+ { my $hash_key=''; my $hash_value='';
+ $line = $_; #print $line;
+ $line = trim($line);
+ next if $line =~ /^\s*$/; # skip blank lines
+ next if (substr(trim($line),0,1) ne $reservedCOMMENTSYMBOL);
+ #skip lines, starting NOT from %
+ next if (substr(trim($line),0,2) eq "$reservedCOMMENTSYMBOL$reservedCOMMENTSYMBOL");
+ $line = substr(trim($line),1);
+ $line=trim($line);
+ next if $line =~ /^\s*$/;
+ if($line eq $reservedBEGINBIBLIO){$start_interpreting=1;next;};
+ if($line eq $reservedENDBIBLIO){ close(FRM); return;};
+
+
+ if(not $start_interpreting){next;};
+
+ #OK, now no shit in this line!
+ if($verbosity_level > 4){print $line," is read from <$FORMAT_NAME>\n";};
+ @justarray=split(//,$line);
+
+ #try to find if this is "cite_format" or "ref_format"
+ my $format='';
+ ($format) = ($line =~ /$reservedCITE_FORMAT([^,\n]*)/);
+ if($format ne '')
+ {if(($format =~ m/$reservedS_STRING1/)||($format =~/$reservedNONUMBER/))
+ { $CITE_FORMAT = $format;
+ if($verbosity_level > 4){print "Citation format=$format\n\n";}
+ next;
+ }
+ else
+ {print STDERR "Unknown citation format \"$format\". Assuming standard=",
+ "$reservedSTANDARD_CITE_FORMAT\n";
+ $CITE_FORMAT = $reservedSTANDARD_CITE_FORMAT ; next;
+ }
+ } ;
+ # now try to find "ref_format"
+ ($format) = ($line =~ /$reservedREF_FORMAT([^,\n]*)/);
+ if($format ne '')
+ {if($format =~ m/$reservedS_STRING1/)
+ { $REF_FORMAT = $format;
+ if($verbosity_level > 4){print "Citation reference format=$format\n\n";};
+ next;
+ }
+ else
+ {print STDERR "Unknown reference format \"$format\". Assuming standard: ",
+ "$reservedSTANDARD_REF_FORMAT\n";
+ $REF_FORMAT = $reservedSTANDARD_REF_FORMAT ; next;
+ }
+ }
+ ($format) = ($line =~ /$reservedORDERING([^,\n]*)/);
+ if($format ne '')
+ {$ORDERING = trim($format);
+ if($verbosity_level > 4){print "Key field for refs ordering=$ORDERING\n\n";};
+ next;
+ } ;
+
+ my $this_is_key=1;
+
+ my $narray=scalar(@justarray);
+ for(my $i=0;$i< $narray-1; $i++)
+ {
+ if(($this_is_key)&&($justarray[$i] eq $reservedLEFTSTART))
+ {$this_is_key = 0; next;};
+ if($this_is_key)
+ {$hash_key ="$hash_key$justarray[$i]";}
+ else
+ {$hash_value = "$hash_value$justarray[$i]"}
+ };
+ if($justarray[$narray-1] ne $reservedRIGHTEND)
+ {
+ print STDERR "Format string \"$line\" must end with \"$reservedRIGHTEND\"!\n";
+ print STDERR "This is fatal error. Exiting...";
+ exit(1);
+ };
+ $hash_key=trim($hash_key);
+ #now analize $hash_key. It must be puur symbolic!
+ unless($hash_key=~ /^[A-Za-z0-9]+$/)
+ {print STDERR "Key field \"$hash_key\" in \"$line\" must include only A-Z,a-z,0-9\n";
+ print STDERR "This is fatal error. Exiting...";
+ exit(1);
+ };
+
+ my $hash_key1=uc($hash_key);
+
+ if (($hash_key1 ne $hash_key)&&($verbosity_level>2))
+ {print " WARNING!!! Key field\n \"$hash_key\" in \"$line\"\n converted to uppercase!!!\n"};
+ $ALLFORMATSTRINGS{$hash_key1} = $hash_value;
+
+ };
+ close(FRM);
+
+
+};
+#--------------------------------------
+sub make_list_of_refs_in_dbase
+
+#
+{ my $current_ref_number=0; my $line;
+ my @fields; my %CURRENT_RECORD;
+
+ my $it_is_label=1; my $save_current_field=0;
+
+ my $item;
+ my $REFS_FILE = @_[0];
+
+ open(RF, $REFS_FILE)|| die "Could not open $REFS_FILE: $!";
+ while($line = <RF>)
+ { next if $line =~ /^\s*$/; # skip blank lines
+ next if (substr(trim($line),0,1) eq $reservedCOMMENTSYMBOL);
+ if($line ne $SEPARATOR)
+ {
+ $line=trim($line);
+ @fields = split(/=/, $line);
+
+ @fields = trim(@fields);
+
+ if($fields[0] eq $reservedLABEL)
+ {
+ my $REFS_N = scalar(@REFS);
+ if(scalar(@fields)>2)
+ { for(my $i=2;$i<scalar(@fields);$i++)
+ {$fields[1] = "$fields[1].$fields[$i]"}
+ };
+ $REFS[$REFS_N] = $fields[1];
+ };
+ };
+ };
+ close(RF);
+};
+
+#------------------------------------------------------------
+
+sub formated_output
+# takes format string in the form
+# $FORMAT_STRING ='$AUTHOR5F L;$ {\bf $YEAR$}, $VOL$ - $NUMBER$' ;
+# and hash
+# of the type
+# my %HASH_REFS= ('AUTHOR' => 'Stepanyan',
+# 'YEAR' => '2000',
+# 'VOL' => '12',
+# 'RT' => 'qq');
+# of course fields in hash can be any.
+# Then makes output of the hash into stdout
+# according to the format string.
+# File with file handle OUTTEX must be opened for writing!!!!
+{
+my @in_arguments = @_; #take all arguments of this function
+
+my $FORMAT_STRING=$in_arguments[0]; # the first MUST be the format string
+
+my %HASH_REFS; #all the rest of arguments
+ #must be put into this hash
+
+my $i; #next lines make hash from array
+for($i=1;$i<scalar(@in_arguments)-1;$i=$i+2)
+{ $HASH_REFS{$in_arguments[$i]} = $in_arguments[$i+1]
+};
+
+
+my @format_char_array; # all chars from the format string
+my @format_array; # if format_string='$AUTHOR$ {\bf 2}'
+ # then format array will be
+ # ('HASH_KEY_AUTHOR',' {\bf 2}')
+
+@format_char_array = split(//, $FORMAT_STRING);
+
+my $start_flag = 0; # when I see $ I do $start_flag=1
+ # when I see it again I do =0
+ # I do it to cath al $xxxx$ things!
+
+my $counter=0; # just counter for the @format_array
+
+
+my $char;
+
+###print "-----\n";
+foreach $char (@format_char_array)
+{
+ ###print "$char\n";
+ if($char ne $reservedDOLLAR) # if it is NOT '$'
+ { # add this char and don't bother yourself with it!
+ $format_array[$counter] = $format_array[$counter] . $char;
+ }
+ else # oooh, this is '$'
+ {
+ if($start_flag == 0){$start_flag = 1} #if it is start of command
+ else{$start_flag = 0}; #if it is end of command
+ $counter++;
+ if($start_flag == 1) #if this will be command
+ #add HASH_KEY before the name of it!
+ {$format_array[$counter] = $reservedHASH_KEY;};
+
+ }
+};
+###print "-----\n";
+###foreach $char (@format_array)
+###{ print "|$char|\n"};
+
+my $char1; my $post_author='';
+
+my @author_fields;
+my $last_sep=''; # 'R.R.Stepanyan',$last_sep,'A.A.Subbotin' - example
+my @author_name_key; my @author_seps;
+
+foreach $char (@format_array)
+{ ($char1) = ( $char =~ /$reservedHASH_KEY([^}]*)/ );
+ # $char1=trim($char1);
+ #$char=trim($char);
+ $#author_fields = -1;
+ if($char1 ne '')
+ { if((not($char1 =~ m/$reservedAUTHOR/))&&($HASH_REFS{$char1} eq '')) #this is not author
+ # and this field is empty
+ { if($optionsINSERT_EMPTY_FIELDS_SIGN)
+ {print OUTTEX $reservedEMTY_FIELD_SIGN}; #OUTTEX is opened!
+ if($verbosity_level > 1) #complain about absence of field
+ {print STDERR "Field <$char1> in the record <$HASH_REFS{$reservedLABEL}> is empty!\n"};
+ }
+ elsif($char1 =~ m/$reservedAUTHOR/)
+ { ($post_author) = ($char1 =~ /$reservedAUTHOR([^\$]*)/); # what if after AUTHOR ??
+ @author_fields=split(//,$post_author);
+
+ my $iaf=0; #number of names in one author (last, first, middle name = 3)
+ my $saf=0; #number of separators
+ my $start=0;
+ my $max_n_of_aut=0;#max num of authors to show. If 0 then unlimited! ??????????
+
+ my $and_word=''; #have to be before the last author if number of outhors>1
+
+ while($author_fields[$start] =~ /^[0-9]+$/)
+ {$max_n_of_aut="$max_n_of_aut$author_fields[$start]";
+ $start++;
+ };
+
+ my $niaf;
+ $niaf=scalar(@author_fields);
+ $#author_name_key = -1; $#author_seps = -1; #to make them clean!
+
+ for(my $ii=$start; $ii<$niaf; $ii++)
+ {
+ if($author_fields[$ii] =~/^[A-Za-z]+$/)
+ {$author_name_key[$iaf] = "$reservedAUTHOR$author_fields[$ii]"; $iaf++; $saf++;}
+ elsif($author_fields[$ii] ne $reservedAND_SEPARATOR)
+ {$author_seps[$saf] = "$author_seps[$saf]$author_fields[$ii]"}
+ else{$and_word = substr($post_author,$ii+1);
+ $ii=$niaf+1; #to finish the loop
+ }
+ };
+
+ $last_sep=$author_seps[$saf];
+
+ #Thus we have
+ # @author_name_key - array of the type (AUTHORL, AUTHORF, AUTHORM)
+ # @author_seps - $author_seps[1] is what should be placed after AUTHORF, 0-th - after AUTHORL
+ # $last_sep - should be placed after the complete name of one person!
+
+ #print $HASH_REFS{'AUTHORL'} ;
+ my $n_of_aut=0 ; my $schet=0; my @avtor;
+ #HOW MANY AUTHOR WE HAVE??? We should find MAXIMUM!!
+
+ while($schet < scalar(@author_name_key) )
+ { @avtor = split(/\|/,$HASH_REFS{$author_name_key[$schet]}); #
+ if($n_of_aut < scalar(@avtor)){$n_of_aut = scalar(@avtor)}; #number of authors
+ $schet++;
+ };
+ # Now number of authors is in the $n_of_aut
+
+
+ my $print_etal = 0; #?????????????
+ if(($max_n_of_aut > 0)&&($max_n_of_aut < $n_of_aut)){$n_of_aut=$max_n_of_aut; $print_etal=1;}
+ # now number of authors to display is '$n_of_aut'!
+
+ my $jj; #counter for all names of one author!
+ my $max_jj = scalar(@author_name_key);
+
+ for(my $ii=0;$ii<$n_of_aut;$ii++) # $ii is number of aut to display
+ {
+ for($jj=0;$jj<$max_jj ;$jj++) # $jj is counter of name of the same person
+ {
+ #print OUTTEX $author_seps[$jj];
+ @avtor = split(/\|/,$HASH_REFS{$author_name_key[$jj]});
+ @avtor = trim(@avtor);
+ if($avtor[$ii] ne ''){print OUTTEX $author_seps[$jj];
+
+ print OUTTEX $avtor[$ii];};
+ };
+
+
+ if($ii<$n_of_aut-2){print OUTTEX $last_sep;}; #for all except the last
+ if($ii == $n_of_aut-2)
+ { if(($n_of_aut>2)||(trim($and_word) eq "")){print OUTTEX $last_sep};
+ if(($n_of_aut>1)&&($print_etal == 0)){print OUTTEX " $and_word ";}
+
+ };
+ };
+ #print $last_sep;
+ if($print_etal){print OUTTEX $reservedET_AL;}
+ }
+ else
+ {
+ print OUTTEX $HASH_REFS{$char1};
+ };
+
+
+ }
+ else{print OUTTEX $char};
+};
+#print "\n";
+};
+#---------------------------------------------------
+
+sub read_inline_arguments
+{my $DD='--'; my $D='-';
+ my $counter=0; my $current='';
+ my $guess;
+
+for($counter=0;$counter<scalar(@ARGV);$counter++)
+{
+ #print "$item \n";
+ $current = $ARGV[$counter];
+
+#------------------------------------------------------------
+ #first check if it has '--' at the beginning
+ ($guess) = ($current =~/$DD([^ ]*)/);
+ if(($guess ne '')&&(substr($current,0,2) eq $DD))
+ {
+ my $nothing=0;
+ SWITCH: {
+ if ($guess eq "help") {&print_help_info; exit(0);}
+ if ($guess eq "version"){&print_version_info; exit(0);}
+
+ #options
+ if ($guess eq "nobibitem")
+ { $optionsKEEP_BIBITEM_AND_CITE=0; last SWITCH; }
+ if ($guess eq "not_insert_empty_field_sign")
+ { $optionsINSERT_EMPTY_FIELDS_SIGN=0 ; last SWITCH; }
+
+ #reserved words
+ if ($guess eq 'separator')
+ { $counter++; $SEPARATOR=$ARGV[$counter]; last SWITCH; }
+
+ if ($guess eq 'etal')
+ { $counter++; $reservedET_AL=$ARGV[$counter]; last SWITCH; }
+ if ($guess eq 'empty_field_sign')
+ { $counter++; $reservedEMTY_FIELD_SIGN=$ARGV[$counter]; last SWITCH; }
+ if ($guess eq 'html')
+ { $optionsHTML_OUTPUT = 1; last SWITCH; }
+ if ($guess eq 'prefix')
+ { $counter++; $httpprefix=$ARGV[$counter]; last SWITCH; }
+
+ $nothing = 1;
+ };
+ if($nothing){print STDERR "Unknown option <$current>!!! Exiting!\n"; exit(1);}
+ else{next};
+ };
+ #-------------------------------------------------------------------
+ #second: check if it has '-' at the beginning
+ ($guess) = ($current =~/$D([^ ]*)/);
+ if(($guess ne '')&&(substr($current,0,1) eq $D))
+ {
+ my $nothing=0;
+ SWITCH: {
+ #options
+ if ($guess eq "h")
+ { &print_help_info; exit(0)}
+ if ($guess eq "o")
+ { $counter++; $OUT_TEX=$ARGV[$counter]; last SWITCH; }
+ if ($guess eq "f")
+ { $counter++; $FORMAT_NAME=$ARGV[$counter]; last SWITCH; }
+ if ($guess eq "d")
+ { my $itis=1; my $whatis='';
+ while($itis)
+ {
+ $counter++;
+ #unless($counter < scalar(@ARGV)-1){$counter--;last SWITCH;}
+ $whatis = $ARGV[$counter];
+ if((substr($whatis,0,2) eq $DD)||(substr($whatis,0,1) eq $D))
+ {$counter--; $itis=0;}
+ else{$REFS_FILES[$itis-1] = $whatis; $itis++};
+ };
+ if(scalar(@REFS_FILES)<1){print STDERR "Invalid format of -d option";}
+ last SWITCH;
+ }
+
+ if ($guess eq "a")
+ { $counter++; $ABBR_NAME=$ARGV[$counter]; $optionsABBREVIATIONS=1; last SWITCH; }
+
+
+ if ($guess eq "v")
+ { $counter++; $verbosity_level=$ARGV[$counter]; last SWITCH; }
+
+ #reserved words
+ #if ($guess eq 'etal')
+ # { $counter++; $reservedET_AL=$ARGV[$counter]; last SWITCH; }
+ $nothing = 1;
+ };
+ if($nothing){print "Unknown option <$current>!!! Exiting!\n"; exit(1);}
+ else{next};
+ };
+ #---------------------------------------------------------------------
+ #so, this is not switch
+
+}
+
+};
+
+#----------------------------------
+sub check_for_important_arguments
+{
+
+ if($OUT_TEX eq ''){$OUT_TEX = "biblist.output.tex"};
+ if(scalar(@REFS_FILES) == 0)
+ {print STDERR "You must select at least one refs dbase file with -d option!!!";
+ print STDERR "Exiting!\n";
+ exit(1)
+ };
+
+
+ if($FORMAT_NAME eq '')
+ {print STDERR "You must select one formats file with -f option!!!";
+ print STDERR "Exiting!\n";
+ exit(1)
+ };
+};
+#-----------------------------------
+sub print_version_info
+{
+print "biblist v.$BIBLIST_VERSION \n";
+print "Written by R.Stepanyan.\n\n";
+print "This is free software. There is NO warranty! \n";
+print "Redistribution of this software is covered by the terms of";
+print "the GNU General Public License.\n";
+print "For more information, please, contact rstepanyan\@yahoo.com\n";
+};
+#-----------------------------------------------
+sub print_help_info
+{
+print "biblist v.$BIBLIST_VERSION \n";
+print "biblist [-o outfile] [-f formatfile] -d dbasefile(s) [other keys] \n";
+print "\n";
+print "-v <number> - verbosity level (0-5)\n";
+print "-h (--help) - this help\n";
+print "--version - version information\n";
+print "\n";
+print "About the other parameters see readme.1st \n";
+print "\n";
+#print "\n";
+};
+
+#----------------------------------------------------
+sub trim {
+ my @out = @_;
+ for (@out) {
+ s/^\s+//;
+ s/\s+$//;
+ }
+ return wantarray ? @out : $out[0];
+}
+#------------------------------------------------------------------------------
+sub insert_abbreviations_of_journals # $OUTTEX must be opened already
+{ my $aline='';
+ if($optionsABBREVIATIONS==1)
+ { open(ABBR,"$ABBR_NAME");
+
+ if($optionsHTML_OUTPUT){print OUTTEX "<br>";} else{print OUTTEX "\n"; };
+
+ while(<ABBR>)
+ { $aline = $_;
+ print OUTTEX "$aline" ;
+ if($optionsHTML_OUTPUT){print OUTTEX "<br>";} ;
+ }
+ close(ABBR);
+
+ if($optionsHTML_OUTPUT){print OUTTEX "<br>";} else{print OUTTEX "\n"; }
+ return 0;
+ }
+ else
+ { return 0;
+ }
+};