aboutsummaryrefslogblamecommitdiffstats
path: root/utilities/mod2osis.cpp
blob: ac42be493ea1fec1a328e5fb13e518bcc12b2877 (plain) (tree)





























































































































































                                                                                                                                                               
// Compression on variable granularity


#include <fcntl.h>

#include <iostream>

#include <fstream>

#include <string>


#ifndef __GNUC__

#include <io.h>

#else

#include <unistd.h>

#endif


#include <ztext.h>

#include <zld.h>

#include <zcom.h>

#include <swmgr.h>

#include <lzsscomprs.h>

#include <zipcomprs.h>

#include <versekey.h>

#include <thmlosis.h>

#include <stdio.h>

#include <markupfiltmgr.h>

#include <algorithm>


void errorOutHelp(char *appName) {
	cerr << appName << " - a tool to output a Sword module in OSIS format\n";
	cerr << "usage: "<< appName << " <modname> \n";
	cerr << "\n\n";
	exit(-1);
}


int main(int argc, char **argv)
{
	SWModule *inModule = 0;
	ThMLOSIS filter;
	
	if ((argc != 2)) {
		errorOutHelp(argv[0]);
	}

	if ((!strcmp(argv[1], "-h")) || (!strcmp(argv[1], "--help")) || (!strcmp(argv[1], "/?")) || (!strcmp(argv[1], "-?")) || (!strcmp(argv[1], "-help"))) {
		errorOutHelp(argv[0]);
	}

	SWMgr mgr(new MarkupFilterMgr(FMT_OSIS));
	OptionsList options = mgr.getGlobalOptions();
	for (OptionsList::iterator it = options.begin(); it != options.end(); it++) {
		OptionsList values = mgr.getGlobalOptionValues(it->c_str());
		if (find(values.begin(), values.end(), "On") != values.end()) {
			mgr.setGlobalOption(it->c_str(), "On");
		}
	}


	ModMap::iterator it = mgr.Modules.find(argv[1]);
	if (it == mgr.Modules.end()) {
		fprintf(stderr, "error: %s: couldn't find module: %s \n", argv[0], argv[1]);
		exit(-2);
	}

	inModule = it->second;
//	inModule->AddRenderFilter(&filter);


	SWKey *key = (SWKey *)*inModule;
	VerseKey *vkey = SWDYNAMIC_CAST(VerseKey, key);

	char *buf;
	bool opendiv = false;
	VerseKey lastHeading;
	lastHeading.Headings(1);
	lastHeading.AutoNormalize(0);
	lastHeading.Testament(5);
	lastHeading = BOTTOM;

	if (vkey)
		vkey->Headings(1);

	cout << "<?xml version=\"1.0\" ";
		if (inModule->getConfigEntry("Encoding")) {
			if (*(inModule->getConfigEntry("Encoding")))
				cout << "encoding=\"" << inModule->getConfigEntry("Encoding") << "\" ";
			else cout << "encoding=\"UTF-8\" ";
		}
		else cout << "encoding=\"UTF-8\" ";
		cout << "?>\n\n";

	cout << "<text ";
		cout << "xmlns:xsi=\"http://www.w3.org/2000/10/XMLSchema-instance\" ";
		cout << "refSys=\"KJV\" ";
		cout << "work=\"";
		cout << inModule->Name() << "\" ";
		if (inModule->Lang()) {
			if (strlen(inModule->Lang()))
				cout << "lang=\"" << inModule->Lang() << "\" ";
		}
		cout << "xsi:noNamespaceSchemaLocation=\"OSISCore_1.0.2.xsd\" ";
		cout << " >\n\n";

	cout << "\t<front>\n";
	cout << "\t\t<title>\n";
	cout << "\t\t\t<titlePart>" << inModule->Description() << "</titlePart>\n";
	cout << "\t\t</title>\n";
	cout << "\t</front>\n\n";

	cout << "\t<body><div>\n";

	int testament = vkey->Testament();		
//	for ((*inModule) = TOP; (inModule->Key() < (VerseKey)"Mat 2:1"); (*inModule)++) {

	for ((*inModule) = TOP; !inModule->Error(); (*inModule)++) {
//	for ((*vkey) = "Mark6:29"; !inModule->Error(); (*inModule)++) {

		if (vkey->Testament() != lastHeading.Testament()) {
			if (opendiv)
				cout << "\t</div>\n";
			cout << "\t<div>";
			opendiv = true;
		}
		if (vkey->Book() != lastHeading.Book()) {
			buf = new char [205];
			lastHeading.Testament(vkey->Testament());
			lastHeading.Book(vkey->Book());
			lastHeading.Chapter(0);
			lastHeading.Verse(0);
			*buf = 0;
			filter.ProcessText(buf, 200 - 3, &lastHeading, inModule);
			cout << "" << buf << endl;
			delete [] buf;
		}
		if (vkey->Chapter() != lastHeading.Chapter()) {
			buf = new char [205];
			lastHeading.Testament(vkey->Testament());
			lastHeading.Book(vkey->Book());
			lastHeading.Chapter(vkey->Chapter());
			lastHeading.Verse(0);
			*buf = 0;
			filter.ProcessText(buf, 200 - 3, &lastHeading, inModule);
			cout << "" << buf;
			delete [] buf;
		}
		/*

		char *text = inModule->getRawEntry();

		int len = (inModule->getEntrySize() + 1) * 15;

		buf = new char [ len ];

		memset(buf, 0, len);

		memcpy(buf, inModule->getRawEntry(), inModule->getEntrySize());

		filter.ProcessText(buf,  len - 3, vkey, inModule);

		cout << buf << endl;

		*/
		cout << inModule->RenderText() << endl;
	}
	if (opendiv)
		cout << "\t</div>\n";
	cout << "\t</div></body>\n";
	cout << "\t</text>\n";
	return 0;
}