htmlhelper.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:9k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: htmlhelper.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:15:33  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.17
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: htmlhelper.cpp,v 1000.3 2004/06/01 19:15:33 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author: Eugene Vasilchenko
  35.  *
  36.  */
  37. #include <ncbi_pch.hpp>
  38. #include <html/html.hpp>
  39. #include <html/htmlhelper.hpp>
  40. BEGIN_NCBI_SCOPE
  41. void CIDs::Decode(const string& str)
  42. {
  43.     if ( str.empty() ) {
  44.         return;
  45.     }
  46.     int id = 0;         // previous ID
  47.     SIZE_TYPE pos;      // current position
  48.     char cmd = str[0];  // command
  49.     // If string begins with digit
  50.     if ( cmd >= '0' && cmd <= '9' ) {
  51.         cmd = ',';      // default command: direct ID
  52.         pos = 0;        // start of number
  53.     }
  54.     else {
  55.         pos = 1;        // start of number
  56.     }
  57.     SIZE_TYPE end;      // end of number
  58.     while ( (end = str.find_first_of(" +_,", pos)) != NPOS ) {
  59.         id = AddID(cmd, id, GetNumber(str.substr(pos, end - pos)));
  60.         cmd = str[end];
  61.         pos = end + 1;
  62.     }
  63.     id = AddID(cmd, id, GetNumber(str.substr(pos)));
  64. }
  65. int CIDs::GetNumber(const string& str)
  66. {
  67.     return NStr::StringToInt(str);
  68. }
  69. int CIDs::AddID(char cmd, int id, int number)
  70. {
  71.     switch ( cmd ) {
  72.     case ' ':
  73.     case '+':
  74.     case '_':
  75.         // incremental ID
  76.         id += number;
  77.         break;
  78.     default:
  79.         id = number;
  80.         break;
  81.     }
  82.     AddID(id);
  83.     return id;
  84. }
  85. string CIDs::Encode(void) const
  86. {
  87.     string out;
  88.     int idPrev = 0;
  89.     for ( const_iterator i = begin(); i != end(); ++i ) {
  90.         int id = *i;
  91.         if ( !out.empty() )
  92.             out += ' ';
  93.         out += NStr::IntToString(id - idPrev);
  94.         idPrev = id;
  95.     }
  96.     return out;
  97. }
  98. // CHTMLHelper
  99. string CHTMLHelper::sm_newline( "n" );
  100. string CHTMLHelper::HTMLEncode(const string& input)
  101. {
  102.     string    output;
  103.     SIZE_TYPE last = 0;
  104.     // Reserve memory.
  105.     output.reserve(input.size());
  106.     // Find first symbol to encode.
  107.     SIZE_TYPE ptr = input.find_first_of(""&<>", last);
  108.     while ( ptr != NPOS ) {
  109.         // We don't know how big output str  will need to be, so we grow it
  110.         // exponentially.
  111.         if ( output.size() == output.capacity()) {
  112.             output.reserve(output.size() + output.size() / 2);
  113.         }
  114.         // Copy plain part of input.
  115.         if ( ptr != last ) {
  116.             output.append(input, last, ptr - last);
  117.         }
  118.         // Append encoded symbol.
  119.         switch ( input[ptr] ) {
  120.         case '"':
  121.             output.append("&quot;");
  122.             break;
  123.         case '&':
  124.             output.append("&");
  125.             // Disable numeric characters reference encoding
  126.             if ( (ptr+1 >= input.length()) || (input[ptr+1] != '#') ) {
  127.                 output.append("amp;");
  128.             }
  129.             break;
  130.         case '<':
  131.             output.append("&lt;");
  132.             break;
  133.         case '>':
  134.             output.append("&gt;");
  135.             break;
  136.         }
  137.         // Skip it
  138.         last = ptr + 1;
  139.         // Find next symbol to encode
  140.         ptr = input.find_first_of(""&<>", last);
  141.     }
  142.     // Append last part of input
  143.     if ( last != input.size() ) {
  144.         output.append(input, last, input.size() - last);
  145.     }
  146.     return output;
  147. }
  148. string CHTMLHelper::StripHTML(const string& str)
  149. {
  150.     return CHTMLHelper::StripSpecialChars(CHTMLHelper::StripTags(str));
  151. }
  152. string CHTMLHelper::StripTags (const string& str)
  153. {
  154.     SIZE_TYPE pos = 0;
  155.     string s(str);
  156.     // First, strip comments
  157.     while ( (pos = s.find("<!--", pos)) != NPOS ) {
  158.         SIZE_TYPE pos_end = s.find("-->", pos + 1);
  159.         if ( pos_end == NPOS ) {
  160.             break;
  161.         }
  162.         s.erase(pos, pos_end - pos + 3);
  163.         pos++;
  164.     }
  165.     // Now, strip balanced "<..>"
  166.     pos =0;
  167.     while ( (pos = s.find("<", pos)) != NPOS ) {
  168.         SIZE_TYPE pos_end = s.find(">", pos + 1);
  169.         if ( pos_end == NPOS ) {
  170.             break;
  171.         }
  172.         if (pos < s.size()  &&
  173.             isalpha((int)s[pos + 1])  &&  isalpha((int)s[pos_end - 1])) {
  174.             s.erase(pos, pos_end - pos + 1);
  175.         }
  176.         pos++;
  177.     }
  178.     return s;
  179. }
  180. string CHTMLHelper::StripSpecialChars(const string& str)
  181. {
  182.     SIZE_TYPE pos = 0;
  183.     string s(str);
  184.     // Strip named and numeric character entities "&[#]...;"
  185.     while ( (pos = s.find("&", pos)) != NPOS ) {
  186.         SIZE_TYPE pos_end = s.find(";", pos + 1);
  187.         if ( pos_end == NPOS ) {
  188.             break;
  189.         }
  190.         if ( (pos_end - pos) > 2  &&  (pos_end - pos) < 8 ) {
  191.             int (*check)(int c);
  192.             SIZE_TYPE start = pos + 1;
  193.             if ( s[start] == '#') {
  194.                 check = &isdigit;
  195.                 start++;
  196.             } else {
  197.                 check = &isalpha;
  198.             }
  199.             bool need_delete = true;
  200.             for (SIZE_TYPE i = start; i < pos_end; i++ ) {
  201.                 if ( !check((int)s[i]) ) {
  202.                     need_delete = false;
  203.                     break;
  204.                 }
  205.             }
  206.             if ( need_delete ) {
  207.                 s.erase(pos, pos_end - pos + 1);
  208.             }
  209.         }
  210.         pos++;
  211.     }
  212.     return s;
  213. }
  214. END_NCBI_SCOPE
  215. /*
  216.  * ===========================================================================
  217.  * $Log: htmlhelper.cpp,v $
  218.  * Revision 1000.3  2004/06/01 19:15:33  gouriano
  219.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.17
  220.  *
  221.  * Revision 1.17  2004/05/17 20:59:50  gorelenk
  222.  * Added include of PCH ncbi_pch.hpp
  223.  *
  224.  * Revision 1.16  2004/02/04 00:39:24  ucko
  225.  * Revert last change -- check() was biting a lot of other code, so we
  226.  * now centrally undefine it in the corelib headers that include CoreServices.h.
  227.  *
  228.  * Revision 1.15  2004/02/03 22:59:58  ucko
  229.  * Make sure to avoid getting check() from Darwin's AssertMacros.h.
  230.  *
  231.  * Revision 1.14  2004/02/02 15:14:03  ivanov
  232.  * Fixed compilation warnings
  233.  *
  234.  * Revision 1.13  2004/02/02 14:17:45  ivanov
  235.  * Added CHTMLHelper::StripHTML(), StripSpecialChars(). Fixed StripTags().
  236.  *
  237.  * Revision 1.12  2004/01/14 13:47:45  ivanov
  238.  * HTMLEncode() performance improvement
  239.  *
  240.  * Revision 1.11  2003/11/03 17:03:08  ivanov
  241.  * Some formal code rearrangement. Move log to end.
  242.  *
  243.  * Revision 1.10  2002/12/23 15:53:53  ivanov
  244.  * HTMLEncode(): disable numeric characters reference encoding (like &#N;)
  245.  *
  246.  * Revision 1.9  2002/12/09 22:09:53  ivanov
  247.  * Changed "pos" type from int to type_t in CHTMLHelper::StripTags()
  248.  *
  249.  * Revision 1.8  2002/09/25 01:24:56  dicuccio
  250.  * Added CHTMLHelper::StripTags() - strips HTML comments and tags from any
  251.  * string. Implemented CHTMLText::PrintBegin() for mode = ePlainText
  252.  *
  253.  * Revision 1.7  1999/05/20 16:52:33  pubmed
  254.  * SaveAsText action for query; minor changes in filters,labels, tabletemplate
  255.  *
  256.  * Revision 1.6  1999/03/15 19:58:35  vasilche
  257.  * CIDs now use set instead of map.
  258.  *
  259.  * Revision 1.5  1999/01/22 17:46:50  vasilche
  260.  * Fixed/cleaned encoding/decoding.
  261.  * Encoded string now shorter.
  262.  *
  263.  * Revision 1.4  1999/01/21 16:18:06  sandomir
  264.  * minor changes due to NStr namespace to contain string utility functions
  265.  *
  266.  * Revision 1.3  1999/01/15 17:47:56  vasilche
  267.  * Changed CButtonList options: m_Name -> m_SubmitName, m_Select ->
  268.  * m_SelectName. Added m_Selected.
  269.  * Fixed CIDs Encode/Decode.
  270.  *
  271.  * Revision 1.2  1999/01/11 15:13:36  vasilche
  272.  * Fixed CHTML_font size.
  273.  * CHTMLHelper extracted to separate file.
  274.  *
  275.  * Revision 1.1  1999/01/07 16:41:57  vasilche
  276.  * CHTMLHelper moved to separate file.
  277.  * TagNames of CHTML classes ara available via s_GetTagName() static
  278.  * method.
  279.  * Input tag types ara available via s_GetInputType() static method.
  280.  * Initial selected database added to CQueryBox.
  281.  * Background colors added to CPagerBax & CSmallPagerBox.
  282.  *
  283.  * ===========================================================================
  284.  */