[sword-devel] proposed patch: adding n=X marker content to footnotes and xrefs

DM Smith dmsmith at crosswire.org
Sat Feb 4 13:47:37 MST 2012


I've always thought that the value of the n attribute should be used if it were there. 

Cent from my fone so theer mite be tipos. ;)

On Feb 4, 2012, at 1:34 PM, Karl Kleinpaste <karl at kleinpaste.org> wrote:

> Quite a while ago, Xiphos gained the capability to post-process the
> *n/*x that come out of the engine so as to add the n=X identifiers that
> emanate out of OSIS and ThML markup.  This is a fine and welcome idea,
> but we have run into a problem.
> 
> Some modules have single-section content that is really big.  I mean,
> *really* big, half a megabyte at a time Really Big.  Notably,
> EarlyFathers' /NPNF109/Subject_Index is my current problem child and
> proof case.
> 
> The problem presented by a post-processing step of this sort is that,
> having the content in hand, we now need to make 2 calls to
> getEntryAttributes() in order to retrieve both "n" and "type" elements.
> 
> Evidently, each such call requires that the engine retrieve original
> content from disc, and fully parse it out.  Ouchie.
> 
> /NPNF109/Subject_Index has almost 2500 footnotes in its 480Kbytes.
> 
> Ergo, 5000 retrievals times 480Kbytes apiece = ...
> 
> Ow.  Ow ow ow ow ow.
> 
> Some rough timing when I discovered this problem earlier this week
> showed that it would take -- I am not exaggerating -- just short of an
> hour to render this section, on the rather beastly machine I now use.
> 95+% of the time is being spent in the engine's retrieval; virtually no
> time is spent in the g_string routines that perform the actual textual
> appendage.
> 
> So although the post-processing effect is a good one, being implemented
> *as* a post-processing step is a disaster.  I had never noticed this
> downside until I ran into these pathological cases this week.  The Right
> Way to do this is for the filters to output the n=X content on the spot.
> 
> The attached patch provides this for all htmlhref and xhtml filters.
> I'd like to apply this (I'll do it myself, I have privs) but I wanted to
> make sure that adding this doesn't harm anyone else.  It's a
> straightforward, simple change, and you can see the effect in a couple
> screenshots:
> http://karl.kleinpaste.org/xiphos/notes-xrefs-NASB.png
> http://karl.kleinpaste.org/xiphos/notes-xrefs-NET.png
> 
> Please review and provide feedback.  I'll commit the patch in a day or
> three if no one objects.
> 
> --karl
> 
> Index: src/modules/filters/thmlxhtml.cpp =================================================================== --- src/modules/filters/thmlxhtml.cpp	(revision 2675) +++ src/modules/filters/thmlxhtml.cpp	(working copy) @@ -208,6 +208,7 @@ if (!tag.isEmpty()) { SWBuf type = tag.getAttribute("type"); SWBuf footnoteNumber = tag.getAttribute("swordFootnote"); +	 SWBuf noteName = tag.getAttribute("n"); VerseKey *vkey = NULL; // see if we have a VerseKey * or descendant SWTRY { @@ -217,23 +218,25 @@ if (vkey) { // leave this special osis type in for crossReference notes types? Might thml use this some day? Doesn't hurt. char ch = ((tag.getAttribute("type") && ((!strcmp(tag.getAttribute("type"), "crossReference")) || (!strcmp(tag.getAttribute("type"), "x-cross-ref")))) ? 'x':'n'); - buf.appendFormatted("*%c", + buf.appendFormatted("*%c%s", ch, URL::encode(footnoteNumber.c_str()).c_str(), URL::encode(u->version.c_str()).c_str(), URL::encode(vkey->getText()).c_str(), ch, -	 ch); +	 ch, + URL::encode(noteName.c_str()).c_str()); } else { char ch = ((tag.getAttribute("type") && ((!strcmp(tag.getAttribute("type"), "crossReference")) || (!strcmp(tag.getAttribute("type"), "x-cross-ref")))) ? 'x':'n'); - buf.appendFormatted("*%c", + buf.appendFormatted("*%c%s", ch, URL::encode(footnoteNumber.c_str()).c_str(), URL::encode(u->version.c_str()).c_str(), URL::encode(u->key->getText()).c_str(), ch, -	 ch); +	 ch, + URL::encode(noteName.c_str()).c_str()); } u->suspendTextPassThru = true; } @@ -267,6 +270,7 @@ }  				else { SWBuf footnoteNumber = u->startTag.getAttribute("swordFootnote"); +	 SWBuf noteName = tag.getAttribute("n"); VerseKey *vkey = NULL;  					// see if we have a VerseKey * or descendant SWTRY { @@ -276,11 +280,11 @@ if (vkey) { // leave this special osis type in for crossReference notes types? Might thml use this some day? Doesn't hurt. //buf.appendFormatted("*x ", vkey->getText(), footnoteNumber.c_str()); - buf.appendFormatted("*x", +	 buf.appendFormatted("*x%s",  							URL::encode(footnoteNumber.c_str()).c_str(), URL::encode(u->version.c_str()).c_str(), - URL::encode(vkey->getText()).c_str()); -	 + URL::encode(vkey->getText()).c_str(), + URL::encode(noteName.c_str()).c_str()); } } Index: src/modules/filters/gbfhtmlhref.cpp =================================================================== --- src/modules/filters/gbfhtmlhref.cpp	(revision 2675) +++ src/modules/filters/gbfhtmlhref.cpp	(working copy) @@ -231,6 +231,7 @@ else if (!strcmp(tag.getName(), "RF")) { SWBuf type = tag.getAttribute("type"); SWBuf footnoteNumber = tag.getAttribute("swordFootnote"); + SWBuf noteName = tag.getAttribute("n"); VerseKey *vkey = NULL; // see if we have a VerseKey * or descendant SWTRY { @@ -240,10 +241,11 @@ if (vkey) { // leave this special osis type in for crossReference notes types? Might thml use this some day? Doesn't hurt. //char ch = ((tag.getAttribute("type") && ((!strcmp(tag.getAttribute("type"), "crossReference")) || (!strcmp(tag.getAttribute("type"), "x-cross-ref")))) ? 'x':'n'); - buf.appendFormatted("*n ", +	 buf.appendFormatted("*n%s ", URL::encode(footnoteNumber.c_str()).c_str(), URL::encode(u->version.c_str()).c_str(), - URL::encode(vkey->getText()).c_str()); + URL::encode(vkey->getText()).c_str(), + URL::encode(noteName.c_str()).c_str()); } u->suspendTextPassThru = true; } Index: src/modules/filters/osisxhtml.cpp =================================================================== --- src/modules/filters/osisxhtml.cpp	(revision 2675) +++ src/modules/filters/osisxhtml.cpp	(working copy) @@ -252,6 +252,7 @@ if (!strongsMarkup) {	// leave strong's markup notes out, in the future we'll probably have different option filters to turn different note types on or off SWBuf footnoteNumber = tag.getAttribute("swordFootnote"); + SWBuf noteName = tag.getAttribute("n"); VerseKey *vkey = NULL; char ch = ((tag.getAttribute("type") && ((!strcmp(tag.getAttribute("type"), "crossReference")) || (!strcmp(tag.getAttribute("type"), "x-cross-ref")))) ? 'x':'n'); @@ -265,22 +266,24 @@ SWCATCH ( ... ) {	} if (vkey) { //printf("URL = %s\n",URL::encode(vkey->getText()).c_str()); -	 buf.appendFormatted("*%c", + buf.appendFormatted("*%c%s", ch, URL::encode(footnoteNumber.c_str()).c_str(), URL::encode(u->version.c_str()).c_str(), URL::encode(vkey->getText()).c_str(), ch, -	 ch); +	 ch, + URL::encode(noteName.c_str()).c_str()); } else { - buf.appendFormatted("*%c", + buf.appendFormatted("*%c%s", ch, URL::encode(footnoteNumber.c_str()).c_str(), URL::encode(u->version.c_str()).c_str(), URL::encode(u->key->getText()).c_str(), ch, -	 ch); +	 ch, + URL::encode(noteName.c_str()).c_str()); } } } Index: src/modules/filters/osishtmlhref.cpp =================================================================== --- src/modules/filters/osishtmlhref.cpp	(revision 2675) +++ src/modules/filters/osishtmlhref.cpp	(working copy) @@ -240,6 +240,7 @@ if (!strongsMarkup) {	// leave strong's markup notes out, in the future we'll probably have different option filters to turn different note types on or off SWBuf footnoteNumber = tag.getAttribute("swordFootnote"); + SWBuf noteName = tag.getAttribute("n"); VerseKey *vkey = NULL; char ch = ((tag.getAttribute("type") && ((!strcmp(tag.getAttribute("type"), "crossReference")) || (!strcmp(tag.getAttribute("type"), "x-cross-ref")))) ? 'x':'n'); @@ -253,22 +254,24 @@ SWCATCH ( ... ) {	} if (vkey) { //printf("URL = %s\n",URL::encode(vkey->getText()).c_str()); -	 buf.appendFormatted("*%c", + buf.appendFormatted("*%c%s", ch, URL::encode(footnoteNumber.c_str()).c_str(), URL::encode(u->version.c_str()).c_str(), URL::encode(vkey->getText()).c_str(), ch, -	 ch); +	 ch, + URL::encode(noteName.c_str()).c_str()); } else { - buf.appendFormatted("*%c", + buf.appendFormatted("*%c%s", ch, URL::encode(footnoteNumber.c_str()).c_str(), URL::encode(u->version.c_str()).c_str(), URL::encode(u->key->getText()).c_str(), ch, -	 ch); +	 ch, + URL::encode(noteName.c_str()).c_str()); } } } Index: src/modules/filters/gbfxhtml.cpp =================================================================== --- src/modules/filters/gbfxhtml.cpp	(revision 2675) +++ src/modules/filters/gbfxhtml.cpp	(working copy) @@ -168,6 +168,7 @@ else if (!strcmp(tag.getName(), "RF")) { SWBuf type = tag.getAttribute("type"); SWBuf footnoteNumber = tag.getAttribute("swordFootnote"); +	 SWBuf noteName = tag.getAttribute("n"); VerseKey *vkey = NULL; // see if we have a VerseKey * or descendant SWTRY { @@ -177,10 +178,11 @@ if (vkey) { // leave this special osis type in for crossReference notes types? Might thml use this some day? Doesn't hurt. //char ch = ((tag.getAttribute("type") && ((!strcmp(tag.getAttribute("type"), "crossReference")) || (!strcmp(tag.getAttribute("type"), "x-cross-ref")))) ? 'x':'n'); - buf.appendFormatted("*n ", +	 buf.appendFormatted("*n%s ", URL::encode(footnoteNumber.c_str()).c_str(), URL::encode(u->version.c_str()).c_str(), - URL::encode(vkey->getText()).c_str()); + URL::encode(vkey->getText()).c_str(), + URL::encode(noteName.c_str()).c_str()); } u->suspendTextPassThru = true; } Index: src/modules/filters/thmlhtmlhref.cpp =================================================================== --- src/modules/filters/thmlhtmlhref.cpp	(revision 2675) +++ src/modules/filters/thmlhtmlhref.cpp	(working copy) @@ -206,6 +206,7 @@ if (!tag.isEmpty()) { SWBuf type = tag.getAttribute("type"); SWBuf footnoteNumber = tag.getAttribute("swordFootnote"); +	 SWBuf noteName = tag.getAttribute("n"); VerseKey *vkey = NULL; // see if we have a VerseKey * or descendant SWTRY { @@ -215,23 +216,25 @@ if (vkey) { // leave this special osis type in for crossReference notes types? Might thml use this some day? Doesn't hurt. char ch = ((tag.getAttribute("type") && ((!strcmp(tag.getAttribute("type"), "crossReference")) || (!strcmp(tag.getAttribute("type"), "x-cross-ref")))) ? 'x':'n'); - buf.appendFormatted("*%c", + buf.appendFormatted("*%c%s", ch, URL::encode(footnoteNumber.c_str()).c_str(), URL::encode(u->version.c_str()).c_str(), URL::encode(vkey->getText()).c_str(), ch, -	 ch); +	 ch, + URL::encode(noteName.c_str()).c_str()); } else { char ch = ((tag.getAttribute("type") && ((!strcmp(tag.getAttribute("type"), "crossReference")) || (!strcmp(tag.getAttribute("type"), "x-cross-ref")))) ? 'x':'n'); - buf.appendFormatted("*%c", + buf.appendFormatted("*%c%s", ch, URL::encode(footnoteNumber.c_str()).c_str(), URL::encode(u->version.c_str()).c_str(), URL::encode(u->key->getText()).c_str(), ch, -	 ch); +	 ch, + URL::encode(noteName.c_str()).c_str()); } u->suspendTextPassThru = true; } @@ -265,6 +268,7 @@ }  				else { SWBuf footnoteNumber = u->startTag.getAttribute("swordFootnote"); +	 SWBuf noteName = tag.getAttribute("n"); VerseKey *vkey = NULL;  					// see if we have a VerseKey * or descendant SWTRY { @@ -274,11 +278,11 @@ if (vkey) { // leave this special osis type in for crossReference notes types? Might thml use this some day? Doesn't hurt. //buf.appendFormatted("*x ", vkey->getText(), footnoteNumber.c_str()); - buf.appendFormatted("*x", +	 buf.appendFormatted("*x%s",  							URL::encode(footnoteNumber.c_str()).c_str(), URL::encode(u->version.c_str()).c_str(), - URL::encode(vkey->getText()).c_str()); -	 + URL::encode(vkey->getText()).c_str(), + URL::encode(noteName.c_str()).c_str()); } } Index: src/modules/filters/teihtmlhref.cpp =================================================================== --- src/modules/filters/teihtmlhref.cpp	(revision 2675) +++ src/modules/filters/teihtmlhref.cpp	(working copy) @@ -259,11 +259,13 @@ } if (tag.isEndTag()) { SWBuf footnoteNumber = tag.getAttribute("swordFootnote"); + SWBuf noteName = tag.getAttribute("n"); - buf.appendFormatted("*n", +	 buf.appendFormatted("*n%s",  					URL::encode(footnoteNumber.c_str()).c_str(), URL::encode(u->version.c_str()).c_str(), -	 URL::encode(u->key->getText()).c_str()); +	 URL::encode(u->key->getText()).c_str(), + URL::encode(noteName.c_str()).c_str()); u->suspendTextPassThru = false; }
> _______________________________________________
> sword-devel mailing list: sword-devel at crosswire.org
> http://www.crosswire.org/mailman/listinfo/sword-devel
> Instructions to unsubscribe/change your settings at above page
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.crosswire.org/pipermail/sword-devel/attachments/20120204/2675d80b/attachment-0001.html>


More information about the sword-devel mailing list