|
Packit |
89ede9 |
/*
|
|
Packit |
89ede9 |
* title.c
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* process titles into title/subtitle pairs for MODS
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* Copyright (c) Chris Putnam 2004-2018
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* 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 <string.h>
|
|
Packit |
89ede9 |
#include "str.h"
|
|
Packit |
89ede9 |
#include "fields.h"
|
|
Packit |
89ede9 |
#include "title.h"
|
|
Packit |
89ede9 |
#include "is_ws.h"
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
int
|
|
Packit |
89ede9 |
title_process( fields *info, char *tag, char *data, int level,
|
|
Packit |
89ede9 |
unsigned char nosplittitle )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
str title, subtitle;
|
|
Packit |
89ede9 |
char *p, *q;
|
|
Packit |
89ede9 |
int status;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
str_init( &title );
|
|
Packit |
89ede9 |
str_init( &subtitle );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( nosplittitle ) q = NULL;
|
|
Packit |
89ede9 |
else {
|
|
Packit |
89ede9 |
q = strstr( data, ": " );
|
|
Packit |
89ede9 |
if ( !q ) q = strstr( data, "? " );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( !q ) str_strcpyc( &title, data );
|
|
Packit |
89ede9 |
else {
|
|
Packit |
89ede9 |
p = data;
|
|
Packit |
89ede9 |
while ( p!=q ) str_addchar( &title, *p++ );
|
|
Packit |
89ede9 |
if ( *q=='?' ) str_addchar( &title, '?' );
|
|
Packit |
89ede9 |
q++;
|
|
Packit |
89ede9 |
q = skip_ws( q );
|
|
Packit |
89ede9 |
while ( *q ) str_addchar( &subtitle, *q++ );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( strncasecmp( "SHORT", tag, 5 ) ) {
|
|
Packit |
89ede9 |
if ( str_has_value( &title ) ) {
|
|
Packit |
89ede9 |
status = fields_add( info, "TITLE", str_cstr( &title ), level );
|
|
Packit |
89ede9 |
if ( status!=FIELDS_OK ) return 0;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( str_has_value( &subtitle ) ) {
|
|
Packit |
89ede9 |
status = fields_add( info, "SUBTITLE", str_cstr( &subtitle ), level );
|
|
Packit |
89ede9 |
if ( status!=FIELDS_OK ) return 0;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
} else {
|
|
Packit |
89ede9 |
if ( str_has_value( &title ) ) {
|
|
Packit |
89ede9 |
status = fields_add( info, "SHORTTITLE", str_cstr( &title ), level );
|
|
Packit |
89ede9 |
if ( status!=FIELDS_OK ) return 0;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
/* no SHORT-SUBTITLE! */
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
str_free( &subtitle );
|
|
Packit |
89ede9 |
str_free( &title );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return 1;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* title_combine()
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* Combine a main title and a subtitle into a full title.
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* Example:
|
|
Packit |
89ede9 |
* Main title = "A Clearing in the Distance"
|
|
Packit |
89ede9 |
* Subtitle = "The Biography of Frederick Law Olmstead"
|
|
Packit |
89ede9 |
* Full title = "A Clearing in the Distance: The Biography of Frederick Law Olmstead"
|
|
Packit |
89ede9 |
* Example:
|
|
Packit |
89ede9 |
* Main title = "What Makes a Good Team Player?"
|
|
Packit |
89ede9 |
* Subtitle = "Personality and Team Effectiveness"
|
|
Packit |
89ede9 |
* Full title = "What Makes a Good Team Player? Personality and Team Effectiveness"
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
void
|
|
Packit |
89ede9 |
title_combine( str *fullttl, str *mainttl, str *subttl )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
str_empty( fullttl );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( !mainttl ) return;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
str_strcpy( fullttl, mainttl );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( subttl ) {
|
|
Packit |
89ede9 |
if ( str_has_value( mainttl ) ) {
|
|
Packit |
89ede9 |
if ( mainttl->data[ mainttl->len - 1 ] != '?' && mainttl->data[ mainttl->len - 1] != ':' )
|
|
Packit |
89ede9 |
str_strcatc( fullttl, ": " );
|
|
Packit |
89ede9 |
else
|
|
Packit |
89ede9 |
str_strcatc( fullttl, " " );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
str_strcat( fullttl, subttl );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|