📄 gridtext.c
字号:
/* turn the TITLE style off */ LynxChangeStyle(s_title, ABS_OFF, 0);#endif /* USE_COLOR_STYLE */ lynx_stop_title_color (); return;}/* Output a page** -------------*/PRIVATE void display_page ARGS3( HText *, text, int, line_number, char *, target){ HTLine * line = NULL; int i; char *cp, tmp[7]; int last_screen; TextAnchor *Anchor_ptr = NULL; FormInfo *FormInfo_ptr; BOOL display_flag = FALSE; HTAnchor *link_dest; HTAnchor *link_dest_intl = NULL; static int last_nlinks = 0; static int charset_last_displayed = -1; lynx_mode = NORMAL_LYNX_MODE; if (text == NULL) { /* * Check whether to force a screen clear to enable scrollback, * or as a hack to fix a reverse clear screen problem for some * curses packages. - shf@access.digex.net & seldon@eskimo.com */ if (enable_scrollback) { addch('*'); refresh(); clear(); } addstr("\n\nError accessing document!\nNo data available!\n"); refresh(); nlinks = 0; /* set number of links to 0 */ return; } tmp[0] = tmp[1] = tmp[2] = '\0'; text->page_has_target = NO; last_screen = text->Lines - (display_lines - 2); line = text->last_line->prev; /* * Constrain the line number to be within the document. */ if (text->Lines < (display_lines)) line_number = 0; else if (line_number > text->Lines) line_number = last_screen; else if (line_number < 0) line_number = 0; for (i = 0, line = text->last_line->next; /* Find line */ i < line_number && (line != text->last_line); i++, line = line->next) { /* Loop */#ifndef VMS if (!LYNoCore) { assert(line->next != NULL); } else if (line->next == NULL) { if (enable_scrollback) { addch('*'); refresh(); clear(); } addstr("\n\nError drawing page!\nBad HText structure!\n"); refresh(); nlinks = 0; /* set number of links to 0 */ return; }#else assert(line->next != NULL);#endif /* !VMS */ } if (LYlowest_eightbit[current_char_set] <= 255 && (current_char_set != charset_last_displayed) && /* * current_char_set has changed since last invocation, * and it's not just 7-bit. * Also we don't want to do this for -dump and -source etc. */ LYCursesON) { charset_last_displayed = current_char_set;#ifdef EXP_CHARTRANS_AUTOSWITCH#ifdef LINUX /* * Currently implemented only for LINUX */ stop_curses(); UCChangeTerminalCodepage(current_char_set, &LYCharSet_UC[current_char_set]); start_curses();#endif /* LINUX */#endif /* EXP_CHARTRANS_AUTOSWITCH */ } /* * Check whether to force a screen clear to enable scrollback, * or as a hack to fix a reverse clear screen problem for some * curses packages. - shf@access.digex.net & seldon@eskimo.com */ if (enable_scrollback) { addch('*'); refresh(); clear(); } text->top_of_screen = line_number; display_title(text); /* will move cursor to top of screen */ display_flag=TRUE; /* * Output the page. */ if (line) { char *data; int offset, HitOffset, LenNeeded; for (i = 0; i < (display_lines); i++) { /* * Verify and display each line. */#ifndef VMS if (!LYNoCore) { assert(line != NULL); } else if (line == NULL) { if (enable_scrollback) { addch('*'); refresh(); clear(); } addstr("\n\nError drawing page!\nBad HText structure!\n"); refresh(); nlinks = 0; /* set number of links to 0 */ return; }#else assert(line != NULL);#endif /* !VMS */ display_line(line, text);#if defined(FANCY_CURSES) || defined(USE_SLANG) /* * If the target is on this line, recursively * seek and emphasize it. - FM */ data = (char *)line->data; offset = (int)line->offset; while ((target && *target) && (case_sensitive ? (cp = LYno_attr_mbcs_strstr(data, target, text->T.output_utf8, &HitOffset, &LenNeeded)) != NULL : (cp = LYno_attr_mbcs_case_strstr(data, target, text->T.output_utf8, &HitOffset, &LenNeeded)) != NULL) && ((int)line->offset + LenNeeded) < LYcols) { int itmp = 0; int written = 0; int x_pos = offset + (int)(cp - data); int len = strlen(target); size_t utf_extra = 0; int y; text->page_has_target = YES; /* * Start the emphasis. */ LYstartTargetEmphasis(); /* * Output the target characters. */ for (; written < len && (tmp[0] = data[itmp]) != '\0'; itmp++) { if (IsSpecialAttrChar(tmp[0])) { /* * Ignore special characters. */ x_pos--; } else if (cp == &data[itmp]) { /* * First printable character of target. */ move((i + 1), x_pos); if (text->T.output_utf8 && !isascii(tmp[0])) { if ((*tmp & 0xe0) == 0xc0) { utf_extra = 1; } else if ((*tmp & 0xf0) == 0xe0) { utf_extra = 2; } else if ((*tmp & 0xf8) == 0xf0) { utf_extra = 3; } else if ((*tmp & 0xfc) == 0xf8) { utf_extra = 4; } else if ((*tmp & 0xfe) == 0xfc) { utf_extra = 5; } else { /* * Garbage. */ utf_extra = 0; } if (strlen(&line->data[itmp+1]) < utf_extra) { /* * Shouldn't happen. */ utf_extra = 0; } } if (utf_extra) { strncpy(&tmp[1], &line->data[itmp+1], utf_extra); tmp[utf_extra+1] = '\0'; itmp += utf_extra; addstr(tmp); tmp[1] = '\0'; written += (utf_extra + 1); utf_extra = 0; } else if (HTCJK != NOCJK && !isascii(tmp[0])) { /* * For CJK strings, by Masanobu Kimura. */ tmp[1] = data[++itmp]; addstr(tmp); tmp[1] = '\0'; written += 2; } else { addstr(tmp); written++; } } else if (&data[itmp] > cp) { /* * Output all the other printable target chars. */ if (text->T.output_utf8 && !isascii(tmp[0])) { if ((*tmp & 0xe0) == 0xc0) { utf_extra = 1; } else if ((*tmp & 0xf0) == 0xe0) { utf_extra = 2; } else if ((*tmp & 0xf8) == 0xf0) { utf_extra = 3; } else if ((*tmp & 0xfc) == 0xf8) { utf_extra = 4; } else if ((*tmp & 0xfe) == 0xfc) { utf_extra = 5; } else { /* * Garbage. */ utf_extra = 0; } if (strlen(&line->data[itmp+1]) < utf_extra) { /* * Shouldn't happen. */ utf_extra = 0; } } if (utf_extra) { strncpy(&tmp[1], &line->data[itmp+1], utf_extra); tmp[utf_extra+1] = '\0'; itmp += utf_extra; addstr(tmp); tmp[1] = '\0'; written += (utf_extra + 1); utf_extra = 0; } else if (HTCJK != NOCJK && !isascii(tmp[0])) { /* * For CJK strings, by Masanobu Kimura. */ tmp[1] = data[++itmp]; addstr(tmp); tmp[1] = '\0'; written += 2; } else { addstr(tmp); written++; } } } /* * Stop the emphasis, and reset the offset and * data pointer for our current position in the * line. - FM */ LYstopTargetEmphasis(); LYGetYX(y, offset); data = (char *)&data[itmp]; /* * Adjust the cursor position, should we be at * the end of the line, or not have another hit * in it. - FM */ move((i + 2), 0); }#endif /* FANCY CURSES || USE_SLANG */ /* * Stop if this is the last line. Otherwise, make sure * display_flag is set and process the next line. - FM */ if (line == text->last_line) { /* * Clear remaining lines of display. */ for (i++; i < (display_lines); i++) { move((i + 1), 0); clrtoeol(); } break; } display_flag = TRUE; line = line->next; } } text->next_line = line; /* Line after screen */ text->stale = NO; /* Display is up-to-date */ /* * Add the anchors to Lynx structures. */ nlinks = 0; for (Anchor_ptr=text->first_anchor; Anchor_ptr != NULL && Anchor_ptr->line_num <= line_number+(display_lines); Anchor_ptr = Anchor_ptr->next) { if (Anchor_ptr->line_num >= line_number && Anchor_ptr->line_num < line_number+(display_lines)) { /* * Load normal hypertext anchors. */ if (Anchor_ptr->show_anchor && Anchor_ptr->hightext && strlen(Anchor_ptr->hightext) > 0 && (Anchor_ptr->link_type & HYPERTEXT_ANCHOR)) { links[nlinks].hightext = Anchor_ptr->hightext; links[nlinks].hightext2 = Anchor_ptr->hightext2; links[nlinks].hightext2_offset = Anchor_ptr->hightext2offset; links[nlinks].inUnderline = Anchor_ptr->inUnderline; links[nlinks].anchor_number = Anchor_ptr->number; links[nlinks].anchor_line_num = Anchor_ptr->line_num; link_dest = HTAnchor_followMainLink( (HTAnchor *)Anchor_ptr->anchor); { /* * Memory leak fixed 05-27-94 * Garrett Arch Blythe */ auto char *cp_AnchorAddress = NULL; if (traversal) cp_AnchorAddress = stub_HTAnchor_address(link_dest); else {#ifndef DONT_TRACK_INTERNAL_LINKS if (Anchor_ptr->link_type == INTERNAL_LINK_ANCHOR) { link_dest_intl = HTAnchor_followTypedLink( (HTAnchor *)Anchor_ptr->anchor, LINK_INTERNAL); if (link_dest_intl && link_dest_intl != link_dest) { if (TRACE) fprintf(stderr, "display_page: unexpected typed link to %s!\n", link_dest_intl->parent->address); link_dest_intl = NULL; } } else link_dest_intl = NULL; if (link_dest_intl) { char *cp2 = HTAnchor_address(link_dest_intl); cp_AnchorAddress = cp2; } else#endif cp_AnchorAddress = HTAnchor_address(link_dest); } FREE(links[nlinks].lname); if (cp_AnchorAddress != NULL) links[nlinks].lname = cp_AnchorAddress; else StrAllocCopy(links[nlinks].lname, empty_string); } links[nlinks].lx = Anchor_ptr->line_pos; links[nlinks].ly = ((Anchor_ptr->line_num + 1) - line_number); if (link_dest_intl) links[nlinks].type = WWW_INTERN_LINK_TYPE; else links[nlinks].type = WWW_LINK_TYPE; links[nlinks].target = empty_string; links[nlinks].form = NULL; nlinks++; display_flag = TRUE; } else if (Anchor_ptr->link_type == INPUT_ANCHOR && Anchor_ptr->input_field->type != F_HIDDEN_TYPE) { /* * Handle form fields. */ lynx_mode = FORMS_LYNX_MODE; FormInfo_ptr = Anchor_ptr->input_field; links[nlinks].anchor_number = Anchor_ptr->number; links[nlinks].anchor_line_num = Anchor_ptr->line_num; links[nlinks].form = FormInfo_ptr; links[nlinks].lx = Anchor_ptr->line_pos; links[nlinks].ly = ((Anchor_ptr->line_num + 1) - line_number); links[nlinks].type = WWW_FORM_LINK_TYPE; links[nlinks].inUnderline = Anchor_ptr->inUnderline; links[nlinks].target = empty_string; StrAllocCopy(links[nlinks].lname, empty_string); if (FormInfo_ptr->type == F_RADIO_TYPE) { if (FormInfo_ptr->num_value) links[nlinks].hightext = checked_radio; else links[nlinks].hightext = unchecked_radio; } else if (FormInfo_ptr->type == F_CHECKBOX_TYPE) { if (FormInfo_ptr->num_value) links[nlinks].hightext = checked_box; else links[nlinks].hightext = unchecked_box; } else if (FormInfo_ptr->type == F_PASSWORD_TYPE) { links[nlinks].hightext = STARS(strlen(FormInfo_ptr->value)); } else { /* TEXT type */ links[nlinks].hightext = FormInfo_ptr->value; } /* * Never a second line on form types. */ links[nlinks].hightext2 = NULL; links[nlinks].hightext2_offset = 0; nlinks++; /* * Bold the link after incrementing nlinks. */ highlight(OFF, (nlinks - 1), target); display_flag = TRUE; } else { /* * Not showing anchor. */ if (TRACE && Anchor_ptr->hightext && *Anchor_ptr->hightext) fprintf(stderr, "\nGridText: Not showing link, hightext=%s\n", Anchor_ptr->hightext); } } if (Anchor_ptr == text->last_anchor) /* * No more links in document. - FM */ break; if (nlinks == MAXLINKS) { /* * Links array is full. If interactive, tell user * to use half-page or two-line scrolling. - FM */ if (LYCursesON) { _statusline(MAXLINKS_REACHED); sleep(AlertSecs); } if (TRACE) fprintf(stderr, "\ndisplay_page: MAXLINKS reached.\n"); break; } } /* * Free any un-reallocated links[] entries * from the previous page draw. - FM */ for (i = nlinks; i < last_nlinks; i++) FREE(links[i].lname);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -