Foreign characters in TBK3.0 (long)

> Date:     Thu, 24 Aug 1995 08:49:26 +0000
> From:     gasmit@facstaff.wm.edu (Gary A. Smith)
> Subject:  Re: Foreign characters in TBK3.0
> To:       Chailerd Pichitpornchai
>           
>
> Hi,
>
>     I would be interested in your Ctrl-2 handler for typing in
> letters with diacritical marks.  I have been looking for an efficient
> way to get those upper-ASCII characters on the screen in some foreign
> language programs I have written.  I have devised a "buttonbar"
> solution, where the user clicks on buttons whose captions are the
> letters required for a specific language.  But I haven't been able to
> use this solution for input in request or ask boxes.  Would your
> handler solve that?
>
> +---------------------------------+----------------------------------+
> | Gary Smith                      | Voice: 804-221-3660              |
> | Department of Modern Languages  | FAX:   804-221-3637              |
> |   and Literatures               | Email: gasmit@facstaff.wm.edu    |
> | College of William and Mary     |                                  |
> | Williamsburg, VA 23187-8795     |                                  |
> +---------------------------------+----------------------------------+
> |"Wer immer strebend sich bemueht, den koennen wir erloesen" - Goethe|
> | Rough translation: Just keep on trying, and you'll get your reward.|
> +--------------------------------------------------------------------+
>

I think that the following techniques and handlers will be of useful to many developers whose work is dealing with data entry for letters with diacritical marks. So I decided to post to the list.

What you actually need are one lookup "Table" and 3 handlers described in (4) below. However, you need to create a couple of extra temporary fields to make life easier in creating the lookuup "Table".

Let's start...

  1. Make a temporary field First of all you creat a temporary field, named "Temp1", to fill in the letters that are filled between 128 to 255, by using the buttonClick handler below.
    (This will facilitate the copying of the letters with diacritical marks into the actual lookup "Table".)

    Create a temporary button with the following handler.
    Then execute it.

    to handle buttonClick
        local string x
        sysLockScreen = true
        clear x
        step i from 128 to 255
            x = x & i & " : " & ansiToChar(i) & crlf
        end
        text of field "Temp1" = x
    end
    

  2. Create another temporary field, named "Temp2" and set activated script property to true. Put the following handler in it's script.
    to handle keyDown key, isShift, isCtrl
        request "The scancode is" && key & "."
        forward
    end
    
