OSDN Git Service

進捗を記録
authoryamat0jp <terukohietori@gmail.com>
Sun, 30 Jun 2019 08:57:36 +0000 (17:57 +0900)
committeryamat0jp <terukohietori@gmail.com>
Sun, 30 Jun 2019 08:57:36 +0000 (17:57 +0900)
Project3.dproj
Unit1.dfm
Unit1.pas
WebModuleUnit1.dfm
WebModuleUnit1.pas
article.htm [deleted file]
index.htm [deleted file]
top.htm

index 6464c91..c3e2ade 100644 (file)
@@ -98,9 +98,6 @@
             <FormType>dfm</FormType>
             <DesignClass>TDataModule</DesignClass>
         </DCCReference>
-        <None Include="index.htm"/>
-        <None Include="article.htm"/>
-        <None Include="top.htm"/>
         <BuildConfiguration Include="Release">
             <Key>Cfg_2</Key>
             <CfgParent>Base</CfgParent>
                 </Source>
             </Delphi.Personality>
             <Deployment>
-                <DeployFile LocalName="Untitled1.htm" Configuration="Debug" Class="ProjectFile">
-                    <Platform Name="Win32">
-                        <RemoteDir>.\</RemoteDir>
-                        <Overwrite>true</Overwrite>
-                    </Platform>
-                </DeployFile>
-                <DeployFile LocalName="index.htm" Configuration="Debug" Class="ProjectFile">
-                    <Platform Name="Win32">
-                        <RemoteDir>.\</RemoteDir>
-                        <Overwrite>true</Overwrite>
-                    </Platform>
-                </DeployFile>
                 <DeployFile LocalName="Win32\Debug\Project3.exe" Configuration="Debug" Class="ProjectOutput">
                     <Platform Name="Win32">
                         <RemoteName>Project3.exe</RemoteName>
index 6f4ee46..da07f75 100644 (file)
--- a/Unit1.dfm
+++ b/Unit1.dfm
@@ -1,15 +1,20 @@
 object DataModule1: TDataModule1
   OldCreateOrder = False
-  Height = 150
-  Width = 215
+  Height = 230
+  Width = 302
   object FDTable1: TFDTable
     Active = True
-    IndexFieldNames = 'DATABASE'
+    IndexFieldNames = 'DBNUM'
     Connection = FDConnection1
     UpdateOptions.UpdateTableName = 'DBNAME'
     TableName = 'DBNAME'
-    Left = 16
+    Left = 32
     Top = 88
+    object FDTable1DBNUM: TIntegerField
+      FieldName = 'DBNUM'
+      Origin = 'DBNUM'
+      Required = True
+    end
     object FDTable1DATABASE: TWideStringField
       FieldName = 'DATABASE'
       Origin = '"DATABASE"'
@@ -31,12 +36,19 @@ object DataModule1: TDataModule1
   end
   object FDTable2: TFDTable
     Active = True
-    IndexFieldNames = 'NUMBER'
+    IndexFieldNames = 'DBNUM;NUMBER'
+    MasterSource = DataSource1
+    MasterFields = 'DBNUM'
     Connection = FDConnection1
     UpdateOptions.UpdateTableName = 'ARTICLE'
     TableName = 'ARTICLE'
-    Left = 80
+    Left = 96
     Top = 88
+    object FDTable2DBNUM: TIntegerField
+      FieldName = 'DBNUM'
+      Origin = 'DBNUM'
+      Required = True
+    end
     object FDTable2NUMBER: TIntegerField
       FieldName = 'NUMBER'
       Origin = 'NUMBER'
@@ -73,25 +85,70 @@ object DataModule1: TDataModule1
     Connection = FDConnection1
     UpdateOptions.UpdateTableName = 'SETTING'
     TableName = 'SETTING'
-    Left = 144
+    Left = 160
     Top = 88
-    object FDTable3TITLE: TStringField
+    object FDTable3TITLE: TWideStringField
       FieldName = 'TITLE'
       Origin = 'TITLE'
+      Size = 80
     end
-    object FDTable3TITLE2: TStringField
+    object FDTable3TITLE2: TWideStringField
       FieldName = 'TITLE2'
       Origin = 'TITLE2'
-      Size = 80
+      Size = 320
     end
     object FDTable3MENTE: TBooleanField
       FieldName = 'MENTE'
       Origin = 'MENTE'
     end
+    object FDTable3INFO: TIntegerField
+      FieldName = 'INFO'
+      Origin = 'INFO'
+    end
+    object FDTable3COUNT: TIntegerField
+      FieldName = 'COUNT'
+      Origin = '"COUNT"'
+    end
   end
   object FDGUIxWaitCursor1: TFDGUIxWaitCursor
     Provider = 'Forms'
     Left = 48
     Top = 24
   end
+  object DataSource1: TDataSource
+    DataSet = FDTable1
+    Left = 64
+    Top = 152
+  end
+  object FDQuery1: TFDQuery
+    Connection = FDConnection1
+    Left = 160
+    Top = 152
+  end
+  object FDTable4: TFDTable
+    Active = True
+    Connection = FDConnection1
+    UpdateOptions.UpdateTableName = 'REQ'
+    TableName = 'REQ'
+    Left = 224
+    Top = 88
+    object FDTable4DBNAME: TIntegerField
+      FieldName = 'DBNAME'
+      Origin = 'DBNAME'
+    end
+    object FDTable4POSNUM: TIntegerField
+      FieldName = 'POSNUM'
+      Origin = 'POSNUM'
+    end
+    object FDTable4DATE: TDateField
+      FieldName = 'DATE'
+      Origin = '"DATE"'
+      Required = True
+    end
+    object FDTable4REQUEST: TWideMemoField
+      FieldName = 'REQUEST'
+      Origin = 'REQUEST'
+      BlobType = ftWideMemo
+    end
+  end
 end
index 559e59f..4fe3d8b 100644 (file)
--- a/Unit1.pas
+++ b/Unit1.pas
@@ -21,13 +21,24 @@ type
     FDTable2NAME: TStringField;
     FDTable2COMMENT: TWideMemoField;
     FDTable2RAW: TWideMemoField;
