Avatar billede mr.meincke Nybegynder
30. september 2003 - 15:50 Der er 23 kommentarer og
1 løsning

Convert Tag Case

Hej,
Jeg ved ikke helt hvordan jeg skal lave det så jeg spørger jer :)

Jeg skal ha gjort sådan så alle HTML tags bliver til UpperCase. Men der skal også tages højde for at der kan være PHP og ASP "tags" i dokumentet - Altså <% og <?.

// Mr.Meincke
Avatar billede stoney Nybegynder
30. september 2003 - 16:16 #1
Prøv lige at uddybe dit spørgsmål !!

Stoney
Avatar billede mr.meincke Nybegynder
30. september 2003 - 16:26 #2
altså i min SynEdit skal jeg ha lavet en funktion som coverterer alle HTML tags til Lower alle Uppercase ... Kommer an på hvad brugere vælger...
Avatar billede athlon-pascal Juniormester
30. september 2003 - 16:26 #3
Går ud fra du mener det her:
<tag href="www.exp.dk">Rigtig meget tekst og evt. flere tags</tag>
--->
<TAG href="www.exp.dk">Rigtig meget tekst og evt. flere tags</TAG>
Avatar billede mr.meincke Nybegynder
30. september 2003 - 16:28 #4
ja... HREF skal også helst (ikke nødvedigt) i uppercase... Men ellers ja :o) Nå, skal lige købe nogle sko... Er back om 30 min or so
Avatar billede mr.meincke Nybegynder
30. september 2003 - 17:06 #5
Back :)
Avatar billede Slettet bruger
30. september 2003 - 17:16 #6
Prøv det her:

function TagsToUpperCase(Text: String): String;
var
I,L:Integer;
S:String;
begin
  Result := Text;
  I := 0;
  while True do
  begin
    if (Text[I] = '<') and (Text[I+1] <> '%') and (Text[I+1] <> '?') then
    begin
      L := Length(Text);
      if Pos(' ', Copy(Result,I,Length(Result)-I)) <> 0 then
        L := Pos(' ', Copy(Result,I,Length(Result)-I));
      if (Pos('>',Copy(Result,I,Length(Text)-I)) <= L) and (Pos('>', Copy(Result,I,Length(Text)-I)) <> 0) then L := Pos('>', Copy(Result,I,Length(Result)-I));
      S := Copy(Result, I, L);
      L := Length(S);
      Delete(Result, I, L);
      Insert(UpperCase(S),Result,I);
    end;
    Inc(I);
    if I = Length(Text) then Break;
  end;
end;
Avatar billede Slettet bruger
30. september 2003 - 17:33 #7
Det her laver også href til uppercase:

function TagsToUpperCase1(Text: String): String;
var
I:Integer;
IsInTag: Boolean;
begin
  Result := Text;
  IsInTag := False;
  I := 0;
  while True do
  begin
    if (Text[I] = '<') and (Text[I+1] <> '%') and (Text[I+1] <> '?') then IsInTag := True
    else if (Text[I] = '>') and (Text[I-1] <> '%') and (Text[I-1] <> '?') then IsInTag := False;

    if IsInTag = True then
    begin
      if LastDelimiter(' ', Copy(Text, 0, I)) < LastDelimiter('<', Copy(Text, 0, I)) then
      begin
        Delete(Result, I, 1);
        Insert(UpperCase(Text[I]),Result,I);
      end;
      if LastDelimiter('=', Copy(Text, 0, I)) < LastDelimiter(' ', Copy(Text, 0, I)) then
      begin
        Delete(Result, I, 1);
        Insert(UpperCase(Text[I]),Result,I);
      end;
    end;
    Inc(I);
    if I >= Length(Text) then Break;
  end;
end;
Avatar billede mr.meincke Nybegynder
30. september 2003 - 18:20 #8
Tester dem lige...
Avatar billede mr.meincke Nybegynder
30. september 2003 - 18:23 #9
Virker... Takker! :)
Avatar billede Slettet bruger
30. september 2003 - 18:29 #10
Den kan vist godt blive lidt kortere :-) :

