[sword-devel] PATCH Genbook osisRef does not conform to OSIS in libsword

Tuomas Airaksinen tuomas.airaksinen at gmail.com
Mon Jun 22 00:23:50 MST 2015


Hi all,

Currently in libsword apps, referenses to genbook nodes need to be written
in form osisRef="BookId:rootnode/branchnode/leafnode". This is wrong,
because OSIS xml scheme does not allow '/' character in osisRefs. Instead,
osisRef should be in form, osisRef="BookId:rootnode.branchnode.leafnode".
Also http://www.crosswire.org/wiki/OSIS_Genbooks suggest the latter form.

See also discussion on https://github.com/crosswire/jsword/pull/98

Attached is the patch to fix this issue. I tested this with Xiphos and it
seems to work fine.

Thanks,
Best regards, Tuomas

ps.
just a little humble suggestion, *please* move to github. It would be a lot
more convenient and easier to get involved to development via pullrequests
than this way.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.crosswire.org/pipermail/sword-devel/attachments/20150622/1b65fdf2/attachment.html>
-------------- next part --------------
diff --git a/src/keys/treekey.cpp b/src/keys/treekey.cpp
index a466da6..fd82ff5 100644
--- a/src/keys/treekey.cpp
+++ b/src/keys/treekey.cpp
@@ -53,7 +53,7 @@ void TreeKey::assureKeyPath(const char *keyBuffer) {
 	root();
 
 	// TODO: change to NOT use strtok. strtok is dangerous.
-	SWBuf tok = strtok(keybuf, "/");
+	SWBuf tok = strtok(keybuf, ".");
 	tok.trim();
 	while (tok.size()) {
 		bool foundkey = false;
@@ -88,7 +88,7 @@ void TreeKey::assureKeyPath(const char *keyBuffer) {
 //      std::cout << getLocalName() << " : " << tok << std::endl;
 #endif
 
-		tok = strtok(0, "/");
+		tok = strtok(0, ".");
 		tok.trim();
 
 	}
diff --git a/src/keys/treekeyidx.cpp b/src/keys/treekeyidx.cpp
index 5164277..08c5eeb 100644
--- a/src/keys/treekeyidx.cpp
+++ b/src/keys/treekeyidx.cpp
@@ -514,7 +514,7 @@ void TreeKeyIdx::saveTreeNode(TreeNode *node) {
 void TreeKeyIdx::setText(const char *ikey) {
 	char *buf = 0;
 	stdstr(&buf, ikey);
-	SWBuf leaf = strtok(buf, "/");
+	SWBuf leaf = strtok(buf, ".");
 	leaf.trim();
 	root();
 	while ((leaf.size()) && (!popError())) {
@@ -527,7 +527,7 @@ void TreeKeyIdx::setText(const char *ikey) {
 				break;
 			}
 		}
-		leaf = strtok(0, "/");
+		leaf = strtok(0, ".");
 		leaf.trim();
 		if (!ok) {
 		    	if (inChild) {	// if we didn't find a matching child node, default to first child
@@ -617,10 +617,12 @@ const char *TreeKeyIdx::getText() const {
 	static SWBuf fullPath;
 	fullPath = currentNode.name;
 	parent.parent = currentNode.parent;
-	while (parent.parent > -1) {
+	while (parent.parent > 0) {
 		getTreeNodeFromIdxOffset(parent.parent, &parent);
-		fullPath = ((SWBuf)parent.name) + (SWBuf) "/" + fullPath;
+		fullPath = ((SWBuf)parent.name) + (SWBuf) "." + fullPath;
 	}
+	getTreeNodeFromIdxOffset(parent.parent, &parent);
+	fullPath = ((SWBuf)parent.name) + (SWBuf) fullPath;
 	// we've snapped; clear our unsnapped text holder
 	unsnappedKeyText = "";
 	return fullPath.c_str();


More information about the sword-devel mailing list