# bib-key.awk - rekey every entry with a generated citation key # # Requires bib-parse.awk and bib-canon.awk. Keys have the form # , e.g. knuth1984literate. function bib_pass(raw) { bib_sep() print raw } function bib_entry(type, key, k, n) { bib_sep() 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 a = bib_clean(a) if (match(a, / [Aa][Nn][Dd] /)) a = substr(a, 1, RSTART - 1) 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 t = bib_clean(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 }