function TagsToUpperCase(Text: String): String;
var
I:Integer;
IsInTag: Boolean;
begin
  Result := Text;
  for I := 0 to Length(Text) do
  begin
    if (Text[I] = '<') and (Text[I+1] <> '%') and (Text[I+1] <> '?') then IsInTag := True;
    if (Text[I] = '>') and (Text[I-1] <> '%') and (Text[I-1] <> '?') then IsInTag := False;
    if IsInTag then
    begin
      if (LastDelimiter('=', Copy(Text, 0, I)) < LastDelimiter(' ', Copy(Text, 0, I))) or
        (LastDelimiter(' ', Copy(Text, 0, I)) < LastDelimiter('<', Copy(Text, 0, I))) then
      begin
        Delete(Result, I, 1);
        Insert(UpperCase(Text[I]),Result,I);
      end;
    end;
  end;
end;
Avatar billede mr.meincke Nybegynder
30. september 2003 - 18:30 #11
Hehe... Takker du ;)
Hejhej *Vinker* ... Lol... Ej vil du lige tjene 60 point xTra? :)
Alle HTML tags skal slettes... Samme regler som før :P
Avatar billede Slettet bruger
30. september 2003 - 18:52 #12
Prøv det her:

function DeleteTags(Text: String): String;
var
StartPos,EndPos:Integer;
begin
  Result := Text;
  StartPos := Pos('<',Result);
  EndPos := Pos('>', Result);
  while StartPos > 0 do
  begin
    Delete(Result, StartPos, EndPos - StartPos + 1);
    StartPos := Pos('<',Result);
    EndPos := Pos('>', Result);
  end;
end;
Avatar billede mr.meincke Nybegynder
30. september 2003 - 19:14 #13
Virker fint... Opretter lige et spm.. Har en sidste opg til 150 points igen hvis du er med på den? Den går ud på udvidet søg og udvidet erstart. Du ved søg i mappe, åbne filer osv :)
Avatar billede mr.meincke Nybegynder
30. september 2003 - 19:15 #14
Avatar billede Slettet bruger
30. september 2003 - 19:19 #15
Hvad mener du med udvidet??
Avatar billede mr.meincke Nybegynder
30. september 2003 - 19:25 #16
Altså ligsom i HomeSite... Du kan vælge at søge i de filer som er åbne, en mappe eller bare i den aktive fil...
Avatar billede athlon-pascal Juniormester
30. september 2003 - 19:39 #17
hejhej -> Din TagsToUpperCase-funktion er lidt langsom (det kan mærkes)... Den her er noget hurtigere, og i mine test lige så effektiv:

function TagCase(S: String; UpCase: Boolean = true): String;

  function CaseIt(S: String; UpCase: Boolean): String;
  begin
    if UpCase then
      Result := AnsiUpperCase(S)
    else
      Result := AnsiLowerCase(S);
  end;

var
  J, K, L: Integer;
  S1: String;
  TextStyle: (tsText, tsTag, tsTagProp, tsTagPropText);
begin
  Result := '';
  TextStyle := tsText;
  while Length(S) > 0 do
  begin
    case TextStyle of
      tsText:
        begin
          J := Pos('<', S);

          if J = 0 then
            J := Length(S)
          else
          begin
            TextStyle := tsTag;

            if J < Length(S) then
              if (Copy(S, J, 2)[2] in ['!', '?', '%']) then
                TextStyle := tsText;
          end;

          Result := Result + Copy(S, 1, J);
          Delete(S, 1, J);
        end;
      tsTag, tsTagProp:
        begin
          J := Pos(' ', S);
          K := Pos('>', S);
          if TextStyle = tsTagProp then
            L := Pos('"', S)
          else
            L := -1;

          if J = 0 then
            J := Length(S);

          if K < J then
          begin
            J := K;
            TextStyle := tsText;
          end
          else
            TextStyle := tsTagProp;

            if (L < J) and (L > 0) then
            begin
              J := L;
              TextStyle := tsTagPropText;
            end;

          Result := Result + CaseIt(Copy(S, 1, J), UpCase);
          Delete(S, 1, J);
        end;
      tsTagPropText:
        begin
          J := Pos('"', S);
          if J = 0 then
            J := Length(S)
          else
            TextStyle := tsTagProp;

          Result := Result + Copy(S, 1, J);
          Delete(S, 1, J);
        end;
    end;
  end;
