summaryrefslogtreecommitdiff
path: root/support/copac-clean/copac-clean.sno
blob: fa97342dfd4f8528249670cb1082c2e884d2c06c (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
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