/* * Copyright 2005-2007 Gerald Schmidt. * * This file is part of Xml Copy Editor. * * Xml Copy Editor is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2 of the License. * * Xml Copy Editor is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Xml Copy Editor; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include #include #include #include "wrapregex.h" #include "mp3album.h" Mp3Album::Mp3Album() : d ( new Mp3AlbumData() ) { XML_SetUserData ( p, d.get() ); XML_SetElementHandler ( p, start, end ); XML_SetCharacterDataHandler ( p, characterdata ); d->trackNo = 0; d->armed = false; } Mp3Album::~Mp3Album() {} void XMLCALL Mp3Album::start ( void *data, const XML_Char *el, const XML_Char **attr ) { Mp3AlbumData *ad; ad = ( Mp3AlbumData * ) data; std::string value; char noArray[5]; int currentNo; for ( ; *attr; attr += 2 ) { if ( !strcmp ( *attr, "smilref" ) && !strncmp ( * ( attr + 1 ), "speechgen", 9 ) ) { memcpy ( noArray, ( * ( attr + 1 ) ) + 9, 4 ); noArray[4] = '\0'; currentNo = atoi ( noArray ); if ( currentNo > ad->trackNo ) { ad->trackNoString = noArray; ad->trackNo = currentNo; ad->armed = true; } } } } void XMLCALL Mp3Album::end ( void *data, const XML_Char *el ) { Mp3AlbumData *ad; ad = ( Mp3AlbumData * ) data; if ( ad->armed ) { ad->armed = false; bool abbrev = false; if ( ad->buffer.size() > 22 ) { ad->buffer.erase ( 18 ); abbrev = true; } int replacements; // no trailing whitespace std::string pattern = "\\s+$"; WrapRegex re ( pattern, false ); ad->buffer = re.replaceGlobal ( ad->buffer, &replacements ); // no contiguous whitespace std::string pattern2 = "\\s\\s+"; std::string replace2 = " "; WrapRegex re2 ( pattern2, false, replace2 ); ad->buffer = re.replaceGlobal ( ad->buffer, &replacements ); // alphanumeric only std::string pattern3 = "[;\\.\\[\\],!^&*()]"; WrapRegex re3 ( pattern3, false ); ad->buffer = re3.replaceGlobal ( ad->buffer, &replacements ); if ( abbrev ) ad->buffer.append ( "..." ); if ( ad->trackNo == 1 ) ad->albumTitle = ad->buffer; if ( abbrev ) ad->buffer.append ( " " ); std::string source; source.append ( "speechgen" ); source.append ( ad->trackNoString ); source.append ( ".mp3" ); std::stringstream destinationStream; destinationStream << ad->trackNo << " - " << ad->buffer.c_str(); ad->buffer.clear(); ad->fileNameVector.push_back ( std::make_pair ( source, destinationStream.str()) ); } if ( !ad->armed || ad->buffer.empty() ) { ad->armed = false; return; } } void XMLCALL Mp3Album::characterdata ( void *data, const XML_Char *s, int len ) { Mp3AlbumData *ad; ad = ( Mp3AlbumData * ) data; if ( ad->armed ) ad->buffer.append ( s, len ); } void Mp3Album::getFileNameVector ( std::vector >& v ) { v = d->fileNameVector; } std::string Mp3Album::getAlbumTitle() { return d->albumTitle; }