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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
|
* COPAC-CLEAN.SNO
* Edits library cards from COPAC removing BibTeX errors
* version 0.7 29.08.2015
* guido.milanese@unicatt.it
* requires xclip and zenity
* called from copac-clean.sh
*
* ---> Set tabstop=3 to read/edit this file
*
* LIBRARY FILES
-include "bq.sno" ;* shell operations
-include "itrim.inc" ;* initial trim
-include "mami.inc" ;* converts uppercase to lowercase
-include "newline.inc" ;* sets newline according to OS
-include "nopairs.inc" ;* nopairs (' ' = ' ')
-include "repl.inc" ;* string-by-string replacement
*************************
* INITIALISATIONS
*************************
* Copacbib is the BibTeX item produced by COPAC, now empty
Copacbib =
nl = newline() ;* sets newline according to OS
ErrMsg0 = "\t\t<b>No selection!</b>\n"
+ "Check again the Copac page and your selection\n\n"
+ "\t\t\tExiting"
ErrMsg1 = "\t\t<b>No valid BibTeX file!</b>\n"
+ "Check again the Copac page and your selection\n\n"
+ "\t\t\tExiting"
* Pattern: hyphenation. Admits 2 forms, old (wrong) and new
P_hyphen = (("language = {") | ("langage = {"))
+ (("English" | "French" | "German" | "Italian" | "Latin") . Language) '}'
* Pattern: entrytype
P_entrytype = '@' (arb . V_entrytype) '{'
* Pattern: author. Accepts space/no space
P_author = "author" . Label_author
+ (span(' ') | '') '=' (span(' ') | '') '{' (arb . Name_author) "},"
* Pattern: note, as above
P_note = ((nl | ' ') "note" . Label_note)
+ (span(' ') | '') '=' (span(' ') | '') arb "},"
* Pattern: title, as above
P_title = "title" (span(' ') | '') '=' (span(' ') | '') arb "},"
* Pattern: label
P_label = '@' break('{') len(1) (arb . V_label) ","
*************************
* INTERNAL FUNCTIONS
*************************
**************************************
*-- Function READANDCHECK
*-- Reads from clipbpoard, checks if it is all right
**************************************
*-- requires itrim.inc
define("readandcheck()Par1,Par2") :(readandcheck_end)
readandcheck
readandcheck_bg
* first check zenity:
* if zenity does not work exits
Zchk = bq('zenity --version')
(leq(Zchk)) (Terminal = "Zenity is not installed") :s(end)
*
* now read/check the COPAC item
* Copacbib is the BibTeX item produced by COPAC
* reads from the clipboard, if fails exits
Copacbib = bq("xclip -o") ;*:f(freturn)
leq(Copacbib) :f(readancheck_goon)
(bq('zenity --error --no-wrap --text="' ErrMsg0 '"')) :(end)
* checks if it is a valid BibTeX item:
* if Copacbib does not begin with a '@' fails and exits
* First removes any blank at the beginning
readancheck_goon
Copacbib = itrim(Copacbib)
Copacbib ? pos(0) '@' :s(readandcheck_rt)
bq('zenity --error --no-wrap --text="' ErrMsg1 '"') :(end)
readandcheck_rt readandcheck = Copacbib :(return)
readandcheck_end
**************************************
*-- Function CPCTR
*-- Transformation of COPAC data
**************************************
define("cpctr(Copacdata)Par1,Par2") :(cpctr_end)
cpctr
cpctr_bg
* common errors in the AUTHOR field
Copacdata ? P_author
Name_author2 = Name_author
authors1 Name_author2 ? ", and" = " and" :s(authors1)
authors2 Name_author2 ? ". and" = " and" :s(authors2) ;* 28.12.2013
Copacdata ? Name_author = Name_author2
*
* if entrytype is proceedings changes "author" to "editor"
* entrytype?
Copacdata ? P_entrytype
* Copacdata ? P_author
(
+ (V_entrytype ? "proceedings")
+ (Copacdata ? Label_author = "editor")
+ )
*
* adds always a SHORTTITLE field.
* The SHORTTITLE is to be later edited manually, according to the
* user's preferences.
* Adds a BOOKTITLE field only if entrytype is PROCEEDINGS
* Useless for BIBLATEX but necessary for standard BIBTEX
* title
Copacdata ? P_title . V_title
Shorttitle = " short" V_title
Booktitle = " book" V_title ;* leave it here!
Copacdata ? V_title = V_title Shorttitle
((V_entrytype ? "proceedings") (Copacdata ? V_title = V_title Booktitle))
*
* Hyphenation. Works only if ONE language is declared
Copacdata ? P_hyphen . V_hyphen
V_hyphen2 = V_hyphen
V_hyphen2 ? "langage" = "hyphenation" ;* try also the wrong form, no harm
* V_hyphen2 ? "language" = "hyphenation" ;* corrected by COPAC, at last!
V_hyphen2 ? "language" = "langid" ;* changed 0.8 28.08.2015
Language2 = mami(Language)
Language2 ? "english" = "british" ;* optional
Language2 ? "latin" = "italian"
V_hyphen2 ? Language = Language2
Copacdata ? V_hyphen = V_hyphen2
*
* Location. Changes to 'll' (optional)
Copacdata ? "location " = "ll "
*
* Changes NOTE fields to ANNOTE: the NOTE field is normally printed,
* while the NOTE field produced by Copac is normally an annotation
* loops because there are frequently more than 1 NOTE fields
cpctrlpn Copacdata ? P_note . V_note :f(cpctrlpn_nd)
V_note2 = V_note
V_note2 ? "note" = "annote"
Copacdata ? V_note = V_note2 :(cpctrlpn)
cpctrlpn_nd
*
* Punctuation cleanup
punct1 Copacdata ? " : }" = "}" :s(punct1)
punct2 Copacdata ? (any(",.:; ") '}') . W = "}" :s(punct2)
punct3 Copacdata ? "title=" = "title = " :s(punct3)
Copacdata = nopairs(Copacdata)
newlines Copacdata = repl(Copacdata,"},", "}," nl)
Copacdata = repl(Copacdata, ", author", ',' nl "author")
Copacdata = repl(Copacdata, ", editor", ',' nl "editor")
Copacdata = repl(Copacdata," :",':')
Copacdata ? P_label
Output = Copacdata
OkMsg1 = "BibTeX entry <b>" V_label "</b> transformed.\n"
+ "Now paste the clipboard contents to your BibTeX archive\n\n"
+ "\t\t\t Exiting"
bq('zenity --info --no-wrap --title="Done!" --text="' OkMsg1 '"')
cpctr_rt cpctr = Copacdata :s(return)f(freturn)
cpctr_end
******************************
* MAIN PROGRAMME
******************************
* Reads from clipboard and checks data
Copacbib = readandcheck() :f(end)
* Transforms data
(
+ ~(Copacbib = Cpctr(Copacbib))
+ (Terminal = "Something wrong!")
+ )
end
*
******************************
* HISTORY
******************************
10.09.2013 version 0.1
15.09.2013 version 0.2 -- first usable
30.10.2013 version 0.3 -- some fields corrected; comments edited
27.12.2013 version 0.4 -- changes author to editor in proceedings
28.12.2013 version 0.5 -- general editing of functions
05.01.2014 version 0.6 -- improved check
|