701 lines
11 KiB
C++
701 lines
11 KiB
C++
/*++
|
|
|
|
Copyright (c) 1997 Microsoft Corporation
|
|
|
|
Module Name: html.cpp
|
|
|
|
Abstract:
|
|
|
|
This module contains simple HTML authoring functions.
|
|
|
|
|
|
--*/
|
|
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#include <windows.h>
|
|
#include <httpext.h>
|
|
|
|
#include <stdio.h>
|
|
#include <stdarg.h>
|
|
|
|
#include "html.h"
|
|
|
|
|
|
void
|
|
WriteString(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB,
|
|
IN LPCSTR lpsz
|
|
)
|
|
{
|
|
DWORD dwBytesWritten;
|
|
|
|
dwBytesWritten = lstrlen( lpsz );
|
|
pECB->WriteClient( pECB->ConnID, (PVOID) lpsz, &dwBytesWritten, 0 );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlCreatePage(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB,
|
|
IN LPCSTR lpszTitle
|
|
)
|
|
{
|
|
WriteString( pECB, "<HTML>\r\n\r\n" );
|
|
|
|
if ( lpszTitle ) {
|
|
WriteString( pECB, "<HEAD><TITLE>" );
|
|
HtmlWriteText( pECB, lpszTitle );
|
|
WriteString( pECB, "</TITLE></HEAD>\r\n\r\n" );
|
|
}
|
|
WriteString( pECB, "<BODY>\r\n\r\n" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlEndPage(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "</BODY>\r\n\r\n" );
|
|
WriteString( pECB, "</HTML>\r\n" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlHeading(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB,
|
|
IN int nHeading,
|
|
IN LPCSTR lpszText
|
|
)
|
|
{
|
|
HtmlBeginHeading( pECB, nHeading );
|
|
HtmlWriteText( pECB, lpszText );
|
|
HtmlEndHeading( pECB, nHeading );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlBeginHeading(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB,
|
|
IN int nHeading
|
|
)
|
|
{
|
|
char szCode[16];
|
|
|
|
wsprintf( szCode, "<H%i>", nHeading );
|
|
WriteString( pECB, szCode );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlEndHeading(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB,
|
|
IN int nHeading
|
|
)
|
|
{
|
|
char szCode[16];
|
|
|
|
wsprintf( szCode, "</H%i>", nHeading );
|
|
WriteString( pECB, szCode );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlWriteTextLine(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB,
|
|
IN LPCSTR lpsz
|
|
)
|
|
{
|
|
HtmlWriteText( pECB, lpsz );
|
|
WriteString( pECB, "\r\n" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlWriteText(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB,
|
|
IN LPCSTR lpsz
|
|
)
|
|
{
|
|
char szBuf[1028];
|
|
int nLen;
|
|
int i;
|
|
|
|
//
|
|
// Build up enough data to make call to WriteString
|
|
// worthwhile; convert special chars too.
|
|
//
|
|
nLen = 0;
|
|
for ( i = 0; lpsz[i]; i++ ) {
|
|
if ( lpsz[i] == '<' )
|
|
lstrcpy( &szBuf[nLen], "<" );
|
|
else if ( lpsz[i] == '>' )
|
|
lstrcpy( &szBuf[nLen], ">" );
|
|
else if ( lpsz[i] == '&' )
|
|
lstrcpy( &szBuf[nLen], "&" );
|
|
else if ( lpsz[i] == '\"' )
|
|
lstrcpy( &szBuf[nLen], """ );
|
|
else {
|
|
szBuf[nLen] = lpsz[i];
|
|
szBuf[nLen + 1] = 0;
|
|
}
|
|
|
|
nLen += lstrlen( &szBuf[nLen] );
|
|
|
|
if ( nLen >= 1024 ) {
|
|
WriteString( pECB, szBuf );
|
|
nLen = 0;
|
|
}
|
|
}
|
|
|
|
if ( nLen )
|
|
WriteString( pECB, szBuf );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlEndParagraph(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "<P>\r\n" );
|
|
}
|
|
|
|
|
|
//
|
|
// HtmlHyperLink adds a hyptertext link. lpszDoc is the destination
|
|
// document, and lpszText is the display text.
|
|
//
|
|
// HtmlHyperLinkAndBookmark adds a hyperlink with a bookmark link.
|
|
// HtmlBookmarkLink adds only a bookmark link.
|
|
//
|
|
|
|
void
|
|
HtmlHyperLink(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB,
|
|
IN LPCSTR lpszDoc,
|
|
IN LPCSTR lpszText
|
|
)
|
|
{
|
|
WriteString( pECB, "<A HREF=\"" );
|
|
HtmlWriteText( pECB, lpszDoc );
|
|
WriteString( pECB, "\">" );
|
|
HtmlWriteText( pECB, lpszText );
|
|
WriteString( pECB, "</A>\r\n" );
|
|
}
|
|
|
|
void
|
|
HtmlHyperLinkAndBookmark(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB,
|
|
IN LPCSTR lpszDoc,
|
|
IN LPCSTR lpszBookmark,
|
|
IN LPCSTR lpszText
|
|
)
|
|
{
|
|
WriteString( pECB, "<A HREF=\"" );
|
|
if ( lpszDoc )
|
|
HtmlWriteText( pECB, lpszDoc );
|
|
WriteString( pECB, "#" );
|
|
HtmlWriteText( pECB, lpszBookmark );
|
|
WriteString( pECB, "\">" );
|
|
HtmlWriteText( pECB, lpszText );
|
|
WriteString( pECB, "</A>\r\n" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlBookmarkLink(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB,
|
|
IN LPCSTR lpszBookmark,
|
|
IN LPCSTR lpszText
|
|
)
|
|
{
|
|
HtmlHyperLinkAndBookmark( pECB, NULL, lpszBookmark, lpszText );
|
|
}
|
|
|
|
|
|
//
|
|
// The following support list formatting.
|
|
//
|
|
|
|
void
|
|
HtmlBeginUnnumberedList(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "<UL>\r\n" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlBeginListItem(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "<LI>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlEndUnnumberedList(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "</UL>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlBeginNumberedList(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "<OL>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlEndNumberedList(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "</OL>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlBeginDefinitionList(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "<DL>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlEndDefinitionList(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "</DL>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlDefinition(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB,
|
|
IN LPCSTR lpszTerm,
|
|
IN LPSTR lpszDef
|
|
)
|
|
{
|
|
int nStart, nEnd, nLen;
|
|
char tcHolder;
|
|
|
|
WriteString( pECB, "<DT> " );
|
|
HtmlWriteText( pECB, lpszTerm );
|
|
WriteString( pECB, "\r\n" );
|
|
WriteString( pECB, "<DD> " );
|
|
|
|
nStart = 0;
|
|
nLen = lstrlen( lpszDef );
|
|
do {
|
|
nEnd = nStart + 70;
|
|
if ( nEnd >= nLen ) {
|
|
HtmlWriteText( pECB, &lpszDef[nStart] );
|
|
WriteString( pECB, "\r\n" );
|
|
break;
|
|
}
|
|
while ( nEnd > nStart )
|
|
if ( lpszDef[nEnd] == ' ' )
|
|
break;
|
|
|
|
if ( nEnd == nStart )
|
|
// too long!
|
|
nEnd = nStart + 70;
|
|
|
|
// write defintion segment
|
|
tcHolder = lpszDef[nEnd];
|
|
lpszDef[nEnd] = 0;
|
|
HtmlWriteText( pECB, &lpszDef[nStart] );
|
|
WriteString( pECB, "\r\n" );
|
|
lpszDef[nEnd] = tcHolder;
|
|
nStart = nEnd;
|
|
|
|
// skip excess whitespace
|
|
while ( lpszDef[nStart] == ' ' )
|
|
nStart++;
|
|
|
|
// pretty formatting
|
|
if ( nStart < nLen )
|
|
WriteString( pECB, " " );
|
|
} while ( nStart < nLen );
|
|
}
|
|
|
|
|
|
// For complex defintions
|
|
void
|
|
HtmlBeginDefinitionTerm(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "<DT>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlBeginDefinition(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "<DD>" );
|
|
}
|
|
|
|
|
|
//
|
|
// Text formatting
|
|
//
|
|
|
|
void
|
|
HtmlBeginPreformattedText(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "<PRE>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlEndPreformattedText(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "</PRE>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlBeginBlockQuote(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "<BLOCKQUOTE>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlEndBlockQuote(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "</BLOCKQUOTE>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlBeginAddress(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "<ADDRESS>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlEndAddress(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "</ADDRESS>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlBeginDefine(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "<DFN>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlEndDefine(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "</DFN>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlBeginEmphasis(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "<EM>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlEndEmphasis(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "</EM>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlBeginCitation(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "<CITE>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlEndCitation(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "</CITE>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlBeginCode(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "<CODE>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlEndCode(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "</CODE>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlBeginKeyboard(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "<KBD>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlEndKeyboard(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "</KBD>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlBeginStatus(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "<SAMP>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlEndStatus(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "</SAMP>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlBeginStrong(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "<STRONG>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlEndStrong(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "</STRONG>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlBeginVariable(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "<VAR>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlEndVariable(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "</VAR>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlBold(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB,
|
|
IN LPCSTR lpszText
|
|
)
|
|
{
|
|
HtmlBeginBold( pECB );
|
|
HtmlWriteText( pECB, lpszText );
|
|
HtmlEndBold( pECB );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlBeginBold(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "<B>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlEndBold(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "</B>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlItalic(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB,
|
|
IN LPCSTR lpszText
|
|
)
|
|
{
|
|
HtmlBeginItalic( pECB );
|
|
HtmlWriteText( pECB, lpszText );
|
|
HtmlEndItalic( pECB );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlBeginItalic(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "<I>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlEndItalic(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "</I>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlFixed(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB,
|
|
IN LPCSTR lpszText
|
|
)
|
|
{
|
|
HtmlBeginFixed( pECB );
|
|
HtmlWriteText( pECB, lpszText );
|
|
HtmlEndFixed( pECB );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlBeginFixed(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "<TT>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlEndFixed(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "</TT>" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlLineBreak(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "<BR>\r\n" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlHorizontalRule(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB
|
|
)
|
|
{
|
|
WriteString( pECB, "\r\n<HR>\r\n" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlImage(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB,
|
|
IN LPCSTR lpszPicFile,
|
|
IN LPCSTR lpszAltText
|
|
)
|
|
{
|
|
WriteString( pECB, "<IMG SRC = \"" );
|
|
HtmlWriteText( pECB, lpszPicFile );
|
|
WriteString( pECB, "\"" );
|
|
if ( lpszAltText ) {
|
|
WriteString( pECB, " ALT = \"" );
|
|
HtmlWriteText( pECB, lpszAltText );
|
|
WriteString( pECB, "\"" );
|
|
}
|
|
WriteString( pECB, ">\r\n" );
|
|
}
|
|
|
|
|
|
void
|
|
HtmlPrintf(
|
|
IN EXTENSION_CONTROL_BLOCK * pECB,
|
|
IN LPCSTR lpszFormat,
|
|
...
|
|
)
|
|
{
|
|
char szBuf[8192];
|
|
|
|
va_list list;
|
|
|
|
va_start( list, lpszFormat );
|
|
|
|
vsprintf( szBuf, lpszFormat, list );
|
|
WriteString( pECB, szBuf );
|
|
|
|
va_end( list );
|
|
}
|