OSDN Git Service

NGの処理を正規表現利用化にして、
authorh677 <h677>
Mon, 12 Feb 2007 16:06:36 +0000 (16:06 +0000)
committerh677 <h677>
Mon, 12 Feb 2007 16:06:36 +0000 (16:06 +0000)
ためしに組み込んでみた。

HTMLCreate.pas
NGWordEdit.dfm
NGWordEdit.pas
NGWordUnit.pas

index 2917c2e..0bec152 100644 (file)
@@ -99,7 +99,7 @@ var
 implementation
 
 uses
-    Trip;
+    Trip, NGWordUnit;
 
 const
        URL_CHAR: string = '0123456789'
@@ -771,16 +771,22 @@ begin
 
                if (Trim(ReadList[i]) <> '') then begin
                        DivideStrLine(ReadList[i], @Res);
-                       AddAnchorTag(@Res);
-                       ConvRes(@Res, @ResLink);
-                       Res.FDateTime := AddBeProfileLink(Res.FDateTime, i + 1);
-
-                       if NewReceiveNo <= (i + 1) then
-                               // \90V\92\85\83\8c\83X
-                               html.Add(SkinedRes(SkinNewRes, @Res, IntToStr(i + 1)))
-                       else
-                               // \92Ê\8fí\82Ì\83\8c\83X
-                               html.Add(SkinedRes(SkinRes, @Res, IntToStr(i + 1)));
+            if (NGWordList.IsNG(@Res) = -1) then begin
+                       AddAnchorTag(@Res);
+                       ConvRes(@Res, @ResLink);
+                       Res.FDateTime := AddBeProfileLink(Res.FDateTime, i + 1);
+
+                           if NewReceiveNo <= (i + 1) then
+                                   // \90V\92\85\83\8c\83X
+                               html.Add(SkinedRes(SkinNewRes, @Res, IntToStr(i + 1)))
+                       else
+                               // \92Ê\8fí\82Ì\83\8c\83X
+                               html.Add(SkinedRes(SkinRes, @Res, IntToStr(i + 1)));
+            end else begin
+{$IFDEF DEBUG}
+                html.Add('<h4>\82 \82Ú\81`\82ñ</h4>');
+{$ENDIF}
+            end;
                end;
 
                if ThreadItem.Kokomade = (i + 1) then begin
@@ -858,16 +864,22 @@ begin
                        if (Trim(ReadList[i]) <> '') then begin
                                No := IntToStr(i + 1);
                                DivideStrLine(ReadList[i], @Res);
-                               AddAnchorTag(@Res);
-                               ConvRes(@Res, @ResLink);
-                               Res.FDateTime := AddBeProfileLink(Res.FDateTime, i + 1);
-                               if Res.FMailTo = '' then
-                                       html.Add(Format(FORMAT_NOMAIL, [No, No, No, Res.FName, Res.FDateTime, Res.FBody]))
-                               else if GikoSys.Setting.ShowMail then
-                                       html.Add(Format(FORMAT_SHOWMAIL, [No, No, No, Res.FMailTo, Res.FName, Res.FMailTo, Res.FDateTime, Res.FBody]))
-                               else
-                                       html.Add(Format(FORMAT_NOSHOW, [No, No, No, Res.FMailTo, Res.FName, Res.FDateTime, Res.FBody]));
-                       end;
+                if (NGWordList.IsNG(@Res) = -1) then begin
+                    AddAnchorTag(@Res);
+                    ConvRes(@Res, @ResLink);
+                    Res.FDateTime := AddBeProfileLink(Res.FDateTime, i + 1);
+                    if Res.FMailTo = '' then
+                        html.Add(Format(FORMAT_NOMAIL, [No, No, No, Res.FName, Res.FDateTime, Res.FBody]))
+                    else if GikoSys.Setting.ShowMail then
+                        html.Add(Format(FORMAT_SHOWMAIL, [No, No, No, Res.FMailTo, Res.FName, Res.FMailTo, Res.FDateTime, Res.FBody]))
+                    else
+                        html.Add(Format(FORMAT_NOSHOW, [No, No, No, Res.FMailTo, Res.FName, Res.FDateTime, Res.FBody]));
+                           end;
+            end else begin
+{$IFDEF DEBUG}
+                html.Add('<h4>\82 \82Ú\81`\82ñ</h4>');
+{$ENDIF}
+            end;
 
                        if ThreadItem.Kokomade = (i + 1) then begin
                                html.Add('<a name="koko"></a><div class="koko">\83R\83R\82Ü\82Å\93Ç\82ñ\82¾</div>');
