OSDN Git Service

・スレタイの特定ワードを非表示にする機能に「©bbspink.com」も追加
[gikonavigoeson/gikonavi.git] / MojuUtils.pas
index 98fcc97..4c87fb0 100644 (file)
 unit MojuUtils;
-//**************************
-//     \8d¡\82Ì\8f\8a\81A\95\8e\9a\97ñ\92u\8a·\8aÖ\90\94 CustomStringReplace\81@\82¾\82¯\81B
-//**************************
+//******************************************************************************
+//     \95\8e\9a\97ñ\92u\8a·\8aÖ\90\94 CustomStringReplace
+//  \8eg\82¢\95û\82Í\81A
+//\81@CustomStringReplace(
+//\81@   \8c³\82Ì\95\8e\9a\97ñ\81iString\82à\82µ\82­\82ÍTStringList),
+//\81@   \8c\9f\8dõ\95\8e\9a\97ñ\81iString),
+//             \92u\8a·\95\8e\9a\97ñ\81iString),
+//      \91å\95\8e\9a\8f¬\95\8e\9a\81iBoolean)True:\8bæ\95Ê\82µ\82È\82¢\81@false or \8fÈ\97ª:\8bæ\95Ê\82·\82é
+//
+// Delphi-ML\82Ì\8bL\8e\9669334\82É\8dÚ\82Á\82Ä\82¢\82½\83R\81[\83h\82ð\8aÛ\83p\83N\83\8a\82µ\82Ü\82µ\82½\81B
+//******************************************************************************
 
 interface
 
 uses
        Windows, Classes, SysUtils;
 
-    function StrPosEx(StrStart, StrEnd, SubstrStart, SubstrEnd: PChar): PChar;
-    function AnsiStrPosEx(StrStart, StrEnd, SubstrStart, SubstrEnd: PChar): PChar;
-    function ReplaceString(const S, OldPattern, NewPattern: string): string;
+       function StrPosEx(StrStart, StrEnd, SubstrStart, SubstrEnd: PChar): PChar;
+       function AnsiStrPosEx(StrStart, StrEnd, SubstrStart, SubstrEnd: PChar): PChar;
+       function ReplaceString(const S: String; const OldPattern: String; const NewPattern: string): String;
+       function IgnoCaseReplaceString(const S: String; const OldPattern:String; const NewPattern: string): String;
 
-    function CustomStringReplace(S , OldPattern: String;const  NewPattern: string): String; overload;
-    function CustomStringReplace(S , OldPattern: String;const  NewPattern: string; IgnoreCase : Boolean): String; overload;
-    procedure CustomStringReplace(var S : TStringList; OldPattern: String;const  NewPattern: string);overload;
-    procedure CustomStringReplace(var S : TStringList; OldPattern: String;const  NewPattern: string; IgnoreCase : Boolean);overload;
+       function CustomStringReplace(const S: String; const OldPattern: String; const  NewPattern: string; IgnoreCase : Boolean = False): String; overload;
+       procedure CustomStringReplace(var S : TStringList;const OldPattern: String;const  NewPattern: string; IgnoreCase : Boolean = False); overload;
 
+       function ZenToHan(const s: string): string;
+       function VaguePos(const Substr: String; const S: string): Integer;
 
-implementation
-
-function CustomStringReplace(
-       S ,OldPattern: String;
-    const NewPattern: string
-): String;
-{
-var
-       position : Integer;
-    lenOld : Integer;//OldPattern\82Ì\92·\82³
-}
-begin
-    Result := ReplaceString(S,OldPattern,NewPattern);
-{
-    position := 0;
-    lenOld := Length(OldPattern);
-    Result := '';
-    position := AnsiPos( OldPattern, S);
-    while  position  <> 0  do begin
-        Result := Result + Copy(S,1,position -1 ) + NewPattern;
-        Delete(S,1, position + lenOld - 1);
-        position := AnsiPos( OldPattern, S);
-    end;
-    if Length( S ) > 0 then begin
-        Result := Result + S;
-    end;
-}
-
-end;
-function CustomStringReplace(
-       S , OldPattern: String;
-    const  NewPattern: string;
-    IgnoreCase : Boolean
-): String;
-var
-       position : Integer;
-    lenOld : Integer;//OldPattern\82Ì\92·\82³
-    buffer : String;
-begin
-    position := 0;
-    lenOld := Length(OldPattern);
-    Result := '';
-    if not IgnoreCase then begin
-        Result := ReplaceString(S,OldPattern,NewPattern);
-    end else begin
-        buffer := AnsiLowerCase(S);
-        OldPattern := AnsiLowerCase(OldPattern);
-        position := AnsiPos( OldPattern, buffer);
-        while  position  <> 0  do begin
-            Result := Result + Copy(S,1,position -1 ) + NewPattern;
-            Delete(S,1, position + lenOld - 1);
-            Delete(buffer,1, position + lenOld - 1);
-            position := AnsiPos( OldPattern, buffer);
-        end;
-        if Length( S ) > 0 then begin
-            Result := Result + S;
-        end;
-    end;
-end;
-procedure CustomStringReplace(
-       var S : TStringList;
-    OldPattern: String;
-    const  NewPattern: string;
-    IgnoreCase : Boolean
-);
-var
-    i : Integer;
-begin
-    if not IgnoreCase then begin
-        for i := 0 to S.Count - 1 do begin
-               S.Strings[i] := ReplaceString(S.Strings[i],OldPattern,NewPattern);
-        end;
-    end else begin
-        for i := 0 to S.Count - 1 do begin
-               S.Strings[i] := CustomStringReplace( S.Strings[i], OldPattern, NewPattern,IgnoreCase );
-        end;
-    end;
-end;
-procedure CustomStringReplace(
-       var S : TStringList;
-    OldPattern: String;
-    const  NewPattern: string
-);
-var
-    i : Integer;
-begin
-       for i := 0 to S.Count - 1 do begin
-       S.Strings[i] := ReplaceString(S.Strings[i],OldPattern,NewPattern);
-    end;
-end;
+       function ReplaseNoValidateChar( inVal : String): String;
+       function IsNoValidID( inID :String): Boolean;
+       //<font>\83^\83O\82ð\91S\82Ä\8dí\8f\9c\82·\82é
+       function DeleteFontTag( inSource : string) : string;
+       function RemoveToken(var s: string;const delimiter: string): string;
+       // \96³\8aQ\89»(& -> &amp; " -> &auot; \82É\95Ï\8a·\82·\82é)
+       function Sanitize(const s: String): String;
+       // \96³\8aQ\89»\89ð\8f\9c(&amp; -> & &auot; -> " \82É\95Ï\8a·\82·\82é)
+       function UnSanitize(const s: String): String;
 
+implementation
+// \83|\83C\83\93\83^\81[\81\95\83A\83Z\83\93\83u\83\89\82É\82æ\82é\8d\82\91¬\83|\83X
 function StrPosEx(StrStart, StrEnd, SubstrStart, SubstrEnd: PChar): PChar;
 asm
-        PUSH    EBX
-        PUSH    ESI
-        PUSH    EDI
+               PUSH    EBX
+               PUSH    ESI
+               PUSH    EDI
 
-        MOV    ESI,ECX        { Point ESI to substr                  }
-        MOV    EDI,EAX        { Point EDI to s                        }
+               MOV    ESI,ECX        { Point ESI to substr                  }
+               MOV    EDI,EAX        { Point EDI to s                        }
 
-        MOV    ECX,EDX        { ECX = search length                  }
+               MOV    ECX,EDX        { ECX = search length                  }
         SUB    ECX,EAX
 
         MOV    EDX,SubstrEnd
@@ -159,65 +89,307 @@ asm
         POP    ESI
         POP    EBX
 end;
