diff options
Diffstat (limited to 'support/copac-clean/copac-clean.sno')
-rw-r--r-- | support/copac-clean/copac-clean.sno | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/support/copac-clean/copac-clean.sno b/support/copac-clean/copac-clean.sno new file mode 100644 index 0000000000..fa97342dfd --- /dev/null +++ b/support/copac-clean/copac-clean.sno @@ -0,0 +1,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 + |