Blame bibutils/notes.c

Packit 89ede9
/*
Packit 89ede9
 * notes.c
Packit 89ede9
 *
Packit 89ede9
 * Copyright (c) Chris Putnam 2016-2018
Packit 89ede9
 *
Packit 89ede9
 * Program and source code released under the GPL version 2
Packit 89ede9
 *
Packit 89ede9
 */
Packit 89ede9
#include <string.h>
Packit 89ede9
#include "url.h"
Packit 89ede9
#include "notes.h"
Packit 89ede9
Packit 89ede9
/*
Packit 89ede9
 * notes are mostly directly copies; however, lots of formats hide
Packit 89ede9
 * URLs/DOIs in the notes fields. For example:
Packit 89ede9
 *
Packit 89ede9
 * For RIS, Oxford Journals hides DOI in the N1 field.
Packit 89ede9
 * For Endnote, Wiley hides DOI in the %1 field.
Packit 89ede9
 * etc.
Packit 89ede9
 */
Packit 89ede9
Packit 89ede9
typedef struct url_t {
Packit 89ede9
	char *prefix;
Packit 89ede9
	char *tag;
Packit 89ede9
	int offset;
Packit 89ede9
} url_t;
Packit 89ede9
Packit 89ede9
static void
Packit 89ede9
notes_added_url( fields *bibout, str *invalue, int level, int *ok )
Packit 89ede9
{
Packit 89ede9
	url_t prefixes[] = {
Packit 89ede9
		{ "arXiv:",                                    "ARXIV",     6 },
Packit 89ede9
		{ "http://arxiv.org/abs/",                     "ARXIV",    21 },
Packit 89ede9
		{ "jstor:",                                    "JSTOR",     6 },
Packit 89ede9
		{ "http://www.jstor.org/stable/",              "JSTOR",    28 },
Packit 89ede9
		{ "medline:",                                  "MEDLINE",   8 },
Packit 89ede9
		{ "pubmed:",                                   "PMID",      7 },
Packit 89ede9
		{ "http://www.ncbi.nlm.nih.gov/pubmed/",       "PMID",     35 },
Packit 89ede9
		{ "http://www.ncbi.nlm.nih.gov/pmc/articles/", "PMC",      41 },
Packit 89ede9
		{ "http://dx.doi.org/",                        "DOI",      19 },
Packit 89ede9
		{ "isi:",                                      "ISIREFNUM", 4 },
Packit 89ede9
	};
Packit 89ede9
	int nprefixes = sizeof( prefixes ) / sizeof( prefixes[0] );
Packit 89ede9
Packit 89ede9
	char *p = invalue->data;
Packit 89ede9
	char *tag = "URL";
Packit 89ede9
	int fstatus;
Packit 89ede9
	int i;
Packit 89ede9
Packit 89ede9
	/* bibtex/biblatex-specific */
Packit 89ede9
	if ( !strncasecmp( p, "\\urllink", 8 ) ) p += 8;
Packit 89ede9
	if ( !strncasecmp( p, "\\url", 4 ) ) p += 4;
Packit 89ede9
Packit 89ede9
	for ( i=0; i
Packit 89ede9
		if ( !strncasecmp( p, prefixes[i].prefix, prefixes[i].offset ) ) {
Packit 89ede9
			tag = prefixes[i].tag;
Packit 89ede9
			p   = p + prefixes[i].offset;
Packit 89ede9
			break;
Packit 89ede9
		}
Packit 89ede9
	}
Packit 89ede9
Packit 89ede9
	fstatus = fields_add( bibout, tag, p, level );
Packit 89ede9
Packit 89ede9
	if ( fstatus==FIELDS_OK ) *ok = 1;
Packit 89ede9
	else *ok = 0;
Packit 89ede9
}
Packit 89ede9
Packit 89ede9
static int
Packit 89ede9
notes_added_doi( fields *bibout, str *invalue, int level, int *ok )
Packit 89ede9
{
Packit 89ede9
	int doi, fstatus;
Packit 89ede9
Packit 89ede9
	doi = is_doi( invalue->data );
Packit 89ede9
Packit 89ede9
	if ( doi != -1 ) {
Packit 89ede9
		fstatus = fields_add( bibout, "DOI", &(invalue->data[doi]), level );
Packit 89ede9
		if ( fstatus != FIELDS_OK ) *ok = 0;
Packit 89ede9
		return 1;
Packit 89ede9
	}
Packit 89ede9
Packit 89ede9
	else return 0;
Packit 89ede9
}
Packit 89ede9
Packit 89ede9
int
Packit 89ede9
notes_add( fields *bibout, str *invalue, int level )
Packit 89ede9
{
Packit 89ede9
	int fstatus, done = 0, ok = 1;
Packit 89ede9
Packit 89ede9
	if ( !is_embedded_link( invalue->data ) ) {
Packit 89ede9
		fstatus = fields_add( bibout, "NOTES", invalue->data, level );
Packit 89ede9
		if ( fstatus != FIELDS_OK ) ok = 0;
Packit 89ede9
	}
Packit 89ede9
Packit 89ede9
	else {
Packit 89ede9
Packit 89ede9
		done = notes_added_doi( bibout, invalue, level, &ok );
Packit 89ede9
		if ( !done ) notes_added_url( bibout, invalue, level, &ok );
Packit 89ede9
Packit 89ede9
	}
Packit 89ede9
Packit 89ede9
	return ok;
Packit 89ede9
}