end;
Avatar billede athlon-pascal Juniormester
30. september 2003 - 19:40 #18
Selvfølgelig er det godt, hvis man kan lave det uden så meget kode, men jeg vil dog prioritere hastighed ret højt, hvad det angår :-)
Avatar billede athlon-pascal Juniormester
30. september 2003 - 20:09 #19
Hvis i ikke tror på mig, så prøv selv i Delphi... Min er mere end dobbelt så hurtig!
Avatar billede Slettet bruger
30. september 2003 - 20:55 #20
Er ikke itvivl om det du siger er rigtigt :-).. Din metode er ca. 6 gange hurtiger end min.

Bare sig hvis du vil have point så opretter jeg et spm til dig ;)
Avatar billede athlon-pascal Juniormester
30. september 2003 - 21:01 #21
Hejhej -> Jeg behøver ikke points, jeg er faktisk rimelig tilfreds med at ligge nummer 1 på test.exp.dk (Eksperten v. 4 alpha) ;-)

http://sstuhr.frac.dk/Exp/TagCase.zip - hvis andre skulle få lyst til at sammenligne (der bruges SynEdit, men færdig exe-fil medfølger) :-)
Avatar billede Slettet bruger
30. september 2003 - 21:26 #22
Ved du hvornår det nye eksperten er færdig så alle kan få adgang?? :-)... Synes Delphi katagorien er lidt kedelig.
Avatar billede athlon-pascal Juniormester
30. september 2003 - 21:28 #23
hejhej -> Jeg tror du skal regne med at der går et stykke tid, jeg ville ikke turde udskifte Eksperten med den nye version nu hvis jeg var admin...
Avatar billede athlon-pascal Juniormester
30. september 2003 - 21:55 #24
Brug den her, den er bedre gearet til <!-- kommentarter -->:

function TagCase(S: String; UpCase: Boolean = true): String;

  function CaseIt(S: String; UpCase: Boolean): String;
  begin
    if UpCase then
      Result := AnsiUpperCase(S)
    else
      Result := AnsiLowerCase(S);
  end;

var
  J, K, L: Integer;
  TextStyle: (tsText, tsTag, tsTagProp, tsTagPropText, tsComment);
begin
  Result := '';
  TextStyle := tsText;
  while Length(S) > 0 do
  begin
    case TextStyle of
      tsText:
        begin
          J := Pos('<', S);

          if J = 0 then
            J := Length(S)
          else
          begin
            TextStyle := tsTag;

            if J < Length(S) then
              if (Copy(S, J, 2)[2] in ['?', '%']) then
                TextStyle := tsText
              else if Copy(S, J, 4) = '<!--' then
                TextStyle := tsComment;
          end;

          Result := Result + Copy(S, 1, J);
          Delete(S, 1, J);
        end;
      tsComment:
        begin
          J := Pos('-->', S);

          if J = 0 then
            J := Length(S);

          TextStyle := tsText;

          Result := Result + Copy(S, 1, J);
          Delete(S, 1, J);
        end;
      tsTag, tsTagProp:
        begin
          J := Pos(' ', S);
          K := Pos('>', S);
          if TextStyle = tsTagProp then
            L := Pos('"', S)
          else
            L := -1;

          if J = 0 then
            J := Length(S);

          if K < J then
          begin
            J := K;
            TextStyle := tsText;
          end
          else
            TextStyle := tsTagProp;

            if (L < J) and (L > 0) then
            begin
              J := L;
              TextStyle := tsTagPropText;
            end;

          Result := Result + CaseIt(Copy(S, 1, J), UpCase);
          Delete(S, 1, J);
        end;
      tsTagPropText:
        begin
          J := Pos('"', S);
          if J = 0 then
            J := Length(S)
          else
            TextStyle := tsTagProp;

          Result := Result + Copy(S, 1, J);
          Delete(S, 1, J);
        end;
    end;
  end;
end;
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester