* 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\tNo selection!\n"
+ "Check again the Copac page and your selection\n\n"
+ "\t\t\tExiting"
ErrMsg1 = "\t\tNo valid BibTeX file!\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 " V_label " 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