[sword-cvs] swordtools/modules/hebrew-wlc/WLC2OSIS/WLC2OSIS/Translate BookName.java, NONE, 1.1 H.java, NONE, 1.1 Header.java, NONE, 1.1 Index.java, NONE, 1.1 MC.java, NONE, 1.1 MCO.java, NONE, 1.1 Note.java, NONE, 1.1 Translate.java, NONE, 1.1 UnicodeChar.java, NONE, 1.1 WKQ.java, NONE, 1.1 package.html, NONE, 1.1

sword at www.crosswire.org sword at www.crosswire.org
Fri Jun 4 02:14:54 MST 2004


Committed by: mgruner

Update of /cvs/core/swordtools/modules/hebrew-wlc/WLC2OSIS/WLC2OSIS/Translate
In directory www:/tmp/cvs-serv15120/modules/hebrew-wlc/WLC2OSIS/WLC2OSIS/Translate

Added Files:
	BookName.java H.java Header.java Index.java MC.java MCO.java 
	Note.java Translate.java UnicodeChar.java WKQ.java 
	package.html 
Log Message:
initial import of source files for the new BHS-replacement WLC (Westminster Leningrad Codex).
Not functional yet at all.

--- NEW FILE: BookName.java ---
package WLC2OSIS.Translate ;

import WLC2OSIS.* ;
import WLC2OSIS.Translate.* ;
import Utilities.* ;

import java.io.*;
//==============================================================================
/**
 *  <b>Object containing alternative book names, abbreviations, 
 *     and numbers.</b><p>
 *
 *  Special to WLC.
 */
//==============================================================================
public class BookName{

public int wlcnumber = 0 ;      // Book number in WLC text.
public String wlcname = ""  ;   // Book name in WLC text.

public int number = 0 ;         // Book number in JPS Tanach.
public String name = "" ;       // Book name in JPS Tanach.
public String abbrev = ""  ;    // Book abreviation in NSRV.
public String filename  = "" ;  // Book filename
public String hebrewname = "" ;

//-----------------------------------------------------------------------------

// Full definition

public BookName( int wlcnumber, String wlcname, 
             int number, String name, String abbrev,  
             String hebrewname, String filename ) {
    this.wlcnumber = wlcnumber ;
    this.wlcname = wlcname ;
    this.number = number ;
    this.name = name ;
    this.abbrev = abbrev ;
    this.hebrewname = hebrewname ;
    this.filename = filename ;
    }
//-----------------------------------------------------------------------------

// Definition for books that have names that are valid filenames.
// Their filenames are their abbrev.

public BookName( int wlcnumber, String wlcname, 
             int number, String name, String abbrev, String hebrewname ) {
    this(wlcnumber, wlcname, number, name, abbrev,
        hebrewname, name ) ;
    }
//-----------------------------------------------------------------------------

// Provides an array of BookNames

public static BookName[] setBookNames() {
    BookName[] BookNames = new BookName[40] ;
    
    BookNames[ 1] = new BookName(1, "gn", 
                                 1, "Genesis", "Gen", H.Gen ) ;
    BookNames[ 2] = new BookName(2, "ex", 
                                 2, "Exodus", "Ex", H.Exod) ;
    BookNames[ 3] = new BookName(3, "lv", 
                                 3, "Leviticus", "Lev", H.Lev) ;
    BookNames[ 4] = new BookName(4, "nu", 
                                 4, "Numbers", "Num", H.Num) ;
    BookNames[ 5] = new BookName(5, "dt", 
                                 5, "Deuteronomy", "Deut", H.Deut) ;

    BookNames[ 6] = new BookName(6, "js", 
                                 6, "Joshua", "Josh", H.Josh) ;
    BookNames[ 7] = new BookName(7, "ju",  
                                 7, "Judges", "Judg", H.Judg) ;
    BookNames[ 8] = new BookName(8, "1s", 
                                 8, "1 Samuel", "1 Sam", H.Sam1, "Samuel 1") ;
    BookNames[ 9] = new BookName(9, "2s",  
                                 9, "2 Samuel", "2 Sam", H.Sam2, "Samuel 2") ;
    BookNames[10] = new BookName(10, "1k", 
                                 10, "1 Kings", "1 Kings", H.Kgs1, "Kings 1") ;
    BookNames[11] = new BookName(11, "2k", 
                                 11, "2 Kings", "2 Kings", H.Kgs2, "Kings 2") ;
    BookNames[12] = new BookName(12, "is", 
                                 12, "Isaiah", "Isa", H.Isa) ;
    BookNames[13] = new BookName(13, "je", 
                                 13, "Jeremiah", "Jer", H.Jer) ;
    BookNames[14] = new BookName(14, "ek", 
                                 14, "Ezekiel", "Ezek", H.Ezek) ;
    
    BookNames[15] = new BookName(15, "ho",
                                 15, "Hosea", "Hos", H.Hos) ;
    BookNames[16] = new BookName(16, "jl",  
                                 16, "Joel", "Joel", H.Joel) ;
    BookNames[17] = new BookName(17, "am",  
                                 17, "Amos", "Am", H.Amos) ;
    BookNames[18] = new BookName(18, "ob", 
                                 18, "Obadiah", "Ob", H.Obad) ;
    BookNames[19] = new BookName(19, "jn", 
                                 19, "Jonah", "Jon", H.Jonah) ;
    BookNames[20] = new BookName(20, "mi",  
                                 20, "Micah", "Mic", H.Micah) ;
    BookNames[21] = new BookName(21, "na", 
                                 21, "Nahum", "Nah", H.Nahum) ;
    BookNames[22] = new BookName(22, "hb", 
                                 22, "Habakkuk", "Hab", H.Hab) ;
    BookNames[23] = new BookName(23, "zp", 
                                 23, "Zephaniah", "Zeph", H.Zeph) ;
    BookNames[24] = new BookName(24, "hg",  
                                 24, "Haggai", "Hag", H.Hag) ;
    BookNames[25] = new BookName(25, "zc",  
                                 25, "Zechariah", "Zech", H.Zech) ;
    BookNames[26] = new BookName(26, "ma",  
                                 26, "Malachi", "Mal", H.Mal) ;
    
    BookNames[27] = new BookName(27, "ps", 
                                 27, "Psalms", "Ps", H.Ps) ;
    BookNames[28] = new BookName(28, "jb",  
                                 29, "Job", "Job", H.Job) ;
    BookNames[29] = new BookName(29, "pr",  
                                 28, "Proverbs", "Prov", H.Prov) ;
    BookNames[30] = new BookName(30, "ru", 
                                 31, "Ruth", "Ruth", H.Ruth) ;
    BookNames[31] = new BookName(31, "ca",  
                                 30, "The Song of Songs", "Song", H.Song, "Song of Songs") ;
    BookNames[32] = new BookName(32, "ec", 
                                 33, "Ecclesiastes", "Eccl", H.Eccl) ;
    BookNames[33] = new BookName(33, "lm",  
                                 32, "Lamentations", "Lam", H.Lam) ;
    BookNames[34] = new BookName(34, "es", 
                                 34, "Esther", "Esth", H.Esth) ;
    BookNames[35] = new BookName(35, "da", 
                                 35, "Daniel", "Dan", H.Dan) ;
    BookNames[36] = new BookName(36, "er",
                                 36, "Ezra", "Ezra", H.Ezra) ;
    BookNames[37] = new BookName(37, "ne",
                                 37, "Nehemiah", "Neh", H.Neh) ;
    BookNames[38] = new BookName(38, "1c", 
                                 38, "1 Chronicles", "1 Chr", H.Chr1, "Chronicles 1") ;
    BookNames[39] = new BookName(39, "2c", 
                                 39, "2 Chronicles", "2 Chr", H.Chr2, "Chronicles 2") ;
    return BookNames ;
    }
//-----------------------------------------------------------------------------

// Returns a BookName object given a 2 letter book code.

public static BookName getBookName(BookName[] BookNames, String BookCode) {
    for (int k =1; k < BookNames.length; k++) {
        if( BookCode.compareTo(BookNames[k].wlcname)==0){
            return BookNames[k] ;
            }
        }
    System.out.println("BookName: No book found for code " + BookCode + " !") ;
    return null ;
    }
//-----------------------------------------------------------------------------
}
//==============================================================================
//==============================================================================

--- NEW FILE: H.java ---
package WLC2OSIS.Translate ;

//==============================================================================
/**
 *  <b>Unicode Hebrew characters</b><p>
 *
 *  From Unicode Hebrew, Version 4.0.
 */
