/* html.c -- html-related utilities. $Id: html.c,v 1.5 1999/09/18 19:27:41 karl Exp $ Copyright (C) 1999 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "system.h" #include "cmds.h" #include "html.h" #include "lang.h" #include "makeinfo.h" #include "sectioning.h" /* See html.h. */ int html_output_head_p = 0; void html_output_head () { char *html_title; if (html_output_head_p) return; html_output_head_p = 1; /* The should not have markup. */ html_title = title ? text_expansion (title) : _("Untitled"); add_word_args ("<html lang=\"%s\"><head>\n<title>%s\n", language_table[language_code].abbrev, html_title); add_word ("\n"); add_word_args ("\n", html_title); add_word_args ("\n", VERSION); add_word ("\n"); add_word ("\n\n"); } /* Escape HTML special characters in the string if necessary, returning a pointer to a possibly newly-allocated one. */ char * escape_string (string) char * string; { int i=0, newlen=0; char * newstring; do { /* Find how much to allocate. */ switch (string[i]) { case '&': newlen += 5; /* `&' */ break; case '<': case '>': newlen += 4; /* `<', `>' */ break; default: newlen++; } i++; } while (string[i]); if (newlen == i) return string; /* Already OK. */ newstring = xmalloc (newlen + 2); i = 0; do { switch (string[i]) { case '&': strcpy (newstring, "&"); newstring += 5; break; case '<': strcpy (newstring, "<"); newstring += 4; break; case '>': strcpy (newstring, ">"); newstring += 4; break; default: newstring[0] = string[i]; newstring++; } } while (string[i++]); free (string); return newstring - newlen -1; } /* Open or close TAG according to START_OR_END. */ void insert_html_tag (start_or_end, tag) int start_or_end; char *tag; { if (!paragraph_is_open && (start_or_end == START)) { /* Need to compensate for the

we are about to insert, or else cm_xxx functions that call us will get wrong text between START and END. */ adjust_braces_following (output_paragraph_offset, 3); add_word ("

"); } add_char ('<'); if (start_or_end != START) add_char ('/'); add_word (tag); add_char ('>'); } /* Output an HTML to the filename for NODE, including the other string as extra attributes. */ void add_link (node, attributes) char *node, *attributes; { if (node) { add_word_args ("\n"); } } /* Output NAME with characters escaped as appropriate for an anchor name, i.e., escape URL special characters as %. */ void add_escaped_anchor_name (name) char *name; { for (; *name; name++) { if (*name == '&') add_word ("&"); else if (! URL_SAFE_CHAR (*name)) /* Cast so characters with the high bit set are treated as >128, for example o-umlaut should be 246, not -10. */ add_word_args ("%%%x", (unsigned char) *name); else add_char (*name); } } /* Insert the text for the name of a reference in an HTML anchor appropriate for NODENAME. If HREF is nonzero, it will be appropriate for a href= attribute, rather than name= i.e., including the `#' if it's an internal reference. */ void add_anchor_name (nodename, href) char *nodename; int href; { if (href) add_char ('#'); add_escaped_anchor_name (nodename); }