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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: demo_html_template.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:16:06  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: demo_html_template.cpp,v 1000.1 2004/06/01 19:16:06 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:  Vladimir Ivanov
  35.  *
  36.  * File Description:  Sample of usage the HTML library templates.
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <corelib/ncbiapp.hpp>
  41. #include <corelib/ncbienv.hpp>
  42. #include <html/page.hpp>
  43. #include <stdlib.h>
  44. USING_NCBI_SCOPE;
  45. //----------------------------------------------------------------------------
  46. //
  47. // The hook procedure to generate table rows.
  48. //
  49. //----------------------------------------------------------------------------
  50. //
  51. // Simple data source.
  52. // You can use here any other: files, databases...
  53. struct SPerson {
  54.     const char*  name; 
  55.     const char*  phone;
  56.     const char*  email;
  57. };
  58. static const SPerson s_Persons[] = {
  59.     { "Username 1", "111-111-1111", "name1@server" },
  60.     { "Username 2", "222-222-2222", "name2@server" },
  61.     { "Username 3", "333-333-3333", "name3@server" },
  62.     { "Username 4", "444-444-4444", "name4@server" },
  63.     { "Username 5", "555-555-5555", "name5@server" },
  64.     { "Username 6", "666-666-6666", "name6@server" },
  65.     { "Username 7", "777-777-7777", "name7@server" },
  66.     { "Username 8", "888-888-8888", "name8@server" },
  67.     { "Username 9", "999-999-9999", "name9@server" },
  68.     { 0, 0, 0}
  69. };
  70. struct STableRowHook_Ctx
  71. {
  72.     STableRowHook_Ctx(const SPerson *const x_persons)
  73.         : persons(x_persons), current(0) {}
  74.     const SPerson *const persons;
  75.     size_t               current;
  76. };
  77. // You can use hook functions with other parameters like next:
  78. //
  79. //   static CNCBINode* s_TableRowHook(void)
  80. //   static CNCBINode* s_TableRowHook(const string& name)
  81. //   static CNCBINode* s_TableRowHook(void* data)
  82. //   static CNCBINode* s_TableRowHook(void* data, const string& name)
  83. //   static CNCBINode* s_TableRowHook(CAnyNodeClass* node)
  84. //   static CNCBINode* s_TableRowHook(CAnyNodeClass* node, const string& name)
  85. //   static CNCBINode* s_TableRowHook(CAnyNodeClass* node, TAnyType data)
  86. //   static CNCBINode* s_TableRowHook(CAnyNodeClass* node, TAnyType data,
  87. //                                    const string& name)
  88. //
  89. // <node> - contains a pointer to node called the function.
  90. // <data> - allows to pass into hook-function some data.
  91. // <name> - contains a name of the tag for which the functons is called.
  92. //          so the one mapper function can be set for few different tags.
  93. //
  94. // (see file nodemap.hpp, CreateTagMapper() for details)
  95. //
  96. static CNCBINode* s_TableRowHook(CHTMLPage*          page  /*never NULL*/,
  97.                                  STableRowHook_Ctx*  ctx)
  98. {
  99.     SPerson person;
  100.     person = ctx->persons[ctx->current];
  101.     // Do we have something to print out?
  102.     if ( !person.name ) {
  103.         // No more data. Stop the table row dublication.
  104.         return 0;
  105.     }
  106.     // Here we are constructing a node using an already existent
  107.     // template. But you can construct it yourself, using a full set
  108.     // of CNCBINode and its derived classes, and also an AppendChild()
  109.     // method.
  110.     
  111.     CNCBINode* node = new CNCBINode();
  112.     if ( !node ) {
  113.         return 0;
  114.     }
  115.     // For example, we add a HTML comment before each table row.
  116.     // We add CHTMLText("n") nodes only for good look in the text mode,
  117.     // they will be ignored by Internet browsers.
  118.     node->AppendChild(new CHTMLText("n"));
  119.     node->AppendChild(new CHTMLComment("Table row #"
  120.                                        + NStr::IntToString(ctx->current+1)));
  121.     node->AppendChild(new CHTMLText("n"));
  122.     node->AppendChild(new CHTMLTagNode("table_row_template"));
  123.     // Define variables for the new row.
  124.     page->AddTagMap("name",  new CHTMLText(person.name));
  125.     page->AddTagMap("phone", new CHTMLText(person.phone));
  126.     page->AddTagMap("email", new CHTMLText(person.email));
  127.     // Decorate table rows.
  128.     string css_class = "colored";
  129.     if (ctx->current != 5) {
  130.         css_class = ctx->current %2 ? "even" : "odd";
  131.     }
  132.     page->AddTagMap("class", new CHTMLText(css_class));
  133.     // Increment the hook's context row counter.
  134.     ctx->current++;
  135.     // Instruct to call this hook again after printing already prepared data.
  136.     // By default repetition is disabled.
  137.     node->RepeatTag();
  138.     // Return generated node.
  139.     return node;
  140. }
  141. //----------------------------------------------------------------------------
  142. //
  143. // The class to provide random numbers
  144. //
  145. //----------------------------------------------------------------------------
  146. class CNumAdderCtx
  147. {
  148. public:
  149.     // Constructor.
  150.     CNumAdderCtx(CHTMLPage* page)
  151.         : m_Counter(0), m_Sum(0), m_Page(page)
  152.         { srand((unsigned int)time(0)); }
  153.     // Generate random number by module 10.
  154.     int GetRandomNumber()
  155.     {
  156.         int n = rand() % 10;
  157.         m_Counter++;
  158.         m_Sum += n;
  159.         return n;
  160.     }
  161.     
  162.     // Return current counter value
  163.     int GetCounter()
  164.         { return m_Counter; };
  165.     
  166.     // Return accumulated sum.
  167.     int GetSum()
  168.         { return m_Sum; };
  169.     // Return accumulated sum.
  170.     CHTMLPage* GetPage()
  171.         { return m_Page; }
  172. private:
  173.     int        m_Counter;   // Just a counter.
  174.     int        m_Sum;       // Accumulated sum.
  175.     CHTMLPage* m_Page;      // Reference to the main page.
  176. };
  177. //----------------------------------------------------------------------------
  178. //
  179. // Demo application class
  180. //
  181. //----------------------------------------------------------------------------
  182. class CDemoApplication : public CNcbiApplication
  183. {
  184. public:
  185.     virtual int Run (void);
  186.     // Function to generate data for number addition example.
  187.     //
  188.     // You can use hook functions with other parameters like next:
  189.     //
  190.     //   CNCBINode* NumAdderHook(void)
  191.     //   CNCBINode* NumAdderHook(const string& name)
  192.     //   CNCBINode* NumAdderHook(TAnyType data)
  193.     //   CNCBINode* NumAdderHook(TAnyType data, const string& name)
  194.     //
  195.     // (see file nodemap.hpp, CreateTagMapper() for details)
  196.     //
  197.     CNCBINode* NumAdderHook(CNumAdderCtx* ctx);
  198. };
  199. CNCBINode* CDemoApplication::NumAdderHook(CNumAdderCtx* ctx)
  200. {
  201.     // Generate random numbers until it sum is less 50.
  202.     if ( ctx->GetSum() >= 50 ) {
  203.         return 0;
  204.     }
  205.     // Generate node to represent a generated number.
  206.     int n = ctx->GetRandomNumber();
  207.     int i = ctx->GetCounter();
  208.     CNCBINode* node = new CHTMLText(NStr::IntToString(i) +
  209.                                     ". Add number: " +
  210.                                     NStr::IntToString(n) + " <br>n");
  211.     // Get sum value.
  212.     int sum = ctx->GetSum();
  213.     // Add result if sum is above 50.
  214.     if ( sum >= 50) {
  215.         CNCBINode* sep = new CHTMLPlainText("-");
  216.         sep->SetRepeatCount(25);
  217.         node->AppendChild(sep);
  218.         node->AppendChild(new CHTML_br());
  219.         ctx->GetPage()->AddTagMap("num_sum",
  220.                                   new CHTMLText(NStr::IntToString(sum)));
  221.     }
  222.     // Enable to call this hook again after printing already prepared data.
  223.     // By default repetition is disabled.
  224.     node->RepeatTag();
  225.     // Return generated node.
  226.     return node;
  227. }
  228. int CDemoApplication::Run(void)
  229. {
  230.     // Create main page, that is used to compose and write out the HTML code.
  231.     CHTMLPage page("HTML library template demo page");
  232.     
  233.     // Set used template. The main template can be only one.
  234.     // Each next call of the SetTemplate*() redefine previous template.
  235.     page.SetTemplateFile("demo_html_template.html"); 
  236.     // page.SetTemplateString(...);
  237.     // page.SetTemplateStream(...);
  238.     // page.SetTemplateBuffer(...);
  239.     // Load template libraries. The number of loaded libraries is
  240.     // limited only with amount of available memory.
  241.     page.LoadTemplateLibFile("demo_html_template.inc");
  242.     // page.LoadTemplateLibString(...);
  243.     // page.LoadTemplateLibStream(...);
  244.     // page.LoadTemplateLibBuffer(...);
  245.     // Redefine some definition from already loaded template library.
  246.     page.AddTagMap("TITLE",
  247.         new CHTMLText("Sample of usage the HTML library templates"));
  248.     // Create other necessary tags.
  249.     page.AddTagMap("HEADLINE",
  250.         new CHTMLText("Phone browser"));
  251.     page.AddTagMap("DATE",
  252.         new CHTMLText(CTime(CTime::eCurrent).AsString("M B Y, h:m")));
  253.     // Setup static hook procedure to generate table rows
  254.     STableRowHook_Ctx table_ctx(s_Persons);
  255.     page.AddTagMap("table_row_hook", CreateTagMapper(s_TableRowHook,
  256.                                                      &table_ctx));
  257.     // We also can use any other tag mappers, such as a function with
  258.     // tag name parameter, or some class method as shown below.
  259.     CNumAdderCtx adder_ctx(&page);
  260.     page.AddTagMap("num_add", CreateTagMapper(&CDemoApplication::NumAdderHook,
  261.                                               &adder_ctx));
  262.     // Print out the results.
  263.     page.Print(cout);
  264.     // Next line added to better output look in the text mode only
  265.     cout << endl;
  266.     // All done.
  267.     return 0;
  268. }
  269. //----------------------------------------------------------------------------
  270. //
  271. // Main function
  272. //
  273. //----------------------------------------------------------------------------
  274. static CDemoApplication theDemoApplication;
  275. int main(int argc, const char* argv[])
  276. {
  277.     // Execute main application function.
  278.     return theDemoApplication.AppMain(argc, argv, 0, eDS_Default, 0);
  279. }
  280. /*
  281.  * ===========================================================================
  282.  * $Log: demo_html_template.cpp,v $
  283.  * Revision 1000.1  2004/06/01 19:16:06  gouriano
  284.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  285.  *
  286.  * Revision 1.4  2004/05/17 20:59:56  gorelenk
  287.  * Added include of PCH ncbi_pch.hpp
  288.  *
  289.  * Revision 1.3  2004/02/10 18:49:38  ivanov
  290.  * Get rid of compilation warning
  291.  *
  292.  * Revision 1.2  2004/02/02 15:14:26  ivanov
  293.  * Lines wrapped at 79th column
  294.  *
  295.  * Revision 1.1  2004/02/02 14:34:00  ivanov
  296.  * Initial revision
  297.  *
  298.  * ===========================================================================
  299.  */