//==============================================================================
public class H{

// Letters = Consonants

public static final char alef =        '\u05d0' ;
public static final char bet =         '\u05d1' ;
public static final char gimel =       '\u05d2' ;
public static final char dalet =       '\u05d3' ;
public static final char he =          '\u05d4' ;
public static final char vav =         '\u05d5' ;
public static final char zayin =       '\u05d6' ;
public static final char het =         '\u05d7' ;
public static final char tet =         '\u05d8' ;
public static final char yod =         '\u05d9' ;
public static final char finalkaf =    '\u05dA' ;
public static final char kaf =         '\u05dB' ;
public static final char lamed =       '\u05dC' ;
public static final char finalmem =    '\u05dD' ;
public static final char mem =         '\u05dE' ;
public static final char finalnun =    '\u05dF' ;
public static final char nun =         '\u05e0' ;
public static final char samekh =      '\u05e1' ;
public static final char ayin =        '\u05e2' ;
public static final char finalpe =     '\u05e3' ;
public static final char pe =          '\u05e4' ;
public static final char finaltsadi =  '\u05e5' ;
public static final char tsadi =       '\u05e6' ;
public static final char qof =         '\u05e7' ;
public static final char resh =        '\u05e8' ;
public static final char shin =        '\u05e9' ;
public static final char tav =         '\u05eA' ;

// Points and punctuation

public static final char sheva =       '\u05b0' ;
public static final char hatafsegol  = '\u05b1' ;
public static final char hatafpatah =  '\u05b2' ;
public static final char hatafqamats = '\u05b3' ;
public static final char hiriq =       '\u05b4' ;
public static final char tsere  =      '\u05b5' ;
public static final char segol =       '\u05b6' ;
public static final char patah  =      '\u05b7' ;
public static final char qamats =      '\u05b8' ;
public static final char holam  =      '\u05b9' ;
public static final char reserved  =   '\u05ba' ;
public static final char qubuts =      '\u05bb' ;
public static final char dagesh  =     '\u05bc' ;
public static final char meteg =       '\u05bd' ;
public static final char maqaf  =      '\u05be' ;
public static final char rafe =        '\u05bf' ;
public static final char paseq  =      '\u05c0' ;
public static final char shindot =     '\u05c1' ;
public static final char sindot  =     '\u05c2' ;
public static final char sofpasuq =    '\u05c3' ;
public static final char upperdot  =   '\u05c4' ;

public static final char masoranumberdot  =   '\u0307' ;

// Accents

public static final char etnachta  =   '\u0591' ;
public static final char accentsegol = '\u0592' ;
public static final char shalshelet  = '\u0593' ;
public static final char zaqefqatan  = '\u0594' ;
public static final char zaqefgadol  = '\u0595' ;
public static final char tipeha  =     '\u0596' ;
public static final char revia  =      '\u0597' ;
public static final char zarqa  =      '\u0598' ;
public static final char pashta  =     '\u0599' ;
public static final char yetiv  =      '\u059a' ;
public static final char tevir  =      '\u059b' ;
public static final char geresh  =     '\u059c' ;
public static final char gereshmuqdam= '\u059d' ;
public static final char gershayim  =  '\u059e' ;
public static final char qarneypara  = '\u059f' ;
public static final char telishagedola='\u05a0' ;
public static final char pazer  =      '\u05a1' ;
public static final char reserved2  =  '\u05a2' ;
public static final char munah  =      '\u05a3' ;
public static final char mahapakh  =   '\u05a4' ;
public static final char merkha  =     '\u05a5' ;
public static final char merkhakefula= '\u05a6' ;
public static final char darga  =      '\u05a7' ;
public static final char qadma  =      '\u05a8' ;
public static final char telishaqetana='\u05a9' ;
public static final char yerahbenyomo= '\u05aa' ;
public static final char ole  =        '\u05ab' ;
public static final char iluy  =       '\u05ac' ;
public static final char dehi  =       '\u05ad' ;
public static final char zinor  =      '\u05ae' ;
public static final char masoracircle= '\u05af' ;

// Yiddish ligatures for completeness
public static final char doublevav =      '\u05f0' ;
public static final char vavyod =         '\u05f1' ;
public static final char doubleyod =       '\u05f2' ;


// Additional punctuation
public static final char punctgeresh =      '\u05f3' ;
public static final char punctgershayim =   '\u05f4' ;

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------

// Letters = Consonants as Strings have initial capital letter in name.

public static final String Alef =        "\u05d0" ;
public static final String Bet =         "\u05d1" ;
public static final String Gimel =       "\u05d2" ;
public static final String Dalet =       "\u05d3" ;
public static final String He =          "\u05d4" ;
public static final String Vav =         "\u05d5" ;
public static final String Zayin =       "\u05d6" ;
public static final String Het =         "\u05d7" ;
public static final String Tet =         "\u05d8" ;
public static final String Yod =         "\u05d9" ;
public static final String Finalkaf =    "\u05dA" ;
public static final String Kaf =         "\u05dB" ;
public static final String Lamed =       "\u05dC" ;
public static final String Finalmem =    "\u05dD" ;
public static final String Mem =         "\u05dE" ;
public static final String Finalnun =    "\u05dF" ;
public static final String Nun =         "\u05e0" ;
public static final String Invertednun = "\uf300" ;
public static final String Samekh =      "\u05e1" ;
public static final String Ayin =        "\u05e2" ;
public static final String Finalpe =     "\u05e3" ;
public static final String Pe =          "\u05e4" ;
public static final String Finaltsadi =  "\u05e5" ;
public static final String Tsadi =       "\u05e6" ;
public static final String Qof =         "\u05e7" ;
public static final String Resh =        "\u05e8" ;
public static final String Shin =        "\u05e9" ;
public static final String Tav =         "\u05eA" ;
//-----------------------------------------------------------------------------

// Book names in Hebrew

public static final String Tnk = Tav+Nun+Character.toString(punctgershayim)+Finalkaf  ;

public static final String Gen = Bet+Resh+Alef+Shin+Yod+Tav ;
public static final String Exod = Shin+Mem+Vav+Tav ;
public static final String Lev = Vav+Yod+Qof+Resh+Alef ;
public static final String Num = Bet+Mem+Dalet+Bet+Dalet ;
public static final String Deut = Dalet+Bet+Resh+Yod+Finalmem ;

public static final String Josh = Yod+He+Vav+Shin+Ayin ;
public static final String Judg = Shin+Vav+Pe+Tet+Yod+Finalmem ;
public static final String Sam1 = Shin+Mem+Vav+Alef+Lamed+" "+Alef ;
public static final String Sam2 = Shin+Mem+Vav+Alef+Lamed+" "+Bet ;
public static final String Kgs1 = Mem+Lamed+Kaf+Yod+Finalmem+" "+Alef ;
public static final String Kgs2 = Mem+Lamed+Kaf+Yod+Finalmem+" "+Bet ;
public static final String Isa = Yod+Shin+Ayin+He ;
public static final String Jer = Yod+Resh+Mem+Yod+He ;
public static final String Ezek = Yod+Het+Zayin+Qof+Alef+Lamed ;

public static final String Hos = He+Vav+Shin+Ayin ;
public static final String Joel = Yod+Vav+Alef+Lamed ;
public static final String Amos = Ayin+Mem+Vav+Samekh ;
public static final String Obad = Ayin+Bet+Dalet+Yod+He ;
public static final String Jonah = Yod+Vav+Nun+He ;
public static final String Micah = Mem+Yod+Kaf+He ;
public static final String Nahum = Nun+Het+Vav+Finalmem ;
public static final String Hab = Het+Bet+Qof+Vav+Qof ;
public static final String Zeph = Tsadi+Pe+Nun+Yod+He ;
public static final String Hag = Het+Gimel+Yod ;
public static final String Zech = Zayin+Kaf+Resh+Yod+He ;
public static final String Mal = Mem+Lamed+Alef+Kaf+Yod ;

public static final String Ps = Tav+He+Yod+Lamed+Yod+Finalmem ;
public static final String Job = Alef+Yod+Vav+Bet ;
public static final String Prov = Mem+Shin+Lamed+Yod ;
public static final String Ruth = Resh+Vav+Tav ;
public static final String Song = Shin+Yod+Resh+" "+He+Shin+Yod+Resh+Yod+Finalmem ;
public static final String Eccl = Qof+He+Lamed+Tav ;
public static final String Lam = Alef+Yod+Kaf+He ;
public static final String Esth = Alef+Samekh+Tav+Resh ;
public static final String Dan = Dalet+Nun+Yod+Alef+Lamed ;
public static final String Ezra = Ayin+Zayin+Resh+Alef ;
public static final String Neh= Nun+Het+Mem+Yod+He ;
public static final String Chr1 = Dalet+Bet+Resh+Yod+" "+He+Yod+Mem+Yod+Finalmem+" "+Alef ;
public static final String Chr2 = Dalet+Bet+Resh+Yod+" "+He+Yod+Mem+Yod+Finalmem+" "+Bet ;
//-----------------------------------------------------------------------------
}
//==============================================================================
//==============================================================================

--- NEW FILE: Header.java ---
package WLC2OSIS.Translate ;

import WLC2OSIS.* ;
import WLC2OSIS.Translate.* ;
import WLC2OSIS.Utilities.* ;

import java.util.Date ;
import java.text.SimpleDateFormat ;
//==============================================================================
/**
 *  <b>Header information for Tanach.</b><p>
 */
//==============================================================================
public class Header{

static SimpleDateFormat DateFormat = new SimpleDateFormat("dd MMM yyyy") ;
static String DateTime ;

public Header(){
    }
//-----------------------------------------------------------------------------

// Writes the Notes to the XML file.

public static void writeHeader(WLC2OSIS A, XMLWriter w) {
    Date DT = new Date() ;
    DateTime = DateFormat.format(DT) ;
    A.w.openTag("header", 0) ;
    A.w.writeString("name", 1, "Tanach") ;
    A.w.writeString("hebrewname", 1, H.Tnk) ;
    A.w.writeString("title", 1, A.Title) ;
    A.w.writeString("shortdescription", 1, A.ShortDescription)  ;
    for (int i =0; i < A.Description.length; i++){
        A.w.writeString("description", 1, A.Description[i]) ;
        }
    A.w.writeString("date", 1, A.Date) ;
    A.w.writeString("transcriptiondate", 1, DateTime) ;
    A.w.writeString("copyright", 1, "\u00A9 C. V. Kimball 2004") ;
    A.w.writeString("filename", 1, A.InputFilename) ;
    A.w.closeTag("header", 0) ;
    }
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
}
//==============================================================================
//==============================================================================

