|
Packit |
89ede9 |
/*
|
|
Packit |
89ede9 |
* endxmlin.c
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* Copyright (c) Chris Putnam 2006-2018
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* Program and source code released under the GPL version 2
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
#include <stdio.h>
|
|
Packit |
89ede9 |
#include <stdlib.h>
|
|
Packit |
89ede9 |
#include "str.h"
|
|
Packit |
89ede9 |
#include "str_conv.h"
|
|
Packit |
89ede9 |
#include "fields.h"
|
|
Packit |
89ede9 |
#include "name.h"
|
|
Packit |
89ede9 |
#include "xml.h"
|
|
Packit |
89ede9 |
#include "xml_encoding.h"
|
|
Packit |
89ede9 |
#include "reftypes.h"
|
|
Packit |
89ede9 |
#include "bibformats.h"
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
typedef struct {
|
|
Packit |
89ede9 |
char *attrib;
|
|
Packit |
89ede9 |
char *internal;
|
|
Packit |
89ede9 |
} attribs;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
extern variants end_all[];
|
|
Packit |
89ede9 |
extern int end_nall;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int endxmlin_readf( FILE *fp, char *buf, int bufsize, int *bufpos, str *line, str *reference, int *fcharset );
|
|
Packit |
89ede9 |
static int endxmlin_processf( fields *endin, char *p, char *filename, long nref, param *pm );
|
|
Packit |
89ede9 |
extern int endin_typef( fields *endin, char *filename, int nrefs, param *p );
|
|
Packit |
89ede9 |
extern int endin_convertf( fields *endin, fields *info, int reftype, param *p );
|
|
Packit |
89ede9 |
extern int endin_cleanf( bibl *bin, param *p );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/*****************************************************
|
|
Packit |
89ede9 |
PUBLIC: void endxmlin_initparams()
|
|
Packit |
89ede9 |
*****************************************************/
|
|
Packit |
89ede9 |
void
|
|
Packit |
89ede9 |
endxmlin_initparams( param *p, const char *progname )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
p->readformat = BIBL_ENDNOTEXMLIN;
|
|
Packit |
89ede9 |
p->charsetin = BIBL_CHARSET_DEFAULT;
|
|
Packit |
89ede9 |
p->charsetin_src = BIBL_SRC_DEFAULT;
|
|
Packit |
89ede9 |
p->latexin = 0;
|
|
Packit |
89ede9 |
p->xmlin = 1;
|
|
Packit |
89ede9 |
p->utf8in = 1;
|
|
Packit |
89ede9 |
p->nosplittitle = 0;
|
|
Packit |
89ede9 |
p->verbose = 0;
|
|
Packit |
89ede9 |
p->addcount = 0;
|
|
Packit |
89ede9 |
p->output_raw = 0;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
p->readf = endxmlin_readf;
|
|
Packit |
89ede9 |
p->processf = endxmlin_processf;
|
|
Packit |
89ede9 |
p->cleanf = NULL;
|
|
Packit |
89ede9 |
p->typef = endin_typef;
|
|
Packit |
89ede9 |
p->convertf = endin_convertf;
|
|
Packit |
89ede9 |
p->all = end_all;
|
|
Packit |
89ede9 |
p->nall = end_nall;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
slist_init( &(p->asis) );
|
|
Packit |
89ede9 |
slist_init( &(p->corps) );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( !progname ) p->progname = NULL;
|
|
Packit |
89ede9 |
else p->progname = strdup( progname );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/*****************************************************
|
|
Packit |
89ede9 |
PUBLIC: int endxmlin_readf()
|
|
Packit |
89ede9 |
*****************************************************/
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
xml_readmore( FILE *fp, char *buf, int bufsize, int *bufpos )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
if ( !feof( fp ) && fgets( buf, bufsize, fp ) ) return 0;
|
|
Packit |
89ede9 |
return 1;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
endxmlin_readf( FILE *fp, char *buf, int bufsize, int *bufpos, str *line, str *reference, int *fcharset )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
str tmp;
|
|
Packit |
89ede9 |
char *startptr = NULL, *endptr = NULL;
|
|
Packit |
89ede9 |
int haveref = 0, inref = 0, done = 0, file_charset = CHARSET_UNKNOWN, m;
|
|
Packit |
89ede9 |
str_init( &tmp );
|
|
Packit |
89ede9 |
while ( !haveref && !done ) {
|
|
Packit |
89ede9 |
if ( line->data ) {
|
|
Packit |
89ede9 |
if ( !inref ) {
|
|
Packit |
89ede9 |
startptr = xml_find_start( line->data, "RECORD" );
|
|
Packit |
89ede9 |
if ( startptr ) inref = 1;
|
|
Packit |
89ede9 |
} else
|
|
Packit |
89ede9 |
endptr = xml_find_end( line->data, "RECORD" );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* If no <record> tag, we can trim up to last 8 bytes */
|
|
Packit |
89ede9 |
/* Emptying string can lose fragments of <record> tag */
|
|
Packit |
89ede9 |
if ( !startptr ) {
|
|
Packit |
89ede9 |
if ( line->len > 8 ) {
|
|
Packit |
89ede9 |
int n = 8;
|
|
Packit |
89ede9 |
char *p = &(line->data[line->len-1]);
|
|
Packit |
89ede9 |
while ( *p && n ) { p--; n--; }
|
|
Packit |
89ede9 |
str_segdel( line, line->data, p );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( !startptr || !endptr ) {
|
|
Packit |
89ede9 |
done = xml_readmore( fp, buf, bufsize, bufpos );
|
|
Packit |
89ede9 |
str_strcatc( line, buf );
|
|
Packit |
89ede9 |
} else {
|
|
Packit |
89ede9 |
/* we can reallocate in the str_strcat, so re-find */
|
|
Packit |
89ede9 |
startptr = xml_find_start( line->data, "RECORD" );
|
|
Packit |
89ede9 |
endptr = xml_find_end( line->data, "RECORD" );
|
|
Packit |
89ede9 |
str_segcpy( reference, startptr, endptr );
|
|
Packit |
89ede9 |
/* clear out information in line */
|
|
Packit |
89ede9 |
str_strcpyc( &tmp, endptr );
|
|
Packit |
89ede9 |
str_strcpy( line, &tmp );
|
|
Packit |
89ede9 |
haveref = 1;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( line->data ) {
|
|
Packit |
89ede9 |
m = xml_getencoding( line );
|
|
Packit |
89ede9 |
if ( m!=CHARSET_UNKNOWN ) file_charset = m;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
str_free( &tmp );
|
|
Packit |
89ede9 |
*fcharset = file_charset;
|
|
Packit |
89ede9 |
return haveref;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/*****************************************************
|
|
Packit |
89ede9 |
PUBLIC: int endxmlin_processf()
|
|
Packit |
89ede9 |
*****************************************************/
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/*
|
|
Packit |
89ede9 |
* add data to fields
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/*
|
|
Packit |
89ede9 |
* handle fields with (potentially) several style pieces
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* <datatype>
|
|
Packit |
89ede9 |
* <style>aaaaa</style>
|
|
Packit |
89ede9 |
* </datatype>
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* <datatype>aaaaaa</datatype>
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* <datatype>
|
|
Packit |
89ede9 |
* <style>aaa</style><style>aaaa</style>
|
|
Packit |
89ede9 |
* </datatype>
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
endxmlin_datar( xml *node, str *s )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( xml_has_value( node ) ) {
|
|
Packit |
89ede9 |
str_strcat( s, &(node->value) );
|
|
Packit |
89ede9 |
if ( str_memerr( s ) ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->down && xml_tag_matches( node->down, "style" ) ) {
|
|
Packit |
89ede9 |
status = endxmlin_datar( node->down, s );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node, "style" ) && node->next ) {
|
|
Packit |
89ede9 |
status = endxmlin_datar( node->next, s );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
endxmlin_data( xml *node, char *inttag, fields *info, int level )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status;
|
|
Packit |
89ede9 |
str s;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
str_init( &s );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
status = endxmlin_datar( node, &s );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( str_has_value( &s ) ) {
|
|
Packit |
89ede9 |
status = fields_add( info, inttag, s.data, level );
|
|
Packit |
89ede9 |
if ( status!=FIELDS_OK ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
str_free( &s );
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* <titles>
|
|
Packit |
89ede9 |
* <title>
|
|
Packit |
89ede9 |
* <style>ACTUAL TITLE HERE</style><style>MORE TITLE</style>
|
|
Packit |
89ede9 |
* </title>
|
|
Packit |
89ede9 |
* </titles>
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
endxmlin_titles( xml *node, fields *info )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
attribs a[] = {
|
|
Packit |
89ede9 |
{ "title", "%T" },
|
|
Packit |
89ede9 |
{ "secondary-title", "%B" },
|
|
Packit |
89ede9 |
{ "tertiary-title", "%S" },
|
|
Packit |
89ede9 |
{ "alt-title", "%!" },
|
|
Packit |
89ede9 |
{ "short-title", "SHORTTITLE" },
|
|
Packit |
89ede9 |
};
|
|
Packit |
89ede9 |
int i, status, n = sizeof( a ) / sizeof ( a[0] );
|
|
Packit |
89ede9 |
str title;
|
|
Packit |
89ede9 |
str_init( &title );
|
|
Packit |
89ede9 |
for ( i=0; i
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node, a[i].attrib ) && node->down ) {
|
|
Packit |
89ede9 |
str_empty( &title );
|
|
Packit |
89ede9 |
status = endxmlin_datar( node, &title );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
str_trimstartingws( &title );
|
|
Packit |
89ede9 |
str_trimendingws( &title );
|
|
Packit |
89ede9 |
status = fields_add( info, a[i].internal, title.data, 0);
|
|
Packit |
89ede9 |
if ( status!=FIELDS_OK ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->next ) {
|
|
Packit |
89ede9 |
status = endxmlin_titles( node->next, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
str_free( &title );
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* <contributors>
|
|
Packit |
89ede9 |
* <secondary-authors>
|
|
Packit |
89ede9 |
* <author>
|
|
Packit |
89ede9 |
* <style>ACTUAL AUTHORS HERE</style>
|
|
Packit |
89ede9 |
* </author>
|
|
Packit |
89ede9 |
* </secondary-authors>
|
|
Packit |
89ede9 |
* </contributors>
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
/*
|
|
Packit |
89ede9 |
* corp-name CDATA #IMPLIED
|
|
Packit |
89ede9 |
* first-name CDATA #IMPLIED
|
|
Packit |
89ede9 |
* initials CDATA #IMPLIED
|
|
Packit |
89ede9 |
* last-name CDATA #IMPLIED
|
|
Packit |
89ede9 |
* middle-initial CDATA #IMPLIED
|
|
Packit |
89ede9 |
* role CDATA #IMPLIED
|
|
Packit |
89ede9 |
* salutation CDATA #IMPLIED
|
|
Packit |
89ede9 |
* suffix CDATA #IMPLIED
|
|
Packit |
89ede9 |
* title CDATA #IMPLIED
|
|
Packit |
89ede9 |
* >
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
endxmlin_contributor( xml *node, fields *info, char *int_tag, int level )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status;
|
|
Packit |
89ede9 |
status = endxmlin_data( node, int_tag, info, level );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
if ( node->next ) {
|
|
Packit |
89ede9 |
status = endxmlin_contributor( node->next, info, int_tag, level );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
endxmlin_contributors( xml *node, fields *info )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
attribs a[] = {
|
|
Packit |
89ede9 |
{ "authors", "%A" },
|
|
Packit |
89ede9 |
{ "secondary-authors", "%E" },
|
|
Packit |
89ede9 |
{ "tertiary-authors", "%Y" },
|
|
Packit |
89ede9 |
{ "subsidiary-authors", "%?" },
|
|
Packit |
89ede9 |
{ "translated-authors", "%?" },
|
|
Packit |
89ede9 |
};
|
|
Packit |
89ede9 |
int i, status, n = sizeof( a ) / sizeof ( a[0] );
|
|
Packit |
89ede9 |
for ( i=0; i
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node, a[i].attrib ) && node->down ) {
|
|
Packit |
89ede9 |
status = endxmlin_contributor( node->down, info, a[i].internal, 0 );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->next ) {
|
|
Packit |
89ede9 |
status = endxmlin_contributors( node->next, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
endxmlin_keyword( xml *node, fields *info )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status;
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node, "keyword" ) ) {
|
|
Packit |
89ede9 |
status = endxmlin_data( node, "%K", info, 0 );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->next ) {
|
|
Packit |
89ede9 |
status = endxmlin_keyword( node->next, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
endxmlin_keywords( xml *node, fields *info )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
if ( node->down && xml_tag_matches( node->down, "keyword" ) )
|
|
Packit |
89ede9 |
return endxmlin_keyword( node->down, info );
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/*
|
|
Packit |
89ede9 |
*<electronic-resource-num>
|
|
Packit |
89ede9 |
* size="100%">10.1007/BF00356334</style></electronic-resource-num>
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
endxmlin_ern( xml *node, fields *info )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node, "electronic-resource-num" ) )
|
|
Packit |
89ede9 |
return endxmlin_data( node, "DOI", info, 0 );
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
endxmlin_language( xml *node, fields *info )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node, "language" ) )
|
|
Packit |
89ede9 |
return endxmlin_data( node, "%G", info, 0 );
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/*
|
|
Packit |
89ede9 |
* <urls>
|
|
Packit |
89ede9 |
* <pdf-urls>
|
|
Packit |
89ede9 |
* <url>internal-pdf://Zukin_1995_The_Cultures_of_Cities-0000551425/Zukin_1995_The_Cultures_of_Cities.pdf</url>
|
|
Packit |
89ede9 |
* </pdf-urls>
|
|
Packit |
89ede9 |
* </urls>
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
endxmlin_fileattach( xml *node, fields *info )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status;
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node, "url" ) ) {
|
|
Packit |
89ede9 |
status = endxmlin_data( node, "FILEATTACH", info, 0 );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->down ) {
|
|
Packit |
89ede9 |
status = endxmlin_fileattach( node->down, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->next ) {
|
|
Packit |
89ede9 |
status = endxmlin_fileattach( node->next, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
endxmlin_urls( xml *node, fields *info )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status;
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node, "pdf-urls" ) && node->down ) {
|
|
Packit |
89ede9 |
status = endxmlin_fileattach( node->down, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "url" ) ) {
|
|
Packit |
89ede9 |
status = endxmlin_data( node, "%U", info, 0 );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
} else {
|
|
Packit |
89ede9 |
if ( node->down ) {
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node->down, "related-urls" ) ||
|
|
Packit |
89ede9 |
xml_tag_matches( node->down, "pdf-urls" ) ||
|
|
Packit |
89ede9 |
xml_tag_matches( node->down, "url" ) ) {
|
|
Packit |
89ede9 |
status = endxmlin_urls( node->down, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->next ) {
|
|
Packit |
89ede9 |
status = endxmlin_urls( node->next, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
endxmlin_pubdates( xml *node, fields *info )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node, "date" ) )
|
|
Packit |
89ede9 |
return endxmlin_data( node, "%8", info, 0 );
|
|
Packit |
89ede9 |
else {
|
|
Packit |
89ede9 |
if ( node->down && xml_tag_matches( node->down, "date" ) )
|
|
Packit |
89ede9 |
return endxmlin_pubdates( node->down, info );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
endxmlin_dates( xml *node, fields *info )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status;
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node, "year" ) ) {
|
|
Packit |
89ede9 |
status = endxmlin_data( node, "%D", info, 0 );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
} else {
|
|
Packit |
89ede9 |
if ( node->down ) {
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node->down, "year" ) ) {
|
|
Packit |
89ede9 |
status = endxmlin_dates( node->down, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node->down, "pub-dates" ) ) {
|
|
Packit |
89ede9 |
status = endxmlin_pubdates( node->down, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->next ) {
|
|
Packit |
89ede9 |
status = endxmlin_dates( node->next, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/*
|
|
Packit |
89ede9 |
* <ref-type name="Journal Article">17</ref-type>
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
endxmlin_reftype( xml *node, fields *info )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status;
|
|
Packit |
89ede9 |
str *s;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
s = xml_attribute( node, "name" );
|
|
Packit |
89ede9 |
if ( str_has_value( s ) ) {
|
|
Packit |
89ede9 |
status = fields_add( info, "%0", str_cstr( s ), 0 );
|
|
Packit |
89ede9 |
if ( status!=FIELDS_OK ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
endxmlin_record( xml *node, fields *info )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
attribs a[] = {
|
|
Packit |
89ede9 |
{ "volume", "%V" },
|
|
Packit |
89ede9 |
{ "num-vol", "%6" },
|
|
Packit |
89ede9 |
{ "pages", "%P" },
|
|
Packit |
89ede9 |
{ "number", "%N" },
|
|
Packit |
89ede9 |
{ "issue", "%N" },
|
|
Packit |
89ede9 |
{ "label", "%F" },
|
|
Packit |
89ede9 |
{ "auth-address", "%C" },
|
|
Packit |
89ede9 |
{ "auth-affiliation", "%C" },
|
|
Packit |
89ede9 |
{ "pub-location", "%C" },
|
|
Packit |
89ede9 |
{ "publisher", "%I" },
|
|
Packit |
89ede9 |
{ "abstract", "%X" },
|
|
Packit |
89ede9 |
{ "edition", "%7" },
|
|
Packit |
89ede9 |
{ "reprint-edition", "%)" },
|
|
Packit |
89ede9 |
{ "section", "%&" },
|
|
Packit |
89ede9 |
{ "accession-num", "%M" },
|
|
Packit |
89ede9 |
{ "call-num", "%L" },
|
|
Packit |
89ede9 |
{ "isbn", "%@" },
|
|
Packit |
89ede9 |
{ "notes", "%O" },
|
|
Packit |
89ede9 |
{ "custom1", "%1" },
|
|
Packit |
89ede9 |
{ "custom2", "%2" },
|
|
Packit |
89ede9 |
{ "custom3", "%3" },
|
|
Packit |
89ede9 |
{ "custom4", "%4" },
|
|
Packit |
89ede9 |
{ "custom5", "%#" },
|
|
Packit |
89ede9 |
{ "custom6", "%$" },
|
|
Packit |
89ede9 |
};
|
|
Packit |
89ede9 |
int i, status, n = sizeof ( a ) / sizeof( a[0] );
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node, "DATABASE" ) ) {
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "SOURCE-APP" ) ) {
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "REC-NUMBER" ) ) {
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "ref-type" ) ) {
|
|
Packit |
89ede9 |
status = endxmlin_reftype( node, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "contributors" ) ) {
|
|
Packit |
89ede9 |
if ( node->down ) {
|
|
Packit |
89ede9 |
status = endxmlin_contributors( node->down, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "titles" ) ) {
|
|
Packit |
89ede9 |
if ( node->down ) endxmlin_titles( node->down, info );
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "keywords" ) ) {
|
|
Packit |
89ede9 |
status = endxmlin_keywords( node, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "urls" ) ) {
|
|
Packit |
89ede9 |
status = endxmlin_urls( node, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "electronic-resource-num" ) ) {
|
|
Packit |
89ede9 |
status = endxmlin_ern( node, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "dates" ) ) {
|
|
Packit |
89ede9 |
status = endxmlin_dates( node, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "language" ) ) {
|
|
Packit |
89ede9 |
status = endxmlin_language( node, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "periodical" ) ) {
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "secondary-volume" ) ) {
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "secondary-issue" ) ) {
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "reprint-status" ) ) {
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "orig-pub" ) ) {
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "report-id" ) ) {
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "coden" ) ) {
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "caption" ) ) {
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "research-notes" ) ) {
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "work-type" ) ) {
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "reviewed-item" ) ) {
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "availability" ) ) {
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "remote-source" ) ) {
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "meeting-place" ) ) {
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "work-location" ) ) {
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "work-extent" ) ) {
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "pack-method" ) ) {
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "size" ) ) {
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "repro-ratio" ) ) {
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "remote-database-name" ) ) {
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "remote-database-provider" ) ) {
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "access-date" ) ) {
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "modified-data" ) ) {
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "misc1" ) ) {
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "misc2" ) ) {
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "misc3" ) ) {
|
|
Packit |
89ede9 |
} else {
|
|
Packit |
89ede9 |
for ( i=0; i
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node, a[i].attrib ) ) {
|
|
Packit |
89ede9 |
status = endxmlin_data( node, a[i].internal, info, 0 );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->next ) {
|
|
Packit |
89ede9 |
status = endxmlin_record( node->next, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
endxmlin_assembleref( xml *node, fields *info )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status;
|
|
Packit |
89ede9 |
if ( str_is_empty( &(node->tag) ) ) {
|
|
Packit |
89ede9 |
if ( node->down )
|
|
Packit |
89ede9 |
return endxmlin_assembleref( node->down, info );
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "RECORD" ) ) {
|
|
Packit |
89ede9 |
if ( node->down ) {
|
|
Packit |
89ede9 |
status = endxmlin_record( node->down, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* endxmlin_processf first operates by converting to endnote input
|
|
Packit |
89ede9 |
* the endnote->mods conversion happens in convertf.
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* this is necessary as the xml format is as nasty and as overloaded
|
|
Packit |
89ede9 |
* as the tags used in the Refer format output
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
endxmlin_processf( fields *fin, char *data, char *filename, long nref, param *pm )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status;
|
|
Packit |
89ede9 |
xml top;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
xml_init( &top );
|
|
Packit |
89ede9 |
xml_parse( data, &top );
|
|
Packit |
89ede9 |
status = endxmlin_assembleref( &top, fin );
|
|
Packit |
89ede9 |
xml_free( &top );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( status==BIBL_OK ) return 1;
|
|
Packit |
89ede9 |
return 0;
|
|
Packit |
89ede9 |
}
|