+    FDTable3: TFDTable;
+    FDGUIxWaitCursor1: TFDGUIxWaitCursor;
+    DataSource1: TDataSource;
+    FDTable2DBNUM: TIntegerField;
     FDTable2DATE: TDateField;
     FDTable1DATABASE: TWideStringField;
-    FDTable3: TFDTable;
-    FDTable3TITLE: TStringField;
-    FDTable3TITLE2: TStringField;
+    FDTable1DBNUM: TIntegerField;
+    FDQuery1: TFDQuery;
+    FDTable4: TFDTable;
+    FDTable3TITLE: TWideStringField;
+    FDTable3TITLE2: TWideStringField;
     FDTable3MENTE: TBooleanField;
-    FDGUIxWaitCursor1: TFDGUIxWaitCursor;
+    FDTable3INFO: TIntegerField;
+    FDTable4DBNAME: TIntegerField;
+    FDTable4POSNUM: TIntegerField;
+    FDTable4DATE: TDateField;
+    FDTable4REQUEST: TWideMemoField;
+    FDTable3COUNT: TIntegerField;
   private
     { Private \90é\8c¾ }
   public
index b9637be..8b83ab1 100644 (file)
@@ -5,33 +5,48 @@ object TWebModule1: TTWebModule1
     item
       Name = 'top'
       PathInfo = '/'
-      Producer = top
-      OnAction = TWebModule1indexpageAction
+      OnAction = TWebModule1topAction
     end
     item
-      Default = True
       Name = 'indexpage'
       PathInfo = '/index'
-      Producer = index
       OnAction = TWebModule1indexpageAction
     end
     item
+      MethodType = mtPost
       Name = 'regist'
       PathInfo = '/regist'
       OnAction = TWebModule1registAction
+    end
+    item
+      Name = 'admin'
+      PathInfo = '/admin'
+      OnAction = TWebModule1adminAction
+    end
+    item
+      Name = 'search'
+      PathInfo = '/search'
+      OnAction = TWebModule1searchAction
+    end
+    item
+      Name = 'help'
+      PathInfo = '/help'
+      OnAction = TWebModule1helpAction
+    end
+    item
+      MethodType = mtGet
+      Name = 'master'
+      PathInfo = '/master'
+      OnAction = page
     end>
