[sword-svn] r2688 - in trunk: include src/modules/filters tests tests/testsuite

scribe at crosswire.org scribe at crosswire.org
Sun Mar 4 19:02:10 MST 2012


Author: scribe
Date: 2012-03-04 19:02:10 -0700 (Sun, 04 Mar 2012)
New Revision: 2688

Added:
   trunk/tests/osistest.cpp
   trunk/tests/testsuite/osis.good
   trunk/tests/testsuite/osis.sh
   trunk/tests/testsuite/osisReference.xml
Modified:
   trunk/include/osisheadings.h
   trunk/include/swbasicfilter.h
   trunk/include/swoptfilter.h
   trunk/src/modules/filters/osisheadings.cpp
   trunk/tests/Makefile.am
Log:
Reworked OSISHeadings filter to be sane, thought might not work.  Test!
Added OSIS Reference doc and start of osis test to testsuite
Changed SWOptionFilter and SWBasicFilter to virtual extend SWFilter to prevent bad MI.



Modified: trunk/include/osisheadings.h
===================================================================
--- trunk/include/osisheadings.h	2012-03-03 13:09:14 UTC (rev 2687)
+++ trunk/include/osisheadings.h	2012-03-05 02:02:10 UTC (rev 2688)
@@ -22,16 +22,17 @@
 #define OSISHEADINGS_H
 
 #include <swoptfilter.h>
+#include <swbasicfilter.h>
 
 SWORD_NAMESPACE_START
 
 /** This Filter shows/hides headings in a OSIS text
  */
-class SWDLLEXPORT OSISHeadings : public SWOptionFilter {
+class SWDLLEXPORT OSISHeadings : public SWOptionFilter, public SWBasicFilter {
 public:
 	OSISHeadings();
-	virtual ~OSISHeadings();
-	virtual char processText(SWBuf &text, const SWKey *key = 0, const SWModule *module = 0);
+	virtual BasicFilterUserData *createUserData(const SWModule *module, const SWKey *key);
+	virtual bool handleToken(SWBuf &buf, const char *token, BasicFilterUserData *userData);
 };
 
 SWORD_NAMESPACE_END

Modified: trunk/include/swbasicfilter.h
===================================================================
--- trunk/include/swbasicfilter.h	2012-03-03 13:09:14 UTC (rev 2687)
+++ trunk/include/swbasicfilter.h	2012-03-05 02:02:10 UTC (rev 2688)
@@ -55,7 +55,7 @@
  * <code>*buf</code> address and change <code>*buf</code> to point past
  * the last char of the written sequence.
  */
-class SWDLLEXPORT SWBasicFilter : public SWFilter {
+class SWDLLEXPORT SWBasicFilter : public virtual SWFilter {
 
 class Private;
 

Modified: trunk/include/swoptfilter.h
===================================================================
--- trunk/include/swoptfilter.h	2012-03-03 13:09:14 UTC (rev 2687)
+++ trunk/include/swoptfilter.h	2012-03-05 02:02:10 UTC (rev 2688)
@@ -35,7 +35,7 @@
 
   /** Base class for all option filters.
   */
-class SWDLLEXPORT SWOptionFilter : public SWFilter {
+class SWDLLEXPORT SWOptionFilter : public virtual SWFilter {
 protected:
 	SWBuf optionValue;
 	const char *optName;

Modified: trunk/src/modules/filters/osisheadings.cpp
===================================================================
--- trunk/src/modules/filters/osisheadings.cpp	2012-03-03 13:09:14 UTC (rev 2687)
+++ trunk/src/modules/filters/osisheadings.cpp	2012-03-05 02:02:10 UTC (rev 2688)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- *osisheadings -	SWFilter descendant to hide or show headings
+ * osisheadings -	SWFilter descendant to hide or show headings
  *			in an OSIS module.
  *
  *
@@ -35,143 +35,104 @@
 const SWBuf choices[3] = {"Off", "On", ""};
 const StringList oValues(&choices[0], &choices[2]);
 
-OSISHeadings::OSISHeadings() : SWOptionFilter(oName, oTip, &oValues) {
-	setOptionValue("Off");
+
+namespace {
+	class MyUserData : public BasicFilterUserData {
+	public:
+		SWBuf currentHeadingName;
+		XMLTag currentHeadingTag;
+		const char *sID;
+		SWBuf heading;
+		int depth;
+		int headerNum;
+
+		MyUserData(const SWModule *module, const SWKey *key) : BasicFilterUserData(module, key) {
+			currentHeadingName = "";
+			currentHeadingTag = "";
+			sID = 0;
+			heading = "";
+			depth = 0;
+			headerNum = 0;
+		}
+	};
+};
+
+
+BasicFilterUserData *OSISHeadings::createUserData(const SWModule *module, const SWKey *key) {
+	return new MyUserData(module, key);
 }
 
 
-OSISHeadings::~OSISHeadings() {
+OSISHeadings::OSISHeadings() : SWOptionFilter(oName, oTip, &oValues) {
+	setOptionValue("Off");
+	setPassThruUnknownToken(true);
 }
 
 
-char OSISHeadings::processText(SWBuf &text, const SWKey *key, const SWModule *module) {
-	SWBuf token;
-	bool intoken    = false;
-	bool hide       = false;
-	bool preverse   = false;
-	bool withinTitle = false;
-	bool withinPreverseDiv = false;
-	SWBuf preverseDivID = "";
-	const char *pvDID = 0;
-	bool canonical  = false;
-	SWBuf header;
-	int headerNum   = 0;
-	int pvHeaderNum = 0;
-	char buf[254];
-	XMLTag startTag;
+bool OSISHeadings::handleToken(SWBuf &buf, const char *token, BasicFilterUserData *userData) {
 
-	SWBuf orig = text;
-	const char *from = orig.c_str();
-	
-	XMLTag tag;
+	MyUserData *u = (MyUserData *)userData;
+	XMLTag tag(token);
+	SWBuf name = tag.getName();
 
-	for (text = ""; *from; ++from) {
-		if (*from == '<') {
-			intoken = true;
-			token = "";
-			
-			continue;
-		}
-		if (*from == '>') {	// process tokens
-			intoken = false;
-			tag = token;
+	// we only care about titles and divs or if we're already in a heading
+	//
+	// are we currently in a heading?
+	if (u->currentHeadingName.size()) {
+		u->heading.append(u->lastTextNode);
+		if (name == u->currentHeadingName) {
+			if (tag.isEndTag(u->sID)) {
+				if (!u->depth-- || u->sID) {
+					// we've just finished a heading.  It's all stored up in u->heading
+					bool canonical = (SWBuf("true") == u->currentHeadingTag.getAttribute("canonical"));
+					bool preverse = (SWBuf("x-preverse") == tag.getAttribute("subType") || SWBuf("x-preverse") == tag.getAttribute("subtype"));
 
-			// <title> </title> <div subType="x-preverse"> (</div> ## when in previous)
-			if ( (!withinPreverseDiv && !strcmp(tag.getName(), "title")) || 
-				(!strcmp(tag.getName(), "div") &&
-					((withinPreverseDiv && (tag.isEndTag(pvDID))) ||
-					 (tag.getAttribute("subType") && !strcmp(tag.getAttribute("subType"), "x-preverse")))
-				)) {
+					// do we want to put anything in EntryAttributes?
+					if (u->module->isProcessEntryAttributes() && (option || canonical || !preverse)) {
+						SWBuf buf; buf.appendFormatted("%i", u->headerNum++);
+						u->module->getEntryAttributes()["Heading"][(preverse)?"Preverse":"Interverse"][buf] = u->heading;
 
-				withinTitle = (!tag.isEndTag(pvDID));
-				if (!strcmp(tag.getName(), "div")) {
-					withinPreverseDiv = (!tag.isEndTag(pvDID));
-					if (!pvDID) {
-						preverseDivID = tag.getAttribute("sID");
-						pvDID = (preverseDivID.length())? preverseDivID.c_str() : 0;
-					}
-				}
-				
-				if (!tag.isEndTag(pvDID)) { //start tag
-					if (!tag.isEmpty() || pvDID) {
-						startTag = tag;
-					}
-				}
-				
-				if ( !tag.isEndTag(pvDID) && (withinPreverseDiv 
-					|| (tag.getAttribute("subType") && !stricmp(tag.getAttribute("subType"), "x-preverse"))
-					|| (tag.getAttribute("subtype") && !stricmp(tag.getAttribute("subtype"), "x-preverse"))	// deprecated
-						)) {
-					hide = true;
-					preverse = true;
-					header = "";
-					canonical = (tag.getAttribute("canonical") && (!stricmp(tag.getAttribute("canonical"), "true")));
-					continue;
-				}
-				if (!tag.isEndTag(pvDID)) { //start tag
-					hide = true;
-					header = "";
-					if (option || canonical) {	// we want the tag in the text
-						text.append('<');
-						text.append(token);
-						text.append('>');
-					}
-					continue;
-				}
-				if (hide && tag.isEndTag(pvDID)) {
-					if (module->isProcessEntryAttributes() && ((option || canonical) || (!preverse))) {
-						if (preverse) {
-							sprintf(buf, "%i", pvHeaderNum++);
-							module->getEntryAttributes()["Heading"]["Preverse"][buf] = header;
-						}
-						else {
-							sprintf(buf, "%i", headerNum++);
-							module->getEntryAttributes()["Heading"]["Interverse"][buf] = header;
-							if (option || canonical) {	// we want the tag in the text
-								text.append(header);
-							}
-						}
-						
-						StringList attributes = startTag.getAttributeNames();
+						StringList attributes = u->currentHeadingTag.getAttributeNames();
 						for (StringList::const_iterator it = attributes.begin(); it != attributes.end(); it++) {
-							module->getEntryAttributes()["Heading"][buf][it->c_str()] = startTag.getAttribute(it->c_str());
+							u->module->getEntryAttributes()["Heading"][buf][it->c_str()] = u->currentHeadingTag.getAttribute(it->c_str());
 						}
 					}
-					
-					hide = false;
-					if (!(option || canonical) || preverse) {	// we don't want the tag in the text anymore
-						preverse = false;
-						continue;
+
+					// do we want the heading in the body?
+					if (!preverse && (option || canonical)) {
+						buf.append(u->currentHeadingTag);
+						buf.append(u->heading);
+						buf.append(tag);
 					}
-					preverse = false;
-					pvDID = 0;
+					u->suspendTextPassThru = false;
 				}
 			}
-
-			if (withinTitle) {
-				header.append('<');
-				header.append(token);
-				header.append('>');
-			} else {
-				// if not a heading token, keep token in text
-				if (!hide) {
-					text.append('<');
-					text.append(token);
-					text.append('>');
-				}
-			}
-			continue;
+			else u->depth++;
 		}
-		if (intoken) { //copy token
-			token.append(*from);
-		}
-		else if (!hide) { //copy text which is not inside a token
-			text.append(*from);
-		}
-		else header.append(*from);
+		u->heading.append(tag);
+		return true;
 	}
-	return 0;
+
+	// are we a title or a preverse div?
+	else if (	    name == "title"
+		|| (name == "div"
+			&& ( SWBuf("x-preverse") == tag.getAttribute("subType")
+			  || SWBuf("x-preverse") == tag.getAttribute("subtype")))) {
+
+		u->currentHeadingName = name;
+		u->currentHeadingTag = tag;
+		u->heading = "";
+		u->sID = u->currentHeadingTag.getAttribute("sID");
+		u->depth = 0;
+		u->suspendTextPassThru = true;
+
+		return true;
+	}
+
+	return false;
 }
 
+
+
 SWORD_NAMESPACE_END
 

Modified: trunk/tests/Makefile.am
===================================================================
--- trunk/tests/Makefile.am	2012-03-03 13:09:14 UTC (rev 2687)
+++ trunk/tests/Makefile.am	2012-03-05 02:02:10 UTC (rev 2688)
@@ -10,7 +10,7 @@
 noinst_PROGRAMS = utf8norm ciphertest keytest mgrtest parsekey versekeytest vtreekeytest versemgrtest listtest casttest \
 modtest compnone complzss localetest introtest indextest configtest keycast \
 romantest testblocks filtertest rawldidxtest lextest swaptest \
- swbuftest xmltest webiftest striptest
+ swbuftest xmltest webiftest striptest osistest
 
 if HAVE_ICU
 ICUPROG = icutest translittest tlitmgrtest
@@ -66,6 +66,7 @@
 webiftest_SOURCES = webiftest.cpp
 striptest_SOURCES = striptest.cpp
 xmltest_SOURCES = xmltest.cpp
+osistest_SOURCES = osistest.cpp
 
 EXTRA_DIST = 
 include bcppmake/Makefile.am

Added: trunk/tests/osistest.cpp
===================================================================
--- trunk/tests/osistest.cpp	                        (rev 0)
+++ trunk/tests/osistest.cpp	2012-03-05 02:02:10 UTC (rev 2688)
@@ -0,0 +1,45 @@
+#include <iostream>
+
+#include <swmgr.h>
+#include <markupfiltmgr.h>
+#include <swmodule.h>
+
+using namespace std;
+using namespace sword;
+
+
+int main(int argc, char **argv) {
+
+	if (argc != 2) {
+		cerr << "\nusage: " << *argv << " <modName>\n" << endl;
+		exit(-1);
+	}
+
+	SWMgr library(new MarkupFilterMgr(FMT_XHTML));
+	library.setGlobalOption("Headings", "On");
+
+	SWModule *module = library.getModule(argv[1]);
+
+	if (!module) {
+		cerr << "\nCouldn't file modules: " << argv[1] << "\n" << endl;
+		exit(-2);
+	}
+
+	module->setKey("Ps.3.1");
+
+	module->RenderText();
+
+	SWBuf header = module->getEntryAttributes()["Heading"]["Preverse"]["0"];
+
+	cout << "-------\n";
+	cout << header << endl;
+
+	cout << "-------\n";
+	cout << module->RenderText(header) << endl;
+
+	cout << "-------\n";
+	cout << module->getRenderHeader() << endl;
+	cout << module->RenderText() << endl;
+
+	return 0;
+}

Added: trunk/tests/testsuite/osis.good
===================================================================
--- trunk/tests/testsuite/osis.good	                        (rev 0)
+++ trunk/tests/testsuite/osis.good	2012-03-05 02:02:10 UTC (rev 2688)
@@ -0,0 +1,8 @@
+SUCCESS: ../../utilities/osis2mod: has finished its work and will now rest
+-------
+<div sID="gen12" type="section"/> <title canonical="true" type="psalm">A Psalm of David, when he fled from Absalom his son.</title> <div sID="gen13" type="paragraph"/> <lg sID="gen14"/> 
+-------
+<div sID="gen12" type="section"/> <h3>A Psalm of David, when he fled from Absalom his son.</h3>   
+-------
+		.divineName {			font-variant: small-caps;		}		.wordsOfJesus {			color: red;		}	
+ Lord, how are they increased that trouble me! many are they that rise up against me.

Added: trunk/tests/testsuite/osis.sh
===================================================================
--- trunk/tests/testsuite/osis.sh	                        (rev 0)
+++ trunk/tests/testsuite/osis.sh	2012-03-05 02:02:10 UTC (rev 2688)
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+rm -rf osis/
+mkdir -p osis/mods.d
+mkdir -p osis/modules
+
+cat > osis/mods.d/osisreference.conf <<!
+[OSISReference]
+DataPath=./modules/
+ModDrv=zText
+Encoding=UTF-8
+BlockType=BOOK
+CompressType=ZIP
+SourceType=OSIS
+Lang=en
+GlobalOptionFilter=OSISStrongs
+GlobalOptionFilter=OSISMorph
+GlobalOptionFilter=OSISFootnotes
+GlobalOptionFilter=OSISHeadings
+GlobalOptionFilter=OSISRedLetterWords
+Feature=StrongsNumbers
+!
+
+../../utilities/osis2mod osis/modules/ osisReference.xml -z 2>&1 | grep -v \$Rev
+
+cd osis && ../../osistest OSISReference


Property changes on: trunk/tests/testsuite/osis.sh
___________________________________________________________________
Added: svn:executable
   + *

Added: trunk/tests/testsuite/osisReference.xml
===================================================================
--- trunk/tests/testsuite/osisReference.xml	                        (rev 0)
+++ trunk/tests/testsuite/osisReference.xml	2012-03-05 02:02:10 UTC (rev 2688)
@@ -0,0 +1,180 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<osis
+  xmlns="http://www.bibletechnologies.net/2003/OSIS/namespace"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://www.bibletechnologies.net/2003/OSIS/namespace
+  http://www.bibletechnologies.net/osisCore.2.1.1.xsd">
+
+<osisText osisIDWork="KJV" osisRefWork="defaultReferenceScheme" xml:lang="en">
+
+<header>
+  <work osisWork="KJV">
+    <title>King James Version (1769) with Strongs Numbers and Morphology</title>
+    <identifier type="OSIS">Bible.KJV</identifier>
+    <scope>Gen-Rev</scope>
+    <refSystem>Bible.KJV</refSystem>
+  </work>
+  <work osisWork="defaultReferenceScheme">
+    <refSystem>Bible.KJV</refSystem>
+  </work>
+  <work osisWork="strong">
+    <refSystem>Dict.Strongs</refSystem>
+  </work>
+  <work osisWork="robinson">
+    <refSystem>Dict.Robinsons</refSystem>
+  </work>
+  <work osisWork="osmorph">
+    <refSystem>Dict.osmorph</refSystem>
+  </work>
+  <work osisWork="oslemma">
+    <refSystem>Dict.oslemma</refSystem>
+  </work>
+</header>
+<div type="bookGroup">
+ <title>Old Testament</title>
+ <div type="book" osisID="Gen">
+  <title type="main">THE FIRST BOOK OF MOSES CALLED GENESIS</title>
+  <div type="section">
+   <title>Introduction and Outline</title>
+    <p>
+     This is the <hi type="bold">Book of Genesis</hi>, the <hi type="italic">first</hi> book in the Bible. It may be outlined as follows:
+    </p>
+    <p>
+     <list>
+      <item><hi type="super">1</hi>Creation of Heaven and Earth, 1:1-2:4a</item>
+      <item><hi type="super">2</hi>Creation of Man and Woman, 2:4b-25</item>
+      <item><hi type="sub">3</hi>Fall, 3:1-24</item>
+      <item>...</item>
+     </list>
+    </p>
+    <p>
+     Tables work like this:
+     <table>
+      <row>
+       <cell><hi type="bold">Column 1 Label</hi></cell>
+       <cell><hi type="bold">Column 2 Label</hi></cell>
+      </row>
+      <row>
+       <cell>Column 1, Row 1</cell>
+       <cell>Column 2, Row 1</cell>
+      </row>
+      <row>
+       <cell>Column 1, Row 2</cell>
+       <cell>Column 2, Row 2</cell>
+      </row>
+     </table>
+    </p>
+  </div>
+  <chapter sID="Gen.1" osisID="Gen.1"/>
+   <div type="majorSection">
+    <title>From Creation to Abraham (1:1–11:9)</title>
+    <div type="section">
+     <title>Creation of the Heavens and the Earth</title>
+     <p>
+      <verse sID="Gen.1.1" osisID="Gen.1.1"/>
+       <w lemma="strong:H07225">In the beginning</w> 
+       <w lemma="strong:H0430">God</w> 
+       <w lemma="strong:H0853 strong:H01254">created</w> 
+       <w lemma="strong:H8064">the heaven</w> 
+       <w lemma="strong:H0853">and</w> 
+       <w lemma="strong:H0776">the earth</w>.
+      <verse eID="Gen.1.1"/>
+     </p>
+     <p>
+      <verse sID="Gen.1.2" osisID="Gen.1.2"/>Text of verse 2.<verse eID="Gen.1.2"/>
+      <verse sID="Gen.1.3" osisID="Gen.1.3"/>
+       Text of verse 3.
+       <note type="crossReference" n="a" osisID="Gen.1.3!crossReference.a" osisRef="Gen.1.3">
+       <reference osisRef="2Cor.4.6">2 Cor 4:6</reference>
+       </note>
+      <verse eID="Gen.1.3"/>
+      <verse sID="Gen.1.4" osisID="Gen.1.4"/>
+       And God saw the light, that 
+       <transChange type="added">it was</transChange> good: 
+       and God divided the light from the darkness.
+       <note type="study">the light from…: Heb. between the light and between the darkness</note>
+      <verse eID="Gen.1.4"/>
+      <verse sID="Gen.1.5" osisID="Gen.1.5"/>
+       <w lemma="oslemma:וְ oslemma:קרא" morph="osmorph:Cv osmorph:Vqi3ms" src="1 2">וַיִּקְרָ֨א</w>
+       <w lemma="oslemma:אֱלֹהִים" morph="osmorph:Ncmp">אֱלֹהִ֤ים</w>
+       <w lemma="oslemma:לְ oslemma:הַ oslemma:אֹור" morph="osmorph:R osmorph:Td osmorph:Ncms" src="1 2 3">לָאֹור֙</w>
+       <w lemma="oslemma:יֹום" morph="osmorph:Ncms">יֹ֔ום</w>
+       <w lemma="oslemma:וְ oslemma:לְ oslemma:הַ oslemma:חֹשֶׁכְ" morph="osmorph:Cc osmorph:R osmorph:Td osmorph:Ncms" src="1 2 3 4">וְלַחֹ֖שֶׁךְ</w>
+       <w lemma="oslemma:קרא" morph="osmorph:Vqp3ms">קָ֣רָא</w>
+       <w lemma="oslemma:לַיְלָה" morph="osmorph:Ncms">לָ֑יְלָה</w>
+       <w lemma="oslemma:וְ oslemma:היה" morph="osmorph:Cv osmorph:Vqi3ms" src="1 2">וַֽיְהִי־</w><w lemma="oslemma:עֶרֶב" morph="osmorph:Ncms">עֶ֥רֶב</w>
+       <w lemma="oslemma:וְ oslemma:היה" morph="osmorph:Cv osmorph:Vqi3ms" src="1 2">וַֽיְהִי־</w><w lemma="oslemma:בֹּקֶר" morph="osmorph:Ncms">בֹ֖קֶר</w>
+       <w lemma="oslemma:יֹום" morph="osmorph:Ncms">יֹ֥ום</w>
+       <w lemma="oslemma:אֶחָד" morph="osmorph:Acms">אֶחָֽד</w>׃
+       <w lemma="oslemma:פ" morph="osmorph:M">פ</w>
+      <verse eID="Gen.1.5"/>
+     </p>
+  <chapter eID="Gen.1"/>
+    </div>
+   </div>
+ </div>
+ <div type="book" osisID="Ps">
+  <title type="main">THE BOOK OF PSALMS</title>
+  <chapter sID="Ps.3" osisID="Ps.3"/>
+   <title type="chapter">PSALM 3.</title>
+   <div type="section">
+   <title type="psalm" canonical="true">A Psalm of David, when he fled from Absalom his son.</title>
+    <p>
+     <lg>
+      <verse sID="Ps.3.1" osisID="Ps.3.1"/>
+       <l level="1"><seg><divineName>Lord</divineName></seg>, how are they increased that trouble me!</l>
+       <l level="1">many <transChange type="added">are</transChange> they that rise up against me.</l>
+      <verse eID="Ps.3.1"/>
+      <verse sID="Ps.3.2" osisID="Ps.3.2"/>
+       <l level="1">Many <transChange type="added">there be</transChange> which say of my soul,</l>
+       <l level="1"><transChange type="added">There is</transChange> no help for him in God.</l>
+       <l type="selah">Selah.</l> 
+      <verse eID="Ps.3.2"/>
+      <verse sID="Ps.3.3" osisID="Ps.3.3"/>
+       
+      <verse eID="Ps.3.3"/>
+     </lg>
+    </p>
+   </div>
+  <chapter eID="Ps.3"/>
+ </div>
+</div>
+<div type="bookGroup">
+ <title>New Testament</title>
+ <div type="book" osisID="Mark">
+  <title type="main">THE GOSPEL ACCORDING TO <abbr expansion="Saint">ST.</abbr> MARK</title>
+  <chapter sID="Mark.1" osisID="Mark.1"/>
+   <div type="section">
+    <title>The Beginning of the Ministry of Jesus</title>
+    <title type="parallel">(<reference osisRef="Matt.4.12-Matt.4.22">Matt 4:12–22</reference>; 
+     <reference osisRef="Luke.4.14">Luke 4:14</reference>, <reference osisRef="Luke.4.15">15</reference>; 
+     <reference osisRef="Luke.5.1-Luke.5.11">5:1-11</reference>)
+    </title>
+    <p>
+     <verse sID="Mark.1.14" osisID="Mark.1.14"/>
+      <w src="2" lemma="strong:G1161" morph="robinson:CONJ">Now</w> 
+      <w src="1" lemma="strong:G3326" morph="robinson:PREP">after</w> that 
+      <w src="5 6" lemma="strong:G3588 strong:G2491" morph="robinson:T-ASM robinson:N-ASM">John</w> 
+      <w src="4" lemma="strong:G3860" morph="robinson:V-APN">was put in prison</w>, 
+      <w src="8 9" lemma="strong:G3588 strong:G2424" morph="robinson:T-NSM robinson:N-NSM">Jesus</w> 
+      <w src="7" lemma="strong:G2064" morph="robinson:V-2AAI-3S">came</w> 
+      <w src="10" lemma="strong:G1519" morph="robinson:PREP">into</w> 
+      <w src="11 12" lemma="strong:G3588 strong:G1056" morph="robinson:T-ASF robinson:N-ASF">Galilee</w>, 
+      <w src="13" lemma="strong:G2784" morph="robinson:V-PAP-NSM">preaching</w> 
+      <w src="14 15" lemma="strong:G3588 strong:G2098" morph="robinson:T-ASN robinson:N-ASN">the gospel</w> 
+      <w src="16 17" lemma="strong:G3588 strong:G932" morph="robinson:T-GSF robinson:N-GSF">of the kingdom</w> 
+      <w src="18 19" lemma="strong:G3588 strong:G2316" morph="robinson:T-GSM robinson:N-GSM">of God</w>,
+      <w src="3" lemma="strong:G3588" morph="robinson:T-ASN"></w>
+     <verse eID="Mark.1.14"/>
+     <verse sID="Mark.1.15" osisID="Mark.1.15"/>
+      And saying, 
+      <q who="Jesus">The time is fulfilled, and the kingdom of God is at hand: repent ye, and believe the <seg type="x-variant" subType="x-1">gospel</seg>
+<seg type="x-variant" subType="x-2">good news</seg>.</q>
+     <verse eID="Mark.1.15"/>
+    </p>
+   </div>
+  <chapter eID="Mark.1"/>
+ </div>
+</div>
+</osisText>
+</osis>




More information about the sword-cvs mailing list