home *** CD-ROM | disk | FTP | other *** search
- From: lab@and.cs.liv.ac.uk
- Newsgroups: alt.sources
- Subject: JUSTIFY macros for XEDIT (written in REXX)
- Message-ID: <1990Nov5.204846.4363@and.cs.liv.ac.uk>
- Date: 5 Nov 90 19:48:46 GMT
-
- Here is a collection of CMS XEDIT macros (written in REXX by Eric Thomas
- ERIC@SEARN.BITNET - note the change of net address from the macro
- headers).
-
- In submitting this, I've tried to keep to the rules for comp.sources.misc
- and hence the shar format (CMS users I'm sure can manage :-)).
- Please note that some lines are longer than 80 characters. This is just
- to warn those whose mailers may chop at column 81.....
-
- Alan Thew
- qq11@liverpool.ac.uk
- mcsun!ukc!liv!qq11
-
- Submitted-by: qq11@liv.ac.uk
- Archive-name: justify/part01
-
- ---- Cut Here and feed the following to sh ----
- #!/bin/sh
- # This is justify, a shell archive (produced by shar 3.49)
- # To extract the files from this archive, save it to a file, remove
- # everything above the "!/bin/sh" line above, and type "sh file_name".
- #
- # made 10/30/1990 23:42 UTC by qq11@liv.ac.uk
- # Source directory /users/u5/qcl/qq11/work
- #
- # existing files will NOT be overwritten unless -c is specified
- #
- # This shar contains:
- # length mode name
- # ------ ---------- ------------------------------------------
- # 126 -rw------- MANIFEST
- # 13319 -rw------- jf.xedit
- # 10354 -rw------- jm.xedit
- # 12986 -rw------- justify.memo
- # 5894 -rw------- prefixb.xedit
- # 5979 -rw------- prefixj.xedit
- # 7424 -rw------- prefixtf.xedit
- #
- # ============= MANIFEST ==============
- if test -f 'MANIFEST' -a X"$1" != X"-c"; then
- echo 'x - skipping MANIFEST (File already exists)'
- else
- echo 'x - extracting MANIFEST (Text)'
- sed 's/^X//' << 'SHAR_EOF' > 'MANIFEST' &&
- XJF XEDIT C1
- XJM XEDIT C1
- XJUSTIFY MEMO C1
- XPREFIXB XEDIT C1
- XPREFIXJ XEDIT C1
- XPREFIXTF XEDIT C1
- SHAR_EOF
- chmod 0600 MANIFEST ||
- echo 'restore of MANIFEST failed'
- Wc_c="`wc -c < 'MANIFEST'`"
- test 126 -eq "$Wc_c" ||
- echo 'MANIFEST: original size 126, current size' "$Wc_c"
- fi
- # ============= jf.xedit ==============
- if test -f 'jf.xedit' -a X"$1" != X"-c"; then
- echo 'x - skipping jf.xedit (File already exists)'
- else
- echo 'x - extracting jf.xedit (Text)'
- sed 's/^X//' << 'SHAR_EOF' > 'jf.xedit' &&
- X/***********************************************************************
- X * *
- X * JF -- Justify and Flow XEDIT macro, release 2 *
- X * *
- X * (c) Eric Thomas 1987 (ERIC at FRECP11) *
- X * *
- X * This file was last updated on Saturday, January the 9th of 1988 *
- X * *
- X * This XEDIT macro was originally written to justify MAILER-format or *
- X * IBM NOTE-format files and was intended to be issued from the MAIL *
- X * or NOTE exec just before pressing the PF5 key to send the note. It *
- X * performs as the PREFIXTF (qqv) macro, except that all lines in the *
- X * body of the mail item are formatted and that any line extending up *
- X * to column 79 is concatenated with the following line to allow you *
- X * to enter text as a "continuous stream" without having to resort to *
- X * POWER INPUT mode. *
- X * *
- X * Please refer to PREFIXTF XEDIT and JUSTIFY MEMO (available from *
- X * Netserv) for more information in the formatting process. *
- X * *
- X * Syntax: JF <nn | ? | <L<nn>> <R<nn>>> <QUIET> <RAgged> *
- X * <PLpl<,tm<,bm>>> <PN<T|B>> *
- X * *
- X * - JF alone will justify the whole file. For NOTE or MAIL files, the *
- X * header is left unchanged. Otherwise the whole file is justified. *
- X * *
- X * - JF nn indicates that output text should be formatted with a right *
- X * margin of 'nn'. The default is to format output text with the *
- X * same right margin as input. For example, if the person you are *
- X * mailing to has a 40-columns terminal (such as the french *
- X * MINITEL), you can use JF 40 to make sure that he will have no *
- X * problem reading your mail. Using JF 70 makes sure that the *
- X * mailfile can be read without problem under XEDIT or the ISPF *
- X * editor with prefixes on, even if the note gets subsequently *
- X * quoted by a "REPLY TEXT" or suchlike. *
- X * *
- X * - JF ? queries the status of the left and right margins. *
- X * *
- X * - L<nn> redefines the Left margin. If you omit 'nn', you will be *
- X * asked to move the cursor to the desired column and press ENTER. *
- X * *
- X * - R<nn> similarly redefines the Right margin. *
- X * *
- X * - The QUIET option suppresses the information message which is dis- *
- X * played when margins are changed. This is very useful when you *
- X * call JF from your PROFILE XEDIT to select different default *
- X * options. *
- X * *
- X|* - The RAgged option causes the text to be formatted with ragged *
- X|* right. *
- X|* *
- X|* - The PL option allows you to define a page length, top margin and *
- X|* bottom margin. The default top and bottom margins are 2 lines *
- X|* each, and the default page length is OFF (continuous output). *
- X|* These options are particularly useful when running JF on a piece *
- X|* of INCOMING mail with the intent of neatening it up and *
- X|* subsequently printing it on a line printer without running over *
- X|* the page perforations. *
- X|* *
- X|* - The PN option is meaningful only when specified together with PL *
- X|* and orders JF to number the output pages. The optional parameter *
- X|* indicates whether pages must be numbered on the Top lines or on *
- X|* the Bottom lines (the default is Top). The page number will be *
- X|* printed on the first (or last) line if the corresponding margin *
- X|* is set to 1 or 2, or after a blank line if the margin is set to 3 *
- X|* or more. I will of course not be printed if the margin is set to *
- X|* 0. *
- X * *
- X * *
- X * The default values are L1; R73 if PREFIX ON is in effect, R78 other *
- X * wise. *
- X * *
- X * 08 Mar 1987: Change right margin after a 'JF nn' call if nn is not *
- X * the current right margin. Allow 'JF nn' where nn is *
- X * larger than the present right margin. *
- X * *
- X * 08 Mar 1987: Some fixes that can't be explained in 4-5 lines... *
- X * *
- X * 09 Mar 1987: Fix for right margin = 80. *
- X * *
- X * 29 May 1987: Allow use of JF on incoming mail. *
- X * New options: RAgged, PLpl<,tm<,bm>> and PN<T|B> *
- X * *
- X * 09 Jan 1988: Change MAIL identification algorithm and processing *
- X * to solve problems with RICE mail. *
- X * *
- X ***********************************************************************/
- X
- X Arg options
- X
- X'COMMAND EXTRACT /Line/Uniqueid/Prefix/FN/FT/FM/Trunc'
- X Address COMMAND 'GLOBALV SELECT $JM$ STACK $'uniqueid.1
- X Parse pull xfn xft xfm lmarg rmarg minl .
- X If xfn xft xfm ^= Space(fname.1 ftype.1 fmode.1) Then
- X Do
- X lmarg = 1
- X If prefix.1 ^= 'OFF'
- X Then Do
- X rmarg = 73
- X minl = 62
- X End
- X Else Do
- X rmarg = 78
- X minl = 66
- X End
- X Address COMMAND 'GLOBALV SELECT $JM$ SETL $'uniqueid.1 fname.1 ftype.1 fmode.1 lmarg rmarg minl
- X End
- X
- X JMopt = ''
- X orgline = line.1
- X newrmarg = rmarg
- X pl = 0
- X tm = 2
- X bm = 2
- X pn = 'O'
- X format = 1
- X ragged = 0
- X Do Words(options)
- X Parse var options opt options
- X Select
- X When Datatype(opt,'W') & opt > 0 Then newrmarg = opt
- X When opt == '?' Then
- X Do
- X 'COMMAND MSG Left margin:' lmarg', Right margin:' rmarg'.'
- X format = 0
- X End
- X When Abbrev('OFF',opt,1) Then Call Error 'Text Flow operation cannot be undone'
- X When Left(opt,2) == 'PL' Then
- X Do
- X Parse var opt 'PL'pl','tm','bm
- X If pl = '' Then Signal Missarg
- X If tm = '' Then tm = 2
- X If bm = '' Then bm = 2
- X If ^Datatype(pl||tm||bm,'W') | pl ^> 0 | tm < 0 | bm < 0
- X Then Signal Invarg
- X If tm+bm ^< pl Then Call Error 'Top and bottom margins exceed page length'
- X End
- X When Left(opt,2) == 'PN' Then
- X Do
- X Parse var opt 'PN'pn
- X If pn = '' Then pn = 'T'
- X If pn ^= 'T' & pn ^= 'B' Then Call Error 'Invalid page numbering option -- "'opt'"'
- X End
- X When Abbrev('RAGGED',opt,3) Then ragged = 1
- X Otherwise JMopt = JMopt opt
- X End
- X End
- X
- X If newrmarg < lmarg+2 | newrmarg > trunc.1 Then Call Error 'New right margin exceeds allowable boundaries'
- X
- X If JMopt ^= '' Then
- X Do
- X 'STATE JM XEDIT'
- X If rc ^== 0 Then Call Error 'File "JM XEDIT" not found',28
- X 'MACRO JM' JMopt
- X Exit rc
- X End
- X If ^format Then Exit 0
- X
- X'COMMAND PRESERVE'
- X'COMMAND SET LINEND OFF'
- X'COMMAND SET IMAGE OFF'
- X'COMMAND SET SCOPE ALL'
- X'COMMAND SET AUTOSAVE OFF'
- X accents = '@{}:?]XDKa*J-\X
- X/* You may wish not to consider accentuated characters as alphabetical
- X ones, especially since some of them are regular characters on
- X some displays (eg '@' -- 'at' sign or 'a accent grave' french
- X character). In that case, remove the "||accents" portion of the
- X following statement. */
- X alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'||,
- X '0123456789()"'':;'||accents
- X
- X If ftype.1 = 'NOTE'
- X Then 'COMMAND :6 COMMAND FIND _______'
- X Else If Not_Mail() Then 'COMMAND TOP'
- X
- X'COMMAND EXTRACT /Line'
- X hdrline = line.1
- X
- X t. = ''
- X r. = ''
- X n. = 1
- X index = 1
- X il = 1
- X previndent = -2
- X ll = rmarg-lmarg+1
- X maxmarg = Max(80,rmarg+1)
- X
- X Do forever
- X 'COMMAND NEXT'
- X If rc ^== 0 Then Leave
- X 'COMMAND EXTRACT /Curline'
- X line = Substr(curline.3,lmarg,ll)
- X If Right(t.index,1) == ' '
- X Then indent = Verify(line'A',alphabet,'M')
- X Else indent = 1
- X l.index.il = Left(curline.3,lmarg-1)Left(line,indent-1)
- X previl = il
- X If Length(l.index.il) > newrmarg Then Call Spill_L
- X If rmarg = 78 & Substr(curline.3,79,1) ^== ' '
- X Then line = Substr(curline.3,lmarg,ll+1)
- X Else r.index.il = Substr(curline.3,rmarg+1)
- X line = Substr(line,indent,maxmarg-indent)
- X If line = '' Then
- X Do
- X Call Close_Par
- X previndent = 0
- X Iterate
- X End
- X Select
- X When previndent = indent Then nop
- X When previndent = -2 Then previndent = -1
- X When previndent = -1 Then previndent = indent
- X Otherwise
- X Call Close_Par
- X il = il-1
- X previndent = -1
- X End
- X t.index = t.index||line
- X il = il+1
- X End
- X
- X n.index = il-1
- X If n.index = 0 Then index = index-1
- X
- X lc = 1
- X pg = 1
- X Select
- X When pn == 'O' Then nop
- X When pn == 'B' Then
- X If bm > 2 Then po = 'COMMAND -1'
- X Else po = ''
- X When pn == 'T' Then
- X Do
- X If tm > 2 Then po = 2-tm
- X Else po = 1-tm
- X If po = 0 Then po = ''
- X Else po = 'COMMAND' po
- X End
- X End
- X pe = pl-bm+1
- X
- X toldspill = 0
- X'COMMAND :'hdrline
- X Do i = 1 to index
- X If n.i = 0 Then Iterate
- X If t.i = '' Then
- X Do
- X Call Input Left(l.i.1,newrmarg)r.i.1
- X Iterate
- X End
- X il = 1
- X t = Space(t.i)
- X Do until t = ''
- X xl = newrmarg-Length(l.i.il)+1
- X j = Lastpos(' ',t' ',xl)
- X If j == 0 Then Call Spill
- X line = Left(t,j-1)
- X t = Strip(Substr(t,j))
- X If ^ragged & t ^== '' Then line = Justify(line,xl-1)
- X Call Input Left(l.i.il||line,newrmarg)r.i.il
- X If il ^= n.i Then il = il+1
- X End
- X End
- X If pn = 'B' Then
- X Do
- X 'COMMAND ADD' pe-lc+bm
- X 'COMMAND NEXT' pe-lc+bm
- X Call Page
- X End
- X
- X'COMMAND SET MSGMODE OFF'
- X'COMMAND +1 COMMAND DELETE *'
- X'COMMAND :'orgline 'COMMAND RESTORE'
- X If newrmarg = rmarg Then Exit
- X minl = Format(minl*(newrmarg-lmarg+1)/(rmarg-lmarg+1),,0)
- X Address COMMAND 'GLOBALV SELECT $JM$ SETL $'uniqueid.1 fname.1 ftype.1 fmode.1 lmarg newrmarg minl
- X'COMMAND MSG Note: right margin has been adjusted to' newrmarg'.'
- X Exit
- X
- XInput:
- X Select
- X When pl == 0 Then nop
- X When lc == 1 Then Call Top_Margin
- X When lc == pe Then Call Bottom_Margin
- X Otherwise lc = lc+1
- X End
- X'COMMAND INPUT' Arg(1)
- X Return
- X
- XTop_Margin:
- X lc = tm+2
- X If tm == 0 Then Return
- X'COMMAND ADD' tm
- X'COMMAND NEXT' tm
- X If pn == 'T' Then Call Page
- X Return
- X
- XBottom_Margin:
- X If bm ^== 0 Then
- X Do
- X 'COMMAND ADD' bm
- X 'COMMAND NEXT' bm
- X If pn == 'B' Then Call Page
- X End
- X Call Top_Margin
- X Return
- X
- XPage:
- X po 'COMMAND REPLACE' Left('',newrmarg-9) 'Page' Right(pg,3)
- X pg = pg+1
- X If po = '' Then Return
- X Translate(po,'+','-')
- X Return
- X
- XClose_Par:
- X n.index = previl-1
- X i = index
- X index = index+1
- X Do j = 1 for il-previl+1
- X l.index.j = l.i.previl
- X r.index.j = r.i.previl
- X previl = previl+1
- X End
- X il = j
- X Return
- X
- XSpill:
- X xl = Max(xl,2)
- X j = xl
- X If toldspill Then Return
- X toldspill = 1
- X'COMMAND EMSG Text flow operation caused words to be spilled.'
- X Return
- X
- XSpill_L:
- X If l.index.il = '' Then
- X Do
- X l.index.il = ' ' /* Purposefully leave one 1 blank */
- X Return
- X End
- X Do while Length(l.index.il) > newrmarg
- X xline = Substr(l.index.il,newrmarg+1)
- X l.index.il = Left(l.index.il,newrmarg)
- X il = il+1
- X l.index.il = xline
- X End
- X Return
- X
- XMissarg:
- X Call Error 'Missing argument'
- X
- XInvarg:
- X Call Error 'Invalid argument'
- X
- XError:
- X Parse arg msg,retcode
- X If retcode == '' Then retcode = 24
- X'COMMAND EMSG' msg'.'
- X Exit retcode
- X
- XNot_Mail:
- X'COMMAND TOP'
- X'COMMAND +1 COMMAND EXTRACT /Curline'
- X If Pos(':',curline.3) == 0 Then Return 1
- X Parse upper var curline.3 tag ':'
- X If Words(tag) ^== 1 Then Return 1
- X If Find('RECEIVED DATE RESENT-DATE',tag) == 0 Then Return 1
- X banner = Copies('=',70)
- X Do forever
- X 'COMMAND NEXT'
- X If rc ^== 0 Then Return 1
- X 'COMMAND EXTRACT /Curline'
- X If curline.3 = '' | Left(curline.3,70) = banner Then Return 0
- X End
- SHAR_EOF
- chmod 0600 jf.xedit ||
- echo 'restore of jf.xedit failed'
- Wc_c="`wc -c < 'jf.xedit'`"
- test 13319 -eq "$Wc_c" ||
- echo 'jf.xedit: original size 13319, current size' "$Wc_c"
- fi
- # ============= jm.xedit ==============
- if test -f 'jm.xedit' -a X"$1" != X"-c"; then
- echo 'x - skipping jm.xedit (File already exists)'
- else
- echo 'x - extracting jm.xedit (Text)'
- sed 's/^X//' << 'SHAR_EOF' > 'jm.xedit' &&
- X/***********************************************************************
- X * *
- X * JM -- Justify Mail XEDIT macro, release 2 *
- X * *
- X * (c) Eric Thomas 1986 (ERIC at FRECP11) *
- X * *
- X * This file was last updated on Friday, February the 27th of 1987 *
- X * *
- X * This XEDIT macro was originally written to justify MAILER-format or *
- X * IBM NOTE-format files and was intended to be issued from the MAIL *
- X * or NOTE exec just before pressing the PF5 key to send the note. It *
- X * respects indentation, starting its justification process at the *
- X * first alphabetical character encountered within the justification *
- X * margins. The justification margins, as well as the minimum number *
- X * of characters that are required for a line to be justified, can be *
- X * altered and will remain active for the current file. *
- X * *
- X * Please see also the JF (Justify and Flow) macro. It is recommended *
- X * that JF be used instead of JM whenever possible, that is, when the *
- X * mailfile contains only pure text (no drawings, no boxes, etc). JF *
- X * usually gives much better results than JM, and also allows you to *
- X * choose the number of columns of the resulting output. *
- X * *
- X * *
- X * Syntax: JM <Off | ? | <L<nn>> <R<nn>> <nn | nn%>>> <QUIET> *
- X * *
- X * - JM alone will justify the whole file. For NOTE or MAIL files, the *
- X * header is left unchanged. Otherwise the whole file is justified. *
- X * *
- X * - JM Off will undo the justification process, if needed. *
- X * *
- X * - JM ? queries the status of the margins and minimum required *
- X * length for justification. *
- X * *
- X * - L<nn> redefines the Left margin. If you omit 'nn', you will be *
- X * asked to move the cursor to the desired column and press ENTER. *
- X * *
- X * - R<nn> similarly redefines the Right margin. *
- X * *
- X * - nn redefines the minimum number of characters that the portion of *
- X * the line that is between the justification margins should have in *
- X * order to get justified. If one of the margins is changed without *
- X * a new 'nn' being justified, the value will be automatically adjus *
- X * ted in the same proportions as the previous value. For example, *
- X * if JM L1 R73 66 is in effect, entering JM L10 will cause the mini *
- X * mum required length to be automatically adjusted to 58. *
- X * *
- X * - nn% redefines the minimum required length as a percentage of the *
- X * total available space between justification margins. Example: *
- X * JM L10 R50 90% and JM L10 R50 37 lead to the same result. *
- X * *
- X * - The QUIET option suppresses the information message which is dis- *
- X * played when margins are changed. This is very useful when you *
- X * call JM from your PROFILE XEDIT to select different default *
- X * options. *
- X * *
- X * The default values are L1; R73 if PREFIX ON is in effect, R78 other *
- X * wise; 85% minimum required size. *
- X * *
- X * 3 Feb 1986: changed default right margin from 79 to 78 for compa- *
- X * tibility with the JF macro. *
- X * *
- X * 20 Feb 1986: JM failed to recognize the header of resent mail. *
- X * *
- X * 22 Feb 1986: minimum required length redefined to 85% for better *
- X * results. *
- X * *
- X * 27 Feb 1986: incorrect results when first TAB not in column 1. *
- X * AUTOSAVE may get triggered several times during *
- X * execution of the macro. *
- X * *
- X ***********************************************************************/
- X
- X Arg options
- X If Abbrev('OFF',options,1) Then Do
- X options = ''
- X off = 1
- X End
- X Else off = 0
- X'COMMAND EXTRACT /Line/Uniqueid/Prefix/FN/FT/FM'
- X Address COMMAND 'GLOBALV SELECT $JM$ STACK $'uniqueid.1
- X Pull xfn xft xfm lmarg rmarg minl .
- X If xfn xft xfm ^= Space(fname.1 ftype.1 fmode.1) Then
- X Do
- X lmarg = 1
- X If prefix.1 ^= 'OFF' Then Do
- X rmarg = 73
- X minl = 62
- X End
- X Else Do
- X rmarg = 78
- X minl = 66
- X End
- X Address COMMAND 'GLOBALV SELECT $JM$ SETL $'uniqueid.1 fname.1,
- X ftype.1 fmode.1 lmarg rmarg minl
- X End
- X If options ^= '' Then Signal Setup
- X
- X'COMMAND PRESERVE'
- X'COMMAND SET LINEND OFF'
- X'COMMAND SET IMAGE OFF'
- X'COMMAND SET AUTOSAVE OFF'
- X accents = '@{}:?]XDKa*J-\X
- X/* You may wish not to consider accentuated characters as alphabetical
- X ones, especially since some of them are regular characters on
- X some displays (eg '@' -- 'at' sign or 'a accent grave' french
- X character). In that case, remove the "||accents" portion of the
- X following statement. */
- X alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'||accents
- X
- X If ftype.1 = 'NOTE'
- X Then 'COMMAND :6 COMMAND FIND _______'
- X Else Do /* Check for MAIL files */
- X 'COMMAND TOP'
- X 'COMMAND +1 COMMAND EXTRACT /Curline'
- X Parse upper var curline.3 tag ':'
- X If Words(tag) = 1 & Find('DATE RESENT-DATE',tag) ^= 0
- X Then 'COMMAND LOCATE /=============='
- X Else 'COMMAND TOP'
- X End
- X
- X maxl = minl+lmarg-1
- X jc = rmarg + 1
- X If ^off
- X Then /* Separate Do...End for better speed */
- X Do forever
- X 'COMMAND NEXT'
- X If rc ^= 0 Then Leave
- X 'COMMAND EXTRACT /Curline'
- X start = Verify(curline.3,alphabet,'MATCH',lmarg)
- X If start = 0 | start >= rmarg Then Iterate
- X If Length(Strip(Left(curline.3,rmarg),'T')) < maxl Then Iterate
- X 'COMMAND REPLACE' Left(curline.3,start-1)Justify(Substr(curline.3,start,jc-start),jc-start)Substr(curline.3,jc)
- X End
- X Else
- X Do forever
- X 'COMMAND NEXT'
- X If rc ^= 0 Then Leave
- X 'COMMAND EXTRACT /Curline'
- X start = Verify(curline.3,alphabet,'MATCH',lmarg)
- X If start = 0 | start > rmarg Then Iterate
- X 'COMMAND REPLACE' Left(curline.3,start-1)Left(Space(Substr(curline.3,start,jc-start)),jc-start)Substr(curline.3,jc)
- X End
- X
- X'COMMAND :'line.1 'COMMAND RESTORE'
- X Exit
- X
- XSetup:
- X'EXTRACT /LRECL'
- X pct = 0
- X newmin = 0
- X didlist = 0
- X quiet = 0
- X prev = rmarg-lmarg+1
- X Do Words(options)
- X Parse var options opt options
- X Select
- X When Left(opt,1) = 'L' Then Call Nalieva
- X When Left(opt,1) = 'R' Then Call Naprava
- X When Right(opt,1) = '%' Then Call Percent
- X When opt = 'QUIET' Then quiet = 1
- X When opt = '?' Then Call List
- X Otherwise
- X minl = Decparm(1)
- X newmin = 1
- X End
- X End
- X
- X If rmarg ^> lmarg Then
- X Do
- X 'COMMAND EMSG Left margin cannot exceed right margin.'
- X Exit
- X End
- X
- X If pct Then minl = Format(minl*(rmarg-lmarg+1)/100,,0)
- X If newmin & minl > rmarg-lmarg+1 Then
- X Do
- X 'COMMAND EMSG Minimum required length exceeds total length.'
- X Exit
- X End
- X
- X If ^newmin Then
- X Do
- X oldml = minl
- X minl = Format((rmarg-lmarg+1)*(minl/prev),,0)
- X If ^quiet & oldml ^= minl Then
- X 'COMMAND MSG Minimum required length has been adjusted according',
- X 'to previous proportions.'
- X End
- X
- X Address COMMAND 'GLOBALV SELECT $JM$ SETL $'uniqueid.1 fname.1 ftype.1,
- X fmode.1 lmarg rmarg minl
- X Call List
- X Exit
- X
- XList:
- X If didlist | quiet Then Return
- X didlist = 1
- X 'COMMAND MSG Left margin:' lmarg', Right margin:' rmarg||,
- X ', Minimum length:' minl '('Format(100*minl/(rmarg-lmarg+1),,0)'%)'
- X Return
- X
- XPercent:
- X pct = 1
- X newmin = 1
- X Parse var opt opt'%'
- X minl = Decparm(1,'')
- X If minl > 100 Then
- X Do
- X 'COMMAND EMSG Invalid percentage value.'
- X Exit
- X End
- X Return
- X
- XNalieva:
- X lmarg = Decparm(2,'Left margin',lmarg)
- X If lmarg > lrecl.1 Then
- X Do
- X 'COMMAND EMSG Left margin should not exceed LRECL.'
- X Exit
- X End
- X Return
- X
- XNaprava:
- X rmarg = Decparm(2,'Right margin',rmarg)
- X If rmarg > lrecl.1 Then
- X Do
- X 'COMMAND EMSG Right margin should not exceed LRECL.'
- X Exit
- X End
- X Return
- X
- X
- XDecparm:
- X Parse arg x,title,y
- X arg = Substr(opt,x)
- X If arg = '' Then
- X Do 1
- X If title = '' Then Leave
- X 'COMMAND MSG Position cursor on the' title 'and press ENTER.'
- X If y > lrecl.1 Then y = lrecl.1
- X 'COMMAND CURSOR FILE' line.1 y
- X Address COMMAND 'MAKEBUF'
- X 'COMMAND READ'
- X Address COMMAND 'DROPBUF'
- X 'COMMAND EXTRACT /Cursor'
- X 'COMMAND CURSOR CMDLINE'
- X If cursor.4 > 0 Then Return cursor.4
- X 'COMMAND EMSG Invalid cursor location.'
- X Exit
- X End
- X If Datatype(arg,'W') & arg > 0 Then Return arg
- X 'COMMAND EMSG Invalid argument -- "'opt'".'
- X Exit
- SHAR_EOF
- chmod 0600 jm.xedit ||
- echo 'restore of jm.xedit failed'
- Wc_c="`wc -c < 'jm.xedit'`"
- test 10354 -eq "$Wc_c" ||
- echo 'jm.xedit: original size 10354, current size' "$Wc_c"
- fi
- # ============= justify.memo ==============
- if test -f 'justify.memo' -a X"$1" != X"-c"; then
- echo 'x - skipping justify.memo (File already exists)'
- else
- echo 'x - extracting justify.memo (Text)'
- sed 's/^X//' << 'SHAR_EOF' > 'justify.memo' &&
- X Installation and programming logic information for the JUSTIFY package
- X --------------------------------------------------------------------
- X Revision date: 8 March 1987
- X
- X
- XHistory of changes: moved to the comments area in the affected macros.
- X
- X*-----------------------------------------------------------------------*
- X|
- X| There are two distinct sub-packages in the JUSTIFY package:
- X|
- X| - The PREFIXJ - PREFIXB - JM package which performs text justifica-
- X| tion on a line per line basis.
- X|
- X| - The PREFIXTF - JF package which performs "text flow" and justifica-
- X| tion on a paragraph per paragraph basis.
- X|
- X| The installation procedure is identical for the two sub-packages, and
- X| has not been revised. A detailed description of the programming logic
- X| involved in the Text Flow package can be found at the end of this memo.
- X|
- X| The following lines are the original description of the package which
- X| I have not had time to rewrite:
- X|
- X| Part I -- The Justification sub-package
- X|
- X This package consists in three XEDIT macros: two new prefix
- X subcommands (J/Jnnn/JJ...JJ and B/Bnnn/BB...BB) to justify/unjustify
- X text, and one command-line macro, JM, to justify a whole file at once
- X from the command- line. JM originally stood for "Justify Mail" and
- X supported only MAIL files from the MAIL/MAILBOOK environment. It was
- X later upgraded to support IBM NOTEs as well, and finally suffered a
- X major rewrite before being made available on Netserv in an attempt to
- X raise it to the same level of quality as the other Netserv programs.
- X This is the reason why there are special cases for the handling of
- X NOTEs and MAIL files in the code.
- X
- X
- X Before starting to use the prefix commands you must modify your
- X PROFILE XEDIT file to include synonym definitions for the new prefix
- X subcommands since they are not provided in the standard IBM set:
- X
- X SET PREFIX SYNONYM J PREFIXJ
- X SET PREFIX SYNONYM JJ PREFIXJ
- X SET PREFIX SYNONYM B PREFIXB
- X SET PREFIX SYNONYM BB PREFIXB
- X| SET PREFIX SYNONYM TF PREFIXTF
- X
- X These lines can be added nearly anywhere, preferrably before or after
- X the regular synonym definitions, if any.
- X
- X
- X The justification process performed by the three macros will take
- X place between user-modifiable "justification margins". The default
- X values for these margins are column 1 for the left margin and either
- X| column 73 or 78 for the right margin, depending on whether you run with
- X PREFIX ON or OFF. These default values correspond to the proper values
- X for justifying IBM NOTE and RFC822 MAIL files, respectively. It is
- X important to note that anything that might appear after the right
- X margin (or before the left margin) will be left unchanged; it is
- X therefore necessary to make sure that the right margin is expanded
- X whenever lines longer than 73 characters are to be justified (unless
- X PREFIX OFF was in effect and the lines were smaller than 80
- X characters).
- X
- X These "justification parameters" are local to each file in the XEDIT
- X ring and will remain valid for the XEDIT session, ie until you QUIT;
- X however, if you immediately recall the file you have just QUITted, the
- X previous justification parameters will be recalled and you will not
- X have to provide them again. This does not occur if you recall a
- X different file, of course.
- X
- X
- X Additionally, the actual justification process will start at the
- X first alphabetical character encountered within the justification
- X margins. This allows for indentation and sub-paragraphs to be respected
- X by the justification process:
- X
- X - This line has been justified with margins of 1 and 73, and yet the
- X leading blanks and dash were not "squeezed" in the process.
- X
- X If the portion of the line between the justification margins is
- X smaller than a certain amount of characters, it will not be expanded.
- X This avoids
- X justifying lines like that...
- X This "minimum required number of characters" can be redefined by the
- X user in one of two ways:
- X
- X 1) An absolute value
- X 2) A percentage of the size of the "justification area". The default
- X| value is precisely expressed as 85% of the justification area.
- X
- X
- X Furthermore, if one or both of the justification margins are changed
- X without the "minimum required number of characters" being altered, JM
- X will automatically expand or reduce it according to the previous
- X| proportions. For example, if you change from the default settings of
- X| margins 1 and 73 and minimum length 62 (ie 85% of 73) to margins 10 and
- X| 50, the minimum length will be automatically changed to 35 (85% of 41)
- X to stay in proportions with the previous value.
- X
- X
- X The justification parameters can be changed by means of the JM
- X command, and will affect both JM and PREFIXJ/PREFIXB operations. The
- X syntax is:
- X
- X JM <L<nn>> <R<nn>> <nn | nn%>
- X
- X - Lnn and Rnn indicate the left and right justification margins,
- X respectively. If 'nn' is omitted you will be required to position the
- X cursor on the desired column and press ENTER. The original position
- X of the cursor will be the last value of the corresponding margin.
- X
- X - nn and nn% indicate a new value for the minimum required length
- X parameter, either as an absolute number or expressed as a percentage
- X of the size of the justification area.
- X
- X Examples:
- X
- X JM L1 R 80% -- left margin = 1
- X right margin to be modified using the cursor keys
- X new minimum is 80% of justification area
- X
- X JM R70 -- left margin = unchanged
- X right margin = 70
- X minimum will be adjusted according to the previous
- X proportions
- X
- X
- X You can query the status of the justification parameters by issuing a
- X 'JM ?' command. Please refer to the block comments at the beginning of
- X the various macros for a more detailed description of their syntax.
- X
- X|
- X| Part II -- The Text Flow sub-package
- X|
- X| There are only two macros in the Text Flow sub-package, JF (similar
- X| to JM) and PREFIXTF which implements the TF block prefix command. As
- X| Text Flow cannot be undone, there is no equivalent to the B/BB prefix
- X| command.
- X|
- X| The algorithms used by JF and TF are slightly different because JF
- X| was designed to be invoked from the MAIL environment mainly. It can
- X| also be called from the NOTE environment but it is NOT recommended to
- X| blindly use JF on a non-mail file as this might lead to unexpected
- X| results. The differences between the two algorithms will be explained
- X| later.
- X|
- X| JF and TF are similar to JM and JJ in that they will operate between
- X| a left margin and a right margin, and will preserve anything outside
- X| those margins. JF/TF and JM/JJ use the same GLOBALV storage to keep
- X| those margins which are therefore shared between JM and JF: a JM L10
- X| command has exactly the same effect as JF L10. However, JF/TF will not
- X| use the "minimum required length" parameter at all as they will justify
- X| ALL the lines in each paragraph, except the last one.
- X|
- X| Another important difference between JF/TF and JM/JJ is that JF/TF
- X| can reformat text using a different output right margin, ie a different
- X| number of columns for output. This "output right margin" is called the
- X| "reformatting margin". The default is of course to use the input right
- X| margin as reformatting margin.
- X|
- X| A short description of the Text Flow algorithm used by both JF and TF
- X| follows. Please refer to the macros for more details on the exact
- X| implementation.
- X|
- X|
- X| Step 1: Process the input lines and split them in paragraph units.
- X|
- X| The input text is read in, analyzed and stored in an internal array
- X| of "paragraph units". A "break" between two paragraph units is caused
- X| by one of the following:
- X|
- X| - A blank line: a blank line causes a break and is preserved.
- X|
- X| - A change in indention, except between the two first lines of the
- X| paragraph unit. That is, the first and second line of each
- X| paragraph can have different indentions without causing a break.
- X| Those indentions will be respected in the output text. A break
- X| caused by a change in indention does NOT generate any blank line.
- X|
- X| For each paragraph unit, JF/TF maintains an internal array of "left
- X| keep" and "right keep", one "keep" of each type for each line in the
- X| input paragraph.
- X|
- X| - The "right keep" is the data in the input line after the right
- X| margin (possibly null string).
- X|
- X| - The "left keep" is the data in the input line before the left
- X| margin, concatenated with any "non-alphanumeric" bytes that may
- X| have been found at the beginning of the actual "data line". The
- X| definition of "non-alphanumeric" can be found in the macros and
- X| it differs from that of JM/JJ. Note that blanks are considered as
- X| non-alphanumeric characters.
- X|
- X| - Whenever the left keep length exceeds the "reformatting margin",
- X| null input lines are generated and the left keep is split across
- X| those new lines, with each new left keep generated in this
- X| fashion not exceeding the reformatting margin. That is, JF/TF
- X| acts as if the large left keep had been found on several input
- X| lines, each of them having a left keep smaller than or equal to
- X| the reformatting margin and being otherwise empty. This does not
- X| apply when the left keep contains only blanks: in that case, the
- X| left keep is forced to a single blank and no null line is
- X| generated as those null lines would only result in pointless
- X| blank lines in the output text.
- X|
- X| Finally, the concatenated contents of each paragraph unit is kept in
- X| an internal array.
- X|
- X| Step 2: Produce output lines according to the reformatting margin.
- X|
- X| Each paragraph unit will then be reformatted and produce one or more
- X| output lines. The indention of all the lines in a given paragraph
- X| will be the same, except that the first line might be undented or
- X| outdented. The data portions of all the lines in the paragraph unit
- X| except the last one will be unconditionally justified. The left and
- X| right "keeps" will not be justified of course.
- X|
- X| It is however possible for the output paragraph to be smaller or
- X| longer than the input one. In this case a special handling must be
- X| performed on the "keeps":
- X|
- X| - If the output paragraph is smaller than the input one, the last
- X| (unused) keeps will be discarded. Another solution would have been
- X| to generate null lines to make sure that all the keeps are
- X| preserved, but this would have been very impractical in the
- X| majority of case.
- X|
- X| - If the output paragraph is longer, the last keep is re-used as
- X| many times as required to make sure that all the extra lines are
- X| properly indented. This may not necessarily be what you wanted but
- X| it seems to be the best solution.
- X|
- X| Note that if the reformatting margin is different from the input
- X| right margin, the right keep may end up at a different column
- X| position than it originally was. This is perfectly normal.
- X|
- X| Step 3: Delete the original input lines.
- X|
- X|
- X|
- X| JF is slightly different from TF and will perform the following
- X| additional steps:
- X|
- X| - When the input right margin is set to 78, lines which have a non-
- X| blank character in column 79 will be pasted with the next line. This
- X| allows MAIL users to enter text without having to worry about
- X| physical line size, and to reformat it later. This is also the
- X| reason why the default right margin was changed to 78: running JF on
- X| a piece of text formatted with the R79 option would be most likely
- X| to cause disastrous results...
- X|
- X| - When you specify a reformatting margin different from the original
- X| right margin, the right margin will be changed to the reformatting
- X| margin you specified upon completion of the reformatting process in
- X| order to avoid problems if you subsequently call JF on the mail file
- X| again. Try the following sequence on a dummy mailfile originally
- X| containing text in columns 1-50 only:
- X|
- X| o JF 70 (reformats text for 70 columns). A JF R70 is then
- X| automatically issued.
- X|
- X| o JF R50 to cancel the previous internal JF R70.
- X|
- X| o JF 50 to format the text back in 50 columns mode. As you will
- X| see the result is not precisely what you would have expected...
- X|
- SHAR_EOF
- chmod 0600 justify.memo ||
- echo 'restore of justify.memo failed'
- Wc_c="`wc -c < 'justify.memo'`"
- test 12986 -eq "$Wc_c" ||
- echo 'justify.memo: original size 12986, current size' "$Wc_c"
- fi
- # ============= prefixb.xedit ==============
- if test -f 'prefixb.xedit' -a X"$1" != X"-c"; then
- echo 'x - skipping prefixb.xedit (File already exists)'
- else
- echo 'x - extracting prefixb.xedit (Text)'
- sed 's/^X//' << 'SHAR_EOF' > 'prefixb.xedit' &&
- X/***********************************************************************
- X * *
- X * PREFIXB -- Justification XEDIT prefix macro, release 2 *
- X * *
- X * (c) Eric Thomas 1986 (ERIC at FRECP11) *
- X * *
- X * This file was last updated on Friday, February the 27th of 1987 *
- X * *
- X * This macro is the counterpart of PREFIXJ and defines an un-justifi- *
- X * cation prefix: B, Bnnnn, BB...BB. All lines subjected to the B pre- *
- X * fix will be unjustified with all multiple blanks being removed *
- X * between the justification margins. See "JM XEDIT" and "JUSTIFY *
- X * MEMO" (available from Netserv) for more information. *
- X * *
- X * Your PROFILE XEDIT must be modified in order to define the name you *
- X * want to give the justify synonym. The following two lines should be *
- X * added to PROFILE XEDIT, for example immediately after all other *
- X * synonym definitions: *
- X * *
- X * SET PREFIX SYNONYM B PREFIXB *
- X * SET PREFIX SYNONYM BB PREFIXB *
- X * *
- X * You may substitute any other name for B or BB if those names are *
- X * already in use. *
- X * *
- X * 3 Feb 1986: changed default right margin from 79 to 78 for compa- *
- X * tibility with the JF macro. *
- X * *
- X * 22 Feb 1986: minimum required length redefined to 85% for better *
- X * results. *
- X * *
- X * 27 Feb 1986: incorrect results when first TAB not in column 1. *
- X * AUTOSAVE may get triggered several times during *
- X * execution of the macro. *
- X * *
- X ***********************************************************************/
- X
- X'COMMAND EXTRACT /Line/Uniqueid/Prefix/FN/FT/FM/Size/Cursor'
- X Address COMMAND 'GLOBALV SELECT $JM$ STACK $'uniqueid.1
- X Pull xfn xft xfm lmarg rmarg minl .
- X If xfn xft xfm ^= Space(fname.1 ftype.1 fmode.1) Then
- X Do
- X lmarg = 1
- X If prefix.1 ^= 'OFF' Then Do
- X rmarg = 73
- X minl = 62
- X End
- X Else Do
- X rmarg = 78
- X minl = 66
- X End
- X Address COMMAND 'GLOBALV SELECT $JM$ SETL $'uniqueid.1 fname.1,
- X ftype.1 fmode.1 lmarg rmarg minl
- X End
- X jc = rmarg + 1
- X maxl = minl+lmarg-1
- X
- X Arg prefix operand pline op rest
- X Parse Source . . . . . name .
- X prf=name||Space(op rest)
- X
- X If prefix ^= 'PREFIX' Then
- X Call Error1 "8 646E 'PREFIXB' must be invoked from the prefix area."
- X
- X If operand = 'CLEAR' Then Exit
- X
- X'COMMAND PRESERVE'
- X'COMMAND SET LINEND OFF'
- X'COMMAND SET IMAGE OFF'
- X'COMMAND SET AUTOSAVE OFF'
- X
- X accents = '@{}:?]XDKa*J-\X
- X/* You may wish not to consider accentuated characters as alphabetical
- X ones, especially since some of them are regular characters on
- X some displays (eg '@' -- 'at' sign or 'a accent grave' french
- X character). In that case, remove the "||accents" portion of the
- X following statement. */
- X alphabet = xrange('a','z')||xrange('A','Z')||accents
- X
- X Select
- X When Length(name) = 1 Then
- X Do
- X If rest ^= '' Then Call Error "0 659E Invalid prefix subcommand:" prf
- X If op = '' Then op = 1
- X If op = '*' Then op = size.1
- X If Datatype(op,'W') & op > 0
- X Then
- X Do
- X 'COMMAND :'pline
- X Do Format(op,,0)
- X Call Justifyline
- X 'COMMAND NEXT'
- X pline = pline + 1
- X If pline > size.1 Then Leave
- X End
- X Signal Closeup
- X End
- X Else Call Error "0 659E Invalid prefix subcommand:" prf
- X End
- X
- X When Length(name) = 2 Then
- X Do
- X If op ^= '' Then Call Error "0 659E Invalid prefix subcommand:" prf
- X 'COMMAND EXTRACT /PENDING BLOCK' name ':0 :'pline '/'
- X If pending.0 ^= 0
- X Then
- X Do
- X 'COMMAND :'pending.1 'COMMAND SET PENDING OFF'
- X Do pline-pending.1+1
- X Call Justifyline
- X 'COMMAND NEXT'
- X pending.1 = pending.1 + 1
- X If pending.1 > size.1 Then Leave
- X End
- X Signal Closeup
- X End
- X Else 'COMMAND :'pline 'COMMAND SET PENDING BLOCK' Left(prf,5)
- X End
- X
- X Otherwise Call Error "0 686E Synonym '"name"' not recognized by prefix macro 'PREFIXB'."
- X End
- X
- X'COMMAND RESTORE'
- X Exit
- X
- XCloseup:
- X 'COMMAND :'line.1 'COMMAND RESTORE'
- X 'COMMAND CURSOR SCREEN' cursor.5 cursor.6 'PRIORITY 40'
- X Exit
- X
- XError:
- X 'COMMAND :'pline 'COMMAND SET PENDING ERROR' Left(prf,5)
- X 'COMMAND RESTORE'
- X
- XError1:
- X Parse arg err msg
- X If msg ^= '' Then 'COMMAND EMSG PXJ'Strip(msg)
- X Exit err
- X
- XJustifyline:
- X 'COMMAND EXTRACT /Curline'
- X start = Verify(curline.3,alphabet,'MATCH',lmarg)
- X If start = 0 | start > rmarg Then Return
- X 'COMMAND REPLACE' Left(curline.3,start-1)Left(Space(Substr(curline.3,start,jc-start)),jc-start)Substr(curline.3,jc)
- X Return
- SHAR_EOF
- chmod 0600 prefixb.xedit ||
- echo 'restore of prefixb.xedit failed'
- Wc_c="`wc -c < 'prefixb.xedit'`"
- test 5894 -eq "$Wc_c" ||
- echo 'prefixb.xedit: original size 5894, current size' "$Wc_c"
- fi
- # ============= prefixj.xedit ==============
- if test -f 'prefixj.xedit' -a X"$1" != X"-c"; then
- echo 'x - skipping prefixj.xedit (File already exists)'
- else
- echo 'x - extracting prefixj.xedit (Text)'
- sed 's/^X//' << 'SHAR_EOF' > 'prefixj.xedit' &&
- X/***********************************************************************
- X * *
- X * PREFIXJ -- Justification XEDIT prefix macro, release 2 *
- X * *
- X * (c) Eric Thomas 1986 (ERIC at FRECP11) *
- X * *
- X * This file was last updated on Friday, February the 27th of 1987 *
- X * *
- X * This macro can be used to define a justification prefix to XEDIT: *
- X * J, Jnnnn, JJ...JJ. The selected lines will be justified using the *
- X * same algorithm and parameters as the JM macro, to which you should *
- X * refer for more details on the justification process itself. See *
- X * also file "JUSTIFY MEMO" from Netserv. *
- X * *
- X * Your PROFILE XEDIT must be modified in order to define the name you *
- X * want to give the justify synonym. The following two lines should be *
- X * added to PROFILE XEDIT, for example immediately after all other *
- X * synonym definitions: *
- X * *
- X * SET PREFIX SYNONYM J PREFIXJ *
- X * SET PREFIX SYNONYM JJ PREFIXJ *
- X * *
- X * You may substitute any other name for J or JJ if those names are *
- X * already in use. *
- X * *
- X * 3 Feb 1986: changed default right margin from 79 to 78 for compa- *
- X * tibility with the JF macro. *
- X * *
- X * 22 Feb 1986: minimum required length redefined to 85% for better *
- X * results. *
- X * *
- X * 27 Feb 1986: incorrect results when first TAB not in column 1. *
- X * AUTOSAVE may get triggered several times during *
- X * execution of the macro. *
- X * *
- X ***********************************************************************/
- X
- X'COMMAND EXTRACT /Line/Uniqueid/Prefix/FN/FT/FM/Size/Cursor'
- X Address COMMAND 'GLOBALV SELECT $JM$ STACK $'uniqueid.1
- X Pull xfn xft xfm lmarg rmarg minl .
- X If xfn xft xfm ^= Space(fname.1 ftype.1 fmode.1) Then
- X Do
- X lmarg = 1
- X If prefix.1 ^= 'OFF' Then Do
- X rmarg = 73
- X minl = 62
- X End
- X Else Do
- X rmarg = 78
- X minl = 66
- X End
- X Address COMMAND 'GLOBALV SELECT $JM$ SETL $'uniqueid.1 fname.1,
- X ftype.1 fmode.1 lmarg rmarg minl
- X End
- X jc = rmarg + 1
- X maxl = minl+lmarg-1
- X
- X Arg prefix operand pline op rest
- X Parse Source . . . . . name .
- X prf=name||Space(op rest)
- X
- X If prefix ^= 'PREFIX' Then
- X Call Error1 "8 646E 'PREFIXJ' must be invoked from the prefix area."
- X
- X If operand = 'CLEAR' Then Exit
- X
- X'COMMAND PRESERVE'
- X'COMMAND SET LINEND OFF'
- X'COMMAND SET IMAGE OFF'
- X'COMMAND SET AUTOSAVE OFF'
- X
- X accents = '@{}:?]XDKa*J-\X
- X/* You may wish not to consider accentuated characters as alphabetical
- X ones, especially since some of them are regular characters on
- X some displays (eg '@' -- 'at' sign or 'a accent grave' french
- X character). In that case, remove the "||accents" portion of the
- X following statement. */
- X alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'||accents
- X
- X Select
- X When Length(name) = 1 Then
- X Do
- X If rest ^= '' Then Call Error "0 659E Invalid prefix subcommand:" prf
- X If op = '' Then op = 1
- X If op = '*' Then op = size.1
- X If Datatype(op,'W') & op > 0
- X Then
- X Do
- X 'COMMAND :'pline
- X Do Format(op,,0)
- X Call Justifyline
- X 'COMMAND NEXT'
- X pline = pline + 1
- X If pline > size.1 Then Leave
- X End
- X Signal Closeup
- X End
- X Else Call Error "0 659E Invalid prefix subcommand:" prf
- X End
- X
- X When Length(name) = 2 Then
- X Do
- X If op ^= '' Then Call Error "0 659E Invalid prefix subcommand:" prf
- X 'COMMAND EXTRACT /PENDING BLOCK' name ':0 :'pline '/'
- X If pending.0 ^= 0
- X Then
- X Do
- X 'COMMAND :'pending.1 'COMMAND SET PENDING OFF'
- X Do pline-pending.1+1
- X Call Justifyline
- X 'COMMAND NEXT'
- X pending.1 = pending.1 + 1
- X If pending.1 > size.1 Then Leave
- X End
- X Signal Closeup
- X End
- X Else 'COMMAND :'pline 'COMMAND SET PENDING BLOCK' Left(prf,5)
- X End
- X
- X Otherwise Call Error "0 686E Synonym '"name"' not recognized by prefix macro 'PREFIXJ'."
- X End
- X
- X'COMMAND RESTORE'
- X Exit
- X
- XCloseup:
- X 'COMMAND :'line.1 'COMMAND RESTORE'
- X 'COMMAND CURSOR SCREEN' cursor.5 cursor.6 'PRIORITY 40'
- X Exit
- X
- XError:
- X 'COMMAND :'pline 'COMMAND SET PENDING ERROR' Left(prf,5)
- X 'COMMAND RESTORE'
- X
- XError1:
- X Parse arg err msg
- X If msg ^= '' Then 'COMMAND EMSG PXJ'Strip(msg)
- X Exit err
- X
- XJustifyline:
- X 'COMMAND EXTRACT /Curline'
- X start = Verify(curline.3,alphabet,'MATCH',lmarg)
- X If start = 0 | start >= rmarg Then Return
- X If Length(Strip(Left(curline.3,rmarg),'T')) < maxl Then Return
- X 'COMMAND REPLACE' Left(curline.3,start-1)Justify(Substr(curline.3,start,jc-start),jc-start)Substr(curline.3,jc)
- X Return
- SHAR_EOF
- chmod 0600 prefixj.xedit ||
- echo 'restore of prefixj.xedit failed'
- Wc_c="`wc -c < 'prefixj.xedit'`"
- test 5979 -eq "$Wc_c" ||
- echo 'prefixj.xedit: original size 5979, current size' "$Wc_c"
- fi
- # ============= prefixtf.xedit ==============
- if test -f 'prefixtf.xedit' -a X"$1" != X"-c"; then
- echo 'x - skipping prefixtf.xedit (File already exists)'
- else
- echo 'x - extracting prefixtf.xedit (Text)'
- sed 's/^X//' << 'SHAR_EOF' > 'prefixtf.xedit' &&
- X/***********************************************************************
- X * *
- X * PREFIXTF -- Text Flow XEDIT prefix macro, release 2 *
- X * *
- X * (c) Eric Thomas 1987 (ERIC at FRECP11) *
- X * *
- X * This file was last updated on Sunday, March the 8th of 1987 *
- X * *
- X * This macro can be used to define a "Text Flow" prefix to XEDIT: *
- X * TF<adj>...TF. Text from the selected lines will be flown in or out *
- X * to produce evenly balanced lines, and will eventually be justified. *
- X * The "input" margins can be defined by means of the JM macro (qqv), *
- X * while 'adj' defines the "output" right margin. It defaults to the *
- X * input right margin and must be either an absolute column number or *
- X * an offset (+nn or -nn) relative to the input right margin. *
- X * *
- X * Please refer to file "JUSTIFY MEMO" (available from Netserv) for *
- X * more details. *
- X * *
- X * Your PROFILE XEDIT must be modified in order to define the name you *
- X * want to give to the Text Flow prefix. The following line should be *
- X * added to PROFILE XEDIT, for example immediately after all other *
- X * synonym definitions: *
- X * *
- X * SET PREFIX SYNONYM TF PREFIXTF *
- X * *
- X * You may substitute any other name for TF if this name is already in *
- X * use. *
- X * *
- X * 08 Mar 1987: Some fixes that can't be explained in 4-5 lines... *
- X * *
- X ***********************************************************************/
- X
- X'COMMAND EXTRACT /Line/Uniqueid/Prefix/FN/FT/FM/Size/Cursor/Trunc'
- X Address COMMAND 'GLOBALV SELECT $JM$ STACK $'uniqueid.1
- X Pull xfn xft xfm lmarg rmarg minl .
- X If xfn xft xfm ^= Space(fname.1 ftype.1 fmode.1) Then
- X Do
- X lmarg = 1
- X If prefix.1 ^= 'OFF' Then Do
- X rmarg = 73
- X minl = 62
- X End
- X Else Do
- X rmarg = 78
- X minl = 66
- X End
- X Address COMMAND 'GLOBALV SELECT $JM$ SETL $'uniqueid.1 fname.1,
- X ftype.1 fmode.1 lmarg rmarg minl
- X End
- X
- X Arg prefix function pline op
- X If prefix ^= 'PREFIX' Then
- X Do
- X "COMMAND EMSG 'PREFIXTF' must be invoked from the prefix area."
- X Exit 8
- X End
- X If function = 'CLEAR' Then Exit 0
- X
- X Parse Source . . . . . name .
- X op = Space(op,0)
- X prefix = name||op
- X
- X'COMMAND PRESERVE'
- X'COMMAND SET LINEND OFF'
- X'COMMAND SET IMAGE OFF'
- X'COMMAND SET AUTOSAVE OFF'
- X
- X accents = '@{}:?]XDKa*J-\X
- X/* You may wish not to consider accentuated characters as alphabetical
- X ones, especially since some of them are regular characters on
- X some displays (eg '@' -- 'at' sign or 'a accent grave' french
- X character). In that case, remove the "||accents" portion of the
- X following statement. */
- X alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'||,
- X '0123456789()"'':;'||accents
- X'COMMAND EXTRACT /PENDING BLOCK' name ':0 :'pline '/'
- X If pending.0 = 0 Then
- X Do
- X If op ^= '' & ^Datatype(op,'W') Then
- X Call Error '8 Invalid argument -- "'op'".'
- X 'COMMAND :'pline 'COMMAND SET PENDING BLOCK' Left(prefix,5)
- X 'COMMAND RESTORE'
- X Exit
- X End
- X If op ^= '' Then
- X Call Error '0 No argument is allowed on closing prefix ('prefix').'
- X
- X'COMMAND :'pending.1 'COMMAND SET PENDING OFF'
- X If pending.1 = 0 Then pending.1 = 1
- X If pending.5 = ''
- X Then newrmarg = rmarg
- X Else Do
- X op = pending.5
- X If ^Datatype(op,'W') Then
- X Call Error '0 Invalid argument -- "'op'".'
- X Select
- X When Left(op,1) = '-' Then newrmarg = rmarg - Substr(op,2)
- X When Left(op,1) = '+' Then newrmarg = rmarg + Substr(op,2)
- X Otherwise newrmarg = op
- X End
- X If newrmarg < lmarg+2 | newrmarg > trunc.1 Then
- X Call Error '0 New right margin exceeds allowable boundaries.'
- X End
- X
- X'COMMAND -1'
- X t. = ''
- X n. = 1
- X index = 1
- X il = 1
- X previndent = -2
- X ll = rmarg-lmarg+1
- X
- X Do pline-pending.1+1
- X 'COMMAND NEXT'
- X If rc ^= 0 Then Leave
- X 'COMMAND EXTRACT /Curline'
- X line = Substr(curline.3,lmarg,ll)
- X indent = Verify(line'A',alphabet,'M')
- X l.index.il = Left(curline.3,lmarg-1)Left(line,indent-1)
- X r.index.il = Substr(curline.3,rmarg+1)
- X previl = il
- X If Length(l.index.il) > newrmarg Then Call Spill_L
- X line = Substr(line,indent)
- X If line = '' Then
- X Do
- X Call Close_Par
- X previndent = 0
- X Iterate
- X End
- X Select
- X When previndent = indent Then nop
- X When previndent = -2 Then previndent = -1
- X When previndent = -1 Then previndent = indent
- X Otherwise
- X Call Close_Par
- X il = il - 1
- X previndent = -1
- X End
- X t.index = t.index line
- X il = il + 1
- X End
- X
- X n.index = il - 1
- X If n.index = 0 Then index = index - 1
- X
- X/*do i = 1 to index;
- Xsay 'T.'i'='t.i;
- Xsay ' n.'i'='n.i
- Xdo j = 1 to 10; if l.i.j == 'L.'i'.'j then iterate
- Xsay ' L.'i'.'j'= >>>'l.i.j'<<<'; end
- Xend*/
- X
- X toldspill = 0
- X'COMMAND :'pending.1 'COMMAND -1'
- X Do i = 1 to index
- X If n.i = 0 Then Iterate
- X If t.i = '' Then
- X Do
- X 'COMMAND INPUT' Left(l.i.1,newrmarg)r.i.1
- X Iterate
- X End
- X il = 1
- X t = Space(t.i)
- X Do until t = ''
- X xl = newrmarg-Length(l.i.il)+1
- X j = Lastpos(' ',t' ',xl)
- X If j = 0 Then Call Spill
- X line = Left(t,j-1)
- X t = Strip(Substr(t,j))
- X If t ^= '' Then line = Justify(line,xl-1)
- X 'COMMAND INPUT' Left(l.i.il||line,newrmarg)r.i.il
- X If il ^= n.i Then il = il + 1
- X End
- X End
- X'COMMAND MSGMODE OFF'
- X'COMMAND +1 COMMAND DELETE' pline-pending.1+1
- X'COMMAND :'line.1 'COMMAND RESTORE'
- X'COMMAND CURSOR SCREEN' cursor.5 cursor.6 'PRIORITY 40'
- X Exit
- X
- XClose_Par:
- X n.index = previl - 1
- X i = index
- X index = index + 1
- X Do j = 1 for il-previl+1
- X l.index.j = l.i.previl
- X r.index.j = r.i.previl
- X previl = previl + 1
- X End
- X il = j
- X Return
- X
- XSpill:
- X xl = Max(xl,2)
- X j = xl
- X If toldspill Then Return
- X toldspill = 1
- X 'COMMAND EMSG Text flow operation caused words to be spilled.'
- X Return
- X
- XSpill_L:
- X If l.index.il = '' Then
- X Do
- X l.index.il = ' ' /* Purposefully leave one 1 blank */
- X Return
- X End
- X Do while Length(l.index.il) > newrmarg
- X xline = Substr(l.index.il,newrmarg+1)
- X l.index.il = Left(l.index.il,newrmarg)
- X il = il + 1
- X l.index.il = xline
- X End
- X Return
- X
- XError:
- X Parse arg err msg
- X 'COMMAND :'pline 'COMMAND SET PENDING ERROR' Left(prefix,5)
- X 'COMMAND RESTORE'
- X If msg ^= '' Then 'COMMAND EMSG' Strip(msg)
- X Exit err
- SHAR_EOF
- chmod 0600 prefixtf.xedit ||
- echo 'restore of prefixtf.xedit failed'
- Wc_c="`wc -c < 'prefixtf.xedit'`"
- test 7424 -eq "$Wc_c" ||
- echo 'prefixtf.xedit: original size 7424, current size' "$Wc_c"
- fi
- exit 0
-