--- NEW FILE: Index.java ---
package WLC2OSIS.Translate ;

import WLC2OSIS.* ;
import WLC2OSIS.Parse.* ;
import WLC2OSIS.Utilities.* ;

import java.util.Date ;
import java.text.SimpleDateFormat ;
//==============================================================================
/**
 *  <b>Writes the Tanach.xml file containing only the index.</b><p>
 *
 *  Special to WLC
 */
//==============================================================================
public class Index{

public Index(){
    }
//-----------------------------------------------------------------------------

// Writes the index to the Tanach.xml file.

public static void writeIndex(WLC2OSIS A) {
    
    A.w = new XMLWriter(A.OutputDirectory, 
        "Tanach", "Tanach",
        "Tanach", "" ) ;
    Header.writeHeader(A, A.w) ;
    A.w.openTag("index", 0) ;
    A.w.writeInt("n", 1, A.p.TanachBookCount) ;
    A.w.openTag("books", 1) ;
     
    for (int i = 1; i <= A.p.TanachBookCount; i++){
    
// Place the books out in their usual, not MCW order

        boolean Found = false;
        int k = 0 ;
        for (int j = 1; j <= A.p.TanachBookCount; j++){
            if(A.p.b.BookNames[j].number == i){
               Found = true ;
               k = j ;
               }
            }
        if(!Found){
            System.out.println("Index: Index " + i + " not found in BookNames table.") ;
            } 
            
        A.w.openTag("names", 2) ;
        A.w.writeString("name", 3, A.p.b.BookNames[k].name ) ;
        A.w.writeString("abbrev", 3, A.p.b.BookNames[k].abbrev) ;
        A.w.writeInt("number", 3, A.p.b.BookNames[k].number) ;
        A.w.writeString("filename", 3, A.p.b.BookNames[k].filename) ;
        A.w.writeString("hebrewname", 3, A.p.b.BookNames[k].hebrewname) ;
        A.w.closeTag("names", 2) ;   
        }
    
    A.w.closeTag("books", 1) ;
    A.w.writeInt("vs", 1, A.p.TanachVerseCount) ;
    A.w.writeInt("cs", 1, A.p.TanachChapterCount) ;
    A.w.closeTag("index", 0) ;
    UnicodeChar.writeUnicodeChars(A.w) ;
    Note.writeNotes(A.w) ;
    A.w.close() ;
    }
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
}
//==============================================================================
//==============================================================================

--- NEW FILE: MC.java ---
package WLC2OSIS.Translate ;

import WLC2OSIS.Utilities.* ;
import Utilities.* ;

import java.io.*;
//==============================================================================
/**
 *  <b>MC ASCII decoding constants</b>.<p/>
 */
//==============================================================================
public class MC{

/** Array of MCOs indexed by the lowest 7 bits of the  character value. */
static MCO[] Characters = new MCO[128] ;
/** Array of MCOs indexed by integers from 0 to 99 */
static MCO[] Numbers =  new MCO[100] ;
//-----------------------------------------------------------------------------

// static initializer

static {

//-----------------------------------------------------------------------------

// Set Unknown to all types.

    for (int k=0; k < 128; k++){
        Characters[k] = new MCO("Unknown", MCO.Unknown, "Unspecified", "Unspecified", 0 ) ;
        }
    for (int k=0; k < 100; k++){
        Numbers[k] = new MCO("Unknown", MCO.Unknown, "Unspecified", "Unspecified", 0 ) ;    
        }
//-----------------------------------------------------------------------------

// Set the Characters table

    for (int k=0; k < 128; k++){

// Set the Consonants.

        if(k == (int) ')') Characters[k] = 
            new MCO("alef", MCO.Consonant, H.alef, H.alef, 0 ) ;
        if(k == (int) 'B') Characters[k] = 
            new MCO("bet",  MCO.Consonant, H.bet, H.bet, 0 ) ;
        if(k == (int) 'G') Characters[k] = 
            new MCO("gimel", MCO.Consonant, H.gimel, H.gimel, 0 ) ;
        if(k == (int) 'D') Characters[k] = 
            new MCO("dalet", MCO.Consonant, H.dalet, H.dalet, 0 ) ;
        if(k == (int) 'H') Characters[k] = 
            new MCO("he", MCO.Consonant, H.he, H.he, 0 ) ;
        if(k == (int) 'W') Characters[k] = 
            new MCO("vav", MCO.Consonant, H.vav, H.vav, 0 ) ;
        if(k == (int) 'Z') Characters[k] = 
            new MCO("zayin", MCO.Consonant, H.zayin, H.zayin, 0 ) ;
        if(k == (int) 'X') Characters[k] = 
            new MCO("het", MCO.Consonant, H.het, H.het, 0 ) ;
        if(k == (int) '+') Characters[k] = 
            new MCO("tet", MCO.Consonant, H.tet, H.tet, 0 ) ;
        if(k == (int) 'Y') Characters[k] = 
            new MCO("yod", MCO.Consonant, H.yod, H.yod, 0 ) ;
        if(k == (int) 'K') Characters[k] = 
            new MCO("kaf", MCO.Consonant, H.kaf, H.finalkaf, 0 ) ;
        if(k == (int) 'L') Characters[k] = 
            new MCO("lamed", MCO.Consonant, H.lamed, H.lamed, 0 ) ;
        if(k == (int) 'M') Characters[k] = 
            new MCO("mem", MCO.Consonant, H.mem, H.finalmem, 0 ) ;
        if(k == (int) 'N') Characters[k] = 
            new MCO("nun", MCO.Consonant, H.nun, H.finalnun, 0 );
        if(k == (int) 'S') Characters[k] = 
            new MCO("samekh", MCO.Consonant, H.samekh, H.samekh, 0 ) ;
        if(k == (int) 'P') Characters[k] = 
            new MCO("pe", MCO.Consonant, H.pe, H.finalpe, 0 ) ;
        if(k == (int) '(') Characters[k] = 
            new MCO("ayin", MCO.Consonant, H.ayin, H.ayin, 0 ) ;
        if(k == (int) 'C') Characters[k] = 
            new MCO("tsadi", MCO.Consonant, H.tsadi, H.finaltsadi, 0 ) ;
        if(k == (int) 'Q') Characters[k] = 
            new MCO("qof", MCO.Consonant, H.qof, H.qof, 0 ) ;
        if(k == (int) 'R') Characters[k] = 
            new MCO("resh", MCO.Consonant, H.resh, H.resh, 0 ) ;
        if(k == (int) '$'){
            MCO m = new MCO("shindot", MCO.Mark, H.shindot, H.shindot, 1 ) ;
            Characters[k] = 
                new MCO("shin", MCO.ConsonantMark, H.shin, H.shin, 0, m) ;
            }
        if(k == (int) '&') {
            MCO m = new MCO("sindot", MCO.Mark, H.sindot, H.sindot, 2 ) ;
            Characters[k] = 
                new MCO("shin", MCO.ConsonantMark, H.shin, H.shin, 0, m) ;
            }
        if(k == (int) '#') Characters[k] = 
            new MCO("shin", MCO.Consonant, H.shin, H.shin, 0 ) ;
        if(k == (int) 'T') Characters[k] = 
            new MCO("tav", MCO.Consonant, H.tav, H.tav, 0 ) ;


// Set the dagesh.

        if(k == (int) '.') Characters[k] = 
            new MCO("dagesh", MCO.Mark, H.dagesh, H.dagesh, 3 ) ;

// Set the rafe.

        if(k == (int) ',') Characters[k] = 
            new MCO("rafe", MCO.Mark, H.rafe, H.rafe, 4 ) ;
        
// Set the maqaf.

        if(k == (int) '-') Characters[k] = 
            new MCO("maqef", MCO.Punctuation, H.maqaf, H.maqaf, 16 ) ;
        
// Set the morphological division indicator.

        if(k == (int) '/') Characters[k] = 
            new MCO("morphological divider", MCO.MorphologicalDivision, ' ', ' ', 15 ) ;

// Set the vowels

// : is the hataf indicator
        if(k == (int) ':') Characters[k] = 
            new MCO("sheva", MCO.Sheva, H.sheva, H.sheva, 7 ) ;
        if(k == (int) 'O') Characters[k] = 
            new MCO("holam", MCO.Mark, H.holam, H.holam, 5 ) ;
        if(k == (int) 'I') Characters[k] = 
            new MCO("hiriq", MCO.Mark, H.hiriq, H.hiriq, 7 ) ;
        if(k == (int) 'U') Characters[k] = 
            new MCO("qubuts", MCO.Mark, H.qubuts, H.qubuts, 7 ) ;
        if(k == (int) '"') Characters[k] = 
            new MCO("tsere", MCO.Mark, H.tsere, H.tsere, 7 ) ;
        if(k == (int) 'A') Characters[k] = 
            new MCO("patah", MCO.Vowel, H.patah, H.hatafpatah, 7 ) ;
        if(k == (int) 'F') Characters[k] = 
            new MCO("qamatz",  MCO.Vowel, H.qamats, H.hatafqamats, 7 ) ;
        if(k == (int) 'E') Characters[k] = 
            new MCO("segol", MCO.Vowel, H.segol, H.hatafsegol, 7 ) ;

// Set the accents as digits in the Characters table.

        if(k == (int) '0') Characters[k] = 
            new MCO("0", MCO.Number, '0', '0', 0 ) ;
        if(k == (int) '1') Characters[k] = 
            new MCO("1", MCO.Number, '1', '1', 0 ) ;
        if(k == (int) '2') Characters[k] = 
            new MCO("0", MCO.Number, '2', '2', 0 ) ;
        if(k == (int) '3') Characters[k] = 
            new MCO("3", MCO.Number, '3', '3', 0 ) ;
        if(k == (int) '4') Characters[k] = 
            new MCO("4", MCO.Number, '4', '4', 0 ) ;
        if(k == (int) '5') Characters[k] = 
            new MCO("5", MCO.Number, '5', '5', 0 ) ;
        if(k == (int) '6') Characters[k] = 
            new MCO("6", MCO.Number, '6', '6', 0 ) ;
        if(k == (int) '7') Characters[k] = 
            new MCO("7", MCO.Number, '7', '7', 0 ) ;
        if(k == (int) '8') Characters[k] = 
            new MCO("8", MCO.Number, '8', '8', 0 ) ;
        if(k == (int) '9') Characters[k] = 
            new MCO("9", MCO.Number, '9', '9', 0 ) ;

// Note

        if(k == (int) ']') Characters[k] = 
            new MCO("Note", MCO.Note, ' ', ' ', 14 ) ;

        }
   
//-----------------------------------------------------------------------------

// Set the accents (From Grove's supplement.)
//    The same Unicode character may apply to several MCW accent codes.

        Numbers[0] = new MCO("sof pasuq", MCO.Punctuation, H.sofpasuq, H.sofpasuq, 16 ) ;
        Numbers[1] = new MCO("accentsegol", MCO.Mark, H.accentsegol, H.accentsegol, 11 ) ;
        Numbers[2] = new MCO("zinor", MCO.Mark, H.zinor, H.zinor, 13 ) ;
        Numbers[3] = new MCO("pashta", MCO.Mark, H.pashta, H.pashta, 13 ) ;
        Numbers[4] = new MCO("telishaqetana", MCO.Mark, H.telishaqetana, H.telishaqetana, 13 ) ;
        Numbers[5] = new MCO("blank+paseq", MCO.Punctuation, " " + H.paseq, " " + H.paseq, 16 ) ;
                
        Numbers[10] = new MCO("yetiv", MCO.PrepositiveMark, H.yetiv, H.yetiv, 10 ) ;
        Numbers[13] = new MCO("dehi", MCO.PrepositiveMark, H.dehi, H.dehi, 10 ) ;
        
        Numbers[11] = new MCO("gereshmuqdam", MCO.PrepositiveMark, H.gereshmuqdam, H.gereshmuqdam, 11 ) ;
        Numbers[14] = new MCO("telishagedola", MCO.PrepositiveMark, H.telishagedola, H.telishagedola, 11 ) ;

        Numbers[24] = new MCO("telishaqetana", MCO.Mark, H.telishaqetana, H.telishaqetana, 13 ) ;
        Numbers[33] = new MCO("pashta", MCO.Mark, H.pashta, H.pashta, 13 ) ; 
        Numbers[44] = new MCO("telishagedola", MCO.Mark, H.telishagedola, H.telishagedola, 11 ) ;
        Numbers[52] = new MCO("lowpunctum",  MCO.Mark,'\u0323', '\u0323' ,  9 ) ;
        Numbers[53] = new MCO("highpunctum", MCO.Mark, '\u05c4', '\u05c4', 12 ) ;
        Numbers[60] = new MCO("ole", MCO.Mark, H.ole, H.ole, 11 ) ;
        Numbers[61] = new MCO("geresh", MCO.Mark, H.geresh, H.geresh, 11 ) ;
        Numbers[62] = new MCO("gershayim", MCO.Mark, H.gershayim, H.gershayim, 11 ) ;
        Numbers[63] = new MCO("qadma", MCO.Mark, H.qadma, H.qadma, 11 ) ;
        Numbers[64] = new MCO("iluy", MCO.Mark, H.iluy, H.iluy,11 ) ;
        Numbers[65] = new MCO("shalshelet", MCO.Mark, H.shalshelet, H.shalshelet, 11 ) ;
        Numbers[80] = new MCO("zaqefqatan", MCO.Mark, H.zaqefqatan, H.zaqefqatan, 11 ) ;
        Numbers[81] = new MCO("revia", MCO.Mark, H.revia, H.revia, 11 ) ;
        Numbers[82] = new MCO("zarqa", MCO.Mark, H.zarqa, H.zarqa, 11 ) ;
        Numbers[83] = new MCO("pazer", MCO.Mark, H.pazer, H.pazer, 11 ) ;
        Numbers[84] = new MCO("qarneypara", MCO.Mark, H.qarneypara, H.qarneypara, 11 ) ;
        Numbers[85] = new MCO("zaqefgadol", MCO.Mark, H.zaqefgadol, H.zaqefgadol, 11 ) ; 
        String ZWJMeteg = Character.toString('\u200D')+ Character.toString(H.meteg) ;
        Numbers[35] = new MCO("centermeteg", MCO.Mark, ZWJMeteg, ZWJMeteg, 8 ) ;      
        Numbers[70] = new MCO("mahapakh", MCO.Mark, H.mahapakh, H.mahapakh, 7 ) ;      
        Numbers[71] = new MCO("merka", MCO.Mark, H.merkha, H.merkha, 7 ) ;      
        Numbers[72] = new MCO("merkhakefula", MCO.Mark, H.merkhakefula, H.merkhakefula, 7 ) ;      
        Numbers[73] = new MCO("tipeha", MCO.Mark, H.tipeha, H.tipeha, 7 ) ;      
        Numbers[74] = new MCO("munah", MCO.Mark, H.munah, H.munah, 7 ) ;      
        Numbers[75] = new MCO("leftmeteg", MCO.Mark, H.meteg, H.meteg, 8 ) ;      
        Numbers[91] = new MCO("tevir", MCO.Mark, H.tevir, H.tevir, 7 ) ;      
        Numbers[92] = new MCO("etnachta", MCO.Mark, H.etnachta, H.etnachta, 7 ) ;      
        Numbers[93] = new MCO("yerahbenyomo", MCO.Mark, H.yerahbenyomo, H.yerahbenyomo, 7 ) ;      
        Numbers[94] = new MCO("darga", MCO.Mark, H.darga, H.darga, 7 ) ;      
        Numbers[95] = new MCO("rightmeteg", MCO.Mark, H.meteg, H.meteg, 6 ) ;  
//-----------------------------------------------------------------------------

// Place the Characters results into the UnicodeChars array.

       UnicodeChar.setUnicodeChars(Characters, Numbers) ;
    }
//-----------------------------------------------------------------------------
/**
*  Returns an MCO from a character.
*
*/
public static MCO getMCO(char c){
    int k = (int) c ;
    return Characters[k] ;
    } 
//-----------------------------------------------------------------------------
/**
*  Returns an MCO from an integer.
*
*/
public static MCO getMCO(int k){
    return Numbers[k] ;
    } 
//-----------------------------------------------------------------------------
}
//==============================================================================
//==============================================================================

--- NEW FILE: MCO.java ---
package WLC2OSIS.Translate ;

//==============================================================================
/**
 *  <b>Object representing characters with Name, Type, Group, and Unicode Hebrew
 *  initial and final values.</b><p>
 */
//==============================================================================
public class MCO implements Cloneable{


// Definition of MCO

/** Name of this object */
public String Name = "" ;
/** Type of character, an integer. */
public int Type = 0 ;
/** Type of the object, changes during processing. */
public String Value = "" ;
/** The a final value Unicode character corresponding to the MC character 
 *  at this position in the CharValue[] CharValues. */
public String FinalValue = ""  ;
/** Order group */
public int Group = 0 ;
/** Included MCO used for ConsonantMark Type only.*/
public MCO Object = null ;

// Definition of Types

/** No known MC character correponds to this index. */
public static final int Unknown =  0 ;
/** MC character correponding to this index is a Consonant. */
public static final int Consonant = 1 ;
/** MC character correponding to this index is a Vowel. */
public static final int Vowel = 2 ;
/** MC character correponding to this index is a Mark */ 
public static final int Mark = 3 ;
/** MC character correponding to this index is a MorphologicalDivision */ 
public static final int MorphologicalDivision = 4 ;
/** MC character correponding to this index is a Punctuation */ 
public static final int Punctuation = 5 ;

// The following types > 5 require expansion or re-ordering

/** MC character correponding to this index is a PrepositiveMark */ 
public static final int PrepositiveMark  = 6 ;
/** MC character correponding to this index is a ConsonantMark */ 
public static final int ConsonantMark  = 7;
/** MC character correponding to this index is a Number */ 
public static final int Number  = 8;
/** MC character correponding to this index is a Sheva */ 
public static final int Sheva  = 9 ;
/** MC character correponding to this index is a Note */ 
public static final int Note = 10 ;

//-----------------------------------------------------------------------------
/**
 * Generate from full specification.
 */
public MCO( String Name, int Type, String Value, String FinalValue, int Group ) {
    this.Name = Name ;
    this.Type = Type ;
    this.Value = Value ;
    this.FinalValue = FinalValue ;
    this.Group = Group ;
    this.Object = Object ;
    }
//-----------------------------------------------------------------------------
/**
 * Generate from Value, FinalValue as char with Object.
 */
public MCO( String Name, int Type, char Value, char FinalValue, int Group,
          MCO Object ) {
    this.Name = Name ;
    this.Type = Type ;
    this.Value = Character.toString(Value) ;
    this.FinalValue = Character.toString(FinalValue) ;
    this.Group = Group ;
    this.Object = Object ;
    }
//-----------------------------------------------------------------------------
/**
 * Generate from Value, FinalValue as char without Object.
 */
public MCO( String Name, int Type, char Value, char FinalValue, int Group ) {
    this.Name = Name ;
    this.Type = Type ;
    this.Value = Character.toString(Value) ;
    this.FinalValue = Character.toString(FinalValue) ;
    this.Group = Group ;
    this.Object = null ;
    }
//-----------------------------------------------------------------------------

public void print(){
   System.out.print(Name + " + ") ; 
   }
//-----------------------------------------------------------------------------

public Object clone(){
   MCO M = new MCO(  Name, Type,  Value,  FinalValue, Group ) ;
   M.Object = Object ;
   return M ; 
   }
//-----------------------------------------------------------------------------
}
//==============================================================================
//==============================================================================

