Numerous updates:

* Add makefile to install data

* Reference text is now formatted

* UTF-8 string processing
This commit is contained in:
David Baer
2015-08-06 14:31:38 -04:00
parent af38b1eafc
commit cfc0ba7e9a
13 changed files with 269 additions and 7 deletions

99
src/xml.c Normal file
View 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");
}