home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.cs.arizona.edu
/
ftp.cs.arizona.edu.tar
/
ftp.cs.arizona.edu
/
icon
/
historic
/
v941.tgz
/
icon.v941src.tar
/
icon.v941src
/
ipl
/
progs
/
hebeng.icn
< prev
next >
Wrap
Text File
|
2001-05-02
|
10KB
|
298 lines
############################################################################
#
# File: hebeng.icn
#
# Subject: Program to print mixed Hebrew/English text
#
# Author: Alan D. Corre
#
# Date: May 2, 2001
#
############################################################################
#
# This file is in the public domain.
#
############################################################################
#
# This program is written in ProIcon for the Macintosh computer. Alan D. Corre
# August 1991. It takes input in a transcription of Hebrew which represents
# current pronunciation adequately but mimics the peculiarities of Hebrew
# spelling. Here are some sentences from the beginning of Agnon's story
# "Friendship": marat qliyngel 'i$ah mefursemet haytah umenahelet beyt sefer
# haytah qowdem liymowt hamilHamah. mi$eni$tanu sidrey ha`owlam,neHtexah
# migdulatah..wexol miy $eyac'u low mowniyTiyn ba`owlam haytah mitqarevet
# 'eclow weyowce't wenixneset leveytow" The letter sin is represented by the
# German ess-zed which is alt-s on the Mac and cannot be represented here.
# The tilde (~)toggles between English and Hebrew, so the word "bar" will be
# the English word "bar" or the Hebrew beyt-rey$ according to the current
# mode of the program. Finals are inserted automatically. Justification
# both ways occurs unless the program detects a blank or empty line, in
# which case the previous line is not justified.
# Since I took out non-ASCII chars, and have not rechecked that this
# works with the corresponding octal chars, there could be some slips in
# this text.
#
############################################################################
#
# Requires: ProIcon
#
############################################################################
$ifdef _MACINTOSH
global outfilename, outvar, outwin,hebrew_string_flag, hebrew_text_flag,
screenwidth,screenheight,markers
procedure main()
#message() creates a standard Mac message box
if message("Do you wish to create a new text or print an old one?","New",
"Old") then newtext() else
oldtext()
#Empty and hide the interactive window
wset(0,5)
wset(0,0)
end
procedure newtext()
set_markers()
get_info()
get_screensize()
create_file()
go()
end
procedure oldtext()
#getfile() allows selection of a file already available
outfilename := getfile("Please select file.",,)
#attempt to open a window with the name of the file
if not (outwin := wopen(outfilename,"f")) then stop()
#put a font in this window which has Hebrew letters in high ASCII numbers
wfont(outwin,"Ivrit")
#use 12-point
wfontsize(outwin,12)
#show the window. The user wishing to edit must make the window active
#and use the appropriate alt keys to edit the Hebrew text. This is not
#necessary when using the transcription initially
wset(outwin,1)
if message("Do you wish to edit? (Press return when through editing.)","Yes","No") then
read()
if message("Do you wish to print?","Yes","No") then
#send the window to the printer if the user desires
wprint(outwin,1,1)
end
procedure set_markers()
#five letters preceding these characters take a special final shape
markers := ' ,.;:-\324\"?)]}'
end
procedure get_info()
local dimlist
outfilename := gettext("What is the name of your output file?",,"Cancel")
if /outfilename then stop()
#the program has to know what is the principal language in order to leave
#blanks at paragraph endings properly. When the text flag is set, then the
#program overall is operating in Hebrew mode. When the string flag is set
#the current string is Hebrew
if message("What is the principal language of the text?","Hebrew","English") then
hebrew_string_flag := hebrew_text_flag := 1
if \hebrew_text_flag then {
if not message("The principal language used is Hebrew.","Okay","Cancel") then
stop()} else
if not message("The principal language used is English.","Okay","Cancel") then
stop()
end
procedure get_screensize()
local dimlist
#&screen is a list. Work with the old standard mac screen
dimlist := &screen
screenheight := dimlist[3]
screenwidth := dimlist[4]
if screenwidth > 470 then screenwidth := 470
end
procedure create_file()
#arrange the various fonts and sizes
outwin := wopen(outfilename,"n")
outvar := open(outfilename,"w")
wsize(0,screenwidth,(screenheight / 2 - 40))
wsize(outwin,screenwidth,(screenheight / 2 - 40))
wfont(outwin,"Ivrit")
wfontsize(outwin,12)
wfont(0,"Geneva")
wfontsize(0,12)
#position windows
wmove(0,0,40)
wmove(outwin,0,screenheight / 2 + 20)
wset(outwin,1) #show the output window
end
procedure process(l)
local cursor,substring,newline
if *l = 0 then return " "
cursor := 1
newline := ""
#look for a tilde, and piece together a new line accordingly
l ? while substring := tab(upto('~')) do {
move(1)
if \hebrew_string_flag then substring := hebraize(substring)
if /hebrew_text_flag then newline ||:= substring else
newline := (substring || newline)
#string flag toggle
(/hebrew_string_flag := 1) | (hebrew_string_flag := &null)
cursor := &pos}
substring := l[cursor:0]
if \hebrew_string_flag then substring := hebraize(substring)
if /hebrew_text_flag then newline ||:= substring else
newline := (substring || newline)
return newline
end
procedure justify(l)
#doesn't give perfect right justification, but its good enough
local stringlength,counter,n,increment,newline
stringlength := wtextwidth(outwin,l)
newline := l
increment := 1
while stringlength < screenwidth do {
counter := 0
l ? every n := upto(' ') do {
newline[n + (counter * increment)] := " "
counter +:= 1
stringlength +:= 4
if stringlength >= screenwidth then break}
increment +:= 1}
return newline
end
procedure go()
#the appearance of the Hebrew/English window lags one line behind the
#input window
local line,line2,counter,mess
counter := 0
line := read()
#octal 263 is option-period.
if line == "\263" then stop()
while (line2 := read()) ~== "\263" do {
counter +:= 1
if ((not match(" ",line2)) & (*line2 ~= 0)) then
line := justify(process(line)) else
if /hebrew_text_flag then line := process(line) else
line := rt(process(line))
if (wtextwidth(outwin,line) - screenwidth) > 10 then {
mess := "Warning. Line " || counter || " is " || (wtextwidth(outwin,line) -
screenwidth) || " pixels too long."
message(mess,"Okay","")}
write(outvar,line)
line := line2}
if /hebrew_text_flag then line := process(line) else
line := rt(process(line))
if (wtextwidth(outwin,line) - screenwidth) > 10 then {
mess := "Warning. Last Line is " || (wtextwidth(outwin,line) -
screenwidth) || " pixels too long."
message(mess,"Okay","")}
write(outvar,line)
if message("Do you wish to print?","Yes","No") then wprint(outwin,1,1)
close(outvar)
wclose(outwin,"")
end
procedure hebraize(l)
static s2,s3
#' is used for aleph. For the abbreviation sign use either alt-] which gives
#an appropriate sign, or alt-' which is easier to remember but gives a funny
#looking digraph on the screen
initial{ s2 := "u\'\276\324bvgdhwzHTykKlmMnNs`pfFcCqr$\247tx\261\335(){}[]X"
s3 := "\267\324\'\'\272\272\355\266\372\267\275\305\303\264\373\373\302\265_
\265\176\176\247\322\304\304\304\215\215\317\250\246\244\240_
\373+$)(}{][\373"}
#the following (1) inserts initial aleph in case the student has forgotten it
#(2) takes care of final x with vowel (all other finals are vowelless in
#modern Hebrew (3) takes out vowels except u which is usually represented in
#modern Hebrew (4) takes care of other finals (5) converts to Hebrew letters
#(6) reverses to Hebrew direction
l := reverse(map(finals(devowel(xa(aleph(l)))),s2,s3))
return l
end
procedure aleph(l)
#inserts an aleph in words beginning with vowels only
#this alters the duplicate line; compare procedure devowel which rebuilds
#the line from scratch
local newl,offset
newl := l
offset := 0
if upto('aeiou',l[1]) then {
offset +:= 1
newl[1] := ("\'" || l[1])}
l ? while tab(upto(' ')) do {
tab(many(' '))
if upto('aeiou',l[&pos]) then {
newl[&pos + offset] := ("\'" || l[&pos])
offset +:= 1}}
return newl
end
procedure xa(s)
#takes care of the special case of final xa
local substr,newstr
newstr := ""
s ||:= " "
s ? {while substr := tab(find("xa")) || move(2) || tab(any(markers)) do {
substr[-3] := char(170)
newstr ||:= substr}
newstr ||:= s[&pos:-1]}
return newstr
end
procedure finals(l)
#arranges the final letters
static finals,corresp
local newline
initial {finals := 'xmncf'
corresp := table("")
corresp["x"] := "\301"
corresp["m"] := "\243"
corresp["n"] := "\242"
corresp["f"] := "\354"
corresp["c"] := "\260"}
newline := l
l ? while tab(upto(finals)) do {
move(1)
if (any(markers)) | (&pos = *l + 1) then
newline[&pos - 1] := corresp[l[&pos - 1]]
}
return newline
end
procedure rt(l)
#for right justification; chars are of different size
local stringlength,newline
stringlength := wtextwidth(outwin,l)
newline := l
if (screenwidth-stringlength) > 0 then
newline := (repl(" ",(screenwidth-stringlength +2) / 4) || l)
return newline
end
procedure devowel(l)
local newline,substring
newline := ""
l ? {while substring := tab(upto('aeio')) do {
newline ||:= substring
move(1)}
newline ||:= l[&pos:0]}
return newline
end
$else # not Macintosh
procedure main()
stop("sorry, ", &progname, " only runs under Macintosh ProIcon")
end
$endif