--- NEW FILE: Note.java ---
package WLC2OSIS.Translate ;

import WLC2OSIS.Utilities.* ;

import java.util.Vector ;

//==============================================================================
/**
 *  <b>MC notes.</b><p>
 */
//==============================================================================
public class Note{

String Code ;
String Note ; 

static Vector Notes = new Vector() ;

Note(String Code, String Note){
    this.Code = Code ;
    this.Note = Note ;
    }
//-----------------------------------------------------------------------------

// Writes the Notes to the XML file.

public static void writeNotes(XMLWriter w) {
    setNotes() ;
    w.openTag("notes", 0) ;
    for (int k=0; k < Notes.size() ; k++){
        Note n = (Note) Notes.elementAt(k) ;
        w.openTag("note", 1) ;
        w.writeString("code", 2, n.Code ) ;
        w.writeString("note", 2, n.Note ) ;
        w.closeTag("note", 1) ;
        }
    w.closeTag("notes", 0) ;
    }
//-----------------------------------------------------------------------------

// Writes the Notes to the XML file.

static void setNotes() {

// Do this only once!

    if(Notes.size() > 1) return ;
    Notes.add(new Note("1", "BHS has been faithful to the Leningrad Codex where " 
                          + "\nthere might be a question of the validity of the form "
                          + "\nand we keep the same form as BHS.")) ;
    Notes.add(new Note("2", "We have added a sop pasuq where L and BHC omit it."
                          + "\n(The added sof pasuq often is missing from the text.)" )) ;
    Notes.add(new Note("3", "We read or understand L differently than BHC (1983 Edition). "
                          + "\nOften this notation indicates a typographical error in BHS.")) ;
    Notes.add(new Note("4", "Puncta Extraordaria -- "
                          + "\na \\u05c4 is used to mark such marks in the text"
                          + "\nwhen they are above the line and"
                          + "\na \\u0323 when they are below the line."));
    Notes.add(new Note("5", "Large letter(s).")) ;
    Notes.add(new Note("6", "Small letter(s).")) ;
    Notes.add(new Note("7", "Suspended letter(s).")) ;
    Notes.add(new Note("8", "Inverted nun in the text.")) ;
    Notes.add(new Note("9", "BHS has abandoned L and we concur. " 
                          + "\nAll of these occurrences are ketib/qere problems.")) ;
    Notes.add(new Note("a", "Adaptations to a Qere which L and BHS, by their design, "
                           + "do not indicate.")) ;
    Notes.add(new Note("m", "Miscellaneous notes to the text and occasions "
                           + "\nwhere more than one bracket category applies.")) ;
    Notes.add(new Note("q", "We have abandoned or added a ketib/qere relative to BHS. "
                           + "\nIn doing this we agree with L against BHS.")) ;
    Notes.add(new Note("y", "Yathir readings in L which we have designated as Qeres "
                           + "\nwhen both Dothan and BHS list a Qere.")) ;
    }
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
}
//==============================================================================
//==============================================================================

--- NEW FILE: Translate.java ---
package WLC2OSIS.Translate ;

import WLC2OSIS.* ;
import WLC2OSIS.Parse.* ;
import WLC2OSIS.Utilities.* ;
import Utilities.* ;

import java.io.* ;
import java.util.Vector ;
//==============================================================================
/**
 *  <b>Critical translation of KQ-free MC words into Unicode characters.</b><p>
 */
