📄 doc2html.c
字号:
/*
* doc2html.c -- program to convert Gnuplot .DOC format to
* World Wide Web (WWW) HyperText Markup Language (HTML) format
*
* Created by Russell Lang from doc2ipf by Roger Fearick from
* doc2rtf by M Castro from doc2gih by Thomas Williams.
* 1994-11-03
* Modified by Russell Lang 1996-10-15
* obtain title from first line of doc file.
* Conform to HTML 3.2.
* Modified by Russell Lang 1997-11-28
* Convert {bml* file.bmp} to <IMG SRC="file.gif">
* Modified by Russell Lang 1997-12-18
* Convert non-ascii characters to &#nnn;
* Modified by Russell Lang 2000-06-16
* Change A HREF and NAME fields to use the topic title, not line number.
* Modified by Russell Lang 2001-07-12
* Convert tags to lower case.
* Convert non-ascii characters in links to &#nnn;
* Replace isspace() which doesn't work with c > 127.
* Allow charset to be specified. If charset provided, do not
* quote non-ascii characters. This is to allow use with Greek.
*
* usage: doc2html gnuplot.doc gnuplot.htm
*
*/
/* note that tables must begin in at least the second column to */
/* be formatted correctly and tabs are forbidden */
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#define MAX_LINE_LEN 1024
#define TRUE 1
#define FALSE 0
struct LIST
{
int level;
int line;
char *string;
struct LIST *next;
};
struct LIST *list = NULL;
struct LIST *head = NULL;
struct LIST *keylist = NULL;
struct LIST *keyhead = NULL;
int debug = FALSE;
int nolinks = FALSE;
char *charset = NULL;
void parse(FILE *a);
int lookup(char *s);
char *title_from_index(int id);
void refs(int l, FILE *f);
void convert(FILE *a,FILE *b);
void process_line(char *line, FILE *b);
void putquoted(char *s, FILE *f);
int
main(int argc,char *argv[])
{
FILE * infile;
FILE * outfile;
if (argv[argc-1][0]=='-' && argv[argc-1][1]=='d') {
debug = TRUE;
argc--;
}
if (argv[argc-1][0]=='-' && argv[argc-1][1]=='n') {
nolinks = TRUE;
argc--;
}
if ( (argc > 4) || (argc == 1) ) {
fprintf(stderr,"Usage: %s infile outfile [charset]\n", argv[0]);
fprintf(stderr,"charset is ISO-8859-1 for ISO-Latin1, ISO-8859-7 for Greek, UTF-8 for Unicode\n");
return(1);
}
if ( (infile = fopen(argv[1],"r")) == (FILE *)NULL) {
fprintf(stderr,"%s: Can't open %s for reading\n",
argv[0], argv[1]);
return(1);
}
if (argc >= 3) {
if ( (outfile = fopen(argv[2],"w")) == (FILE *)NULL) {
fprintf(stderr,"%s: Can't open %s for writing\n",
argv[0], argv[2]);
}
}
else {
outfile = stdout;
}
if (argc >= 4)
charset = argv[3];
parse(infile);
convert(infile,outfile);
return(0);
}
/* scan the file and build a list of line numbers where particular levels are */
void parse(FILE *a)
{
static char line[MAX_LINE_LEN];
char *c;
int lineno=0;
int lastline=0;
/* skip title line */
fgets(line,MAX_LINE_LEN,a);
while (fgets(line,MAX_LINE_LEN,a))
{
lineno++;
if (isdigit(line[0]))
{
if (list == NULL)
head = (list = (struct LIST *) malloc(sizeof(struct LIST)));
else
list = (list->next = (struct LIST *) malloc(sizeof(struct LIST)));
list->line = lastline = lineno;
list->level = line[0] - '0';
list->string = (char *) malloc (strlen(line)+1);
c = strtok(&(line[1]),"\n");
strcpy(list->string, c);
list->next = NULL;
}
if (line[0]=='?')
{
if (keylist == NULL)
keyhead = (keylist = (struct LIST *) malloc(sizeof(struct LIST)));
else
keylist = (keylist->next = (struct LIST *) malloc(sizeof(struct LIST)));
keylist->line = lastline;
keylist->level = line[0] - '0';
c = strtok(&(line[1]),"\n");
if( c == NULL || *c == '\0' ) c = list->string ;
keylist->string = (char *) malloc (strlen(c)+1);
strcpy(keylist->string, c);
keylist->next = NULL;
}
}
rewind(a);
}
/* look up an in text reference */
int
lookup(char *s)
{
char *c;
char tokstr[MAX_LINE_LEN];
strcpy(tokstr, s);
/* first try the ? keyword entries */
keylist = keyhead;
while (keylist != NULL)
{
c = keylist->string;
while (*c == ' ') c++;
if (!strcmp(s, c)) return(keylist->line);
keylist = keylist->next;
}
/* then try titles */
#ifdef GNUPLOT
match = strtok(tokstr, " \n\t");
l = 0; /* level */
list = head;
while (list != NULL)
{
c = list->string;
while (*c == ' ') c++;
if (!strcmp(match, c))
{
l = list->level;
match = strtok(NULL, "\n\t ");
if (match == NULL)
{
return(list->line);
}
}
if (l > list->level)
break;
list = list->next;
}
#else
/* we list keys explicitly, rather than building them from multiple levels */
list = head;
while (list != NULL)
{
c = list->string;
while (*c == ' ') c++;
if (!strcmp(s, c)) return(list->line);
list = list->next;
}
#endif
return(-1);
}
char *title_from_index(int id)
{
struct LIST *l = NULL;
static char empty[] = "";
if (id < 0)
return empty;
l = head;
while (l != NULL) {
if (id == l->line)
return l->string;
l = l->next;
}
return NULL;
}
void putquoted(char *s, FILE *f)
{
unsigned int value;
unsigned int digit;
for (; *s; s++) {
if ((charset==NULL) && (*s & 0x80)) {
value = *s & 0xff;
fputc('&', f);
fputc('#', f);
digit = value / 100;
value -= digit * 100;
fputc('0' + digit, f);
digit = value / 10;
value -= digit * 10;
fputc('0' + digit, f);
fputc('0' + value, f);
}
else
fputc(*s, f);
}
}
/* search through the list to find any references */
void
refs(int l, FILE *f)
{
int curlevel;
char *c;
int inlist = FALSE;
/* find current line */
list = head;
while (list->line != l)
list = list->next;
curlevel = list->level;
list = list->next; /* look at next element before going on */
if (list != NULL)
{
inlist = TRUE;
fprintf(f,"<p>\n");
}
while (list != NULL) {
/* we are onto the next topic so stop */
if (list->level == curlevel)
break;
/* these are the next topics down the list */
if (list->level == curlevel+1) {
c = list->string;
while (*c == ' ') c++;
if (nolinks) {
fprintf(f,"<b>\n");
putquoted(c, f);
fprintf(f,"</b><br>\n");
}
else {
char *p = c;
fprintf(f,"<a href=\042#");
while (*p) {
if (*p == ' ')
fputc('_', f);
else {
if ((charset == NULL) && (*p & 0x80)) {
unsigned int value = *p & 0xff;
unsigned int digit;
fputc('&', f);
fputc('#', f);
digit = value / 100;
value -= digit * 100;
fputc('0' + digit, f);
digit = value / 10;
value -= digit * 10;
fputc('0' + digit, f);
fputc('0' + value, f);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -