<div>Hi</div><div><br></div><div>I have a question around the <i>seg </i>element in OSIS. Versions like the WLC have separated each part of the word as a seg (see below). And then separates the words (sets of segs) with spaces.</div>
<div><br></div><div>&lt;div&gt;&lt;title type=&quot;x-gen&quot;&gt;Genesis 1:1&lt;/title&gt;&lt;verse osisID=&quot;Gen.1.1&quot;&gt;&lt;seg type=&quot;x-morph&quot;&gt;בְּ&lt;/seg&gt;&lt;seg type=&quot;x-morph&quot;&gt;רֵאשִׁ֖ית&lt;/seg&gt; &lt;seg type=&quot;x-morph&quot;&gt;בָּרָ֣א&lt;/seg&gt; &lt;seg type=&quot;x-morph&quot;&gt;אֱלֹהִ֑ים&lt;/seg&gt; &lt;seg type=&quot;x-morph&quot;&gt;אֵ֥ת&lt;/seg&gt; &lt;seg type=&quot;x-morph&quot;&gt;הַ&lt;/seg&gt;&lt;seg type=&quot;x-morph&quot;&gt;שָּׁמַ֖יִם&lt;/seg&gt; &lt;seg type=&quot;x-morph&quot;&gt;וְ&lt;/seg&gt;&lt;seg type=&quot;x-morph&quot;&gt;אֵ֥ת&lt;/seg&gt; &lt;seg type=&quot;x-morph&quot;&gt;הָ&lt;/seg&gt;&lt;seg type=&quot;x-morph&quot;&gt;אָֽרֶץ׃&lt;/seg&gt; &lt;/verse&gt;&lt;/div&gt;</div>
<div><br></div><div>The JSword compare functionality (and indexing) uses OSISUtil.getCanonicalText(). This seems to add spaces between the seg elements which then makes for inconsistent results in the diffing (extra differences). The following comment is seen in the method:</div>
<div><div> // make sure that adjacent text elements are separated by whitespace</div><div>// TODO(dms): verify that the xml parser does not split words containing entities.</div></div><div><br></div><div>Presumably, we want to add an exception for <i>seg</i> elements. I assume indexing/searching is also going to be affected by this problem...</div>
<div><br></div><div>My question is whether to add a new block in the instanceof Element part. Or in the instanceof Text part? </div><div>Also, are there any other times ever where we want additional spaces between segs? Any other gotchas?</div>
<div><br></div><div>(see below for JSword function)</div><div>Cheers</div><div>Chris</div><div><br></div><div>Copy of the function in JSword:</div><div><br></div><div><div><b>public static String getCanonicalText(Element root) {</b></div>
<div>        StringBuilder buffer = new StringBuilder();</div><div><br></div><div>        // Dig past osis, osisText, if present, to get to the real content.</div><div>        List&lt;Content&gt; frag = OSISUtil.getFragment(root);</div>
<div><br></div><div>        Iterator&lt;Content&gt; dit = frag.iterator();</div><div>        String sID = null;</div><div>        Content data = null;</div><div>        Element ele = null;</div><div>        while (dit.hasNext()) {</div>
<div>            data = dit.next();</div><div>            if (data instanceof Element) {</div><div>                ele = (Element) data;</div><div>                if (!isCanonical(ele)) {</div><div>                    continue;</div>
<div>                }</div><div><br></div><div>                if (ele.getName().equals(OSISUtil.OSIS_ELEMENT_VERSE)) {</div><div>                    sID = ele.getAttributeValue(OSISUtil.OSIS_ATTR_SID);</div><div>                }</div>
<div><br></div><div>                if (sID != null) {</div><div>                    getCanonicalContent(ele, sID, dit, buffer);</div><div>                } else {</div><div>                    getCanonicalContent(ele, null, ele.getContent().iterator(), buffer);</div>
<div>                }</div><div>            } else if (data instanceof Text) {</div><div>                // make sure that adjacent text elements are separated by</div><div>                // whitespace</div><div>                // TODO(dms): verify that the xml parser does not split words</div>
<div>                // containing entities.</div><div>                int lastIndex = buffer.length() - 1;</div><div>                String text = ((Text) data).getText();</div><div>                // Ignore empty text nodes.</div>
<div>                if (text.length() != 0) {</div><div>                    if (lastIndex &gt;= 0 &amp;&amp; !Character.isWhitespace(buffer.charAt(lastIndex)) &amp;&amp; !Character.isWhitespace(text.charAt(0))) {</div><div>
                        buffer.append(&#39; &#39;);</div><div>                    }</div><div>                    buffer.append(text);</div><div>                }</div><div>            }</div><div>        }</div><div><br>
</div><div>        return buffer.toString().trim();</div><div>    }</div></div><div><br></div><div><br></div><div>Cheers</div><div>Chris</div><div><br></div>