//==============================================================================
public class Translate{

Parser P ;
WLC2OSIS A ;

MCO M ;
MCO Mark ;
Vector MCOs, OrderedMCOs ;
int Type, I, k1, len ;
int[] ConsonantPositions = new int[100] ;
char c, c1 ;
//-----------------------------------------------------------------------------

public Translate(WLC2OSIS A, Parser P) {
    this.A = A ;
    this.P = P ;
    }    
//------------------------------------------------------------------------------

// Translates an MC word (not qere or ketib) to a Unicode String.
// Notes are included as <x>n</x>.

public String translate(String W){
    len = W.length() ;
        
// Convert characters in String to MCO objects, expanding
// ConsonantMarks, Numbers, and Notes as necessary.
// Move PrepositiveMarks to after their consonants.

    MCOs = new Vector() ;
    for (int k = 0; k < len; k++) {
        c = W.charAt(k) ;
        
        
        M = (MCO) (MC.getMCO(c)).clone() ;
        Type = M.Type ;

// Unknown 
        if(Type == MCO.Unknown){
            message("MC: MC Object is of type Unknown."
                + "\nWord: " + W 
                + "\nCharacter: " + c
                + "\n                                     " ) ;
             }
        else if(Type <= 5){  // These types need no expansion.
            MCOs.add(M) ;
            }
        else if(Type == MCO.Sheva ){
// Might be a Hatef Vowel
            k1 = k + 1 ;
            if(k1 < len){
                c1 = W.charAt(k1) ;
                Mark = (MCO) (MC.getMCO(c1)).clone() ;
                if (Mark.Type == MCO.Vowel){
// It is a Hatef vowel
                    MCO Hatef = new MCO("hataf"+Mark.Name, MCO.Vowel,
                           Mark.FinalValue, Mark.FinalValue, Mark.Group) ;
                    MCOs.add(Hatef) ;
                    k++ ;
                    }
// Not a Hatef Vowel
                else{
                    MCOs.add(M) ;
                    }
                }
// Could only be a Sheva
            else{
                MCOs.add(M) ;
                }        
            }
      else if(Type == MCO.ConsonantMark){
            Mark = (MCO) (M.Object).clone() ;
            M.Type = MCO.Consonant ;
            MCOs.add(M) ;
            MCOs.add(Mark) ;
            }
//-----------------------------------------------------------------------------
      else if(Type == MCO.Number){
            k++ ;
            String StringInt = "" ;
            StringInt = StringInt + c ;
            StringInt = StringInt + W.charAt(k) ;
            
            I = new Integer(StringInt).intValue() ;
            if ((I > 99) | (I < 0) ){
                 message("MC: Reconstructed int is out of range."
                    + "\nWord: " + W 
                    + "\nCharacters: " + c + W.charAt(k)
                    + "\nint: " + I ) ;
                 }
            else{
// Found a Mark of some sort
                MCO Found = MC.getMCO(I) ;
                
                if(Found.Type == MCO.PrepositiveMark){
//                  System.out.println("*****  Found a prepositive mark. " + I) ;
                    k++ ;
                    c1 = W.charAt(k) ;
                    M = (MCO) (MC.getMCO(c1)).clone() ;
                    if( M.Type == MCO.Consonant | M.Type == MCO.ConsonantMark ){
 //                     System.out.println("Swapping prepositive mark and consonant.") ;
                        MCOs.add(M) ;
                        MCOs.add(Found) ;
                        } 
                    else{
                        System.out.println("MC: PrepositiveMark not followed by a Consonant."
                            + "\nWord: " + W + "\nType: " + M.Type ) ;
                        MCOs.add(M) ;
                        System.exit(0) ;
                        }
                    }
                else{
                    MCOs.add(MC.getMCO(I)) ;
                    }
                }
            }
//-----------------------------------------------------------------------------
            
        else if(Type == MCO.Note){
            k++ ;
            c1 = W.charAt(k) ;
// Check for an inverted nun.   Assumes the note immediately follows a nun.
            if (c1=='8'){
                MCO Mtemp = (MCO) MCOs.lastElement() ;
                if( (Mtemp.Name).compareTo("nun") == 0) {
                    String in = H.Invertednun ;
                    Mtemp.Name = "invertednun" ;   
                    Mtemp.Value = in ;   
                    Mtemp.FinalValue = in ;  
// The masoranumberdot fails to work in IE. Ezra SIL already provides a dot.
// Providing no accent.
//                  MCO ud = (MCO) (MC.getMCO(81)).clone() ; // revia 81, masora 96
//                  MCOs.add(ud) ;
                    }
                else{
                    System.out.println("Prior MCO isn't a nun!") ;
                    }
                }
// Leave a note
            M.Value = Character.toString(c1) ;
            MCOs.add(M) ;
            }
        else{
            System.out.println("MC: Unknown type for an MCO Object.") ;
            }
        }
//-----------------------------------------------------------------------------
               
// At this point the Consonants are where they should be.
// Locating the consonants and FinalConsonants.

// An incoming word a final consonant before a maqaf 
// as well as at the end .
 
    int LastConsonant = -1 ;
    int ConsonantIndex = 0 ;
    int ConsonantCount = 0 ;
    for (int k = 0; k < MCOs.size(); k++){
        M = (MCO) MCOs.elementAt(k) ;
        if( M.Type == MCO.Consonant ){
            ConsonantPositions[ConsonantIndex] = k ;
            LastConsonant = k ;
            ConsonantIndex++ ;
            ConsonantCount++ ;
            }
// Look for a Maqef, if found, set the LastConsonant final.
        if( (M.Name).compareTo("maqef") == 0){
            setFinal(LastConsonant) ;
            }
        }
//    System.out.println("ObjectCount: " + MCOs.size() ) ;
//    System.out.println("ConsonantCount: " + ConsonantCount) ;
//    System.out.println("LastConsonant: " + LastConsonant) ;
    
//    for (int k = 0; k < ConsonantCount; k++){
//        System.out.println("ConsonantPositions[" + k + "]: " + ConsonantPositions[k]) ;
//         }
//-----------------------------------------------------------------------------
        
    if (ConsonantCount > 0){
       
// Set the final consonant, if any.

        setFinal(LastConsonant) ;
            
//      print(MCOs) ;

//-----------------------------------------------------------------------------

// Order the MCOs

    OrderedMCOs = new Vector() ;    
    int Limit = 0 ;
    for( int ConsonantNumber = 0; ConsonantNumber < ConsonantCount; ConsonantNumber++) {
       if (ConsonantNumber+1 == ConsonantCount){
           Limit = MCOs.size() ;
           }
       else{
           Limit = ConsonantPositions[ConsonantNumber+1] ;
           }
       Order(MCOs, ConsonantPositions[ConsonantNumber], Limit, OrderedMCOs ) ;

       }

       }
    else{
       OrderedMCOs = MCOs ;
       }      


//  print(OrderedMCOs) ;
     
//-----------------------------------------------------------------------------

// Output the ordered Vector

    String S = "" ;
    for (int k = 0; k < OrderedMCOs.size(); k++){
        M = (MCO) OrderedMCOs.elementAt(k) ;
        Type = M.Type ;
//  Only Notes require special treatment
        if (Type == MCO.Note){
            S = S + "<x>" + M.Value + "</x>" ;
            }
        else if ((Type == MCO.MorphologicalDivision)){
            S = S + A.MorphologicalDivisionMarker ;
            }
        else{
            S = S + M.Value ;
//            System.out.println(Integer.toString( (int) M.Value.charAt(0), 16)) ;
            } 
        }      
        
    return S ;
    }
//-----------------------------------------------------------------------------

// Order the Marks following a Consonant.

void Order( Vector MCOs, int StartIndex, int Limit, Vector OrderedMCOs) {
     MCO m ;
     
//  Check for no Marks
     if(StartIndex+1==Limit){
         m = (MCO) MCOs.elementAt(StartIndex) ;
         OrderedMCOs.add(m) ;
         return ;
         }
//  Check for one Mark
     if(StartIndex+2==Limit){
         m = (MCO) MCOs.elementAt(StartIndex) ;
         OrderedMCOs.add(m) ;
         m = (MCO) MCOs.elementAt(StartIndex+1) ;
         OrderedMCOs.add(m) ;
         return ;
         }
         
// Two or more Marks
         
// Save the Consonant
     m = (MCO) MCOs.elementAt(StartIndex) ;
     OrderedMCOs.add(m) ;

// Order the marks
     int MarkCount = (Limit-StartIndex)-1 ; 
     boolean[] Written = new boolean[MarkCount] ;
     for (int k =0; k < MarkCount; k++){
         Written[k] = false ;
         }
         
     int WrittenCount = 0 ;
     do{        
// Find the MCO with the smallest possible Group value and write it.
         int GroupTest = 1000 ;
         int MCOMin = -1 ;
         for( int k = StartIndex+1; k < Limit; k++){
             if(!Written[ k -(StartIndex+1) ]){
                 m = (MCO) MCOs.elementAt(k)  ;
                 int g = m.Group ;
                 if ( g < GroupTest ){
                     GroupTest = g ;
                     MCOMin = k ;
                     }
                 }
             }
         m = (MCO) MCOs.elementAt(MCOMin) ;
         OrderedMCOs.add(m) ;
         Written[MCOMin -(StartIndex+1) ] = true ;
         WrittenCount++ ;
         }while(WrittenCount < MarkCount) ;
            
     }
//-----------------------------------------------------------------------------

// Output a message plus position.

public void message(String m){
    System.out.print(m) ;
    P.printPosition() ;
    }
//-----------------------------------------------------------------------------

// Output a message plus position.

public void print(Vector v){
    System.out.println("\n") ;
    for (int k = 0; k < v.size(); k++){
        MCO m = (MCO) v.elementAt(k) ;
        m.print() ;
        }
    System.out.println("\n") ;
    }
//-----------------------------------------------------------------------------

// Set a consonant as final.

public void setFinal(int Position){
// Do nothing if there's no Position to set
        if (Position < 0) return ;
        
        M = (MCO) MCOs.elementAt(Position) ;
        if (M.Type == MCO.Consonant){
            MCO Final = new MCO("final" + M.Name, MCO.Consonant, M.FinalValue, M.FinalValue,
                 M.Group) ;
            MCOs.setElementAt(Final, Position) ;
            }
        else{
            message("LastConsonant is not a consonant!") ;
            }
        return ;
        }
//-----------------------------------------------------------------------------
}
//==============================================================================
//==============================================================================

--- NEW FILE: UnicodeChar.java ---
package WLC2OSIS.Translate ;

import WLC2OSIS.* ;
import WLC2OSIS.Utilities.* ;
//==============================================================================
/**
 *  <b>Object describing Unicode Hebrew characters and their relation
 *     to the MC characters.</b><p>
 *
 *   The static array UnicodeChars describes Hebrew Unicode characters
 *   and gives their relationship to the MCW letter code.
 */
