home *** CD-ROM | disk | FTP | other *** search
/ Tutto per Internet / Internet.iso / soft95 / Varie / server / HTML.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1995-12-03  |  10.9 KB  |  467 lines

  1. // html.cpp - Some HTML authoring functions
  2.  
  3. #define WIN32_LEAN_AND_MEAN
  4. #include <windows.h>
  5. #include <httpext.h>
  6.  
  7. #include "html.h"
  8.  
  9. //
  10. // WriteString writes an ASCII string to the web browser
  11. //
  12.  
  13. void WriteString (EXTENSION_CONTROL_BLOCK *pECB, LPCTSTR lpsz)
  14.     {
  15.     DWORD dwBytesWritten;
  16.  
  17.     dwBytesWritten = lstrlen (lpsz);
  18.     pECB->WriteClient (pECB->ConnID, (PVOID) lpsz, &dwBytesWritten, 0);
  19.     }
  20.  
  21. //
  22. // HtmlCreatePage adds <HTML> and a title
  23. //
  24.  
  25. void HtmlCreatePage (EXTENSION_CONTROL_BLOCK *pECB, LPCTSTR lpszTitle)
  26.     {
  27.     WriteString (pECB, TEXT("Content-type: text/html\r\n\r\n"));
  28.     WriteString (pECB, TEXT("<HTML>\r\n\r\n"));
  29.  
  30.     if (lpszTitle)
  31.         {
  32.         WriteString (pECB, TEXT("<TITLE>"));
  33.         HtmlWriteText (pECB, lpszTitle);
  34.         WriteString (pECB, TEXT("</TITLE>\r\n\r\n"));
  35.         }
  36.  
  37.     WriteString (pECB, TEXT("<BODY>\r\n\r\n"));
  38.     }
  39.  
  40. void HtmlEndPage (EXTENSION_CONTROL_BLOCK *pECB)
  41.     {
  42.     WriteString (pECB, TEXT("</BODY>\r\n\r\n"));
  43.     WriteString (pECB, TEXT("</HTML>\r\n"));
  44.     }
  45.  
  46.  
  47. //
  48. // Heading tools
  49. //
  50.  
  51. void HtmlHeading (EXTENSION_CONTROL_BLOCK *pECB, int nHeading, 
  52.                   LPCTSTR lpszText)
  53.     {
  54.     HtmlBeginHeading (pECB, nHeading);
  55.     HtmlWriteText (pECB, lpszText);
  56.     HtmlEndHeading (pECB, nHeading);
  57.     }
  58.  
  59. void HtmlBeginHeading (EXTENSION_CONTROL_BLOCK *pECB, int nHeading)
  60.     {
  61.     TCHAR szCode[16];
  62.  
  63.     wsprintf (szCode, TEXT("<H%i>"), nHeading);
  64.     WriteString (pECB, szCode);
  65.     }
  66.  
  67. void HtmlEndHeading (EXTENSION_CONTROL_BLOCK *pECB, int nHeading)
  68.     {
  69.     TCHAR szCode[16];
  70.  
  71.     wsprintf (szCode, TEXT("</H%i>"), nHeading);
  72.     WriteString (pECB, szCode);
  73.     }
  74.  
  75. //
  76. // Text tools
  77. //
  78.  
  79. void HtmlWriteTextLine (EXTENSION_CONTROL_BLOCK *pECB, LPCTSTR lpsz)
  80.     {
  81.     HtmlWriteText (pECB, lpsz);
  82.     WriteString (pECB, TEXT("\r\n"));
  83.     }
  84.  
  85. void HtmlWriteText (EXTENSION_CONTROL_BLOCK *pECB, LPCTSTR lpsz)
  86.     {
  87.     TCHAR szBuf[1028];
  88.     int nLen;
  89.     int i;
  90.  
  91.     //
  92.     // Build up enough data to make call to WriteString
  93.     // worthwhile; convert special chars too.
  94.     //
  95.     nLen = 0;
  96.     for (i = 0 ; lpsz[i] ; i++)
  97.         {
  98.         if (lpsz[i] == TEXT('<'))
  99.             lstrcpy (&szBuf[nLen], TEXT("<"));
  100.         else if (lpsz[i] == TEXT('>'))
  101.             lstrcpy (&szBuf[nLen], TEXT(">"));
  102.         else if (lpsz[i] == TEXT('&'))
  103.             lstrcpy (&szBuf[nLen], TEXT("&"));
  104.         else if (lpsz[i] == TEXT('\"'))
  105.             lstrcpy (&szBuf[nLen], TEXT("""));
  106.         else
  107.             {
  108.             szBuf[nLen] = lpsz[i];
  109.             szBuf[nLen + 1] = 0;
  110.             }
  111.  
  112.         nLen += lstrlen (&szBuf[nLen]);
  113.  
  114.         if (nLen >= 1024)
  115.             {
  116.             WriteString (pECB, szBuf);
  117.             nLen = 0;
  118.             }
  119.         }
  120.  
  121.     if (nLen)
  122.         WriteString (pECB, szBuf);
  123.     }
  124.  
  125. void HtmlEndParagraph (EXTENSION_CONTROL_BLOCK *pECB)
  126.     {
  127.     WriteString (pECB, TEXT("<P>\r\n"));
  128.     }
  129.  
  130. //
  131. // HtmlHyperLink adds a hyptertext link.  lpszDoc is the destination
  132. // document, and lpszText is the display text.
  133. //
  134. // HtmlHyperLinkAndBookmark adds a hyperlink with a bookmark link.
  135. // HtmlBookmarkLink adds only a bookmark link.
  136. //
  137.  
  138. void HtmlHyperLink (EXTENSION_CONTROL_BLOCK *pECB, LPCTSTR lpszDoc, LPCTSTR lpszText)
  139.     {
  140.     WriteString (pECB, TEXT("<A HREF=\""));
  141.     HtmlWriteText (pECB, lpszDoc);
  142.     WriteString (pECB, TEXT("\">"));
  143.     HtmlWriteText (pECB, lpszText);
  144.     WriteString (pECB, TEXT("</A>\r\n"));
  145.     }
  146.         
  147. void HtmlHyperLinkAndBookmark (EXTENSION_CONTROL_BLOCK *pECB, 
  148.                                LPCTSTR lpszDoc, LPCTSTR lpszBookmark,
  149.                                LPCTSTR lpszText)
  150.     {
  151.     WriteString (pECB, TEXT("<A HREF=\""));
  152.     if (lpszDoc)
  153.         HtmlWriteText (pECB, lpszDoc);
  154.     WriteString (pECB, TEXT("#"));
  155.     HtmlWriteText (pECB, lpszBookmark);
  156.     WriteString (pECB, TEXT("\">"));
  157.     HtmlWriteText (pECB, lpszText);
  158.     WriteString (pECB, TEXT("</A>\r\n"));
  159.     }
  160.  
  161. void HtmlBookmarkLink (EXTENSION_CONTROL_BLOCK *pECB, LPCTSTR lpszBookmark,
  162.                        LPCTSTR lpszText)
  163.     {
  164.     HtmlHyperLinkAndBookmark (pECB, NULL, lpszBookmark, lpszText);
  165.     }
  166.  
  167. //
  168. // The following support list formatting.
  169. //
  170.  
  171. void HtmlBeginUnnumberedList (EXTENSION_CONTROL_BLOCK *pECB)
  172.     {
  173.     WriteString (pECB, TEXT("<UL>\r\n"));
  174.     }
  175.  
  176. void HtmlBeginListItem (EXTENSION_CONTROL_BLOCK *pECB)
  177.     {
  178.     WriteString (pECB, TEXT("<LI>"));
  179.     }
  180.  
  181. void HtmlEndUnnumberedList (EXTENSION_CONTROL_BLOCK *pECB)
  182.     {
  183.     WriteString (pECB, TEXT("</UL>"));
  184.     }
  185.  
  186. void HtmlBeginNumberedList (EXTENSION_CONTROL_BLOCK *pECB)
  187.     {
  188.     WriteString (pECB, TEXT("<OL>"));
  189.     }
  190.  
  191. void HtmlEndNumberedList (EXTENSION_CONTROL_BLOCK *pECB)
  192.     {
  193.     WriteString (pECB, TEXT("</OL>"));
  194.     }
  195.     
  196. void HtmlBeginDefinitionList (EXTENSION_CONTROL_BLOCK *pECB)
  197.     {
  198.     WriteString (pECB, TEXT("<DL>"));
  199.     }
  200.  
  201. void HtmlEndDefinitionList (EXTENSION_CONTROL_BLOCK *pECB)
  202.     {
  203.     WriteString (pECB, TEXT("</DL>"));
  204.     }
  205.  
  206. void HtmlDefinition (EXTENSION_CONTROL_BLOCK *pECB, LPCTSTR lpszTerm,
  207.                      LPTSTR lpszDef)
  208.     {
  209.     int nStart, nEnd, nLen;
  210.     TCHAR tcHolder;
  211.  
  212.     WriteString (pECB, TEXT("<DT> "));
  213.     HtmlWriteText (pECB, lpszTerm);
  214.     WriteString (pECB, TEXT("\r\n"));
  215.     WriteString (pECB, TEXT("<DD> "));
  216.  
  217.     nStart = 0 ;
  218.     nLen = lstrlen (lpszDef);
  219.     do  {
  220.         nEnd = nStart + 70;
  221.         if (nEnd >= nLen)
  222.             {
  223.             HtmlWriteText (pECB, &lpszDef[nStart]);
  224.             WriteString (pECB, TEXT("\r\n"));
  225.             break;
  226.             }
  227.  
  228.         while (nEnd > nStart)
  229.             if (lpszDef[nEnd] == TEXT(' '))
  230.                 break;
  231.  
  232.         if (nEnd == nStart)
  233.             // too long!
  234.             nEnd = nStart + 70;
  235.  
  236.         // write defintion segment
  237.         tcHolder = lpszDef[nEnd];
  238.         lpszDef[nEnd] = 0;
  239.         HtmlWriteText (pECB, &lpszDef[nStart]);
  240.         WriteString (pECB, TEXT("\r\n"));
  241.         lpszDef[nEnd] = tcHolder;
  242.         nStart = nEnd;
  243.  
  244.         // skip excess whitespace
  245.         while (lpszDef[nStart] == TEXT(' '))
  246.             nStart++;
  247.  
  248.         // pretty formatting
  249.         if (nStart < nLen)
  250.             WriteString (pECB, TEXT("     "));
  251.         } while (nStart < nLen);
  252.     }
  253.         
  254. // For complex defintions
  255. void HtmlBeginDefinitionTerm (EXTENSION_CONTROL_BLOCK *pECB)
  256.     {
  257.     WriteString (pECB, TEXT("<DT>"));
  258.     }
  259.  
  260. void HtmlBeginDefinition (EXTENSION_CONTROL_BLOCK *pECB)
  261.     {
  262.     WriteString (pECB, TEXT("<DD>"));
  263.     }
  264.  
  265. //
  266. // Text formatting
  267. //
  268.  
  269. void HtmlBeginPreformattedText (EXTENSION_CONTROL_BLOCK *pECB)
  270.     {
  271.     WriteString (pECB, TEXT("<PRE>"));
  272.     }
  273.  
  274. void HtmlEndPreformattedText (EXTENSION_CONTROL_BLOCK *pECB)
  275.     {
  276.     WriteString (pECB, TEXT("</PRE>"));
  277.     }
  278.  
  279. void HtmlBeginBlockQuote (EXTENSION_CONTROL_BLOCK *pECB)
  280.     {
  281.     WriteString (pECB, TEXT("<BLOCKQUOTE>"));
  282.     }
  283.  
  284. void HtmlEndBlockQuote (EXTENSION_CONTROL_BLOCK *pECB)
  285.     {
  286.     WriteString (pECB, TEXT("</BLOCKQUOTE>"));
  287.     }
  288.  
  289. void HtmlBeginAddress (EXTENSION_CONTROL_BLOCK *pECB)
  290.     {
  291.     WriteString (pECB, TEXT("<ADDRESS>"));
  292.     }
  293.  
  294. void HtmlEndAddress (EXTENSION_CONTROL_BLOCK *pECB)
  295.     {
  296.     WriteString (pECB, TEXT("</ADDRESS>"));
  297.     }
  298.  
  299. void HtmlBeginDefine (EXTENSION_CONTROL_BLOCK *pECB)
  300.     {
  301.     WriteString (pECB, TEXT("<DFN>"));
  302.     }
  303.  
  304. void HtmlEndDefine (EXTENSION_CONTROL_BLOCK *pECB)
  305.     {
  306.     WriteString (pECB, TEXT("</DFN>"));
  307.     }
  308.  
  309. void HtmlBeginEmphasis (EXTENSION_CONTROL_BLOCK *pECB)
  310.     {
  311.     WriteString (pECB, TEXT("<EM>"));
  312.     }
  313.  
  314. void HtmlEndEmphasis (EXTENSION_CONTROL_BLOCK *pECB)
  315.     {
  316.     WriteString (pECB, TEXT("</EM>"));
  317.     }
  318.  
  319. void HtmlBeginCitation (EXTENSION_CONTROL_BLOCK *pECB)
  320.     {
  321.     WriteString (pECB, TEXT("<CITE>"));
  322.     }
  323.  
  324. void HtmlEndCitation (EXTENSION_CONTROL_BLOCK *pECB)
  325.     {
  326.     WriteString (pECB, TEXT("</CITE>"));
  327.     }
  328.  
  329. void HtmlBeginCode (EXTENSION_CONTROL_BLOCK *pECB)
  330.     {
  331.     WriteString (pECB, TEXT("<CODE>"));
  332.     }
  333.  
  334. void HtmlEndCode (EXTENSION_CONTROL_BLOCK *pECB)
  335.     {
  336.     WriteString (pECB, TEXT("</CODE>"));
  337.     }
  338.  
  339. void HtmlBeginKeyboard (EXTENSION_CONTROL_BLOCK *pECB)
  340.     {
  341.     WriteString (pECB, TEXT("<KBD>"));
  342.     }
  343.  
  344. void HtmlEndKeyboard (EXTENSION_CONTROL_BLOCK *pECB)
  345.     {
  346.     WriteString (pECB, TEXT("</KBD>"));
  347.     }
  348.  
  349. void HtmlBeginStatus (EXTENSION_CONTROL_BLOCK *pECB)
  350.     {
  351.     WriteString (pECB, TEXT("<SAMP>"));
  352.     }
  353.  
  354. void HtmlEndStatus (EXTENSION_CONTROL_BLOCK *pECB)
  355.     {
  356.     WriteString (pECB, TEXT("</SAMP>"));
  357.     }
  358.  
  359. void HtmlBeginStrong (EXTENSION_CONTROL_BLOCK *pECB)
  360.     {
  361.     WriteString (pECB, TEXT("<STRONG>"));
  362.     }
  363.  
  364. void HtmlEndString (EXTENSION_CONTROL_BLOCK *pECB)
  365.     {
  366.     WriteString (pECB, TEXT("</STRONG>"));
  367.     }
  368.  
  369. void HtmlBeginVariable (EXTENSION_CONTROL_BLOCK *pECB)
  370.     {
  371.     WriteString (pECB, TEXT("<VAR>"));
  372.     }
  373.  
  374. void HtmlEndVariable (EXTENSION_CONTROL_BLOCK *pECB)
  375.     {
  376.     WriteString (pECB, TEXT("</VAR>"));
  377.     }
  378.  
  379. void HtmlBold (EXTENSION_CONTROL_BLOCK *pECB, LPCTSTR lpszText)
  380.     {
  381.     HtmlBeginBold (pECB);
  382.     HtmlWriteText (pECB, lpszText);
  383.     HtmlEndBold (pECB);
  384.     }
  385.  
  386. void HtmlBeginBold (EXTENSION_CONTROL_BLOCK *pECB)
  387.     {
  388.     WriteString (pECB, TEXT("<B>"));
  389.     }
  390.  
  391. void HtmlEndBold (EXTENSION_CONTROL_BLOCK *pECB)
  392.     {
  393.     WriteString (pECB, TEXT("</B>"));
  394.     }
  395.  
  396. void HtmlItalic (EXTENSION_CONTROL_BLOCK *pECB, LPCTSTR lpszText)
  397.     {
  398.     HtmlBeginItalic (pECB);
  399.     HtmlWriteText (pECB, lpszText);
  400.     HtmlEndItalic (pECB);
  401.     }
  402.  
  403. void HtmlBeginItalic (EXTENSION_CONTROL_BLOCK *pECB)
  404.     {
  405.     WriteString (pECB, TEXT("<I>"));
  406.     }
  407.  
  408. void HtmlEndItalic (EXTENSION_CONTROL_BLOCK *pECB)
  409.     {
  410.     WriteString (pECB, TEXT("</I>"));
  411.     }
  412.  
  413. void HtmlFixed (EXTENSION_CONTROL_BLOCK *pECB, LPCTSTR lpszText)
  414.     {
  415.     HtmlBeginFixed (pECB);
  416.     HtmlWriteText (pECB, lpszText);
  417.     HtmlEndFixed (pECB);
  418.     }
  419.  
  420. void HtmlBeginFixed (EXTENSION_CONTROL_BLOCK *pECB)
  421.     {
  422.     WriteString (pECB, TEXT("<TT>"));
  423.     }
  424.  
  425. void HtmlEndFixed (EXTENSION_CONTROL_BLOCK *pECB)
  426.     {
  427.     WriteString (pECB, TEXT("</TT>"));
  428.     }
  429.  
  430.  
  431. //
  432. // Line breaks and other formatting
  433. //
  434.  
  435. void HtmlLineBreak (EXTENSION_CONTROL_BLOCK *pECB)
  436.     {
  437.     WriteString (pECB, TEXT("<BR>\r\n"));
  438.     } 
  439.  
  440. void HtmlHorizontalRule (EXTENSION_CONTROL_BLOCK *pECB)
  441.     {
  442.     WriteString (pECB, TEXT("\r\n<HR>\r\n"));
  443.     }
  444.  
  445.  
  446. //
  447. // Images
  448. //
  449.  
  450. void HtmlImage (EXTENSION_CONTROL_BLOCK *pECB, LPCTSTR lpszPicFile,
  451.                 LPCTSTR lpszAltText)
  452.     {
  453.     WriteString (pECB, TEXT("<IMG SRC = \""));
  454.     HtmlWriteText (pECB, lpszPicFile);
  455.     WriteString (pECB, TEXT("\""));
  456.     if (lpszAltText)
  457.         {
  458.         WriteString (pECB, TEXT(" ALT = \""));
  459.         HtmlWriteText (pECB, lpszAltText);
  460.         WriteString (pECB, TEXT("\""));
  461.         }
  462.     WriteString (pECB, TEXT(">\r\n"));
  463.     }
  464.  
  465.  
  466.  
  467.