-  Height = 596
-  Width = 680
-  object top: TPageProducer
-    Left = 40
-    Top = 32
-  end
+  Height = 251
+  Width = 436
   object articles: TDataSetPageProducer
     HTMLDoc.Strings = (
       '                                            <hr size=1>'
       
-        #9'<section id=number><a name=<#number>></a><a href=/{{link}}/user' +
-        'del?job=<#number> style=text-decoration:none>'
+        #9'<section id=number><a name=<#number>></a><a href=/userdel?job=<' +
+        '#number> style=text-decoration:none>'
       #9#9'[<#number>]</a></section>'
       #9'<section id=title><#title></section>'
       #9'<section id=name>'#12288'Name:<h1><#name></h1></section>'
@@ -43,14 +58,327 @@ object TWebModule1: TTWebModule1
         '?db=<#database>&num=<#number>>'#22577#21578'</a></section>'
       #9'<p>'#9651#9660#9651#9660#9651#9660#9651)
     DataSet = DataModule1.FDTable2
+    OnHTMLTag = articlesHTMLTag
     Left = 112
     Top = 88
   end
   object index: TDataSetPageProducer
-    HTMLFile = 'C:\Users\yamat\Documents\GitHub\newbbs\index.htm'
+    HTMLDoc.Strings = (
+      '<!DOCTYPE html>'
+      '<html lang="ja">'
+      '  <head>'
+      '    <meta charset="utf-8">'
+      '    <title>'
+      '    <#title>'
+      '    </title>'
+      '  </head>'
+      '  <body>'
+      ''
+      '    <a href=/ style=text-decoration:none><#title2></a>'
+      '    <header>'
+      '    <a name=top></a>'
+      '    <form action=/regist?db=<#database> method="post">'
+      '      <table>'
+      '        <tr><td>'
+      
+        '          <label><p>'#12362#21517#21069'</p><input name="name" class=name value=<' +
+        '#cookie param=name>></label>'
+      
+        '          <label><p>'#12479#12452#12488#12523'</p><input name="title" class=title valu' +
+        'e=<#cookie param=title> placeholder="'#12479#12452#12488#12523#12394#12375'."></label>'
+      '          <input type="submit" value="'#36865#20449'">'
+      '        </td></tr>'
+      '        <tr><td>'
+      '          <label><p>'#26412#25991'<span>'#24517#38920'</span><br></p>'
+      
+        '            <textarea style="font-size:1.75em" name="comment" co' +
+        'ls=30'
+      
+        '                      required placeholder="'#12467#12513#12531#12488#12394#12393#12434#20837#21147#12375#12390#12367#12384#12373#12356'."><#' +
+        'cookie param=comment></textarea></label>'
+      '        </td></tr>'
+      '        <tr><td>'
+      
+        '          <label><p>'#12497#12473#12527#12540#12489'</p><input name="password" type="passwo' +
+        'rd" placeholder="'#21066#38500#29992'">'
+      
+        '          </label> / <input type="checkbox" name="show" value="t' +
+        'rue" checked><p>'#12503#12524#12499#12517#12540'</p>'
+      '        </td></tr>'
+      '        <tr><td>'
+      
+        '          <label><p>'#21512#35328#33865#12434#12402#12425#12364#12394#12391#20837#21147#12375#12390#12367#12384#12373#12356': genki <input name=aikotob' +
+        'a type=text value=<#cookie param=aikotoba>></label>'
+      '        </td></tr>'
+      '      </table>'
+      '    </form>'
+      '    </header>'
+      '    <hr size="1" width="100%">'
+      
+        '    <form action=/userdel?db=<#database> method="post" id=search' +
+        '>'
+      '      <label><p>'#35352#20107'No</p><input name="number"></label>'
+      
+        '      <label><p>Pass</p><input type="password" name="password"><' +
+        '/label>'
+      '      <input type="submit" value="'#21066#38500'">'
+      '    </form>'
+      '    <form action=/userdel?db=<#database> method=post id=search>'
+      '      <label><p>'#35352#20107'No</p><input name=number></label>'
+      '      <input type=submit value='#31227#21205'>'
+      '    </form>'
+      '    <p><a href=/search?db=<#database>>'#26908#32034#12506#12540#12472'</a></p>'
+      '    <p style=text-align:right><a href=#article>'#19979#12408#31227#21205'</a></p>'
+      '    <p style=text-align:center><#database></p>'
+      '    <#header>'
+      '  <#article>'
+      #9'<a name=article></a>'
+      #9'<p style=text-align:right><a href=#top>Top'#12408#31227#21205'</a></p>'
+      '  <#footer>'
+      
+        '    <p style=text-align:center><a href="/admin?db=<#database>&nu' +
+        'm=0">'#31649#29702#32773#29992#12525#12464#12452#12531'</a></p>'
+      '  </body>'
+      '</html>')
     DataSet = DataModule1.FDTable1
     OnHTMLTag = indexHTMLTag
     Left = 112
     Top = 32
   end
+  object admin: TDataSetTableProducer
+    Columns = <
+      item
+        FieldName = 'NUMBER'
+      end
+      item
+        FieldName = 'TITLE'
+      end
+      item
+        FieldName = 'NAME'
+      end
+      item
+        FieldName = 'COMMENT'
+      end
+      item
+        FieldName = 'DATE'
+      end>
+    Footer.Strings = (
+      '<a href=/index style=text-align:center>'#25147#12427'</a>')
+    Header.Strings = (
+      '')
+    DataSet = DataModule1.FDTable2
+    Left = 176
+    Top = 32
+  end
+  object search: TPageProducer
+    HTMLDoc.Strings = (
+      ''
+      '<!DOCTYPE HTML>'
+      ''
+      '<html>'
+      '  <head>'
+      '    <title>'#26908#32034'</title>'
+      '  </head>'
+      ''
+      '  <body>'
+      '    <form action="/search" method="post">'
+      '    <p align="center"><strong>'#25237#31295#26908#32034
+      '</strong>'
+      '    </p>'
+      '    <p>'
+      '</p>'
+      '    <p>'
+      '    </p>'
+      '      <p align="center">'#26908#32034#12290#12473#12506#12540#12473#12391#21306#20999#12387#12390#12367#12384#12373#12356#12290'</p>'
+      '    <select name=type>'
+      '      <option value=OR>OR</option>'
+      '      <option value=AND>AND</option>'
+      '    </select>      '
+      
+        '        <div style="HEIGHT: 26px; WIDTH: 105px; POSITION: relati' +
+        've; DISPLAY: inline" ms_positioning="FlowLayout">'#26908#32034#12527#12540#12489
+      '</div>'
+      '      <p>&nbsp;<input name="word1"></p>'
+      
+        '    <p><input type="radio" name="filter" style="HEIGHT: 20px; WI' +
+        'DTH: 17px" size="17" value="name">'#21517#21069#12363#12425#26908#32034' <input type="radio" che' +
+        'cked="true" style="HEIGHT: 20px; WIDTH: 16px" size="16" name="fi' +
+        'lter" value="com">'#26412#25991#12363#12425#26908#32034
+      '</p>'
+      '      <p>'
+      '    <input type="submit" value="'#26908#32034'"></p>'
+      '    </form>'
+      '      <p><a href="/">'#25522#31034#26495#12408#25147#12427
+      '</a></p>'
+      '    <#items>'
+      '  </body>'
+      '</html>')
+    OnHTMLTag = searchHTMLTag
+    Left = 240
+    Top = 32
+  end
+  object items: TDataSetPageProducer
+    HTMLDoc.Strings = (
+      '                                            <hr size=1>'
+      #9'<section id=title><#title></section>'
+      #9'<section id=name>'#12288'Name:<h1><#name></h1></section>'
+      #9'<section id=date>'#12288'Date:<h1><#date></h1></section>'
+      #9
+      #9'<section id=comment><#item></section>'
+      '')
+    DataSet = DataModule1.FDTable2
+    OnHTMLTag = itemsHTMLTag
+    Left = 240
+    Top = 88
+  end
+  object help: TPageProducer
+    HTMLDoc.Strings = (
+      ''
+      '<!DOCTYPE html>'
+      ''
+      '<html><head><meta charset=utf8><title>'#20351#12356#26041'</title></head>'
+      '<body>'
+      '<P>'#35370#21839#32773#12398#30342#12373#12435'</P>'
+      '<form action=/help method=post>'
+      #9'<p>'#12362#21839#12356#21512#12431#12379'<'#21066#38500#20381#38972#12394#12393#20309#12391#12418'></p>'
+      #9'<textarea name=help style=height:100px;width:250px>'
+      #25237#31295#32773#21517#12394#12393#65306
+      #30456#35527#20869#23481#65306
+      #12381#12398#20182#65306'</textarea><br>'
+      #9'<input type=submit value="'#36865#20449'"></form>'
+      #9'<p><br>'
+      '<p>'#38283#30330#32773#12398#30342#12373#12435
+      '<p>pybbs'#12398'API'
+      '<p>ArticleAPI ... ~/read/api/<b>dbname</b>/<b>number</b>'
+      '<p>ListAPI ... ~/headline/api'
+      '<p><br>'
+      '<p>'
+      '<p>'#21033#29992#35215#32004
+      '<p>'#12371#12428#12363#12425#26360#12365#12414#12377
+      '<p style=text-align:center><a href=/>'#25147#12427'</a>'
+      '</body>'
+      '</html>')
+    Left = 304
+    Top = 32
+  end
+  object top: TPageProducer
+    HTMLDoc.Strings = (
+      '<!doctype html>'
+      '<html class="no-js" lang="ja">'
+      '<head>'
+      
+        #9'<meta charset="utf-8" name="google-site-verification"  content=' +
+        '"5KOTJTKv1HgTtIt0zVGzuyAkADCwXRme-RiiKJ03l3s" />'
+      #9'<meta http-equiv="X-UA-Compatible" content="IE=edge">'
+      #9'<title>Top Page'
+      '</title>'
+      #9'<link rel="stylesheet" href="{{static_url(css/top.css">'
+      #9'<link rel="stylesheet" href="{{static_url(css/normalize.css">'
+      #9'<script src="{{static_url(js/jquery-1.10.2.min.js"></script>'
+      #9'<script src="{{static_url(js/top.js"></script>'
+      #9'<script src="{{static_url(js/modernizr.custom.min.js"></script>'
+      
+        #9'<script src="{{static_url(js/jquery-ui-1.10.3.custom.min.js"></' +
+        'script>'
+      '</head>'
+      '<body>'
+      '<div id="fb-root"></div>'
+      '<script>(function(d, s, id) {'
+      '  var js, fjs = d.getElementsByTagName(s)[0];'
+      '  if (d.getElementById(id)) return;'
+      '  js = d.createElement(s); js.id = id;'
+      
+        '  js.src = "//connect.facebook.net/ja_JP/sdk.js#xfbml=1&version=' +
+        'v2.8";'
+      '  fjs.parentNode.insertBefore(js, fjs);'
+      '}(document, '#39'script'#39', '#39'facebook-jssdk'#39'));</script>'
+      '<header><h1 style="text-align: center;">'#28961#26009#38651#23376#25522#31034#26495#12408#12424#12358#12371#12381
+      '</h1></header><div class="slideshow">'
+      #9'<div class="slideshow-slides"><div class="slide">'
+      #9'<img src=>'
+      '<#list>'
+      '</div>'
+      '</div>'
+      '</div>'
+      #9'<div class="slideshow-nav">'
+      #9'<a href="#" class="prev">prev'
+      '</a>'
+      #9'<a href="#" class="next">next'
+      '</a>'
+      #9'</div>'
+      #9'<div class="slideshow-indicator"></div>'
+      
+        '        <p>[ <a href=/index?db=<#info>><#info></a> ] ='#12362#30693#12425#12379' <p>[ ' +
+        '<a href="/master">master'
+      
+        '</a> ] ='#31649#29702#20154'<div class="fb-like" data-href="http://pybbs.herokuap' +
+        'p.com" data-layout="box_count" data-action="like" data-size="sma' +
+        'll" data-show-faces="true" data-share="false"></div>'
+      
+        '<p><a href="http://www.xn--gckj5d1ktb3488cn4q.jp/" target="_blan' +
+        'k"><img alt="'#28961#26009#12459#12454#12531#12479#12540'" src="http://www.xn--gckj5d1ktb3488cn4q.jp/' +
+        'counter.php?id=pybbs" border="0"></a>'
+      '<footer>'
+      '<p><br>'
+      '<p><a href="/title">'#12479#12452#12488#12523#34920#31034
+      '</a>'
+      '<p><a href="/help">'#20351#12356#26041#26696#20869
+      '</a>'
+      '<p><a href=/search>'#26908#32034'</a>'
+      '<p>PR '#12522#12531#12463'<br>'
+      
+        '<p><a href="https://www.amazon.co.jp/%E9%AB%98%E6%A0%A1%E5%8D%92' +
+        '%E6%A5%AD%E3%81%BE%E3%81%A7%E3%81%AE%E3%82%B5%E3%83%83%E3%82%AB%' +
+        'E3%83%BC%E6%88%A6%E8%A1%93-sanuki_kainushi-ebook/dp/B00AXBM08Q/r' +
+        'ef=sr_1_7?ie=UTF8&amp;qid=1479369992&amp;sr=8-7&amp;keywords=san' +
+        'uki_kainushi">'#39640#26657#21330#26989#12414#12391#12398#12469#12483#12459#12540#25126#34899
+      '</a><br>amazon kindle'
+      '</p>'
+      '<p>'
+      
+        '<p><a href="https://www.amazon.co.jp/%E4%B8%AD%E5%AD%A6%E5%8D%92' +
+        '%E6%A5%AD%E3%81%BE%E3%81%A7%E3%81%AE%E3%82%B5%E3%83%83%E3%82%AB%' +
+        'E3%83%BC%E6%88%A6%E8%A1%93-sanuki_kainushi-ebook/dp/B014X0S874/r' +
+        'ef=sr_1_3?s=digital-text&amp;ie=UTF8&amp;qid=1479370246&amp;sr=1' +
+        '-3">'#20013#23398#21330#26989#12414#12391#12398#12469#12483#12459#12540#25126#34899
+      '</a><br>amazon kindle'
+      '</p>'
+      '</footer>'
+      ''
+      '</body>'
+      '</html>')
+    OnHTMLTag = topHTMLTag
+    Left = 48
+    Top = 32
+  end
+  object master: TPageProducer
+    HTMLDoc.Strings = (
+      '<!doctype html>'
+      '<head>'
+      '<meta charset=utf-8>'
+      '</head>'
+      '<body>'
+      ''
+      '<p><#request>'
+      '</body></html>')
+    OnHTMLTag = masterHTMLTag
+    Left = 56
+    Top = 144
+  end
+  object alert: TDataSetPageProducer
+    HTMLDoc.Strings = (
+      '<p>[ <#dbname>-<#posnum> ]<#date>'
+      '<p><#comment>')
+    DataSet = DataModule1.FDTable2
+    Left = 56
+    Top = 192
+  end
+  object footer: TDataSetPageProducer
+    HTMLDoc.Strings = (
+      '<p style=text-align:center>[ <#link> ] <#recent>')
+    DataSet = DataModule1.FDTable1
+    OnHTMLTag = footerHTMLTag
+    Left = 112
+    Top = 192
+  end
 end
index 8878222..3176191 100644 (file)
@@ -2,13 +2,21 @@ unit WebModuleUnit1;
 
 interface
 
-uses System.SysUtils, System.Classes, Web.HTTPApp, Web.DSProd, Web.HTTPProd;
+uses System.SysUtils, System.Classes, Web.HTTPApp, Web.DSProd, Web.HTTPProd,
+  Web.DBWeb, System.Variants;
 
 type
   TTWebModule1 = class(TWebModule)
-    top: TPageProducer;
     articles: TDataSetPageProducer;
     index: TDataSetPageProducer;
+    admin: TDataSetTableProducer;
+    search: TPageProducer;
+    items: TDataSetPageProducer;
+    help: TPageProducer;
+    top: TPageProducer;
+    master: TPageProducer;
+    alert: TDataSetPageProducer;
+    footer: TDataSetPageProducer;
     procedure indexHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
       TagParams: TStrings; var ReplaceText: string);
     procedure TWebModule1indexpageAction(Sender: TObject; Request: TWebRequest;
@@ -16,8 +24,31 @@ type
     procedure TWebModule1registAction(Sender: TObject; Request: TWebRequest;
       Response: TWebResponse; var Handled: Boolean);
     procedure WebModuleCreate(Sender: TObject);
+    procedure TWebModule1adminAction(Sender: TObject; Request: TWebRequest;
+      Response: TWebResponse; var Handled: Boolean);
+    procedure TWebModule1topAction(Sender: TObject; Request: TWebRequest;
+      Response: TWebResponse; var Handled: Boolean);
+    procedure itemsHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
+      TagParams: TStrings; var ReplaceText: string);
+    procedure topHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
+      TagParams: TStrings; var ReplaceText: string);
+    procedure TWebModule1searchAction(Sender: TObject; Request: TWebRequest;
+      Response: TWebResponse; var Handled: Boolean);
+    procedure TWebModule1helpAction(Sender: TObject; Request: TWebRequest;
+      Response: TWebResponse; var Handled: Boolean);
+    procedure searchHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
+      TagParams: TStrings; var ReplaceText: string);
+    procedure page(Sender: TObject; Request: TWebRequest;
+      Response: TWebResponse; var Handled: Boolean);
+    procedure masterHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
+      TagParams: TStrings; var ReplaceText: string);
+    procedure articlesHTMLTag(Sender: TObject; Tag: TTag;
+      const TagString: string; TagParams: TStrings; var ReplaceText: string);
+    procedure footerHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
+      TagParams: TStrings; var ReplaceText: string);
   private
     { private \90é\8c¾ }