//==============================================================================
public class UnicodeChar{
/** Starting index for block of Hebrew Unicode characters.*/
public static final int UnicodeStart = 0x00000590 ;
/** Ending index for block of Hebrew Unicode characters.*/
public static final int UnicodeEnd = 0x00000600 ;
/** Size of block of Hebrew Unicode characters.*/
public static final int N = (UnicodeEnd - UnicodeStart) ;

// Object contents 

/** Unicode name WITHOUT the word HEBREW or its type. 
 *  Capital followed by lower case. 
 */
public String Name = "" ; // Unicode name WITHOUT the word HEBREW or
                          // its type. Capital followed by lower case.
/** Unicode type: Accent, Point, Punctuation, Letter, or Ligature. */
public String Type = "&#160;" ; 
 /** Unicode character value. */                         
public char Value= ' ' ;  // Unicode character value.
/** List of equivalent characters represented by this Unicode character.*/
public String Equivalents = "" ; // List of equivalents
/** Notes provided by the Unicode group.*/
public String Notes = "" ;       //  Additional notes.   
/** MCW characters corresponding to this Unicode character.*/
public String MCCode = "" ;
/** Combining group value. */
public String Group = "" ;

/** Array of all Hebrew Unicode characters, 0...N. */
public static UnicodeChar[] UnicodeChars = new UnicodeChar[N] ;
/** Number of special Unicode characters */
public static final int Special = 6;
/** Array of special, non-Hebrew characters */
public static UnicodeChar[] SpecialChars = new UnicodeChar[Special] ;

//-----------------------------------------------------------------------------
/**
 * Creates a UnicodeChar object from the given arguments.
 */
UnicodeChar( char Value, String Name, String Type, String Equivalents, String Notes){
    this.Value = Value ;
    this.Name = Name ;
    this.Type = Type ;
    this.Equivalents = Equivalents ;
    this.Notes = Notes ;
    }
//-----------------------------------------------------------------------------
/**
 * Sets the array  of UnicodeChar[], UnicodeChars, from the
 * Characters array.
 *
 * @param Characters MCO[] array of MCO object whose 
 *      index is the value of the corresponding MCW character. 
 */
public static void setUnicodeChars( MCO[] Characters, MCO[] Numbers ) {
 
    for (char k =0; k < N; k++){
        UnicodeChars[k] = new UnicodeChar( '?',  "Undefined", "Unspecified", "&#160;" ,  "&#160;") ;
        }
    for (char k =0; k < Special; k++){
        SpecialChars[k] = new UnicodeChar( '?',  "Undefined", "Unspecified", "&#160;" ,  "&#160;") ;
        }
    
// Verify the H assignment and enter into table
    
    enterChar(0x0591, H.etnachta,  "Etnachta", "Accent") ;
    enterChar(0x0592, H.accentsegol,     "Segol", "Accent" ) ;
    enterChar(0x0593, H.shalshelet,"Shalshelet", "Accent" ) ;
    enterChar(0x0594, H.zaqefqatan,  "Zaqef Qatan", "Accent" ) ;
    enterChar(0x0595, H.zaqefgadol,  "Zaqef Gadol", "Accent" ) ;
    enterChar(0x0596, H.tipeha,  "Tipeha", "Accent", "Tarha",  "&#160;" ) ;
    enterChar(0x0597, H.revia,  "Revia", "Accent" ) ;
    enterChar(0x0598, H.zarqa,  "Zarqa", "Accent", 
              "Tsinorit, Zinorit, Tsinor, Zinor",
              "This character is to be used when Zarqa or Tsinor are placed above, and also for Tsinorit."
               ) ;
    enterChar(0x0599, H.pashta,  "Pashta", "Accent" ) ;
    enterChar(0x059a, H.yetiv,  "Yetiv", "Accent" ) ;
    enterChar(0x059b, H.tevir,  "Tevir", "Accent" ) ;
    enterChar(0x059c, H.geresh,  "Geresh", "Accent" ) ;
    enterChar(0x059d, H.gereshmuqdam,  "Geresh Muqdam", "Accent" ) ;
    enterChar(0x059e, H.gershayim,  "Gereshayim", "Accent" ) ;
    enterChar(0x059f, H.qarneypara,  "Qarney Para", "Accent" ) ;
    enterChar(0x05a0, H.telishagedola,  "Telisha Gedola", "Accent") ;
    enterChar(0x05a1, H.pazer,  "Pazer", "Accent" ) ;
    enterChar(0x05a3, H.munah,  "Munah", "Accent" ) ;
    enterChar(0x05a4, H.mahapakh,  "Mahapakh", "Accent" ) ;
    enterChar(0x05a5, H.merkha,  "Merkha", "Accent",
             "Yored", "&#160;") ;
    enterChar(0x05a6, H.merkhakefula,  "Merkha Kefula", "Accent") ;
    enterChar(0x05a7, H.darga,  "Darga", "Accent") ;
    enterChar(0x05a8, H.qadma,  "Qadma", "Accent" ) ;
    enterChar(0x05a9, H.telishaqetana,  "Telisha Qetana", "Accent" ) ;
    enterChar(0x05aa, H.yerahbenyomo,  "Yerah Ben Yomo", "Accent",
             "Galgal", "&#160;" ) ;
    enterChar(0x05ab, H.ole,  "Ole", "Accent" ) ;
    enterChar(0x05ac, H.iluy,  "Iluy", "Accent" ) ;
    enterChar(0x05ad, H.dehi,  "Dehi", "Accent" ) ;
    enterChar(0x05ae, H.zinor,  "Zinor", "Accent",
             "Tsinor, Zarqa",
             "This character is to be used when Zarqa or Tsinor are placed above left." ) ;
    enterChar(0x05af, H.masoracircle,  "Masora Circle", "Mark" ) ;
    enterMCCodeAndGroup(0x05af, "Not used", "12") ;
    enterChar(0x05b0, H.sheva,  "Sheva", "Point") ;
    enterChar(0x05b1, H.hatafsegol,  "Hataf Segol", "Point" ) ;
    enterChar(0x05b2, H.hatafpatah,  "Hataf Patah", "Point" ) ;
    enterChar(0x05b3, H.hatafqamats,  "Hataf Qamats", "Point" ) ;
    enterChar(0x05b4, H.hiriq,  "Hiriq", "Point" ) ;
    enterChar(0x05b5, H.tsere,  "Tsere", "Point" ) ;
    enterChar(0x05b6, H.segol,  "Segol", "Point" ) ;
    enterChar(0x05b7, H.patah,  "Patah", "Point", 
               "&#160;",
               "Furtive patah is not a distinct character.") ;
    enterChar(0x05b8, H.qamats,  "Qamats", "Point" ) ;
    enterChar(0x05b9, H.holam,  "Holam", "Point") ; 
    enterChar(0x05bb, H.qubuts,  "Qubuts", "Point" ) ;
    enterChar(0x05bc, H.dagesh,  "Dagesh", "Point",
        "Mapiq, Shuriq", "Falls within base letter." ) ;
    enterChar(0x05bd, H.meteg,  "Meteg", "Point",
        "Siluq",
        "Maybe used as a Hebrew accent sof pasuq."
        + "Left (75), center (35), and right (95) metegs are separately grouped"
        + " to produce correct positioning." 
        + " The center meteg is preceded by a ZWJ, u200D, for positioning." ) ;
    enterChar(0x05be, H.maqaf,  "Maqaf", "Point") ;
    enterChar(0x05bf, H.rafe,  "Rafe", "Point" ) ;
    enterChar(0x05c0, H.paseq,  "Paseq", "Punctuation",
        "Legarmeh", 
        "May be treated as spacing punctuation, not as a point. "
        + "Each Paseq is preceded by a Space, \\u0020, for positioning." ) ;
    enterChar(0x05c1, H.shindot,  "Shin Dot", "Point") ;
    enterChar(0x05c2, H.sindot,  "Sin Dot", "Point" ) ;
    enterChar(0x05c3, H.sofpasuq,  "Sof Pasuq", "Point",
        "&#160;", "May be used as a Hebrew punctuation colon.") ;
    enterChar(0x05c4, H.upperdot,  "Upper Dot", "Mark" ) ;
    
    enterChar(0x05d0, H.alef,  "Alef", "Letter" , "Aleph", "&#160;") ;
    enterChar(0x05d1, H.bet,  "Bet", "Letter" ) ;
    enterChar(0x05d2, H.gimel,  "Gimel", "Letter" ) ;
    enterChar(0x05d3, H.dalet,  "Dalet", "Letter" ) ;
    enterChar(0x05d4, H.he,  "He", "Letter" ) ;
    enterChar(0x05d5, H.vav,  "Vav", "Letter" ) ;
    enterChar(0x05d6, H.zayin,  "Zayin", "Letter" ) ;
    enterChar(0x05d7, H.het,  "Het", "Letter" ) ;
    enterChar(0x05d8, H.tet,  "Tet", "Letter" ) ;
    enterChar(0x05d9, H.yod,  "Yod", "Letter" ) ;
    enterChar(0x05da, H.finalkaf,  "Final Kaf", "Letter" ) ;
    enterChar(0x05db, H.kaf,  "Kaf", "Letter" ) ;
    enterChar(0x05dc, H.lamed,  "Lamed", "Letter" ) ;
    enterChar(0x05dd, H.finalmem,  "Final Mem", "Letter" ) ;
    enterChar(0x05de, H.mem,  "Mem", "Letter" ) ;
    enterChar(0x05df, H.finalnun,  "Final Nun", "Letter" ) ;
    enterChar(0x05e0, H.nun,  "Nun", "Letter" ) ;
    enterChar(0x05e1, H.samekh,  "Samekh", "Letter" ) ;
    enterChar(0x05e2, H.ayin,  "Ayin", "Letter" ) ;
    enterChar(0x05e3, H.finalpe,  "Final Pe", "Letter" ) ;
    enterChar(0x05e4, H.pe,  "Pe", "Letter" ) ;
    enterChar(0x05e5, H.finaltsadi,  "Final Tsadi", "Letter") ;
    enterChar(0x05e6, H.tsadi,  "Tsadi", "Letter") ;
    enterChar(0x05e7, H.qof,  "Qof", "Letter" ) ;
    enterChar(0x05e8, H.resh,  "Resh", "Letter" ) ;
    enterChar(0x05e9, H.shin,  "Shin", "Letter"  ) ;
    enterChar(0x05ea, H.tav,  "Tav", "Letter" ) ;
   
//    enterChar(0x05f0, H.doublevav,  "Yiddish Double Vav", "Ligature" ) ;
//    enterChar(0x05f1, H.vavyod,  "Yiddish Vav Yod", "Ligature" ) ;
//    enterChar(0x05f2, H.doubleyod,  "Yiddish Double Yod", "Ligature" ) ;

//    enterChar(0x05f3, H.punctgeresh,  "Geresh", "Punctuation",
//               "&#160;", "Punctuation, not an accent.") ;
//    enterChar(0x05f4, H.punctgershayim,  "Gershayim", "Punctuation",
//               "&#160;", "Punctuation, not an accent.") ;
    
//-----------------------------------------------------------------------------

//  Set the MCO[] Characters into the UnicodeChar array.

    for(int k=0; k < 128; k++){
        MCO m = Characters[k];
        if(m.Type!=MCO.Unknown){
            char test = (m.Value).charAt(0)  ;
// Try to find the Value in the UnicodeChars array,
            boolean FoundValue = false;
            int j ;
            for (j = 0; j < N; j++){
                if(test == UnicodeChars[j].Value ){
                    FoundValue = true ;
                    break ;
                    }
                }
            if(FoundValue){
                if((char)k=='&'){
                    }
                else{
                    UnicodeChars[j].MCCode = new Character((char)k).toString() ;
                    UnicodeChars[j].Group = new Integer(m.Group).toString() ;
                    }
                }
//  Try to find it as a final character
            test = (m.FinalValue).charAt(0)  ;
            FoundValue = false ;
            for (j = 0; j < N; j++){
                if(test == UnicodeChars[j].Value ){
                    FoundValue = true ;
                    break ;
                    }
                }
            if(FoundValue){
                if((char)k=='&'){
                    }
                else{
                    UnicodeChars[j].MCCode = new Character((char)k).toString() ;
                    UnicodeChars[j].Group = new Integer(m.Group).toString() ;
                    }
                }
            }
        }
//-----------------------------------------------------------------------------

//  Set the MCO[] Numbers into the UnicodeChar array.

    for(int k=0; k < 100; k++){
        MCO m = Numbers[k];
        if(m.Type!=MCO.Unknown){
            char test = (m.Value).charAt(0)  ;
// Try to find the Value in the UnicodeChars array,
            boolean FoundValue = false;
            int j ;
            for (j = 0; j < N; j++){
                if(test == UnicodeChars[j].Value ){
                    FoundValue = true ;
                    break ;
                    }
                }
            if(FoundValue){
                if (UnicodeChars[j].MCCode.compareTo("") == 0){
                    UnicodeChars[j].MCCode = new Integer(k).toString() ;
                    }
                else{
                    UnicodeChars[j].MCCode = UnicodeChars[j].MCCode 
                           + ", " + new Integer(k).toString() ;
                    }
                UnicodeChars[j].Group = new Integer(m.Group).toString() ;
                }
            }
        }
// Special characters

    enterMCCodeAndGroup(0x05bd, "35, 75, 95", "8, 8, 6") ;
    enterMCCodeAndGroup(0x05c0, "5", "16") ;
    enterMCCodeAndGroup(0x05c1, "Not used", "1") ;
    enterMCCodeAndGroup(0x05c2, "Not used", "2") ;
    UnicodeChars[33].MCCode = ":E" ;
    UnicodeChars[33].Group = "7" ;
    UnicodeChars[34].MCCode = ":A" ;
    UnicodeChars[34].Group = "7" ;
    UnicodeChars[35].MCCode = ":F" ;
    UnicodeChars[35].Group = "7" ;
    UnicodeChars[89].MCCode = "&amp;, $" ;
    UnicodeChars[89].Group = "0" ;
    
//----------------------------------------------------------------------------

// Special, non-Hebrew characters

    SpecialChars[0] = new UnicodeChar( '\u0020', "Space", 
         "Space" , "&#160;",   "Paseq is a Space + Paseq.") ;
    SpecialChars[0].Group = "&#160;" ;
    SpecialChars[0].MCCode = "Not used";

    SpecialChars[1] = new UnicodeChar( '/', "Slash", 
         "Morphological divider." , "&#160;", "Morphological divider." ) ;
    SpecialChars[1].Group = "&#160;" ;
    SpecialChars[1].MCCode = "/";
    
    SpecialChars[2] = new UnicodeChar( '\u0307', "Masora or Number dot", 
         "PrepositiveMark" , "&#160;",   "Upper punctum. MC code 53, is translated "
         + "as an Upper Dot, \\u05c4, not as this character. "
         + "This mark is not currently positioned properly by Internet Explorer.") ;
    SpecialChars[2].Group = "12" ;
    SpecialChars[2].MCCode = "(53)";

    SpecialChars[3] = new UnicodeChar( '\u0323', "Combining dot below", 
         "PrepositiveMark" , "&#160;",   "Lower punctum. "
         + "This mark is not currently positioned properly by Internet Explorer.") ;
    SpecialChars[3].Group = "12" ;
    SpecialChars[3].MCCode = "52";
     
    SpecialChars[4] = new UnicodeChar( '\u200D', "Zero width joiner (ZWJ)", 
         "General punct." , "&#160;",   "Center meteg is a ZWJ + meteg.") ;
    SpecialChars[4].Group = "&#160;" ;
    SpecialChars[4].MCCode = "Not used";

    SpecialChars[5] = new UnicodeChar( '\uf300', "Inverted nun", 
         "General punct." , "&#160;",   "Not part of the current Unicode standard. "
             + "Displays acceptably in either SBL Hebrew or Ezra SIL fonts.") ;
    SpecialChars[5].Group = "&#160;" ;
    SpecialChars[5].MCCode = "Not used";


//-----------------------------------------------------------------------------
    return ;
    }
//-----------------------------------------------------------------------------
/**
* Enters a Unicode character into the array UnicodeChars.
*/
static void enterChar(int value,  char c, String Name, String Type, 
        String Equivalents, String Notes) {
    if ( c != (char) value ){
      System.out.println("UnicodeChars:  Error in character table!") ;
      System.out.println("Character: " + c + "   Value: " + value ) ;
      }
    UnicodeChars[value-UnicodeStart] 
        = new UnicodeChar( (char)value, Name, Type, Equivalents, Notes) ;
    }
//-----------------------------------------------------------------------------
/**
* Enters a Unicode character into the array UnicodeChars.
*/
static void enterChar(int value,  char c, String Name, String Type) {
    if ( c != (char) value ){
      System.out.println("UnicodeChars:  Error in character table!") ;
      System.out.println("Character: " + c + "   Value: " + value ) ;
      }
    UnicodeChars[value-UnicodeStart] 
        = new UnicodeChar( (char)value, Name, Type, "", "") ;
    }
//-----------------------------------------------------------------------------
/**
* Enters the MCCode and Group number for a UnicodeChar.
*/
static void  enterMCCodeAndGroup(int k, String MCCode, String Group ){
    UnicodeChars[k-UnicodeStart].MCCode = MCCode ;
    UnicodeChars[k-UnicodeStart].Group = Group ; 
    }
//-----------------------------------------------------------------------------

// Writes the Unicode characters as an XML file.

// ** This belongs in UnicodeChars ***

public static void writeUnicodeChars(XMLWriter w) {
    w.openTag("coding", 0) ;
    for (int k=0; k < N ; k++){
        int i = (int) UnicodeChars[k].Value ;
        String h = Integer.toHexString(i) ;
        w.openTag("char", 1) ;
        w.writeString("value", 2, new Character(UnicodeChars[k].Value).toString() ) ;
        w.writeString("hexvalue", 2, h ) ;
        w.writeString("name", 2, UnicodeChars[k].Name) ;
        w.writeString("mccode", 2, UnicodeChars[k].MCCode) ;
        w.writeString("type", 2, UnicodeChars[k].Type) ;
        w.writeString("equivalents", 2, UnicodeChars[k].Equivalents) ;
        w.writeString("notes", 2, UnicodeChars[k].Notes) ;
        w.writeString("group", 2, UnicodeChars[k].Group) ;
        w.closeTag("char", 1) ;
        }
    for (int k=0; k < Special ; k++){
        int i = (int) SpecialChars[k].Value ;
        String h = Integer.toHexString(i) ;
        w.openTag("specialchar", 1) ;
        w.writeString("value", 2, new Character(SpecialChars[k].Value).toString() ) ;
        w.writeString("hexvalue", 2, h ) ;
        w.writeString("name", 2, SpecialChars[k].Name) ;
        w.writeString("mccode", 2, SpecialChars[k].MCCode) ;
        w.writeString("type", 2, SpecialChars[k].Type) ;
        w.writeString("equivalents", 2, SpecialChars[k].Equivalents) ;
        w.writeString("notes", 2, SpecialChars[k].Notes) ;
        w.writeString("group", 2, SpecialChars[k].Group) ;
        w.closeTag("specialchar", 1) ;
        }
     w.closeTag("coding", 0) ;
     }
//-----------------------------------------------------------------------------
}
//==============================================================================
//==============================================================================