@@ -922,6 +934,7 @@ begin
                if (Trim(ReadList[i]) <> '') then begin
                        No := IntToStr(i + 1);
                        DivideStrLine(ReadList[i], @Res);
+
                        AddAnchorTag(@Res);
                        ConvRes(@Res, @ResLink);
                        Res.FDateTime := AddBeProfileLink(Res.FDateTime, i + 1);
@@ -931,7 +944,12 @@ begin
                                html.Add('<a name="' + No + '"></a><dt><a href="menu:' + No + '">' + No + '</a> \96¼\91O\81F<a href="mailto:' + Res.FMailTo + '"><b> ' + Res.FName + ' </B></a> [' + Res.FMailTo + '] \93\8a\8de\93ú\81F <span class="date">' + Res.FDateTime+ '</span><br><dd>' + Res.Fbody + ' <br><br><br>'#13#10)
                        else
                                html.Add('<a name="' + No + '"></a><dt><a href="menu:' + No + '">' + No + '</a> \96¼\91O\81F<a href="mailto:' + Res.FMailTo + '"><b> ' + Res.FName + ' </B></a> \93\8a\8de\93ú\81F <span class="date">' + Res.FDateTime+ '</span><br><dd>' + Res.Fbody + ' <br><br><br>'#13#10);
-               end;
+        end else begin
+{$IFDEF DEBUG}
+                html.Add('<h4>\82 \82Ú\81`\82ñ</h4>');
+{$ENDIF}
+        end;
+
                if ThreadItem.Kokomade = (i + 1) then begin
                        html.Add('</dl>');
                        html.Add('<a name="koko"></a><table width="100%" bgcolor="#55AA55" cellpadding="0" cellspacing="1"><tr><td align="center" bgcolor="#77CC77" valign="middle"><font size="-1" color="#ffffff"><b>\83R\83R\82Ü\82Å\93Ç\82ñ\82¾</b></font></td></tr></table>');
@@ -976,7 +994,7 @@ begin
                                                ReadList.LoadFromFile(FileName);
                                                ReadList.EndUpdate;
                                                GikoSys.FAbon.IndividualAbon(ReadList, ChangeFileExt(FileName,'.NG'));
-                                               GikoSys.FAbon.Execute(ReadList);                //       \82 \82Ú\81`\82ñ\82µ\82Ä
+                                               //GikoSys.FAbon.Execute(ReadList);              //       \82 \82Ú\81`\82ñ\82µ\82Ä
                                                GikoSys.FSelectResFilter.Execute(ReadList); //\83\8c\83X\82Ì\83t\83B\83\8b\83^\83\8a\83\93\83O\82ð\82·\82é
                                                if ThreadItem.Title = '' then begin
                                                        DivideStrLine(ReadList[0], @Res);
index b270e76..4bf2ea0 100644 (file)
@@ -13,7 +13,6 @@ object NGWordEditForm: TNGWordEditForm
   Menu = MainMenu1
   OldCreateOrder = False
   OnCreate = FormCreate
-  OnDestroy = FormDestroy
   PixelsPerInch = 96
   TextHeight = 12
   object Panel1: TPanel
@@ -158,6 +157,7 @@ object NGWordEditForm: TNGWordEditForm
         Height = 25
         Caption = #22793#26356
         TabOrder = 0
+        OnClick = ModifiedNGButtonClick
       end
       object AddNGButton: TButton
         Left = 24
@@ -190,6 +190,7 @@ object NGWordEditForm: TNGWordEditForm
       RowSelect = True
       TabOrder = 2
       ViewStyle = vsReport
+      OnSelectItem = GikoListView2SelectItem
     end
   end
   object MainMenu1: TMainMenu
index b4e7023..eea0ed1 100644 (file)
@@ -33,7 +33,6 @@ type
     Save1: TMenuItem;
     procedure Load1Click(Sender: TObject);
     procedure Save1Click(Sender: TObject);
-    procedure FormDestroy(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure GikoListView1SelectItem(Sender: TObject; Item: TListItem;
       Selected: Boolean);
@@ -42,9 +41,11 @@ type
     procedure AddButtonClick(Sender: TObject);
     procedure DeleteButtonClick(Sender: TObject);
     procedure ApplyButtonClick(Sender: TObject);
+    procedure ModifiedNGButtonClick(Sender: TObject);
+    procedure GikoListView2SelectItem(Sender: TObject; Item: TListItem;
+      Selected: Boolean);
   private
     { Private \90é\8c¾ }
-    FNGWordList : TNGWordList;
     function AddNGWord(ngWord: TNGWords): TListItem;
     procedure AddWord(word: TNGWord);
   public
@@ -65,16 +66,20 @@ var
     fname : String;
     i: Integer;
 begin
-    fname := GikoSys.GetAppDir + 'ngwords.xml';
-    if (FNGWordList <> nil) then begin
-        FNGWordList.Free;
-    end else begin
-        FNGWordList := TNGWordList.Create;
-    end;
-    FNGWordList.LoadFromFile(fname);
-    GikoListView1.Items.Clear;
-    for i :=0 to FNGWordList.Count - 1 do begin
-        AddNGWord(TNGWords(FNGWordList.Items[i]));
+    GikoListView2.Items.BeginUpdate;
+    GikoListView1.Items.BeginUpdate;
+    try
+        GikoListView2.Items.Clear;
+        GikoListView1.Items.Clear;
+        fname := GikoSys.GetAppDir + 'ngwords.xml';
+        NGWordList.LoadFromFile(fname);
+
+        for i :=0 to NGWordList.Count - 1 do begin
+            AddNGWord(TNGWords(NGWordList.Items[i]));
+        end;
+    finally
+        GikoListView1.Items.EndUpdate;
+        GikoListView2.Items.EndUpdate;
     end;
 end;
 function TNGWordEditForm.AddNGWord(ngWord: TNGWords): TListItem;
@@ -90,23 +95,17 @@ end;
 
 procedure TNGWordEditForm.Save1Click(Sender: TObject);
 begin
-    if (FNGWordList <> nil) then begin
-        FNGWordList.SaveToFrile(GikoSys.GetAppDir + 'ngwords2.xml');
-    end;
-end;
-
-procedure TNGWordEditForm.FormDestroy(Sender: TObject);
-begin
-    if (FNGWordList <> nil) then begin
-        FreeAndNil(FNGWordList);
+    if (NGWordList <> nil) then begin
+        NGWordList.SaveToFrile(GikoSys.GetAppDir + 'ngwords2.xml');
     end;
 end;
 
 procedure TNGWordEditForm.FormCreate(Sender: TObject);
 var
     column1,column2: TListColumn;
+    i: Integer;
 begin
-     GikoListView1.Columns.BeginUpdate;
+    GikoListView1.Columns.BeginUpdate;
        column1 := GikoListView1.Columns.Add;
        column1.ImageIndex := -1;
        column1.Caption := '\93§\96¾';
@@ -133,6 +132,11 @@ begin
        column2.Width := 190;
     GikoListView2.Columns.EndUpdate;
 
+    GikoListView1.Items.BeginUpdate;
+    for i :=0 to NGWordList.Count - 1 do begin
+        AddNGWord(TNGWords(NGWordList.Items[i]));
+    end;
+    GikoListView1.Items.EndUpdate;
 end;
 // \8fã\95\94\83\8a\83X\83g\91I\91ð\83C\83x\83\93\83g
 procedure TNGWordEditForm.GikoListView1SelectItem(Sender: TObject;
@@ -227,9 +231,9 @@ procedure TNGWordEditForm.AddButtonClick(Sender: TObject);
 var
     ngWords: TNGWords;
 begin
-    if (FNGWordList <> nil) then begin
+    if (NGWordList <> nil) then begin
         ngWords := TNGWords.Create;
-        FNGWordList.Add(ngWords);
+        NGWordList.Add(ngWords);
         GikoListView1.Selected := AddNGWord(ngWords);
         GikoListView1.SetFocus;
     end;
@@ -241,8 +245,8 @@ var
 begin
     // \8c»\8dÝ\91I\91ð\82³\82ê\82Ä\82¢\82é\8ds\82ð\8eæ\93¾\82·\82é
     litem := GikoListView1.Selected;
-    if (litem <> nil) and (FNGWordList <> nil) then begin
-        FNGWordList.Delte( TNGWords(litem.Data));
+    if (litem <> nil) and (NGWordList <> nil) then begin
+        NGWordList.Delte( TNGWords(litem.Data));
         GikoListView1.DeleteSelected;
     end;
 end;
@@ -258,4 +262,43 @@ begin
     end;
 end;
 
+procedure TNGWordEditForm.ModifiedNGButtonClick(Sender: TObject);
+var
+    litem, litem2: TListItem;
+begin
+    // \8c»\8dÝ\91I\91ð\82³\82ê\82Ä\82¢\82é\8ds\82ð\8eæ\93¾\82·\82é
+    litem := GikoListView1.Selected;
+    if (litem <> nil) then begin
+        litem2 := GikoListView2.Selected;
+        if litem2 <> nil then begin
+            TNGWord(litem2.Data).NGType := TGikoNGType(ComboBox1.ItemIndex);
+            TNGWord(litem2.Data).Word := NGWordEdit.Text;
+            litem.SubItems.Clear;
+            litem.SubItems.Add(TNGWords(litem.Data).ToString);
+
+            case Integer(TNGWord(litem2.Data).NGType) of
+                Integer(gntAll):   litem2.Caption := '\91S\95\94';
+                Integer(gntName):  litem2.Caption := '\96¼\91O\97\93';
+                Integer(gntMail):  litem2.Caption := '\83\81\81[\83\8b\97\93';
+                Integer(gntDateId):litem2.Caption := '\93ú\95tID\97\93';
+                Integer(gntBody):  litem2.Caption := '\96{\95¶';
+            end;
+            litem2.SubItems.Clear;
+            litem2.SubItems.Add(TNGWord(litem2.Data).Word);
+            end;
+    end;
+end;
+
+procedure TNGWordEditForm.GikoListView2SelectItem(Sender: TObject;
+  Item: TListItem; Selected: Boolean);
+var
+    word : TNGWord;
+    i: Integer;
+begin
+       if (Item <> nil) and (Item.Data <> nil) then begin
+        word := TNGWord(item.Data);
+        ComboBox1.ItemIndex := Ord(word.NGType);
+        NGWordEdit.Text := word.Word;
+       end;
+end;
 end.
index d4e6df6..aa37783 100644 (file)
@@ -3,7 +3,7 @@ unit NGWordUnit;
 interface
 uses
     Windows,Messages, ShellAPI, SysUtils, Classes,StdCtrls,StrUtils,
-    GikoXMLDoc, GikoSystem;
+    GikoXMLDoc, GikoSystem, bmRegExp;
 
 type
        //\83\8a\83X\83g\82Ì\95\\8e¦\83A\83C\83e\83\80\91I\91ð
@@ -32,6 +32,7 @@ type
        private
         FRank : Integer;
         FInvisible: Boolean;
+        FAWKStr: TAWKStr;
        public
         constructor Create;
         procedure Free;
@@ -41,6 +42,7 @@ type
         function ToXMLString(): String;
         function ToString(): String;
         procedure Delete(word: TNGWord); overload;
+        function IsNG(PRes : PResRec): Boolean;
        end;
 
     {\
@@ -53,10 +55,12 @@ type
         procedure LoadFromFile(fileName: String);
         procedure SaveToFrile(fileName: String);
         procedure Delte(NGWords: TNGWords); overload;
-        function IsNG(PRes : PResRec): Boolean;
+        function IsNG(PRes : PResRec): Integer;
     end;
 
     function CompareRank(Item1, Item2: Pointer): Integer;
+var
+       NGWordList: TNGWordList;
 
 implementation
 
@@ -76,6 +80,7 @@ end;
 constructor TNGWords.Create;
 begin
     FRank := 0;
+    FAWKStr := TAWKStr.Create(nil);
 end;
 procedure TNGWords.Free;
 var
@@ -84,6 +89,7 @@ begin
     for i := 0 to Count - 1 do begin
         TObject(Items[i]).Free;
     end;
+    FAWKStr.Free;
     inherited Free;
 end;
 function TNGWords.ReadXMLElement(element :IXMLNode): Boolean;
@@ -144,19 +150,66 @@ begin
         end;
     end;
 end;
+function TNGWords.IsNG(PRes : PResRec): Boolean;
+var
+    i, oLength: Integer;
+    RStart, RLength: Integer;
+    word: TNGWord;
+begin
+    Result := True;
+    for i := 0 to Count - 1 do begin
+        word := TNGWord(Items[i]);
+        FAWKStr.RegExp := word.Word;
+        case Ord(word.FNGType) of
+            Ord(gntAll):
+            begin
+                Result := FAWKStr.Match(FAWKStr.ProcessEscSeq(PRes.FTitle),
+                     RStart, RLength) <> 0;
+                if Result then break;
+                Result := FAWKStr.Match(FAWKStr.ProcessEscSeq(PRes.FMailTo),
+                     RStart, RLength) <> 0;
+                if Result then break;
+                Result := FAWKStr.Match(FAWKStr.ProcessEscSeq(PRes.FName),
+                     RStart, RLength) <> 0;
+                if Result then break;
+                Result := FAWKStr.Match(FAWKStr.ProcessEscSeq(PRes.FDateTime),
+                     RStart, RLength) <> 0;
+                if Result then break;
+                Result := FAWKStr.Match(FAWKStr.ProcessEscSeq(PRes.FBody),
+                     RStart, RLength) <> 0;
+            end;
+            Ord(gntName):
+                Result := FAWKStr.Match(FAWKStr.ProcessEscSeq(PRes.FName),
+                     RStart, RLength) <> 0;
+            Ord(gntMail):
+                Result := FAWKStr.Match(FAWKStr.ProcessEscSeq(PRes.FMailTo),
+                     RStart, RLength) <> 0;
+            Ord(gntDateId):
+                Result := FAWKStr.Match(FAWKStr.ProcessEscSeq(PRes.FDateTime),
+                     RStart, RLength) <> 0;
+            Ord(gntBody):
+                Result := FAWKStr.Match(FAWKStr.ProcessEscSeq(PRes.FBody),
+                     RStart, RLength) <> 0;
+        end;
+        if not Result then Exit;
+    end;
+end;
+
+
 procedure TNGWord.ReadXMLElement(element :IXMLNode);
 begin
-  FRank := StrToIntDef(element.Attributes['rank'],
-                MaxInt);
-  FNGType := TGikoNGType(StrToIntDef(
-      Trim(element.Attributes['ngtype']),
-      Integer(gntAll)));
+    FRank := StrToIntDef(element.Attributes['rank'],
+                  MaxInt);
+    FNGType := TGikoNGType(StrToIntDef(
+        Trim(element.Attributes['ngtype']),
+        Integer(gntAll)));
 
-  FWord := Trim(element.Attributes['word']);
-  if FWord <> '' then begin
-    FWord := MojuUtils.UnSanitize( FWord );
-  end;
+    FWord := Trim(element.Attributes['word']);
+    if FWord <> '' then begin
+      FWord := MojuUtils.UnSanitize( FWord );
+    end;
 end;
+
 function TNGWord.ToXMLString(): String;
 begin
     Result := '<NGWord ' +
@@ -255,13 +308,30 @@ begin
     end;
 end;
 //! NG\94»\92è
-function TNGWordList.IsNG(PRes : PResRec): Boolean;
+function TNGWordList.IsNG(PRes : PResRec): Integer;
 var
     i: Integer;
+    tRes : TResRec;
 begin
-    for i := 0 to Count - 1 do begin
-        //
+    Result := -1;
+    if Count > 0 then begin
+        for i := 0 to Count - 1 do begin
+            if (TNGWords(Items[i]).IsNG(PRes)) then begin
+                Result := i;
+                break;
+            end;
+        end;
     end;
 end;
 
+// \83V\83\93\83O\83\8b\83g\83\93\82Ì\83C\83\93\83X\83^\83\93\83X
+initialization
+        NGWordList := TNGWordList.Create;
+
+finalization
+       if NGWordList <> nil then begin
+               NGWordList.Free;
+               NGWordList := nil;
+       end;
+
 end.