home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Professional
/
OS2PRO194.ISO
/
os2
/
editor
/
me
/
wp.m
< prev
Wrap
Text File
|
1994-01-31
|
5KB
|
198 lines
/**********************************************************************/
/* */
/* WP - some simple macros to do some word-processing thingies. */
/* 1) Allows you to reformat a paragraph. This means cramming */
/* as many words into a line as possible. */
/* 2) Allows to to justify those lines so the last char aligns */
/* at the right margin. */
/* */
/* Kludged together by Marc Adler/Magma Systems */
/* */
/**********************************************************************/
#define CTRL_C 3
#define ALT_J 164
#define ALT_K 165
init()
{
assign_key("just_para", ALT_J);
assign_key("reform", ALT_K);
assign_key("center", CTRL_C);
}
reform()
{
int len;
int margin;
int oldlineno;
string buf;
/* prompt the user for the right margin */
buf = get_tty_str("What is the right margin? ");
if ((margin = atoi(buf)) <= 0) return;
oldlineno = currlinenum(); /* save the current line number */
/* March down till the end of the paragraph */
while (!is_line_blank(currline()))
{
if ((len = strlen(currline())) == 0) /* no more chars - bye */
break;
if (len > margin) /* we must split the line */
{
setcol(margin); /* move to the first word before */
if (currchar() != ' ') /* the right margin */
prevword();
if (!is_bol()) /* move backwards to the first blank */
{
left();
while (!is_bol() && currchar() == ' ')
left();
right();
}
insert("\n"); /* split it */
while (!is_eol() && currchar() == ' ') /* trim leading blanks */
delchar();
}
else if (len <= margin) /* too short - join next line if we can */
{
if (down() && is_line_blank(currline())) break; /* no next line */
/* trim the blanks off the end of the current line */
up();
goeol();
left();
while (currchar() == ' ' && currcol() > 1)
{
delchar(); left();
}
/* make sure there's a blank between the last word of this line */
/* and the first word of the joined line */
goeol();
insert(" ");
delchar(); /* join 'em */
}
} /* end while */
/* Go to the original position */
goline(oldlineno);
gobol();
}
/* just_para - right justifies all lines downwards until the end */
/* of the paragraph */
just_para()
{
while (!is_line_blank(currline()))
{
expand();
down();
}
}
/* expand() - right-justifies a line by inserting spaces between words */
expand()
{
string text, new;
int margin, nextra, nholes, nb;
margin = 65;
squash(); /* compress multiple blanks */
text = currline();
nholes = wordcount(text) - 1; /* get the number of gaps */
nextra = margin - strlen(text); /* and the # of padding blks */
new = ""; /* 'new' holds the new line */
gobol();
while (!is_eol() && nholes > 0)
{
c = currchar();
new = strcat(new, chr(c));
if (c == ' ')
{
/* pad with the appropriate number of blanks */
new = strcat(new, repstr(" ", nb = nextra/nholes));
nextra = nextra - nb;
nholes = nholes - 1;
}
right();
}
/* Concat the remainder of the old line to the new line */
new = strcat(new, substr(text, currcol(), 100));
/* delete the old line and insert the new one */
gobol();
deleol();
insert(new);
gobol();
}
/* squash() - compressed sequences of mult. blanks into one blank */
squash()
{
gobol(); /* start at the front of the curr line */
while (!is_eol())
{
if (currchar() == ' ')
{
right();
while (!is_eol() && currchar() == ' ') delchar(); /* compress */
}
else
right();
}
gobol(); /* go back to the front */
}
/* Wordcount() - counts the # of words in the string str. Assumes that */
/* the string has no multiple blanks (performed by squash) */
wordcount(str)
string str;
{
int count, i, len;
count = 1;
len = strlen(str);
for (i = 1; i <= len; i = i + 1)
if (substr(str, i, 1) == " ") count = count + 1;
return count;
}
is_line_blank(str)
string str;
{
rtrim(str);
return (str == "");
}
/* This macro centers the current line */
center()
{
string text;
text = currline();
gobol(); /* get rid of the characters in the line */
deleol();
ltrim(text); /* remove leading & trailing blanks */
rtrim(text);
setcol((80 - strlen(text)) / 2); /* go to midway point */
insert(text); /* re-insert the text */
gobol(); /* move to the next line down */
down();
}