AlbumShaper  1.0a3
Functions
xmlTools.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

QString fixXMLString (QString text)
 Fix strings before exporting to XML such that & becomes &, etc...
void transformXMLtoHTML (QString outputPath, QString theme, bool smallWebExport)
void updateXML (QString inputPath)

Function Documentation

QString fixXMLString ( QString  text)

Fix strings before exporting to XML such that & becomes &, etc...

Definition at line 36 of file xmlTools.cpp.

Referenced by Subalbum::exportToXML(), Photo::exportToXML(), and Album::exportToXML().

{
  //the following checks are necessary before exporting
  //strings to XML. see http://hdf.ncsa.uiuc.edu/HDF5/XML/xml_escape_chars.html for details
  text.replace("&", "&");
  text.replace("\"",""");
  text.replace("'", "'");
  text.replace("<", "&lt;");
  text.replace(">", "&gt;");
  text.replace("\n", "&#10;");
  text.replace("\r", "&#13;");
  return text;
}
void transformXMLtoHTML ( QString  outputPath,
QString  theme,
bool  smallWebExport 
)

Definition at line 50 of file xmlTools.cpp.

References THEMES_PATH.

Referenced by Album::exportCompressedWebAlbum(), and Album::exportToDisk().

{
  xmlSubstituteEntitiesDefault(1);
  xmlLoadExtDtdDefaultValue = 1;
  xsltStylesheetPtr cur = xsltParseStylesheetFile( (const xmlChar *) QString(THEMES_PATH + theme + "/theme.xsl").ascii() );

  QString xmlFile = QString(outputPath + "/Album.xml");
  xmlDocPtr doc = xmlParseFile( QFile::encodeName(xmlFile) ); 
  
  const char* params[5];
  //--
  params[0] = "outputPath";
  QString quotedPath = outputPath;

  //For some reason libxslt has trouble handling filenames with spaces on Unix platforms (OSX,
  //Linux, FreeBSD?). this problem can be averted by converting the filename to a URI. Converting it
  //to a URI on windows using the qt method mangles the drive name though, so only convert to
  //URI on OSX. We need to nail this weirdness at some point and be consistant IMHO but for now
  //this works...
#ifndef Q_OS_WIN
  quotedPath = QUriDrag::localFileToUri( quotedPath );  
#endif
  
  params[1] = quotedPath.prepend('\"').append('\"').ascii();
  //--
  params[2] = "smallWebExport";
  if(smallWebExport)
    params[3] = "1";
  else
    params[3] = "0";
  //--
  params[4] = NULL;
  xmlDocPtr res = xsltApplyStylesheet( cur, doc, params);
  xsltFreeStylesheet( cur );
  xmlFreeDoc( res );
  xmlFreeDoc( doc );
  xsltCleanupGlobals();
  xmlCleanupParser();
}
void updateXML ( QString  inputPath)

Definition at line 90 of file xmlTools.cpp.

References XMLCONVERSION_PATH.

Referenced by Album::importFromDisk().

{
  //skip updating the xml file if we can't find the update.xsl file
  QDir tmpDir;
  if( !tmpDir.exists( XMLCONVERSION_PATH + "update.xsl" ) )
  {
    std::cout << "Can't find update.xsl! Skipping auto-update!\n";
    return;
  }
  
  xmlSubstituteEntitiesDefault(1);
  xmlLoadExtDtdDefaultValue = 1;

  xsltStylesheetPtr stylesheet;
  xmlDocPtr inputDoc, outputDoc;

  stylesheet = xsltParseStylesheetFile( (const xmlChar *) QString(XMLCONVERSION_PATH + "update.xsl").ascii() );

  QString xmlFile = QString( inputPath + "/Album.xml" );
  xmlFile = QDir::convertSeparators( xmlFile );
  inputDoc = xmlParseFile( QFile::encodeName(xmlFile) ); 

  const char* params[3];
  params[0] = "outputPath";

  QString quotedPath = inputPath;

  //For some reason libxslt has trouble handling filenames with spaces on Unix platforms (OSX,
  //Linux, FreeBSD?). this problem can be averted by converting the filename to a URI. Converting it
  //to a URI on windows using the qt method mangles the drive name though, so only convert to
  //URI on OSX. We need to nail this weirdness at some point and be consistant IMHO but for now
  //this works...
  #ifndef Q_OS_WIN
  quotedPath = QUriDrag::localFileToUri( quotedPath );  
  #endif


  params[1] = quotedPath.prepend('\"').append('\"').ascii();

  params[2] = NULL;

  std::cout.flush();

  //iterate until Album.updated file is created
  QDir workingDir( inputPath );

  int iterations = 0;
  while(true)
  {
    iterations++;

    //apply the stylesheet
    outputDoc = xsltApplyStylesheet( stylesheet, inputDoc, params );

    //if Album.updated file now exists we have already completed the last iteration,
    //meaning the input document is the most up-to-date so break out of loop
    if(workingDir.exists( "Album.updated" ))
      break;

    //free input  doc
    xmlFreeDoc( inputDoc );

    //swap input and output
    inputDoc = outputDoc;
  }

  //remove updated file
  workingDir.remove( inputPath + "/Album.updated" );

  //if we made more than one iteration then changes were applied
  if(iterations > 1)
  {
    //output updated xml file
    FILE* outfile = fopen( QFile::encodeName(xmlFile), "w" );
    xsltSaveResultToFile( outfile, inputDoc, stylesheet);
    fclose( outfile );
  }

  //memory
  xsltFreeStylesheet( stylesheet );
  xmlFreeDoc( inputDoc );
  xmlFreeDoc( outputDoc );
  xsltCleanupGlobals();
  xmlCleanupParser();
}