This is for getting the scancode of the key you press on the keyboard and you can use this return code to fill in the first item of each 3-item entry in the actual lookup "Table" in (3). For example, you type in this field when you want to know the scancode of the key "a" or key "'" (acute).
  • Create the actual lookup "Table" field, named "Table", and set the fieldType to "noWrap". The contents of this field will be something like this:

    base entry,1st lookup entry,2nd lookup entry,...
    
    Examples:

    65,false,a,192,false,a,222,false,a,54,true,a,222,true,ae,...
    65,true,A,192,false,[A-grave],222,false,[A-accent],...
    ...
    (add as many lookup table lines as you would like it to be)

    The layout of the table will be as follows.

    1. Each textline will contain all the letters that have the same base letter but have different diacritical marks. For example, in textLine 1, there will be those letters begun with the letter "a"
             "a" with "'" (acute accent), "a" with "^" (circumflex), ...
      
             And in textLine 2, there will be those letters begun with
             the letter "e"
      
             "e" with "'" (acute accent), "e" with "^" (circumflex), ...
      
             And so on...
      
    2. In each entry of each textLine, there will be 3 values (items) per entry.
             item1,item2,item3, item4,item5,item6, ...
             ^^^^^^^^^^^^^^^^^
             (base entry)       (lookup entry)
      
      
             Base entry
             ~~~~~~~~~~
             The first 3 items will be the base entry or the base letter and
             they will be representing
      
             item1 = scancode    (you get this number from trying typing in
                                  the field "Temp2", for example, the value
                                  for key "a" is 65)
             item2 = shift state ( false = lowercase "a"
                                   true  = uppercase "a")
             item3 = base letter ( for example, the letter a)
      
      
             Lookup entry
             ~~~~~~~~~~~~
             Each lookup entry will be composed of 3 items representing
             as follows.
      
             item4 = scancode    (for example, the value for
                                  key "'" (accent) is 222)
      
             item5 = shift state (for example, when you want to put
                                  the umlaut, you have to press
                                  shift+' to get ")
      
             item6 = the actual letter that has diacritical mark with it
                     (you copy and paste from field "Temp1")
      
      
      **  Example of textLine 1 of field "Table" for the base letter "a"
      
          65,false,a,192,false,a,222,false,a,54,true,a,222,true,ae,...
      
      
      **  Explanation:
      
          65,false,a  is the base entry for lowercase "a" lookup table
      
          192,false,[actual letter of an "a" with "`" (grave)]
      
          222,false,[actual letter of an "a" with "'" (accent)]
      
          54,true,[actual letter of an "a" with "^" (circumflex)]
      
          222,false,[actual letter of an "a" with """ (double quote) to
                     get the umlaut]
          ...
      
          To build the uppercase "A" with its diacritical marks, just
          copy the line in the example and modify according to the
          shift state as follows.
      
          65,true,A,192,false,A,222,false,A,54,true,A,222,true,AE,...
      
      
      **  To build the lookup "Table" is not quite difficult as you expected
          because you just find the scancode the first time and then you
          can use them over and over.
          And you have to build this table just once.
      
      -----------------------------------------------------------------
      
      (4). Now, this is the actual working part that you need to put into
           either the field, recordField, page, background, or book script
           (up to you).
      
      ----------------------------------------------------------------------
      --
      -- **  Copyright  1995  Chailerd Pichitpornchai, MD, PhD
      --
      -- **  This is a freeware. Use with your own risks.
      --
      -- **  Please acknowledge if you use these handlers in your
      --     applications.
      --
      -- **  Last update: 26/08/95
      --
      ----------------------------------------------------------------------
      --   Data Entry for letters with diacritical marks
      --
      --   Handlers for entering letters with diacritical marks.
      --   Use a key combination of Ctrl-2 to flag the starting point of
      --     a sequence of following 2 keys combination.
      --     Then the user just press the 2 appropriate keys combination
      --     to produce the upper ASCII letters.
      --     For example, to type in an "a" with a circumfles "^" on top,
      --     the user will press Ctrl-2 then type the letter "a" and
      --     followed immediately by the letter "^" (pressing shift-6).
      --   If the user types in a nonexisting diacritical mark, the program
      --     will ignore the first key but print the second key instead.
      --
      ----------------------------------------------------------------------
      
      to handle keyDown key, isShift, isCtrl
          system string Table
          system logical Ctrl2
          system int rowNumber
      
          Table = text of field "Table"
      
          conditions
      
          -- The Shift key is pressed for uppercase diacritics
          when key = keyShift
              break
      
          -- Start the 2 keys combination
          when isCtrl and key = key2
              Ctrl2 = True    -- set the "Ctrl2" flag
              rowNumber = 0   -- rowNumber 0 = start 2 keys combination
                              --           1 = 1 key has been entered
                              --          -1 = 2 keys have been entered and
                              --               finished
      
          -- in-between 2 keys combination
          when Ctrl2 = True and rowNumber = 0
              -- see if the 1st key is in the Table
              result = isInTable(key, isShift)
      
              if item 1 of result = True then
                  get flushMessageQueue() -- eat the 1st key stroke
                  rowNumber = item 2 of result
              else
                  Ctrl2 = False
                  rowNumber = -1
              end
      
          -- 2 keys have been entered
          when Ctrl2 = True and rowNumber > 0
              aRow = textLine rowNumber of Table
              step i from 4 to itemCount(aRow) by 3
                  keyShiftPressed = item i+1 of aRow
                  if (key = item i of aRow) and (isShift = keyShiftPressed)
                      rowNumber = -1
                      get flushMessageQueue() -- eat the 2nd key stroke
                      -- print diacritics
                      send keyChar CharToAnsi(item i+2 of aRow)
                      Ctrl2 = False   -- reset the flag
                      found = True
                      break step
                  end
              end
              if found <> True then -- the second key is not in the table
                  Ctrl2 = False     -- ToolBook will print the 2nd key
                  rowNumber = -1
              end
          else                      -- normal key
              forward
          end
      end
      
      to get isInTable k, isS
          system string Table
          step i from 1 to textLineCount(Table)
              get textLine i of Table
              if (k = item 1 of It) and (isS = item 2 of It) then
                  return True, i
                  break step
              end
          end
          return False
      end
      
      to handle keyChar key, isShift, isCtrl
          system logical Ctrl2
          system int rowNumber
      
          conditions
      
          -- In-between 2 key combinations
          when Ctrl2 = True and rowNumber > 0
              --  eat the keystroke
      
          -- Complete the 2 keys combination
          when Ctrl2 = True and rowNumber = -1
              --  print the diacritics
              forward
      
          -- Normal key
          else
              forward
          end
      end
      ======================================================================
      
      The above mentioned method is a minor part of my work that I
      will be presenting at the World Developers' Conference '95
      which will be held during 11-13 September.
      
      My presentation title is
      
      "QED Tutorial Outliner & Template
          - Flexible Authoring with Mechanistic Simulation"
      
      and it is scheduled for Monday, September 11th at 4.30pm in
      the Crossroads room in the Bellevue Red Lion Hotel, Washington.
      
      If any of you happens to come to the meeting, you will be very welcome
      to drop by and discuss with me at the presentation or at the meeting.
      
      I will be absent from the list for a month in September because
      I will be flying to Auckland, New Zealand this upcoming Thursday to
      give a 2-day Multimedia ToolBook training course organised by local
      Asymetrix distributors in NZ. Then I will be heading to the
      Conference and the holidays in the west coast of USA.
      
      I'm really looking forward to attending this exciting Conference!!!
      
      Talk to you all soon.
      
      Chailerd.
      
      
      ***************************************************
      Chailerd Pichitpornchai, MD, PhD
      Research Fellow, ToolBook Consultant
      Quality Education at a Distance (QED) Research Unit
      Monash University, Australia.
      Tel: (61-3) 9905-9141         Fax: (61-3) 9905-2891
      
      *      Asymetrix Authorised Training Center       *
      
      email: chailerd@qed.monash.edu.au
      ***************************************************