+    ss: TStringList;
   public
     { public \90é\8c¾ }
   end;
@@ -33,36 +64,258 @@ uses Unit1;
 
 {$R *.dfm}
 
+procedure TTWebModule1.articlesHTMLTag(Sender: TObject; Tag: TTag;
+  const TagString: string; TagParams: TStrings; var ReplaceText: string);
+begin
+  if TagString = 'database' then
+    ReplaceText := Request.QueryFields.Values['db'];
+end;
+
+procedure TTWebModule1.footerHTMLTag(Sender: TObject; Tag: TTag;
+  const TagString: string; TagParams: TStrings; var ReplaceText: string);
+var
+  i: Integer;
+begin
+  if TagString = 'link' then
+    for i := 1 to 10 do
+      if i = Self.Tag then
+        ReplaceText := ReplaceText + ' ' + i.ToString + ' '
+      else
+        ReplaceText := ReplaceText +
+          Format('<a href=/index?db=%s&num=%d> %d </a>',
+          [Request.QueryFields.Values['db'], i, i])
+  else if TagString = 'recent' then
+    case Self.Tag of
+      - 1:
+        ReplaceText := TagString
+    else
+      ReplaceText := '<a href=/index?db=' + Request.QueryFields.Values['db'] +
+        '>recent</a>';
+    end;
+end;
+
 procedure TTWebModule1.indexHTMLTag(Sender: TObject; Tag: TTag;
   const TagString: string; TagParams: TStrings; var ReplaceText: string);
