Numerous updates:
* Add makefile to install data * Reference text is now formatted * UTF-8 string processing
This commit is contained in:
99
src/xml.c
Normal file
99
src/xml.c
Normal file
@@ -0,0 +1,99 @@
|
||||
#include <libxml/tree.h>
|
||||
#include "sermon.h"
|
||||
|
||||
static void
|
||||
appendHeaderNode(xmlNodePtr headerNode, const char* headerName,
|
||||
const char* headerText) {
|
||||
if (headerText) {
|
||||
xmlNodePtr ptr = xmlNewNode(NULL, headerName);
|
||||
xmlAddChild(ptr, xmlNewText(headerText));
|
||||
xmlAddChild(headerNode, ptr);
|
||||
}
|
||||
}
|
||||
|
||||
xmlNodePtr
|
||||
sermonHeader(const Sermon* srm) {
|
||||
xmlNodePtr header = xmlNewNode(NULL, "header");
|
||||
appendHeaderNode(header, "title", srm->sermonTitle);
|
||||
appendHeaderNode(header, "author", srm->sermonAuthor);
|
||||
appendHeaderNode(header, "occasion", srm->sermonOccasion);
|
||||
appendHeaderNode(header, "date", srm->sermonDate);
|
||||
appendHeaderNode(header, "text", srm->sermonText);
|
||||
return header;
|
||||
}
|
||||
|
||||
|
||||
static xmlNodePtr
|
||||
paragraphToXML(const SermonParagraph* p) {
|
||||
xmlNodePtr result = xmlNewNode(NULL, "p");
|
||||
xmlAddChild(result, xmlNewText(p->paraText));
|
||||
return result;
|
||||
}
|
||||
|
||||
xmlNodePtr
|
||||
sermonBody(const Sermon* srm) {
|
||||
xmlNodePtr body = xmlNewNode(NULL, "body");
|
||||
xmlNodePtr block = NULL;
|
||||
int i = 0;
|
||||
for (i = 0; i < srm->numParagraphs; i++) {
|
||||
const SermonParagraph* p = &srm->sermonParagraphs[i];
|
||||
xmlNodePtr para = paragraphToXML(p);
|
||||
if (p->paraType == PARA_BLOCKQUOTE) {
|
||||
if (!block) {
|
||||
block = xmlNewNode(NULL, "quote");
|
||||
xmlAddChild(body, block);
|
||||
}
|
||||
xmlAddChild(block, para);
|
||||
} else {
|
||||
block = NULL;
|
||||
xmlAddChild(body, para);
|
||||
}
|
||||
}
|
||||
return body;
|
||||
}
|
||||
|
||||
xmlNodePtr
|
||||
sermonFooter(const Sermon* srm) {
|
||||
xmlNodePtr footer = xmlNewNode(NULL, "footer");
|
||||
int i = 0;
|
||||
char num[10];
|
||||
for (i = 0; i < srm->numReferences; i++) {
|
||||
const SermonReference* r = &srm->sermonReferences[i];
|
||||
xmlNodePtr ref = xmlNewNode(NULL, "ref");
|
||||
snprintf(num, 10, "%d", i + 1);
|
||||
xmlNewProp(ref, "number", num);
|
||||
xmlAddChild(ref, paragraphToXML(&r->refText));
|
||||
xmlAddChild(footer, ref);
|
||||
}
|
||||
return footer;
|
||||
}
|
||||
|
||||
xmlDocPtr
|
||||
sermonToXmlDoc(const Sermon* srm) {
|
||||
/* document creation and setup */
|
||||
xmlDocPtr document = xmlNewDoc("1.0");
|
||||
xmlDtdPtr dtd = xmlCreateIntSubset(document, "sermon", NULL, DATADIR "/sermon.dtd");
|
||||
xmlNodePtr sermon = xmlNewNode(NULL, "sermon");
|
||||
xmlNsPtr sermon_ns = xmlNewNs(sermon, "urn:david-sermon", NULL);
|
||||
xmlDocSetRootElement(document, sermon);
|
||||
|
||||
/* add header */
|
||||
xmlAddChild(sermon, sermonHeader(srm));
|
||||
|
||||
/* add body paragraphs */
|
||||
xmlAddChild(sermon, sermonBody(srm));
|
||||
|
||||
if (srm->numReferences) {
|
||||
/* add footer */
|
||||
xmlAddChild(sermon, sermonFooter(srm));
|
||||
}
|
||||
|
||||
return document;
|
||||
}
|
||||
|
||||
void
|
||||
printXML(xmlDocPtr document) {
|
||||
xmlCharEncodingHandlerPtr encoding = xmlFindCharEncodingHandler("utf-8");
|
||||
xmlOutputBufferPtr output = xmlOutputBufferCreateFd(1, encoding);
|
||||
xmlSaveFileTo(output, document, "utf-8");
|
||||
}
|
||||
Reference in New Issue
Block a user