📄 lyprint.c
字号:
outfile_fp = stdout; stop_curses();#ifndef VMS signal(SIGINT, SIG_IGN);#endif /* !VMS */ if (LYPrependBaseToSource && HTisDocumentSource()) { /* * Added the document's base as a BASE tag * to the top of the file. May create * technically invalid HTML, but will help * get any partial or relative URLs resolved * properly if no BASE tag is present to * replace it. - FM */ fprintf(outfile_fp, "<!-- X-URL: %s -->\n<BASE HREF=\"%s\">\n\n", newdoc->address, content_base); } print_wwwfile_to_fd(outfile_fp, 0); if (keypad_mode) printlist(outfile_fp, FALSE);#ifdef VMS if (HadVMSInterrupt) { HadVMSInterrupt = FALSE; start_curses(); break; }#endif /* VMS */ fprintf(stdout,"\n\n%s", PRESS_RETURN_TO_FINISH); fflush(stdout); /* refresh to screen */ LYgetch(); /* grab some user input to pause */#ifdef VMS HadVMSInterrupt = FALSE;#endif /* VMS */ start_curses(); break; case PRINTER: pages = lines_in_file/pagelen; /* count fractional pages ! */ if ((lines_in_file % pagelen) > 0) pages++; if (pages > 4) { sprintf(filename, CONFIRM_LONG_PAGE_PRINT, pages); _statusline(filename); c=LYgetch();#ifdef VMS if (HadVMSInterrupt) { HadVMSInterrupt = FALSE; _statusline(PRINT_REQUEST_CANCELLED); sleep(InfoSecs); break; }#endif /* VMS */ if (c == RTARROW || c == 'y' || c== 'Y' || c == '\n' || c == '\r') { addstr(" Ok..."); } else { _statusline(PRINT_REQUEST_CANCELLED); sleep(InfoSecs); break; } } if (first) { tempname(tempfile, NEW_FILE); first = FALSE; } else { remove(tempfile); /* Remove previous tempfile. */ } if (((cp = strrchr(tempfile, '.')) != NULL) &&#ifdef VMS NULL == strchr(cp, ']') &&#endif /* VMS */ NULL == strchr(cp, '/')) { if (HTisDocumentSource() && strcasecomp(cp, HTML_SUFFIX)) { *cp = '\0'; strcat(tempfile, HTML_SUFFIX); } else if (!HTisDocumentSource() && strcasecomp(cp, ".txt")) { *cp = '\0'; strcat(tempfile, ".txt"); } } if ((outfile_fp = LYNewTxtFile(tempfile)) == NULL) { HTAlert(FILE_ALLOC_FAILED); break; } if (LYPrependBaseToSource && HTisDocumentSource()) { /* * Added the document's base as a BASE tag * to the top of the file. May create * technically invalid HTML, but will help * get any partial or relative URLs resolved * properly if no BASE tag is present to * replace it. - FM */ fprintf(outfile_fp, "<!-- X-URL: %s -->\n<BASE HREF=\"%s\">\n\n", newdoc->address, content_base); } print_wwwfile_to_fd(outfile_fp, 0); if (keypad_mode) printlist(outfile_fp, FALSE); fclose(outfile_fp); /* find the right printer number */ { int count=0; for (cur_printer = printers; count < printer_number; count++, cur_printer = cur_printer->next) ; /* null body */ } /* * Commands have the form "command %s [%s] [etc]" * where %s is the filename and the second optional * %s is the suggested filename. */ if (cur_printer->command != NULL) { /* * Check for two '%s' and ask for the second filename * argument if there is. */ char *first_s = strstr(cur_printer->command, "%s"); if (first_s && strstr(first_s+1, "%s")) { _statusline(FILENAME_PROMPT); again: strcpy(filename, sug_filename); change_sug_filename(filename); if (!(HTisDocumentSource()) && (cp = strrchr(filename, '.')) != NULL) { format = HTFileFormat(filename, &encoding, NULL); if (!strcasecomp(format->name, "text/html") || !IsUnityEnc(encoding)) { *cp = '\0'; strcat(filename, ".txt"); } } check_again: if ((ch = LYgetstr(filename, VISIBLE, sizeof(filename), recall)) < 0 || *filename == '\0' || ch == UPARROW || ch == DNARROW) { if (recall && ch == UPARROW) { if (FirstRecall) { FirstRecall = FALSE; /* * Use the last Fname in the list. - FM */ FnameNum = 0; } else { /* * Go back to the previous Fname * in the list. - FM */ FnameNum++; } if (FnameNum >= FnameTotal) { /* * Reset the FirstRecall flag, * and use sug_file or a blank. - FM */ FirstRecall = TRUE; FnameNum = FnameTotal; _statusline(FILENAME_PROMPT); goto again; } else if ((cp = (char *)HTList_objectAt( sug_filenames, FnameNum)) != NULL) { strcpy(filename, cp); if (FnameTotal == 1) { _statusline(EDIT_THE_PREV_FILENAME); } else { _statusline(EDIT_A_PREV_FILENAME); } goto check_again; } } else if (recall && ch == DNARROW) { if (FirstRecall) { FirstRecall = FALSE; /* * Use the first Fname in the list. - FM */ FnameNum = FnameTotal - 1; } else { /* * Advance to the next Fname * in the list. - FM */ FnameNum--; } if (FnameNum < 0) { /* * Set the FirstRecall flag, * and use sug_file or a blank. - FM */ FirstRecall = TRUE; FnameNum = FnameTotal; _statusline(FILENAME_PROMPT); goto again; } else if ((cp = (char *)HTList_objectAt( sug_filenames, FnameNum)) != NULL) { strcpy(filename, cp); if (FnameTotal == 1) { _statusline(EDIT_THE_PREV_FILENAME); } else { _statusline(EDIT_A_PREV_FILENAME); } goto check_again; } } /* * Printer cancelled. */ _statusline(PRINT_REQUEST_CANCELLED); sleep(InfoSecs); break; } if (no_dotfiles || !show_dotfiles) { if (*filename == '.' ||#ifdef VMS ((cp = strrchr(filename, ':')) && *(cp+1) == '.') || ((cp = strrchr(filename, ']')) && *(cp+1) == '.') ||#endif /* VMS */ ((cp = strrchr(filename, '/')) && *(cp+1) == '.')) { HTAlert(FILENAME_CANNOT_BE_DOT); _statusline(NEW_FILENAME_PROMPT); FirstRecall = TRUE; FnameNum = FnameTotal; goto again; } } /* * Cancel if the user entered "/dev/null" on Unix, * or an "nl:" path (case-insensitive) on VMS. - FM */#ifdef VMS if (!strncasecomp(filename, "nl:", 3) || !strncasecomp(filename, "/nl/", 4))#else if (!strcmp(filename, "/dev/null"))#endif /* VMS */ { _statusline(PRINT_REQUEST_CANCELLED); sleep(InfoSecs); break; } HTAddSugFilename(filename); }#ifdef VMS sprintf(buffer, cur_printer->command, tempfile, filename, "", "", "", "", "", "", "", "", "", "");#else /* Unix: */ /* * Prevent spoofing of the shell. */ cp = quote_pathname(filename); sprintf(buffer, cur_printer->command, tempfile, cp, "", "", "", "", "", "", "", "", "", ""); FREE(cp);#endif /* !VMS */ } else { HTAlert(PRINTER_MISCONF_ERROR); break; } /* * Move the cursor to the top of the screen so that * output from system'd commands don't scroll up * the screen. */ move(1,1); stop_curses(); if (TRACE) fprintf(stderr, "command: %s\n", buffer); printf(PRINTING_FILE);#ifdef VMS /* * Set document's title as a VMS logical. - FM */ StrAllocCopy(envbuffer, HText_getTitle()); if (!(envbuffer && *envbuffer)) StrAllocCopy(envbuffer, "No Title"); Define_VMSLogical("LYNX_PRINT_TITLE", envbuffer);#else /* * Set document's title as an environment variable. - JKT */ StrAllocCopy(envbuffer, "LYNX_PRINT_TITLE="); StrAllocCat(envbuffer, HText_getTitle()); putenv(envbuffer);#endif /* VMS */ fflush(stdout); system(buffer);#ifdef VMS /* * Remove LYNX_PRINT_TITLE logical. - FM */ Define_VMSLogical("LYNX_PRINT_TITLE", "");#else /* * Remove LYNX_PRINT_TITLE value from environment. - KW */ envbuffer[17] = '\0'; /* truncate after '=' */ putenv(envbuffer);#endif /* VMS */ FREE(envbuffer); fflush(stdout);#ifndef VMS signal(SIGINT, cleanup_sig);#endif /* !VMS */ sleep(MessageSecs); start_curses(); /* don't remove(tempfile); */ } /* end switch */ FREE(link_info); FREE(sug_filename); FREE(content_base); FREE(content_location); return(NORMAL);}#ifdef VMSPRIVATE int remove_quotes ARGS1( char *, string){ int i; for(i = 0; string[i] != '\0'; i++) if(string[i] == '"') string[i] = ' '; else if(string[i] == '&') string[i] = ' '; else if(string[i] == '|') string[i] = ' '; return(0);}#endif /* VMS *//* * print_options writes out the current printer choices to a file * so that the user can select printers in the same way that * they select all other links * printer links look like * LYNXPRINT://LOCAL_FILE/lines=# print to a local file * LYNXPRINT://TO_SCREEN/lines=# print to the screen * LYNXPRINT://MAIL_FILE/lines=# mail the file * LYNXPRINT://PRINTER/lines=#/number=# print to printer number # */PUBLIC int print_options ARGS2( char **, newfile, int, lines_in_file){ static char tempfile[256]; static BOOLEAN first = TRUE; static char print_filename[256]; char buffer[LINESIZE]; int count; int pages; FILE *fp0; lynx_printer_item_type *cur_printer; pages = lines_in_file/66 + 1; if (first) { tempname(tempfile, NEW_FILE);#if defined (VMS) || defined (DOSPATH) sprintf(print_filename, "file://localhost/%s", tempfile);#else sprintf(print_filename, "file://localhost%s", tempfile);#endif /* VMS */ first = FALSE;#ifdef VMS } else { remove(tempfile); /* Remove duplicates on VMS. */#endif /* !VMS */ } if ((fp0 = LYNewTxtFile(tempfile)) == NULL) { HTAlert(UNABLE_TO_OPEN_PRINTOP_FILE); return(-1); } StrAllocCopy(*newfile, print_filename); LYforce_no_cache = TRUE; fprintf(fp0, "<head>\n<title>%s</title>\n</head>\n<body>\n", PRINT_OPTIONS_TITLE); fprintf(fp0,"<h1>Printing Options (%s Version %s)</h1><pre>\n", LYNX_NAME, LYNX_VERSION); pages = (lines_in_file+65)/66; sprintf(buffer, " There are %d lines, or approximately %d page%s, to print.\n", lines_in_file, pages, (pages > 1 ? "s" : "")); fputs(buffer,fp0); if (no_print || no_disk_save || child_lynx || no_mail) fprintf(fp0, " Some print functions have been disabled!!!\n"); fprintf(fp0, " You have the following print choices.\n"); fprintf(fp0, " Please select one:\n\n"); if (child_lynx == FALSE && no_disk_save == FALSE && no_print == FALSE) fprintf(fp0, " <a href=\"LYNXPRINT://LOCAL_FILE/lines=%d\">Save to a local file</a>\n", lines_in_file); else fprintf(fp0," Save to disk disabled.\n"); if (child_lynx == FALSE && no_mail == FALSE) fprintf(fp0, " <a href=\"LYNXPRINT://MAIL_FILE/lines=%d\">Mail the file</a>\n", lines_in_file); fprintf(fp0, " <a href=\"LYNXPRINT://TO_SCREEN/lines=%d\">Print to the screen</a>\n", lines_in_file); for (count = 0, cur_printer = printers; cur_printer != NULL; cur_printer = cur_printer->next, count++) if (no_print == FALSE || cur_printer->always_enabled) { fprintf(fp0, " <a href=\"LYNXPRINT://PRINTER/number=%d/pagelen=%d/lines=%d\">", count, cur_printer->pagelen, lines_in_file); fprintf(fp0, (cur_printer->name ? cur_printer->name : "No Name Given")); fprintf(fp0, "</a>\n"); } fprintf(fp0, "</pre>\n</body>\n"); fclose(fp0); LYforce_no_cache = TRUE; return(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -