+++ /dev/null
-unit NGWordEdit;
-
-interface
-
-uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, ExtCtrls, StdCtrls, ComCtrls, GikoListView, Menus, GikoXMLDoc,
- NGWordUnit;
-
-type
- TNGWordEditForm = class(TForm)
- Panel1: TPanel;
- Panel2: TPanel;
- Panel3: TPanel;
- AddButton: TButton;
- DeleteButton: TButton;
- ApplyButton: TButton;
- Button4: TButton;
- Panel4: TPanel;
- Panel5: TPanel;
- GikoListView2: TGikoListView;
- GikoListView1: TGikoListView;
- ComboBox1: TComboBox;
- Label1: TLabel;
- NGWordEdit: TEdit;
- Label2: TLabel;
- ModifiedNGButton: TButton;
- AddNGButton: TButton;
- DeleteNGButton: TButton;
- MainMenu1: TMainMenu;
- File1: TMenuItem;
- Load1: TMenuItem;
- Save1: TMenuItem;
- procedure Load1Click(Sender: TObject);
- procedure Save1Click(Sender: TObject);
- procedure FormCreate(Sender: TObject);
- procedure GikoListView1SelectItem(Sender: TObject; Item: TListItem;
- Selected: Boolean);
- procedure AddNGButtonClick(Sender: TObject);
- procedure DeleteNGButtonClick(Sender: TObject);
- 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¾ }
- function AddNGWord(ngWord: TNGWords): TListItem;
- procedure AddWord(word: TNGWord);
- public
- { Public \90é\8c¾ }
- end;
-
-var
- NGWordEditForm: TNGWordEditForm;
-
-implementation
-
-uses
- GikoSystem;
-{$R *.dfm}
-
-procedure TNGWordEditForm.Load1Click(Sender: TObject);
-var
- fname : String;
- i: Integer;
-begin
- 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;
-begin
- Result := GikoListView1.Items.Add;
- Result.ImageIndex := -1;
- Result.Caption := '';
- Result.SubItems.Clear;
- Result.SubItems.Add(ngWord.ToString);
- Result.Checked := ngWord.Invisible;
- Result.Data := ngWord;
-end;
-
-procedure TNGWordEditForm.Save1Click(Sender: TObject);
-begin
- 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;
- column1 := GikoListView1.Columns.Add;
- column1.ImageIndex := -1;
- column1.Caption := '\93§\96¾';
- column1.DisplayName := '\93§\96¾';
- column1.Width := 40;
- column1 := GikoListView1.Columns.Add;
- column1.ImageIndex := -1;
- column1.Caption := 'NG\83\8f\81[\83h';
- column1.DisplayName := 'NG\83\8f\81[\83h';
- column1.Width := 250;
- GikoListView1.Columns.EndUpdate;
-
-
- GikoListView2.Columns.BeginUpdate;
- column2 := GikoListView2.Columns.Add;
- column2.ImageIndex := -1;
- column2.Caption := '\93K\89\9e\8fê\8f\8a';
- column2.DisplayName := '\93K\89\9e\8fê\8f\8a';
- column2.Width := 100;
- column2 := GikoListView2.Columns.Add;
- column2.ImageIndex := -1;
- column2.Caption := '\83\8f\81[\83h';
- column2.DisplayName := '\83\8f\81[\83h';
- 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;
- Item: TListItem; Selected: Boolean);
-var
- ngWord : TNGWords;
- i: Integer;
-begin
- if (Item <> nil) and (Item.Data <> nil) then begin
- ngWord := TNGWords(item.Data);
- GikoListView2.Items.BeginUpdate;
- GikoListView2.items.Clear;
- if ngWord.Count = 0 then begin
- // \89½\82à\82È\82¢\82Æ\8c©\82¦\82È\82¢\82Ì\82Å\83f\83t\83H\83\8b\83g\82Ì\83\81\83b\83Z\81[\83W
- AddWord(nil);
- end else begin
- // \91S\95\94\82Ì\97v\91f\82ð\92Ç\89Á\82·\82é
- for i := 0 to ngWord.Count - 1 do begin
- AddWord( TNGWord(ngWord.Items[i]) );
- end;
-
- end;
- GikoListView2.Items.EndUpdate;
- end;
-end;
-// \89º\95\94\83\8a\83X\83g\92Ç\89Á\83\81\83\\83b\83h
-procedure TNGWordEditForm.AddWord(word: TNGWord);
-var
- litem: TListItem;
-begin
- litem := GikoListView2.Items.Add;
- litem.ImageIndex := -1;
- litem.SubItems.Clear;
- litem.Data := word;
- if (word = nil) then begin
- litem.Caption := '<\96¢\93ü\97Í>'
- end else begin
- case Integer(word.NGType) of
- Integer(gntAll): litem.Caption := '\91S\95\94';
- Integer(gntName): litem.Caption := '\96¼\91O\97\93';
- Integer(gntMail): litem.Caption := '\83\81\81[\83\8b\97\93';
- Integer(gntDateId):litem.Caption := '\93ú\95tID\97\93';
- Integer(gntBody): litem.Caption := '\96{\95¶';
- end;
- litem.SubItems.Add(word.Word);
- end;
-end;
-//! NG\83\8f\81[\83h\92Ç\89Á\83{\83^\83\93
-procedure TNGWordEditForm.AddNGButtonClick(Sender: TObject);
-var
- litem: TListItem;
- word: TNGWord;
-begin
- // \8c»\8dÝ\91I\91ð\82³\82ê\82Ä\82¢\82é\8ds\82ð\8eæ\93¾\82·\82é
- litem := GikoListView1.Selected;
- if (litem <> nil) then begin
- if NGWordEdit.Text <> '' then begin
- // <\96¢\93ü\97Í>\82ð\8dí\8f\9c\82·\82é
- if (TNGWords(litem.Data).Count = 0) then begin
- GikoListView2.Items.Delete(0);
- end;
- word := TNGWord.Create;
- word.NGType := TGikoNGType(ComboBox1.ItemIndex);
- word.Word := NGWordEdit.Text;
- TNGWords(litem.Data).Add(word);
- AddWord(word);
- litem.SubItems.Clear;
- litem.SubItems.Add(TNGWords(litem.Data).ToString);
- end else begin
- ShowMessage('NG\83\8f\81[\83h\82Í\8bó\97\93\82Å\93o\98^\82Å\82«\82Ü\82¹\82ñ');
- end;
- end;
-end;
-//! NG\83\8f\81[\83h\8dí\8f\9c\83{\83^\83\93
-procedure TNGWordEditForm.DeleteNGButtonClick(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
- TNGWords(litem.Data).Delete(TNGWord(litem2.Data));
- litem.Caption := TNGWords(litem.Data).ToString;
- end;
- GikoListView2.DeleteSelected;
- end;
-end;
-//!
-procedure TNGWordEditForm.AddButtonClick(Sender: TObject);
-var
- ngWords: TNGWords;
-begin
- if (NGWordList <> nil) then begin
- ngWords := TNGWords.Create;
- NGWordList.Add(ngWords);
- GikoListView1.Selected := AddNGWord(ngWords);
- GikoListView1.SetFocus;
- end;
-end;
-//!
-procedure TNGWordEditForm.DeleteButtonClick(Sender: TObject);
-var
- litem: TListItem;
-begin
- // \8c»\8dÝ\91I\91ð\82³\82ê\82Ä\82¢\82é\8ds\82ð\8eæ\93¾\82·\82é
- litem := GikoListView1.Selected;
- if (litem <> nil) and (NGWordList <> nil) then begin
- NGWordList.Delte( TNGWords(litem.Data));
- GikoListView1.DeleteSelected;
- end;
-end;
-
-//! \93K\89\9e\83{\83^\83\93 \93§\96¾\83`\83F\83b\83N\82ð\90Ý\92è\82µ\82È\82¨\82·
-procedure TNGWordEditForm.ApplyButtonClick(Sender: TObject);
-var
- i: Integer;
-begin
- for i := 0 to GikoListView1.Items.Count - 1 do begin
- TNGWords(GikoListView1.Items[i].Data).Invisible :=
- GikoListView1.Items[i].Checked;
- 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.
+++ /dev/null
-unit NGWordUnit;
-
-interface
-uses
- Windows,Messages, ShellAPI, SysUtils, Classes,StdCtrls,StrUtils,
- GikoXMLDoc, GikoSystem, bmRegExp;
-
-type
- //\83\8a\83X\83g\82Ì\95\\8e¦\83A\83C\83e\83\80\91I\91ð
- TGikoNGType = (gntAll, gntName, gntMail, gntDateId, gntBody);
-
- {\
- NG\83\8f\81[\83h\83N\83\89\83X
- }
- TNGWord = class( TObject )
- private
- FRank : Integer;
- FNGType : TGikoNGType;
- FWord : String;
- public
- procedure ReadXMLElement(element :IXMLNode);
- function ToXMLString(): String;
- property Rank : Integer read FRank write FRank;
- property NGType : TGikoNGType read FNGType write FNGType;
- property Word : String read FWord write FWord;
- end;
-
- {\
- NG\83\8f\81[\83h\8fW\8d\87\83N\83\89\83X
- }
- TNGWords = class( TList )
- private
- FRank : Integer;
- FInvisible: Boolean;
- FAWKStr: TAWKStr;
- public
- constructor Create;
- procedure Free;
- property Rank : Integer read FRank write FRank;
- property Invisible : Boolean read FInvisible write FInvisible;
- function ReadXMLElement(element :IXMLNode): Boolean;
- function ToXMLString(): String;
- function ToString(): String;
- procedure Delete(word: TNGWord); overload;
- function IsNG(PRes : PResRec): Boolean;
- end;
-
- {\
- NG\83\8f\81[\83h\8aÇ\97\9d\83N\83\89\83X
- }
- TNGWordList = class( TList )
- private
- public
- procedure Free;
- procedure LoadFromFile(fileName: String);
- procedure SaveToFrile(fileName: String);
- procedure Delte(NGWords: TNGWords); overload;
- function IsNG(PRes : PResRec): Integer;
- end;
-
- function CompareRank(Item1, Item2: Pointer): Integer;
-var
- NGWordList: TNGWordList;
-
-implementation
-
-uses
- MojuUtils, Sort;
-
-function CompareRank(Item1, Item2: Pointer): Integer;
-begin
- if TObject(item1) is TNGWords then begin
- Result := CompareInt(
- TNGWords(Item1).Rank, TNGWords(Item2).Rank);
- end else begin
- Result := CompareInt(
- TNGWord(Item1).Rank, TNGWord(Item2).Rank);
- end;
-end;
-constructor TNGWords.Create;
-begin
- FRank := 0;
- FAWKStr := TAWKStr.Create(nil);
-end;
-procedure TNGWords.Free;
-var
- i: Integer;
-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;
-var
- i, bound : Integer;
- NGWordNode: IXMLNode;
- NG: TNGWord;
-begin
- Result := False;
- if element.NodeName = 'NGWords' then begin
- Rank := StrToIntDef(element.Attributes['rank'],
- MaxInt);
- Invisible := StrToBoolDef(element.Attributes['invisible'],
- False);
- bound := element.ChildNodes.Count - 1;
- for i := 0 to bound do begin
- NGWordNode := element.ChildNodes[i];
- if NGWordNode.NodeName = 'NGWord' then begin
- NG := TNGWord.Create;
- NG.ReadXMLElement( NGWordNode );
- Add(NG);
- end;
- end;
- Sort(@CompareRank);
- Result := True;
- end;
-end;
-function TNGWords.ToXMLString(): String;
-var
- i: Integer;
-begin
- Result := '<NGWords ' +
- 'rank="' + IntToStr(FRank) + '" ' +
- 'invisible="' + BoolToStr(Invisible) + '" >'#13#10;
- for i := 0 to Count - 1 do begin
- Result := Result + TNGWord(Items[i]).ToXMLString + #13#10;
- end;
- Result := Result + '</NGWords>';
-end;
-function TNGWords.ToString(): String;
-var
- i: Integer;
-begin
- Result := '';
- for i := 0 to Count - 1 do begin
- Result := Result + TNGWord(Items[i]).Word + ' , ';
- end;
-end;
-procedure TNGWords.Delete(word: TNGWord);
-var
- i: Integer;
-begin
- for i := Count - 1 downto 0 do begin
- if ( Items[i] = word ) then begin
- TNGWord(Items[i]).Free;
- Self.Delete(i);
- break;
- 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)));
-
- FWord := Trim(element.Attributes['word']);
- if FWord <> '' then begin
- FWord := MojuUtils.UnSanitize( FWord );
- end;
-end;
-
-function TNGWord.ToXMLString(): String;
-begin
- Result := '<NGWord ' +
- 'rank="' + IntToStr(FRank) + '" ' +
- 'ngtype="' + IntToStr(Integer(FNGType)) + '" ' +
- 'word="' + MojuUtils.Sanitize(FWord) + '" />';
-end;
-
-procedure TNGWordList.Free;
-var
- i: Integer;
-begin
- for i := Self.Count - 1 downto 0 do begin
- TNGWords(Self.Items[i]).Free;
- end;
- inherited Free;
-end;
-
-procedure TNGWordList.SaveToFrile(fileName: String);
-var
- xmlStrings: TStringList;
- i: Integer;
-begin
- xmlStrings := TStringList.Create;
- try
- xmlStrings.Add('<?xml version="1.0" encoding="Shift_JIS" standalone="yes"?>');
- xmlStrings.Add('<root>');
- for i := 0 to Self.Count - 1 do begin
- xmlStrings.Add(
- TNGWords(Self.Items[i]).ToXMLString);
-
- end;
- xmlStrings.Add('</root>');
- xmlStrings.SaveToFile(fileName);
- finally
- xmlStrings.Free;
- end;
-end;
-
-procedure TNGWordList.LoadFromFile(fileName: String);
-
-var
- i, bound : Integer;
- XMLDoc : IXMLDocument;
- XMLNode: IXMLNode;
- NG : TNGWords;
-{$IFDEF DEBUG}
- st, rt : Cardinal;
-{$ENDIF}
-begin
-{$IFDEF DEBUG}
- st := GetTickCount;
-{$ENDIF}
- if FileExists( FileName ) then begin
- if (Self.Count > 0) then begin
- Self.Free;
- Self.Capacity := 0;
- end;
- try
- XMLDoc := IXMLDocument.Create;
- //XMLDoc := LoadXMLDocument(FileName);
- LoadXMLDocument(FileName, XMLDoc);
- try
- XMLNode := XMLDoc.DocumentElement;
-
- if XMLNode.NodeName = 'root' then begin
- bound := XMLNode.ChildNodes.Count - 1;
- for i := 0 to bound do begin
- NG := TNGWords.Create;
- if (NG.ReadXMLElement(XMLNode.ChildNodes[i])) then
- Self.Add(NG);
- end;
- end;
- Sort(@CompareRank);
- finally
- XMLDoc.Free;
- end;
- except
- end;
- end;
-{$IFDEF DEBUG}
- rt := GetTickCount - st;
- Writeln('Runtime(Load NGWords) : ' + IntToStr(rt) + ' ms');
-{$ENDIF}
-end;
-procedure TNGWordList.Delte(NGWords: TNGWords);
-var
- i: Integer;
-begin
- for i := Count - 1 downto 0 do begin
- if ( Items[i] = NGWords ) then begin
- TNGWords(Items[i]).Free;
- Self.Delete(i);
- break;
- end;
- end;
-end;
-//! NG\94»\92è
-function TNGWordList.IsNG(PRes : PResRec): Integer;
-var
- i: Integer;
- tRes : TResRec;
-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.