aboutsummaryrefslogtreecommitdiffstats
path: root/lib/bib-key.awk
blob: 3f4117f114912caf66e793523587b414307fce5d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# 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(substr(surname, 1, 30))
  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 substr(word, 1, 30)
}