+var
+  count, max, index: Integer;
+  i: Integer;
 begin
+  if Self.Tag = 0 then
+  begin
+    DataModule1.FDTable1.Locate('database',
+      Request.QueryFields.Values['db'], []);
+    count := DataModule1.FDTable2.RecordCount;
+    max := DataModule1.FDTable3.FieldByName('count').AsInteger;
+    index := StrToIntDef(Request.QueryFields.Values['num'], -1);
+    if count >= 10 * max then
+      ReplaceText := '\82±\82ê\88È\8fã\93\8a\8de\82Å\82«\82Ü\82¹\82ñ.';
+    if (index > -1) and (count < max * (index - 1)) then
+      index := (count div max) + 1;
+    Self.Tag := index;
+    case index of
+      - 1:
+        begin
+          DataModule1.FDTable2.Last;
+          DataModule1.FDTable2.MoveBy(1 - max);
+        end;
+    else
+      DataModule1.FDTable2.First;
+      DataModule1.FDTable2.MoveBy(max * (index - 1));
+    end;
+  end;
   if TagString = 'article' then
   begin
-    DataModule1.FDTable2.First;
-    while DataModule1.FDTable2.Eof = false do
+    for i := 1 to max do
     begin
+      if DataModule1.FDTable2.Eof = true then
+        break;
       ReplaceText := ReplaceText + articles.Content;
       DataModule1.FDTable2.Next;
     end;
+  end
+  else if (TagString = 'footer') or (TagString = 'header') then
+    ReplaceText := ReplaceText + footer.Content;
+end;
+
+procedure TTWebModule1.itemsHTMLTag(Sender: TObject; Tag: TTag;
+  const TagString: string; TagParams: TStrings; var ReplaceText: string);
+var
+  s: TStringList;
+  t: string;
+  i, j: Integer;
+begin
+  if TagString = 'item' then
+  begin
+    s := TStringList.Create;
+    try
+      s.Text := DataModule1.FDTable2.FieldByName('raw').AsString;
+      for i := 0 to s.count - 1 do
+        for j := 0 to ss.count - 1 do
+          if Pos(ss[j], s[i]) > 0 then
+            if Request.ContentFields.Values['type'] = 'OR' then
+              s[i] := '<p style=background-color:aqua>' + s[i]
+            else
+              s[i] := '<p style=background-color:yellow>' + s[i];
+      with DataModule1.FDTable2 do
+        t := Format('<a href=%s>[ %s-%s ]</a>',
+          ['/index', FieldByName('dbnum').AsString, FieldByName('number')
+          .AsString]);
+      ReplaceText := t + s.Text;
+    finally
+      s.Free;
+    end;
   end;
 end;
 
