aboutsummaryrefslogtreecommitdiffstats
path: root/lib/bib-key.awk
diff options
context:
space:
mode:
Diffstat (limited to 'lib/bib-key.awk')
-rw-r--r--lib/bib-key.awk69
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
+}