diff options
Diffstat (limited to 'lib/bib-key.awk')
| -rw-r--r-- | lib/bib-key.awk | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/lib/bib-key.awk b/lib/bib-key.awk new file mode 100644 index 0000000..41534ba --- /dev/null +++ b/lib/bib-key.awk @@ -0,0 +1,69 @@ +# bib-key.awk - rekey every entry with a generated citation key +# +# Requires bib-parse.awk and bib-canon.awk. Keys have the form +# <surname><year><word>, e.g. knuth1984literate. + +function bib_pass(raw) { + if (bib_out_n++) + print "" + print raw +} + +function bib_entry(type, key, k, n) { + if (bib_out_n++) + print "" + k = bib_mkkey() + # disambiguate collisions with b, c, ... suffixes + if (k in BIB_KEYS_SEEN) { + n = ++BIB_KEYS_SEEN[k] + k = k substr("bcdefghijklmnopqrstuvwxyz", n - 1, 1) + } else + BIB_KEYS_SEEN[k] = 1 + bib_emit(type, k) +} + +function bib_mkkey( a, y, t, surname, word, n, parts, i, w) { + a = bib_get("author") + if (a == "") + a = bib_get("editor") + y = bib_get("year") + t = bib_get("title") + + # surname of the first author + if (match(a, / [Aa][Nn][Dd] /)) + a = substr(a, 1, RSTART - 1) + gsub(/[{}]/, "", a) + a = bib_trim(a) + if (index(a, ",") > 0) + surname = substr(a, 1, index(a, ",") - 1) + else { + n = split(a, parts, /[ \t]+/) + surname = (n > 0) ? parts[n] : "" + } + gsub(/[^A-Za-z0-9]/, "", surname) + surname = tolower(surname) + if (surname == "") + surname = "anon" + + # four-digit year + if (match(y, /[0-9][0-9][0-9][0-9]/)) + y = substr(y, RSTART, 4) + else + y = "" + + # first significant word of the title + gsub(/[{}]/, "", t) + word = "" + n = split(tolower(t), parts, /[^a-z0-9]+/) + for (i = 1; i <= n; i++) { + w = parts[i] + if (w == "" || w == "a" || w == "an" || w == "the" || w == "on" || + w == "of" || w == "in" || w == "for" || w == "and" || w == "to" || + w == "with" || w == "from" || w == "by" || w == "at" || w == "is") + continue + word = w + break + } + + return surname y word +} |