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
67
68
69
|
# 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) {
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
}
|