+procedure TTWebModule1.masterHTMLTag(Sender: TObject; Tag: TTag;
+  const TagString: string; TagParams: TStrings; var ReplaceText: string);
+var
+  i, j: Integer;
+  s: string;
+begin
+  if TagString = 'request' then
+    with DataModule1.FDTable4 do
+    begin
+      First;
+      while Eof = false do
+      begin
+        i := FieldByName('dbname').AsInteger;
+        j := FieldByName('posnum').AsInteger;
+        DataModule1.FDTable2.Locate('dbname;posnum', VarArrayOf([i, j]), []);
+        s := DataModule1.FDTable4.FieldByName('request').AsString;
+        ReplaceText := ReplaceText + alert.Content + s;
+        Next;
+      end;
+    end;
+end;
+
+procedure TTWebModule1.searchHTMLTag(Sender: TObject; Tag: TTag;
+  const TagString: string; TagParams: TStrings; var ReplaceText: string);
+var
+  s: TStringList;
+  i: Integer;
+  j: Integer;
+begin
+  if (Request.MethodType = mtPost) and (TagString = 'items') then
+  begin
+    DataModule1.FDTable1.First;
+    s := TStringList.Create;
+    ss := TStringList.Create;
+    try
+      while DataModule1.FDTable1.Eof = false do
+      begin
+        DataModule1.FDTable2.First;
+        while DataModule1.FDTable2.Eof = false do
+        begin
+          s.Text := DataModule1.FDTable2.FieldByName('raw').AsString;
+          ss.Delimiter := ' ';
+          ss.StrictDelimiter := false;
+          ss.DelimitedText := Request.ContentFields.Values['word1'];
+          for i := 0 to s.count - 1 do
+            for j := 0 to ss.count - 1 do
+              if Pos(ss[j], s[i]) > 0 then
+                ReplaceText := ReplaceText + items.Content;
+          DataModule1.FDTable2.Next;
+        end;
+        DataModule1.FDTable1.Next;
+      end;
+    finally
+      s.Free;
+      ss.Free;
+    end;
+  end;
+end;
+
+procedure TTWebModule1.topHTMLTag(Sender: TObject; Tag: TTag;
+  const TagString: string; TagParams: TStrings; var ReplaceText: string);
+var
+  s, t: string;
+  i: Integer;
+begin
+  if TagString = 'list' then
+  begin
+    DataModule1.FDTable1.First;
+    i := DataModule1.FDTable3.FieldByName('info').AsInteger;
+    while DataModule1.FDTable1.Eof = false do
+    begin
+      t := '';
+      if i = DataModule1.FDTable1.FieldByName('dbnum').AsInteger then
+      begin
+        DataModule1.FDTable1.Next;
+        continue;
+      end;
+      s := DataModule1.FDTable1.FieldByName('database').AsString;
+      DataModule1.FDTable2.Last;
+      if Now - DataModule1.FDTable2.FieldByName('date').AsDateTime < 1 then
+        t := 'background-color:aqua;';
+      if DataModule1.FDTable2.RecordCount >= 30 then
+        t := t + 'font-color:red;';
+      if t <> '' then
+        t := ' style=' + t;
+      ReplaceText := ReplaceText +
+        Format('<p%s><a target=_blank href=%s>%s</a><br></p>',
+        [t, '/index?db=' + s, s]);
+      DataModule1.FDTable1.Next;
+    end;
+  end
+  else if TagString = 'info' then
+    ReplaceText := DataModule1.FDTable1.Lookup('dbnum',
+      DataModule1.FDTable3.FieldByName('info').AsInteger, 'database');
+end;
+
+procedure TTWebModule1.TWebModule1adminAction(Sender: TObject;
+  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
+begin
+  DataModule1.FDTable1.Locate('database', Request.QueryFields.Values['db'], []);
+  Response.ContentType := 'text/html;charset=utf-8';
+  Response.Content := admin.Content;
+end;
+
+procedure TTWebModule1.TWebModule1helpAction(Sender: TObject;
+  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
+var
+  i, j: Integer;
+  s: string;
+begin
+  Response.ContentType := 'text/html;charset=utf-8';
+  if Request.MethodType = mtPost then
+  begin
+    i := DataModule1.FDTable1.FieldByName('dbnum').AsInteger;;
+    j := DataModule1.FDTable2.FieldByName('number').AsInteger;
+    s := Request.ContentFields.Values['help'];
+    DataModule1.FDTable4.AppendRecord([i, j, s]);
+  end;
+  Response.Content := help.Content;
+end;
+
 procedure TTWebModule1.TWebModule1indexpageAction(Sender: TObject;
   Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
 begin
-  Response.ContentType := 'text/html;charset=utf8';
+  Self.Tag := 0;
+  Response.ContentType := 'text/html; charset="utf-8"';
   if DataModule1.FDTable3.FieldByName('mente').AsBoolean = true then
-    Response.Content := '\82½\82¾\82¢\82Ü\83\81\83\93\83e\83i\83\93\83X\92\86\82Å\82·^_^';
+    Response.Content := '\82½\82¾\82¢\82Ü\83\81\83\93\83e\83i\83\93\83X\92\86\82Å\82·^_^'
+  else
+    Response.Content := index.Content;
+end;
+
+procedure TTWebModule1.page(Sender: TObject; Request: TWebRequest;
+  Response: TWebResponse; var Handled: Boolean);
+begin
+  Response.ContentType := 'text/html;charset=utf-8';
+  Response.Content := alert.Content;
 end;
 
 procedure TTWebModule1.TWebModule1registAction(Sender: TObject;
   Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
 var
-  number: integer;
+  number: Integer;
   title, name, raw: string;
   comment: TStringList;
-  i: integer;
+  i: Integer;
 begin
+  name := Request.QueryFields.Values['db'];
+  DataModule1.FDTable1.Locate('database', name, []);
   with DataModule1.FDTable2 do
   begin
     Last;
@@ -76,20 +329,43 @@ begin
   comment := TStringList.Create;
   try
     comment.Text := raw;
-    for i := 0 to comment.Count - 1 do
+    for i := 0 to comment.count - 1 do
       comment[i] := '<p>' + comment[i];
-    DataModule1.FDTable2.AppendRecord([number, title, name, comment.Text,
+    i := DataModule1.FDTable1.FieldByName('dbnum').AsInteger;
+    DataModule1.FDTable2.AppendRecord([i, number, title, name, comment.Text,
       raw, Now]);
   finally
     comment.Free;
   end;
-  Response.SendRedirect('/index');
+  Response.SendRedirect('/index?db=' + name);
+end;
+
+procedure TTWebModule1.TWebModule1searchAction(Sender: TObject;
+  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
+begin
+  Response.ContentType := 'text/html;charset=utf-8';
+  Response.Content := search.Content;
+end;
+
+procedure TTWebModule1.TWebModule1topAction(Sender: TObject;
+  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
+begin
+  Response.ContentType := 'text/html;charset=utf-8';
+  Response.Content := top.Content;
 end;
 
 procedure TTWebModule1.WebModuleCreate(Sender: TObject);
+var
+  a: Variant;
 begin
   if DataModule1.FDTable1.Bof and DataModule1.FDTable1.Eof then
-    DataModule1.FDTable1.AppendRecord(['info']);
+    DataModule1.FDTable1.AppendRecord([0, 'info']);
+  if DataModule1.FDTable3.Bof and DataModule1.FDTable3.Eof then
+  begin
+    a := DataModule1.FDTable1.Lookup('database', 'info', 'dbnum');
+    DataModule1.FDTable3.AppendRecord
+      (['\82Æ\82é\82Ë\81`\82Ç\8d\86', '<p style=font-color:gray>\82Æ\82é\82Ë\81`\82Ç\8d\86</p>', false, a, 30]);
+  end;
 end;
 
 end.
diff --git a/article.htm b/article.htm
deleted file mode 100644 (file)
index 81b2b80..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-                                            <hr size=1>
-       <section id=number><a name=<#number>></a><a href=/{{link}}/userdel?job=<#number> style=text-decoration:none>
-               [<#number>]</a></section>
-       <section id=title><#title></section>
-       <section id=name> Name:<h1><#name></h1></section>
-       <section id=date> Date:<h1><#date></h1></section>
-       <p>▽▲▽▲▽▲▽
-       <section id=comment><#comment></section>
-        <section id=master style=text-align:right><a href=/alert?db=<#database>&num=<#number>>報告</a></section>
-       <p>△▼△▼△▼△
diff --git a/index.htm b/index.htm
deleted file mode 100644 (file)
index dc7adc2..0000000
--- a/index.htm
+++ /dev/null
@@ -1,57 +0,0 @@
-<!DOCTYPE html>
-
-<html>
-  <head>
-    <meta charset=utf-8>
-    <title>
-    <#title>
-    </title>
-  </head>
-  <body>
-
-    <a href=/ style=text-decoration:none><#title2></a>
-    <header>
-    <a name=top></a>
-    <form action=/regist?db=<#database> method="post">
-      <table>
-        <tr><td>
-          <label><p>お名前</p><input name="name" class=name value=<#cookie param=name>></label>
-          <label><p>タイトル</p><input name="title" class=title value=<#cookie param=title> placeholder="タイトルなし."></label>
-          <input type="submit" value="送信">
-        </td></tr>
-        <tr><td>
-          <label><p>本文<span>必須</span><br></p>
-            <textarea style="font-size:1.75em" name="comment" cols=30
-                      required placeholder="コメントなどを入力してください."><#cookie param=comment></textarea></label>
-        </td></tr>
-        <tr><td>
-          <label><p>パスワード</p><input name="password" type="password" placeholder="削除用">
-          </label> / <input type="checkbox" name="show" value="true" checked><p>プレビュー</p>
-        </td></tr>
-        <tr><td>
-          <label><p>合言葉をひらがなで入力してください: genki <input name=aikotoba type=text value=<#cookie param=aikotoba>></label>
-        </td></tr>
-      </table>
-    </form>
-    </header>
-    <hr size="1" width="100%">
-    <form action=/userdel?db=<#database> method="post" id=search>
-      <label><p>記事No</p><input name="number"></label>
-      <label><p>Pass</p><input type="password" name="password"></label>
-      <input type="submit" value="削除">
-    </form>
-    <form action=/userdel?db=<#database> method=post id=search>
-      <label><p>記事No</p><input name=number></label>
-      <input type=submit value=移動>
-    </form>
-    <p><a href=/search?db=<#database>>検索ページ</a></p>
-    <p style=text-align:right><a href=#article>下へ移動</a></p>
-    <p style=text-align:center><#database></p>
-
-  <#article>
-       <a name=article></a>
-       <p style=text-align:right><a href=#top>Topへ移動</a></p>
-
-    <p style=text-align:center><a href="/admin?db=<#database>&num=0">管理者用ログイン</a></p>
-  </body>
-</html>
diff --git a/top.htm b/top.htm
index 12a0f48..b0d1c14 100644 (file)
--- a/top.htm
+++ b/top.htm
@@ -1,16 +1,17 @@
 
 <!doctype html>
-<html class=no-js lang=ja>
+<html class="no-js" lang="ja">
 <head>
-       <meta charset=utf-8 name="google-site-verification"  content="5KOTJTKv1HgTtIt0zVGzuyAkADCwXRme-RiiKJ03l3s" />
+       <meta charset="utf-8" name="google-site-verification"  content="5KOTJTKv1HgTtIt0zVGzuyAkADCwXRme-RiiKJ03l3s" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
-       <title>Top Page</title>
-       <link rel=stylesheet href={{static_url('css/top.css')}}>
-       <link rel=stylesheet href={{static_url('css/normalize.css')}}>
-       <script src={{static_url('js/jquery-1.10.2.min.js')}}></script>
-       <script src={{static_url('js/top.js')}}></script>
-       <script src={{static_url('js/modernizr.custom.min.js')}}></script>
-       <script src={{static_url('js/jquery-ui-1.10.3.custom.min.js')}}></script>
+       <title>Top Page
+</title>
+       <link rel="stylesheet" href="{{static_url(css/top.css">
+       <link rel="stylesheet" href="{{static_url(css/normalize.css">
+       <script src="{{static_url(js/jquery-1.10.2.min.js"></script>
+       <script src="{{static_url(js/top.js"></script>
+       <script src="{{static_url(js/modernizr.custom.min.js"></script>
+       <script src="{{static_url(js/jquery-ui-1.10.3.custom.min.js"></script>
 </head>
 <body>
 <div id="fb-root"></div>
   js.src = "//connect.facebook.net/ja_JP/sdk.js#xfbml=1&version=v2.8";
   fjs.parentNode.insertBefore(js, fjs);
 }(document, 'script', 'facebook-jssdk'));</script>
-<header><h1 style=text-align:center>無料電子掲示板へようこそ</h1></header>
-{% set d = 0 %}
-{% set i = 7 %}
-<div class=slideshow>
-       <div class=slideshow-slides>
-{% for x in coll %}
-       {% if d % i == 0 %}
-               <div class=slide>
-       <img src={{static_url('img/slide{0}.jpg'.format(1+d//i))}} style=float:right;height:465px>
-       {% end %}
-       {% set d += 1 %}
-       {% if full(x) == True %}
-       <p><a href=/{{x}} style=color:red>{{x}}</a>
-       {% else %}
-       <p><a href=/{{x}}>{{x}}</a>
-       {% end %}
-       {% if d % i == 0 %}
-               </div>
-       {% end %}
-{% end %}
-{% if d % i != 0 %}
-       </div>
-{% end %}
-       </div>
-       <div class=slideshow-nav>
-       <a href=# class=prev>prev</a>
-       <a href=# class=next>next</a>
-       </div>
-       <div class=slideshow-indicator></div>
+<header><h1 style="text-align: center;">無料電子掲示板へようこそ
+</h1></header>{% set d = 0 %} {% set i = 7 %}<div class="slideshow">
+       <div class="slideshow-slides">{% for x in coll %}{% if d % i == 0 %}    <div class="slide">
+       <img src="{{static_url(img/slide{0}.jpg" i='style="float:right;height:465px"' format="d=">{% end %}{% set d += 1 %}{% if full(x) == True %}     <p><a href="/{{x}}" style="color: red;">{{x}}
+</a>{% else %} <p><a href="/{{x}}">{{x}}
+</a>{% end %}{% if d % i == 0 %}
+</div>{% end %} {% end %} {% if d % i != 0 %}
+</div>{% end %}
 </div>
-{% if name != '' %}
-       <p>[ <a href=/{{name}}>{{name}}</a> ] <=お知らせ
-{% end %}
-<p>[ <a href=/master>master</a> ] <=管理人
-<div class="fb-like" data-href="http://pybbs.herokuapp.com" data-layout="box_count" data-action="like" data-size="small" data-show-faces="true" data-share="false"></div>
+       <div class="slideshow-nav">
+       <a href="#" class="prev">prev
+</a>
+       <a href="#" class="next">next
+</a>
+       </div>
+       <div class="slideshow-indicator"></div>{% if name != '' %}      <p>[ <a href="/{{name}}">{{name}}
+</a> ] =お知らせ {% end %}<p>[ <a href="/master">master
+</a> ] =管理人<div class="fb-like" data-href="http://pybbs.herokuapp.com" data-layout="box_count" data-action="like" data-size="small" data-show-faces="true" data-share="false"></div>
 <p><a href="http://www.xn--gckj5d1ktb3488cn4q.jp/" target="_blank"><img alt="無料カウンター" src="http://www.xn--gckj5d1ktb3488cn4q.jp/counter.php?id=pybbs" border="0"></a>
 <footer>
 <p><br>
-<p><a href=/title>タイトル表示</a>
-<p><a href=/help>使い方案内</a>
-<p>PR リンク
-<br>
-<p><a href=https://www.amazon.co.jp/%E9%AB%98%E6%A0%A1%E5%8D%92%E6%A5%AD%E3%81%BE%E3%81%A7%E3%81%AE%E3%82%B5%E3%83%83%E3%82%AB%E3%83%BC%E6%88%A6%E8%A1%93-sanuki_kainushi-ebook/dp/B00AXBM08Q/ref=sr_1_7?ie=UTF8&qid=1479369992&sr=8-7&keywords=sanuki_kainushi>高校卒業までのサッカー戦術</a><br>
-amazon kindle</p>
+<p><a href="/title">タイトル表示
+</a>
+<p><a href="/help">使い方案内
+</a>
+<p>PR リンク<br>
+<p><a href="https://www.amazon.co.jp/%E9%AB%98%E6%A0%A1%E5%8D%92%E6%A5%AD%E3%81%BE%E3%81%A7%E3%81%AE%E3%82%B5%E3%83%83%E3%82%AB%E3%83%BC%E6%88%A6%E8%A1%93-sanuki_kainushi-ebook/dp/B00AXBM08Q/ref=sr_1_7?ie=UTF8&amp;qid=1479369992&amp;sr=8-7&amp;keywords=sanuki_kainushi">高校卒業までのサッカー戦術
+</a><br>amazon kindle
+</p>
 <p>
-<p><a href=https://www.amazon.co.jp/%E4%B8%AD%E5%AD%A6%E5%8D%92%E6%A5%AD%E3%81%BE%E3%81%A7%E3%81%AE%E3%82%B5%E3%83%83%E3%82%AB%E3%83%BC%E6%88%A6%E8%A1%93-sanuki_kainushi-ebook/dp/B014X0S874/ref=sr_1_3?s=digital-text&ie=UTF8&qid=1479370246&sr=1-3>中学卒業までのサッカー戦術</a><br>
-amazon kindle</p>
+<p><a href="https://www.amazon.co.jp/%E4%B8%AD%E5%AD%A6%E5%8D%92%E6%A5%AD%E3%81%BE%E3%81%A7%E3%81%AE%E3%82%B5%E3%83%83%E3%82%AB%E3%83%BC%E6%88%A6%E8%A1%93-sanuki_kainushi-ebook/dp/B014X0S874/ref=sr_1_3?s=digital-text&amp;ie=UTF8&amp;qid=1479370246&amp;sr=1-3">中学卒業までのサッカー戦術
+</a><br>amazon kindle
+</p>
 </footer>
+
+
+
 </body>
 </html>