-
+//\81@AnsiPos\82Ì\8d\82\91¬\94Å
 function AnsiStrPosEx(StrStart, StrEnd, SubstrStart, SubstrEnd: PChar): PChar;
 var
-  L2: Cardinal;
-  ByteType : TMbcsByteType;
+    L2: Cardinal;
+    ByteType : TMbcsByteType;
 begin
-  Result := nil;
-  if (StrStart = nil) or (StrStart^ = #0) or
-    (SubstrStart = nil) or (SubstrStart^ = #0) then Exit;
-  L2 := SubstrEnd - SubstrStart;
-  Result := StrPosEx(StrStart, StrEnd, SubstrStart, SubstrEnd);
-  while (Result <> nil) and (StrEnd - Result >= L2) do begin
-    ByteType := StrByteType(StrStart, Integer(Result-StrStart));
-    if (ByteType <> mbTrailByte) and
-      (CompareString(LOCALE_USER_DEFAULT, SORT_STRINGSORT, Result, L2, SubstrStart, L2) = 2)
-then Exit;
-    if (ByteType = mbLeadByte) then Inc(Result);
-    Inc(Result);
-    Result := StrPosEx(Result, StrEnd, SubStrStart, SubStrEnd);
-  end;
-  Result := nil;
+    Result := nil;
+    if (StrStart = nil) or (StrStart^ = #0) or
+       (SubstrStart = nil) or (SubstrStart^ = #0) then Exit;
+
+    L2 := SubstrEnd - SubstrStart;
+    Result := StrPosEx(StrStart, StrEnd, SubstrStart, SubstrEnd);
+
+    while (Result <> nil) and (StrEnd - Result >= L2) do begin
+               ByteType := StrByteType(StrStart, Integer(Result-StrStart));
+               if (ByteType <> mbTrailByte) and
+                       (CompareString(LOCALE_USER_DEFAULT, SORT_STRINGSORT, Result, L2, SubstrStart, L2) = 2)
+               then Exit;
+       if (ByteType = mbLeadByte) then Inc(Result);
+       Inc(Result);
+       Result := StrPosEx(Result, StrEnd, SubStrStart, SubStrEnd);
+    end;
+    Result := nil;
 end;
 
-function ReplaceString(const S, OldPattern, NewPattern: string): string;
+//\8d\82\91¬\95\8e\9a\97ñ\92u\8a·\8aÖ\90\94\81i\91å\95\8e\9a\8f¬\95\8e\9a\82Ì\88á\82¢\82ð\96³\8e\8b\82µ\82È\82¢\81j
+function ReplaceString(const S: String; const OldPattern: String; const NewPattern: string): String;
 var
-  ReplaceCount: Integer;
-  DestIndex: Integer;
-  i: Integer;
-  p, e, ps, pe: PChar;
-  Count: Integer;
+       ReplaceCount: Integer;
+       DestIndex: Integer;
+       i, l: Integer;
+       p, e, ps, pe: PChar;
+       Count: Integer;
+       olen: Integer;
 begin
-  Result := S;
-  if OldPattern = '' then Exit;
-    p := PChar(S);
-    e := p + Length(S);
-    ps := PChar(OldPattern);
-    pe := ps + Length(OldPattern);
-    ReplaceCount := 0;
-    while p < e do begin
-      p := AnsiStrPosEx(p, e, ps, pe);
-      if p = nil then Break;
-      Inc(ReplaceCount);
-      Inc(p, Length(OldPattern));
-    end;
-    if ReplaceCount = 0 then Exit;
-    SetString(Result, nil, Length(S) +
-      (Length(NewPattern) - Length(OldPattern)) * ReplaceCount);
-    p := PChar(S);
-    DestIndex := 1;
-    for i := 0 to ReplaceCount - 1 do begin
-      Count := AnsiStrPosEx(p, e, ps, pe) - p;
-      Move(p^, Result[DestIndex], Count);
-      Inc(p, Count);//p := pp;
-      Inc(DestIndex, Count);
-      Move(NewPattern[1], Result[DestIndex], Length(NewPattern));
-      Inc(p, Length(OldPattern));
-      Inc(DestIndex, Length(NewPattern));
-    end;
-    Move(p^, Result[DestIndex], e - p);
+       Result := S;
+       olen := Length(OldPattern);
+       if olen = 0 then Exit;
+       p := PChar(S);
+       e := p + Length(S);
+       ps := PChar(OldPattern);
+       pe := ps + olen;
+       ReplaceCount := 0;
+       while p < e do begin
+               p := AnsiStrPosEx(p, e, ps, pe);
+               if p = nil then Break;
+               Inc(ReplaceCount);
+               Inc(p, olen);
+       end;
+       if ReplaceCount = 0 then Exit;
+       SetString(Result, nil, Length(S) +
+       (Length(NewPattern) - olen) * ReplaceCount);
+       p := PChar(S);
+       DestIndex := 1;
+       l := Length( NewPattern );
+       for i := 0 to ReplaceCount - 1 do begin
+               Count := AnsiStrPosEx(p, e, ps, pe) - p;
+               Move(p^, Result[DestIndex], Count);
+               Inc(p, Count);//p := pp;
+               Inc(DestIndex, Count);
+               Move(NewPattern[1], Result[DestIndex], l);
+               Inc(p, olen);
+               Inc(DestIndex, l);
+       end;
+       Move(p^, Result[DestIndex], e - p);
+end;
+//\8d\82\91¬\95\8e\9a\97ñ\92u\8a·\8aÖ\90\94\81i\91å\95\8e\9a\8f¬\95\8e\9a\82Ì\88á\82¢\82ð\96³\8e\8b\82·\82é\81j
+function IgnoCaseReplaceString(const S: String;const OldPattern:String;const NewPattern: string): String;
+var
+       ReplaceCount: Integer;
+       DestIndex: Integer;
+       i, l: Integer;
+       p, e{, ps, pe}: PChar;
+       p2, e2, ps2, pe2: PChar;
+       Count: Integer;
+       bufferS : String;
+       bufferOldPattern : String;
+begin
+       Result := S;
+       bufferS := AnsiLowerCase(S);
+       bufferOldPattern := AnsiLowerCase(OldPattern);
+
+       if OldPattern = '' then Exit;
+       p       := PChar(S);
+       p2      := PChar(bufferS);
+       e       := p + Length(S);
+       e2      := p2 + Length(bufferS);
+       //ps    := PChar(OldPattern);
+       ps2     := PChar(bufferOldPattern);
+       //pe    := ps + Length(OldPattern);
+       pe2     := ps2 + Length(bufferOldPattern);
+
+       ReplaceCount := 0;
+       while p2 < e2 do begin
+               p2 := AnsiStrPosEx(p2, e2, ps2, pe2);
+               if p2 = nil then Break;
+               Inc(ReplaceCount);
+               Inc(p2, Length(bufferOldPattern));
+       end;
+       if ReplaceCount = 0 then Exit;
+       SetString(Result, nil, Length(bufferS) +
+       (Length(NewPattern) - Length(bufferOldPattern)) * ReplaceCount);
+       p2 := PChar(bufferS);
+       DestIndex := 1;
+       l := Length( NewPattern );
+       for i := 0 to ReplaceCount - 1 do begin
+               Count := AnsiStrPosEx(p2, e2, ps2, pe2) - p2;
+               Move(p^, Result[DestIndex], Count);
+               Inc(p, Count);//p := pp;
+               Inc(p2, Count);//p := pp;
+               Inc(DestIndex, Count);
+               Move(NewPattern[1], Result[DestIndex], l);
+               Inc(p, Length(OldPattern));
+               Inc(p2, Length(OldPattern));
+               Inc(DestIndex, l);
+       end;
+       Move(p^, Result[DestIndex], e - p);
+end;
+//\8d\82\91¬\95\8e\9a\97ñ\92u\8a·\8aÖ\90\94\81i\94Ä\97p\94Å\82P\81j
+function CustomStringReplace(
+       const S :String;
+       const OldPattern: String;
+       const  NewPattern: string;
+       IgnoreCase : Boolean
+): String;
+begin
+       if not IgnoreCase then begin
+               Result := ReplaceString(S,OldPattern,NewPattern);
+       end else begin
+               Result := IgnoCaseReplaceString(S,OldPattern,NewPattern);
+       end;
+end;
+
+//\8d\82\91¬\95\8e\9a\97ñ\92u\8a·\8aÖ\90\94\81i\94Ä\97p\94Å\82Q\81j
+procedure CustomStringReplace(
+       var S : TStringList;
+       const OldPattern: String;
+       const  NewPattern: string;
+       IgnoreCase : Boolean
+);
+var
+       i : Integer;
+begin
+       S.BeginUpdate;
+       if not IgnoreCase then begin
+               for i := 0 to S.Count - 1 do begin
+                       S.Strings[i] := ReplaceString(S.Strings[i], OldPattern,NewPattern);
+               end;
+       end else begin
+               for i := 0 to S.Count - 1 do begin
+                       S.Strings[i] := IgnoCaseReplaceString(S.Strings[i], OldPattern,NewPattern);
+               end;
+       end;
+       S.EndUpdate;
+end;
+
+(*************************************************************************
+ * \91S\8ap\81¨\94¼\8ap
+ * from HotZonu
+ *************************************************************************)
+function ZenToHan(const s: string): string;
+var
+       ChrLen  : Integer;
+begin
+       SetLength(Result, Length(s));
+       ChrLen := Windows.LCMapString(
+                GetUserDefaultLCID(),
+//              LCMAP_HALFWIDTH,
+                LCMAP_HALFWIDTH or LCMAP_KATAKANA or LCMAP_LOWERCASE,
+                PChar(s),
+                Length(s),
+                PChar(Result),
+                Length(Result)
+                );
+       SetLength(Result, ChrLen);
+end;
+
+(*************************************************************************
+ * \91S\8ap\94¼\8ap\82Ð\82ç\82ª\82È\82©\82½\82©\82È\82ð\8bæ\95Ê\82µ\82È\82¢\90¦\82¢Pos
+ *************************************************************************)
+function VaguePos(const Substr:String; const S: string): Integer;
+begin
+       Result := AnsiPos(ZenToHan(Substr), ZenToHan(S));
+end;
+(*************************************************************************
+ * FAT/NTFS\82Ì\83t\83@\83C\83\8b\96¼\82É\8b\96\82³\82ê\82È\82¢\95\8e\9a\81i\,/,:,.,;,*,>,<,|\81j\82ð\91S\8ap\82É\92u\8a·\82·\82é
+ *************************************************************************)
+function ReplaseNoValidateChar( inVal : String): String;
+begin
+       Result := CustomStringReplace(inVal, '\', '\81\8f');
+       Result := CustomStringReplace(Result, '/', '\81^');
+       Result := CustomStringReplace(Result, ':', '\81F');
+       Result := CustomStringReplace(Result, '.', '\81D');
+    Result := CustomStringReplace(Result, ';', '\81G');
+       Result := CustomStringReplace(Result, '*', '\81\96');
+       Result := CustomStringReplace(Result, '>', '\81\84');
+       Result := CustomStringReplace(Result, '<', '\81\83');
+       Result := CustomStringReplace(Result, '|', '\81b');
+end;
+(*************************************************************************
+ * \96³\8cø\82ÈID\82©\82Ì\83`\83F\83b\83N\81i\96³\8cø\97á\81FID:??? , ID:???X)
+ *************************************************************************)
+function IsNoValidID( inID :String): Boolean;
+var
+    bTail : Boolean;
+begin
+    Result := True;
+       inID := Trim(inID);
+       if (Length(inID) > 0) then begin
+               inID := Copy(inID, AnsiPos(':', inID) + 1, Length(inID) );
+        bTail := False;
+        // \96\96\94ö\82ª?\88È\8aO\82©
+        if Length(inID) > 0 then begin
+            bTail := (inID[Length(inID)] <> '?');
+        end;
+               inID := CustomStringReplace(inID, '?', '');
+               if (Length(inID) > 0) and (not
+            ((Length(inID) = 1) and (bTail))) then begin
+                   Result := False;
+        end;
+       end;
+end;
+
+// *************************************************************************
+// HTML\92\86\82Ì<font>\83^\83O\82ð\8dí\8f\9c\82·\82é
+// *************************************************************************
+function       DeleteFontTag(
+        inSource : string    //\83^\83O\82ð\8dí\8f\9c\82·\82é\95\8e\9a\97ñ
+) : string;            //\83^\83O\8dí\8f\9c\8cê\82Ì\95\8e\9a\97ñ
+var
+       pos : Integer;
+begin
+       Result := '';
+
+       //</font>\82ð\8dí\8f\9c
+       inSource := CustomStringReplace( inSource, '</font>', '', True);
+       //<font \82ð\91S\82Ä\8f¬\95\8e\9a\82É\95Ï\8a·\82·\82é
+       inSource := CustomStringReplace( inSource, '<font', '<font', True);
+       //<font \81\82ð\8dí\8f\9c\82·\82é
+       pos := AnsiPos('<font', inSource);
+       while (pos > 0) do begin
+               Result := Result + Copy(inSource, 1, pos - 1);
+               Delete(inSource, 1, pos);
+               //\83^\83O\82ð\95Â\82\82é'>'\82Ü\82Å\82ð\8dí\8f\9c
+        pos := AnsiPos('>', inSource);
+               Delete(inSource, 1, pos);
+               pos := AnsiPos('<font', inSource);
+       end;
+
+       Result := Result + inSource;
+
+
+end;
+// *************************************************************************
+
+
+(*************************************************************************
+ *
+ *\82Ç\82±\82©\82Ì\83T\83C\83g\82©\82ç\82Ì\83p\83N\83\8a
+ *************************************************************************)
+function RemoveToken(var s: string;const delimiter: string): string;
+var
+       p: Integer;
+       pos : PChar;
+       pds, pde : PChar;
+       pss, pse : PChar;
+begin
+       pss := PChar(s);
+       pse := pss + Length(s);
+       pds := PChar(delimiter);
+       pde := pds + Length(delimiter);
+
+       pos := StrPosEx(pss, pse, pds, pde);
+       if pos <> nil then begin
+               p := pos - pss;
+               SetString(Result, pss, p);
+               Delete(s, 1, p + Length(delimiter));
+        if (Length(Result) > 0) then begin
+               if (StrByteType(PChar(Result), Length(Result)-1) = mbLeadByte) then begin
+                       SetLength(Result, Length(Result) - 1);
+                   end;
+        end;
+       end else begin
+               Result := s;
+               s := '';
+       end;
+end;
+
+//! \96³\8aQ\89»(& -> &amp; " -> &quot; \82É\95Ï\8a·\82·\82é)
+function Sanitize(const s: String): String;
+begin
+    // \97]\95ª\82É\83T\83j\83^\83C\83Y\82³\82ê\82È\82¢\82æ\82¤\82É\82¢\82Á\82½\82ñ\8c³\82É\96ß\82·
+    Result := UnSanitize(s);
+       Result := CustomStringReplace(Result, '&', '&amp;');
+       Result := CustomStringReplace(Result, '"', '&quot;');
+end;
+//! \96³\8aQ\89»\89ð\8f\9c(&amp; -> & &quot; -> " \82É\95Ï\8a·\82·\82é)
+function UnSanitize(const s: String): String;
+begin
+       Result := CustomStringReplace(s, '&quot;', '"');
+       Result := CustomStringReplace(Result, '&amp;', '&');
 end;
 
 end.