<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<p>Hi Troy,</p>
<p>Thanks once more for all the details! I appreciate it.<br>
<br>
I just grepped quickly in the SWORD source code (grep -r
"upperUTF8" . | grep -v ".svn") and the method upperUTF8 appears
to be only used in the following places:<br>
<br>
<tt>./src/keys/versekey.cpp:
stringMgr->upperUTF8(abbr, (unsigned int)(strlen(abbr)*2));</tt><tt><br>
</tt><tt>./src/keys/versekey.cpp:
stringMgr->upperUTF8(abbr, (unsigned int)(strlen(abbr)*2));</tt><tt><br>
</tt><tt>./utilities/imp2gbs.cpp:
StringMgr::getSystemStringMgr()->upperUTF8(keyBuffer.getRawData(),
size-2);</tt></p>
<p>I think neither of those is currently used in Ezra Project,
though. At the moment I do not have the use case to parse verse
keys based on any special Unicode inputs. I am only using the
standard English abbreviations for verse keys and that only
happens internally. So, in this case I may just process the
locales.d files directly in node.js / JavaScript.<br>
<br>
Regarding node-sword-interface and the build process for mobile
platforms ... currently I have only tried Android, which works
fine. iOS should technically work as well, but I have not tried
that yet. The boiler plate work to make all that happen smoothly
is provided by the <a moz-do-not-send="true"
href="https://code.janeasystems.com/nodejs-mobile">nodejs-mobile</a>
cordova plugin. That plugin contains build scripts that seemlessly
compile any native node.js addons like node-sword-interface or
also the sqlite3 module that I am using.<br>
<br>
And since I am now using an API compatible runtime environment
both for Electron/nodejs and Cordova/nodejs-mobile I did not have
to add any additional glue code. One risk I see with this approach
is that the guys who provide nodejs-mobile discontinue their work
for some reason. It's essentially a completely separately
maintained fork of nodejs (it has nothing to do with V8 actually).
Originally it is based on the ChakraCore JavaScript engine of the
Microsoft Edge browser. But the nodejs-mobile guys ported it to
Android and iOS ...<br>
<br>
Regarding the StringMgr native callback possibility ... yes
technically this is possible with a node native addon like
node-sword-interface.<br>
I am using such a functionality for the InstallMgr and search
progress feedbacks already.<br>
<br>
So, long story short ... if in the future a usecase comes up to
parse Unicode-based VerseKeys, I will implement a special
StringMgr binding as you suggested. But for now I'll focus on
handling the locales.d content directly in JavaScript / node.js.<br>
<br>
I will keep you posted.<br>
<br>
Best regards,<br>
Tobias<br>
<br>
</p>
<div class="moz-cite-prefix">On 2/6/21 11:59 PM, Troy A. Griffitts
wrote:<br>
</div>
<blockquote type="cite"
cite="mid:a580b744-b15b-3bb6-fb90-12cf32169833@crosswire.org">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<p>The data is pulled from the locales.d/ files, but the toUpper
logic is necessary in a number of places in the engine. Two come
to mind immediately:<br>
</p>
<p>parsing verse references not sensitive to case</p>
<p>parsing LD module keys not sensitive to case<br>
</p>
<p>To be able to get an uppercase representation of any Unicode
character, it takes a pretty hefty dataset of all known human
languages-- that's why we leave it up to an external library.
And yeah, because ICU is so large, that's why I don't compile it
into my binaries in Bishop. Bishop is about 13MB total, which
includes ~8MB of default module data (KJV, SME, StrongsGreek,
StrongsHebrew). That's about 5MB for the app. If I included
ICU, it would greatly increase the size. And both iOS and
Android (Swift and Java) already have facilities for getting the
toUpper of a string.</p>
<p>I hope you can steal the few lines from Bishop's native SWORD
code which tells SWORD to call either Java or Swift when
toUpperUTF is called.</p>
<p>I am sorry that this might break the nice ability to have
exactly the same code on both iOS and Android (I am surprised
that absolutely no changes were required for you to interface to
a native library on both iOS and Android! cordova required me
to provide: Android: Java-jni layer; iOS: Swift layer. I am
jealous.)</p>
<p>If you can think of an alternative, I am happy to listen. We
could provide a better StringMgr default (I think we simply have
a latin-1 single byte tranformation table for basically ASCII
characters), which includes an SW_u32 hash which included German
characters, but that's going to limit the languages we support
to only the ones we add to our toUpper hash, and that's not
really a dataset I want to maintain.</p>
<p>Open to suggestions,</p>
<p>Troy<br>
</p>
<p><br>
</p>
<div class="moz-cite-prefix">On 2/6/21 2:56 PM, Tobias Klein
wrote:<br>
</div>
<blockquote type="cite"
cite="mid:E1l8VZ9-0003St-CW@smtprelay03.ispgateway.de">
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<meta name="Generator" content="Microsoft Word 15 (filtered
medium)">
<style>@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}pre
{mso-style-priority:99;
mso-style-link:"HTML Preformatted Char";
margin:0cm;
font-size:10.0pt;
font-family:"Courier New";}span.HTMLPreformattedChar
{mso-style-name:"HTML Preformatted Char";
mso-style-priority:99;
mso-style-link:"HTML Preformatted";
font-family:"Courier New";}.MsoChpDefault
{mso-style-type:export-only;}div.WordSection1
{page:WordSection1;}</style>
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US">Dear Troy,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Thank you for these
explanations! I appreciate it!<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">For Ezra Project on
Android, I am at this point simply compiling
node-sword-interface with the Android cross compilers and
it works. However, as I wrote, I have issues for the
German Bible book names now.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Is the StringMgr
functionality only used to handle the locales.d files? Or
also for some content inside any SWORD modules?<br>
<br>
<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">If it is only used for
handling the locales.d files then I would consider
handling the Sword locales.d files directly from
JavaScript / node.js, which already supports Unicode.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">I also checked whether
I can cross-compile the ICU library and that worked, but
this is a huge binary (I think 20-30 MB) and I would
rather keep the APK size as small as possible.<br>
<br>
Best regards,<br>
Tobias</span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div
style="mso-element:para-border-div;border:none;border-top:solid
#E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal" style="border:none;padding:0cm"><b>From:
</b><a href="mailto:scribe@crosswire.org"
moz-do-not-send="true">Troy A. Griffitts</a><br>
<b>Sent: </b>Sonntag, 31. Januar 2021 18:20<br>
<b>To: </b><a href="mailto:sword-devel@crosswire.org"
moz-do-not-send="true">sword-devel@crosswire.org</a><br>
<b>Subject: </b>Re: [sword-devel] Sword Locales / German
Umlaut Issues / AndroidBuild</p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p>Dear Tobias,</p>
<p>My apologies for taking so long to respond to this, but I
wanted to give a thorough answer. See the summary at the
end if you don't care about the details.</p>
<p>So, SWORD has a class StringMgr, which manages strings
within SWORD, and by default SWORD includes a very basic
implementation, which doesn't necessarily know about or
support anything beyond what the basic C string methods
support.</p>
<p>I am sure this invokes a sense of horror from you at first,
so let me explain a bit how we properly handle character
sets. First, short background: since we existed well before
the Unicode world, we have multiple locale files for each
language, which you will still see in the locales.d/ folder,
each specifying their character encoding, and most of the
time SWORD doesn't need to manipulate characters, so simply
holding data, and passing that data to a display frontend,
and specifying a font which will handle that encoding was
enough in the old world. IMPORTANT: the one place we do
need to manipulate character data is to perform
case-insensitive comparisons. We did this in the past by
converting a string to uppercase before comparison. You'll
notice this in the section for Bible book abbreviation in
each locale-- the partial match key must be in a toupper
state.</p>
<p>Today, everything in SWORD prefers Unicode and
specifically, encoded as UTF-8. To support this:</p>
<p>First, we have utility functions within SWORD for working
with Unicode encoded strings, see:</p>
<p><a
href="http://crosswire.org/svn/sword/trunk/include/utilstr.h"
moz-do-not-send="true">http://crosswire.org/svn/sword/trunk/include/utilstr.h</a></p>
<p>Specifically:</p>
<pre>SWBuf assureValidUTF8(const char *buf);</pre>
<pre>SW_u32 getUniCharFromUTF8(const unsigned char **buf, bool skipValidation = false);</pre>
<pre>SWBuf *getUTF8FromUniChar(SW_u32 uchar, SWBuf *appendTo);</pre>
<pre>SWBuf utf8ToWChar(const char *buf);</pre>
<pre>SWBuf wcharToUTF8(const wchar_t *buf);</pre>
<pre><o:p> </o:p></pre>
<pre><o:p> </o:p></pre>
<p>To wrap this up, by subclassing StringMgr, SWORD supports
implementing character encoding by linking to other
libraries, e.g., ICU, Qt, etc. to handle full Unicode
support. And while the StringMgr interface allow
implementation of many string functions, upperUTF8 is the
only real method the SWORD engine needs to work completely.
Some utilities use the other methods in there, but the
engine, only needs this method.</p>
<p><o:p> </o:p></p>
<p>In summary, on Android, you are likely not linking to ICU
when you build the native SWORD binary-- which I don't do
either for Bishop. The Cordova SWORD plugin uses the SWORD
java-jni bindings, which use the Java VM to implement
StringMgr:</p>
<p><a
href="https://crosswire.org/svn/sword/trunk/bindings/java-jni/jni/swordstub.cpp"
moz-do-not-send="true">https://crosswire.org/svn/sword/trunk/bindings/java-jni/jni/swordstub.cpp</a>
Search for: AndroidStringMgr</p>
<p>And on iOS the Cordova plugin uses the Swift libraries to
do the same. This is done by using the SWORD flatapi call
to org_crosswire_sword_StringMgr_setToUpper to provide a
Swift implementation to uppercase a string. </p>
<p><a
href="http://crosswire.org/svn/sword/trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ios/SWORD.swift"
moz-do-not-send="true">http://crosswire.org/svn/sword/trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ios/SWORD.swift</a></p>
<p>I hope this give you the information you need to get things
working for you. Please don't hesitate to ask if you need
help,</p>
<p>Troy</p>
<p><o:p> </o:p></p>
<div>
<p class="MsoNormal">On 1/17/21 11:59 AM, Tobias Klein
wrote:<o:p></o:p></p>
</div>
<p class="MsoNormal"
style="mso-margin-top-alt:5.0pt;margin-right:36.0pt;margin-bottom:5.0pt;margin-left:36.0pt">Dear
Troy, <br>
<br>
I'm playing with an Android Build of Sword and I get issues
with the German Umlauts. <br>
<br>
So I have issues with Bible book names like Römer, Könige,
etc. <br>
<br>
The Umlauts are shown as ?. <br>
<br>
I'm configuring the SWORD build with CMake like below
(without ICU!) <br>
<br>
I remember having similar issues on Linux when building
without ICU. <br>
<br>
How do you build SWORD for Bishop? Any suggestions? <br>
<br>
Best regards, <br>
Tobias <br>
<br>
-- Check for working CXX compiler:
/opt/Android/SDK/ndk/r21b/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++<br>
-- Check for working CXX compiler:
/opt/Android/SDK/ndk/r21b/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++
-- works <br>
-- Detecting CXX compiler ABI info <br>
-- Detecting CXX compiler ABI info - done <br>
-- Detecting CXX compile features <br>
-- Detecting CXX compile features - done <br>
-- Check for working C compiler:
/opt/Android/SDK/ndk/r21b/toolchains/llvm/prebuilt/linux-x86_64/bin/clang<br>
-- Check for working C compiler:
/opt/Android/SDK/ndk/r21b/toolchains/llvm/prebuilt/linux-x86_64/bin/clang
-- works <br>
-- Detecting C compiler ABI info <br>
-- Detecting C compiler ABI info - done <br>
-- Detecting C compile features <br>
-- Detecting C compile features - done <br>
-- Configuring your system to build libsword. <br>
-- SWORD Version 1008900000 <o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<pre class="moz-quote-pre" wrap="">_______________________________________________
sword-devel mailing list: <a class="moz-txt-link-abbreviated" href="mailto:sword-devel@crosswire.org" moz-do-not-send="true">sword-devel@crosswire.org</a>
<a class="moz-txt-link-freetext" href="http://crosswire.org/mailman/listinfo/sword-devel" moz-do-not-send="true">http://crosswire.org/mailman/listinfo/sword-devel</a>
Instructions to unsubscribe/change your settings at above page</pre>
</blockquote>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<pre class="moz-quote-pre" wrap="">_______________________________________________
sword-devel mailing list: <a class="moz-txt-link-abbreviated" href="mailto:sword-devel@crosswire.org">sword-devel@crosswire.org</a>
<a class="moz-txt-link-freetext" href="http://crosswire.org/mailman/listinfo/sword-devel">http://crosswire.org/mailman/listinfo/sword-devel</a>
Instructions to unsubscribe/change your settings at above page</pre>
</blockquote>
</body>
</html>