--- NEW FILE: WKQ.java ---
package WLC2OSIS.Translate;

import WLC2OSIS.* ;
import WLC2OSIS.Parse.* ;
import WLC2OSIS.Utilities.* ;
//==============================================================================
/**
 *  <b>Processes usual and Ketib/Qere words.</b><p>
 *
 *  Modified for WLC **qq and *kk null qere and null ketib entries.
 */
//==============================================================================
public class WKQ{

Parser P ;

String Ketib;
int KCount ;
boolean KStarted ;

String Qere ;
int QCount ;
boolean QStarted ;
//-----------------------------------------------------------------------------

public WKQ( Parser P ) {
    this.P = P ;
    }    
//------------------------------------------------------------------------------
/**
 *  Processes MCW words, writing them using the Word.write(Word, Type) method.
 *
 *  @param W String containing MCW word of any type.
 */
public void process(String W) {

    int asteriskcount = P.countChar(W, '*') ;
    int FirstAsterisk = W.indexOf('*') ;
    int LastAsterisk = W.lastIndexOf("*") ;
//----------------------------------------------------------------------------------

// Process a non-KQ

    if (asteriskcount == 0){
        P.w.write(W, "w") ;
        }
//----------------------------------------------------------------------------------

// Look for a KQ that starts with a non-KQ string in the word
// usually abc*xyz. Write abc as a nonKQ word, the process *wxyz.
 
    
    if (FirstAsterisk > 0 && P.countChar(W,'*') >= 1 ){
        String NonKQ = W.substring(0, FirstAsterisk) ;
        P.w.write(NonKQ, "w") ;
        W = W.substring(FirstAsterisk, W.length() ) ;
        process(W) ; // Could be either K or Q
        }
//-----------------------------------------------------------------------------

//  One word has two K,Q sections. *xyz**abc, **xyz*abc, *xyz*abc, **xyz**abc
//  Process the two parts separately.

    else if(P.countChar(W,'*') >= 2 & LastAsterisk > 1 ){
        int Split = W.indexOf('*', 2) ;
        String Part1 = W.substring(0, Split) ;
        String Part2 = W.substring(Split, W.length()) ;
        process(Part1) ;
        process(Part2) ;
        }
//-----------------------------------------------------------------------------

// W has ONLY a leading asterisk or two leading asterisks

    else{
        if(W.charAt(0) == '*'){
            if(W.charAt(1) != '*'){

// Ketib

//        Do nothing if a null K
                if (W.compareTo("*kk") != 0){
                    P.w.write(W.substring(1, W.length() ), "k") ;
                    } 
                }
            else{
            
// Qere

//       Check for a null Q
                if (W.compareTo("**qq") != 0){
                    P.w.write(W.substring(2, W.length() ), "q") ;
                    }
                } 
            }
         }
     return ;
     }   
//------------------------------------------------------------------------------
}
//==============================================================================
//==============================================================================

--- NEW FILE: package.html ---
<HTML>
<BODY>
<b>Classes to translate from the ASCII MC format to Unicode<b>.
<p/>
<p align="right"> (BHS2XML/Translate/package.html)
<p/>
Only the BookName and Note classes are specific to the WLC.</BODY>
</HTML>



More information about the sword-cvs mailing list