#!/bin/gawk -f
#
# Publication List Manager with TRIOS
# kameda@iit.tsukuba.ac.jp
#
# 2007/03/16, 13:30 Very first version
# 2007/04/09, 00:30 Final-Beta-1
#
# [Program-control]
# Initialize variables given at a command line
# Input [default]
# lng ; en jp
# key ; date type
# imode ; tab text
# omode ; html tab text trios
# aformat ; ORIGINAL FirstFamily FirstFAMILY FAMILYFirst FamilyF.
# tfotmat ; ORIGINAL TitleString TITLESTRING Titlestring
# Return value
# -
function InitVariables () {
# my family name in english
myname = "kameda";
# vf :
if (vf == "")
vf = 0;
# lng :
# en = english / jp = japanese
if (lng ~ /^(Japa|japa|jp)/)
lng = "jp";
else
lng = "en";
# key :
# type = type sort (or, as-is for omode={tab|text|trios})
# date = date sort
if (key ~ /^(type|TYPE|Type|class)/)
key = "type";
else
key = "date";
# imode :
# tab = tab separated lines (from excel)
# text =
if (imode ~ /^(tab|TAB|Tab|excel)/)
imode = "tab";
else
imode = "text";
# omode :
# tab = tab separated lines (to excel)
# text = editable text file
# trios = for TRIOS input (to excel)
# html = html file
if (omode ~ /^(tab|TAB|Tab|excel)/)
omode = "tab";
else if (omode ~ /^(TEXT|text|Text)/)
omode = "text";
else if (omode ~ /^(TRI|tri|Tri)/)
omode = "trios";
else
omode = "html";
# aformat: author name format given by user
# ORIGINAL FirstFamily FirstFAMILY FAMILYFirst FamilyF.
if (aformat == "")
aformat = "ORIGINAL";
# tformat: title format given by user
# TitleString TITLESTRING Titlestring, ORIGINAL
if (tformat == "")
tformat = "ORIGINAL";
if (vf>=2) {
printf "lng = %s, key = %s, vf = %d\n", lng, key, vf;
printf "imode = %s, omode = %s, aformat = %s, tformat = %s\n", imode, omode, aformat, tformat;
}
# title order for TYPEs
ntorder = 12;
torder["en",1] = "TAG_PAPER_E";
torder["en",2] = "TAG_ICONF_EVAL";
torder["en",3] = "TAG_ICONF_NONE";
torder["en",4] = "TAG_PAPER_J";
torder["en",5] = "TAG_LETTER_J";
torder["en",6] = "TAG_ORAL_RESEARCH";
torder["en",7] = "TAG_ORAL_NATIONAL";
torder["en",8] = "TAG_BOOK_J";
torder["en",9] = "TAG_MISC";
torder["en",10] = "TAG_NONE";
torder["en",11] = "TAG_PATENT";
torder["en",12] = "TAG_PRIZE";
torder["jp",1] = "TAG_PAPER_J";
torder["jp",2] = "TAG_LETTER_J";
torder["jp",3] = "TAG_PAPER_E";
torder["jp",4] = "TAG_ICONF_EVAL";
torder["jp",5] = "TAG_ICONF_NONE";
torder["jp",6] = "TAG_ORAL_RESEARCH";
torder["jp",7] = "TAG_ORAL_NATIONAL";
torder["jp",8] = "TAG_BOOK_J";
torder["jp",9] = "TAG_MISC";
torder["jp",10] = "TAG_NONE";
torder["jp",11] = "TAG_PATENT";
torder["jp",12] = "TAG_PRIZE";
# title string in HTML
tstring["TAG_BOOK_J","en"] = "Books in Japanese";
tstring["TAG_BOOK_J","jp"] = "書籍";
tstring["TAG_PAPER_E","en"] = "Papers in English Journal";
tstring["TAG_PAPER_E","jp"] = "英文論文";
tstring["TAG_PAPER_J","en"] = "Papers in Japanese Journal";
tstring["TAG_PAPER_J","jp"] = "和文論文";
tstring["TAG_LETTER_J","en"] = "Letters in Japanese Journal";
tstring["TAG_LETTER_J","jp"] = "和文レター";
tstring["TAG_ICONF_EVAL","en"] = "Quarified Articles in International Conference";
tstring["TAG_ICONF_EVAL","jp"] = "査読付国際会議";
tstring["TAG_ICONF_NONE","en"] = "Articles in International Conferences";
tstring["TAG_ICONF_NONE","jp"] = "国際会議";
tstring["TAG_ORAL_RESEARCH","en"] = "Oral Presentations in SIG Meetings in Japan";
tstring["TAG_ORAL_RESEARCH","jp"] = "研究会報告";
tstring["TAG_ORAL_NATIONAL","en"] = "Oral Presentations in National Conferences in Japan";
tstring["TAG_ORAL_NATIONAL","jp"] = "全国大会等";
tstring["TAG_MISC","en"] = "Articles (in Magazines)";
tstring["TAG_MISC","jp"] = "その他(記事等)";
tstring["TAG_NONE","en"] = "Records";
tstring["TAG_NONE","jp"] = "その他(紀要等)";
tstring["TAG_PATENT","en"] = "Patents (Unexamined) in Japan";
tstring["TAG_PATENT","jp"] = "特許(出願中)";
tstring["TAG_PRIZE","en"] = "Prizes";
tstring["TAG_PRIZE","jp"] = "賞";
}
# [Database]
# Sort the index of db[] by db[,"YK_DATE"] field
# Input
# db[]
# tid
# Return value
# tsindex[] ; reverse order of db[] index.
function SortbyDate( i,t,tt,n,sdate,ddate) {
for (i = tid - 1; i >= 1; i--) {
split(db[i,"YK_DATE"], t, "/");
tt = sprintf("%s%02d%02d",t[1],t[2]+0,t[3]+0);
cdate[tt] ++;
sdate[tt cdate[tt]] = i;
if (vf>=10)
printf "sorttest: %d, %s (%s ; %s)\n", i, tt cdate[tt], db[i,"YK_DATE"], db[i,"PAPERID"];
}
n = asorti(sdate, ddate);
for (i = 1; i <= n; i++) {
tsindex[n - i + 1] = sdate[ddate[i]];
}
if (vf>=10) {
printf "%d entries (originally %d entries)\n", n, tid - 1;
for (i = 1; i <= n; i++) {
printf "%d: ddate[%d]=%s, sdate[ddate[%d]]=%s, YK_DATE=%s\n", i, i, ddate[i], i, sdate[ddate[i]], db[tsindex[i],"YK_DATE"];
}
}
}
#+++++++++++++++++++++++++++++++++++++++++++++++++++++
# Input Support Functions
#+++++++++++++++++++++++++++++++++++++++++++++++++++++
# [TEXT-input]
function AddTaginTEXT(newtag, i) {
for (i = 1; i <= num_taglist; i++) {
if (taglist[i] == newtag) {
return 0;
}
}
num_taglist++;
taglist[num_taglist] = newtag;
return 1;
}
#+++++++++++++++++++++++++++++++++++++++++++++++++++++
# Output Support Functions
#+++++++++++++++++++++++++++++++++++++++++++++++++++++
# [HTML-output]
# Capitalize the string
# Input
# ss : string, e.g. "yoshinari KAMEDA"
# tmd : 0 = e.g. "Capital String and PDA" / 1 = e.g. "Capital string and PDA"
# Return Value
# return : capitalized string, e.g. "Yoshinari Kameda"
function ToCapital (ss,tmd, c,i,d,rr) {
rr = "";
c = substr(ss, 1, 1);
rr = toupper(c);
for (i = 2; i <= length(ss); i++) {
c = substr(ss, i-1, 2);
if (c ~ /[ ,.;:-][a-zA-Z]/ && tmd == 0) {
rr = rr toupper(substr(ss, i, 1));
} else {
rr = rr tolower(substr(ss, i, 1));
}
}
gsub(" A ", " a ", rr);
gsub(" An ", " an ", rr);
gsub(" The ", " the ", rr);
gsub(" Its ", " its ", rr); # Not "ITS"
gsub(": a ", ": A ", rr);
gsub(": an ", ": An ", rr);
gsub(": the ", ": The ", rr);
gsub(": its ", ": Its ", rr); # Not "ITS"
gsub("- a ", "- A ", rr);
gsub("- an ", "- An ", rr);
gsub(" At ", " at ", rr);
gsub(" By ", " by ", rr);
gsub(" For ", " for ", rr);
gsub(" From ", " from ", rr);
gsub(" In ", " in ", rr);
gsub(" Of ", " of ", rr);
gsub(" On ", " on ", rr);
gsub(" To ", " to ", rr);
gsub(" Toward ", " toward ", rr);
gsub(" With ", " with ", rr);
gsub(" Via ", " via ", rr);
gsub(" And ", " and ", rr);
# Some words that might come at the first word
gsub("^Its ", "ITS ", rr); # "ITS"
gsub("^Tide: ", "TIDE: ", rr);
# First or in the middle
gsub("^Tide ", "TIDE ", rr);
gsub(" Tide ", " TIDE ", rr);
gsub("^3d ", "3D ", rr);
gsub(" 3d ", " 3D ", rr);
gsub(" 3d-", " 3D-", rr);
gsub("^Hmd ", "HMD ", rr);
gsub(" Hmd ", " HMD ", rr);
gsub("^Pda ", "PDA ", rr);
gsub(" Pda ", " PDA ", rr);
gsub("^Cg ", "CG ", rr);
gsub(" Cg ", " CG ", rr);
# No separator (spaces) required to indentify
gsub("3dcg", "3DCG", rr);
gsub("Pls:", "PLS:", rr);
gsub("Accv2006", "ACCV2006", rr);
gsub("Ucla", "UCLA", rr);
return rr;
}
# [HTML-output]
# String-Print a string if it exists.
# Input
# str : string
# pre : prefix string
# trl : trailer string
# db ; the publication database
#
# Return Value
# return : string, or "" if failed
function StrSprintf (str,pre,trl) {
if (length(str) > 0) {
return pre str trl;
}
return "";
}
# [HTML-output]
# String-Print a string in db[i,tag] if it exists.
# Input
# i : record-ID (1 origin)
# tag : tag in db[]
# pre : prefix string
# trl : trailer string
# db ; the publication database
#
# Return Value
# return : 0 = failed, 1 = success
function DBSprintf (i,tag,pre,trl, s) {
return StrSprintf(db[i, tag], pre, trl);
}
# [HTML-output]
# Format the author name string in English
# Input
# i : record-ID (1 origin)
# ii : author-ID in the record-i (1 origin)
# db ; the publication database
# aformat ; author format, given by user
# Return Value
# return : formatted author name string
function AuthorFormatEn (i,ii, fmt,rname,nfirst,nmiddle,nfamily,aul) {
aul = "";
nfamily = db[i, "YK_AU" ii "-1-en"];
nmiddle = db[i, "YK_AU" ii "-2-en"];
nfirst = db[i, "YK_AU" ii "-3-en"];
if (aformat == "ORIGINAL")
fmt = db[i,"YK_NamePattern"];
else
fmt = aformat;
if (fmt == "FirstFamily") {
aul = aul StrSprintf(ToCapital(nfirst ,0), "", " ");
aul = aul StrSprintf(ToCapital(nmiddle,0), "", " ");
aul = aul StrSprintf(ToCapital(nfamily,0), "", "");
} else if (fmt == "FirstFAMILY") {
aul = aul StrSprintf(ToCapital(nfirst ,0), "", " ");
aul = aul StrSprintf(ToCapital(nmiddle,0), "", " ");
aul = aul StrSprintf(toupper (nfamily ), "", "");
} else if (fmt == "FAMILYFirst") {
aul = aul StrSprintf(toupper (nfamily ), "", " ");
aul = aul StrSprintf(ToCapital(nmiddle,0), "", " ");
aul = aul StrSprintf(ToCapital(nfirst ,0), "", "");
} else if (fmt == "FamilyF.") {
aul = aul StrSprintf(toupper (nfamily ), "", " ");
aul = aul StrSprintf(ToCapital(nmiddle,0), "", " ");
aul = aul StrSprintf(ToCapital(substr(nfirst,1,1),0), "", ".");
} else {
aul = aul StrSprintf(nfirst , "", " ");
aul = aul StrSprintf(nmiddle, "", " ");
aul = aul StrSprintf(nfamily, "", "");
}
if (vf>=20) printf "[%d, %d] %s %s (%s)\n", i,ii,nfirst,nfamily,rname;
return aul;
}
# [HTML-output]
# Show all the authors in a record
# Input
# i : record-ID (1 origin)
# db ; the publication database
# lng ; language
# Return Value
# return : author list string
function ShowAuthors (i, ii,iimax,aul) {
aul = "";
for (ii = 1; ii < 20; ii++) {
if (length(db[i, "YK_AU" ii "-1-en"]) > 0) # check at family name
iimax = ii;
else
break;
}
if (db[i,"YK_LANG"] ~ /^E/ || lng ~ /^en/) {
for (ii = 1; ii <= iimax; ii++) {
# separator
if (ii == iimax && iimax > 2 && db[i, "YK_AU" ii "-1-en"] !~ /^Ed/)
aul = aul ", and ";
else if (ii == iimax && iimax == 2)
aul = aul " and ";
else if (ii >= 2)
aul = aul ", ";
# name ; see AuthorNameEn()
aul = aul AuthorFormatEn(i,ii);
}
} else {
for (ii = 1; ii <= iimax; ii++) {
# separator
if (ii >= 2)
aul = aul ", ";
# name
aul = aul DBSprintf(i, "YK_AU" ii "-1-jp", "", " ");
aul = aul DBSprintf(i, "YK_AU" ii "-2-jp", "", " ");
aul = aul DBSprintf(i, "YK_AU" ii "-3-jp", "", "");
}
}
return aul;
}
# [UNIVERSAL-output]
# Format English title
# Input
# i : record-ID (1 origin)
# db : the publication database
# tformat : title format given by user
# Return Value
# return : -
function FormatTitleEn(i, ttl) {
if (tformat == "TitleString") {
ttl = ToCapital(db[i, "YK_TITLE-en"],0);
} else if (tformat == "TITLESTRING") {
ttl = toupper(db[i, "TITLE-en"]);
} else if (tformat == "Titlestring") {
ttl = ToCapital(db[i, "YK_TITLE-en"],1);
} else {
ttl = db[i, "YK_TITLE-en"];
}
return ttl;
}
# [HTML-output]
# Show title in a record
# Input
# i : record-ID (1 origin)
# db : the publication database
# lng : language
# tformat : title format given by user
# Return Value
# return : -
function ShowTitle (i, ttl) {
if (db[i,"YK_LANG"] ~ /^E/ || lng ~ /^en/) {
ttl = FormatTitleEn(i);
} else {
ttl = db[i, "YK_TITLE-jp"];
}
printf "%s\n", StrSprintf(ttl, "", "
");
}
# [HTML-output]
# Show taken in a record
# Input
# i : record-ID (1 origin)
# db : the publication database
# lng : language
# tformat : title format given by user
# Return Value
# return : -
function ShowTaken (i, ttl) {
ttl = "";
if (db[i,"YK_LANG"] ~ /^E/ || lng ~ /^en/) {
ttl = ttl DBSprintf(i, "YK_TAKEN-BOOK-en", "", "");
} else {
ttl = ttl DBSprintf(i, "YK_TAKEN-BOOK-jp", "", "");
}
ttl = ttl DBSprintf(i, "YK_TAKEN-VOL", ", vol.", "");
ttl = ttl DBSprintf(i, "YK_TAKEN-NO", ", no.", "");
if (length(db[i, "YK_TAKEN-PP"]) > 0) {
if (index(db[i, "YK_TAKEN-PP"], "pages") > 0)
ttl = ttl DBSprintf(i, "YK_TAKEN-PP", ", ", "");
else
ttl = ttl DBSprintf(i, "YK_TAKEN-PP", ", pp.", "");
} else if (length(db[i, "YK_TAKEN-ID"]) > 0) {
ttl = ttl DBSprintf(i, "YK_TAKEN-ID", ", ", "");
}
printf "%s.
\n", ttl;
}
# [HTML-output]
# Show URLs in a record
# Input
# i : record-ID (1 origin)
# Return Value
# return : -
function ShowURL (i, ii,iimax) {
iimax = 0;
for (ii = 1; ii < 20; ii++) {
if (length(db[i, "YK_URL-" ii]) > 0) {
if (iimax > 0)
printf ": \n";
printf "%s", db[i,"YK_URL-" ii], db[i,"YK_URM-" ii];
iimax++;
}
}
if (iimax > 0)
printf "
\n";
}
# [HTML-output]
# Print the data of the tag in the lng language
# Input
# i : record-ID (1 origin)
# db ; the publication database
# tag :
# lng ;
# Return Value
# return : -
function ShowItemLng(i, taghead) {
if (lng ~ /^en/) {
printf "%s\n", DBSprintf(i, taghead "-en", "", "
");
} else {
printf "%s\n", DBSprintf(i, taghead "-jp", "", "
");
}
}
# [HTML-output]
# Show one record in the publication database in HTML format
# Input
# i : record-ID (1 origin)
# Return Value
# return : -
function ShowOneRecordinHTML (i) {
printf "