Subject: [Runeberg]SV: [Runeberg] Vill du hjälpa Projekt Runeberg programmera?
From: "Tommy Riboe" <[email-masked]>
To: <[email-masked]>
Date: Wed, 28 Jan 2004 00:37:13 +0100
List-Id: Projekt Runeberg <runeberg.lists.lysator.liu.se>

Jag byggde vidare på regexp-exemplet från Bengt och kan nu erbjuda
nedanstående förslag. Eftersom jag är så gott som nybörjare på Perl så
skall mitt exempel tas som ett algoritmförslag och kompletteras med
felhantering och liknande. Dessutom har jag säkert missat något
undantagsfall. Det verkar i alla fall fungera med den medföljande
texten utökad med enstaka instanser av mina undantag.

mvh
Tommy Riboe

#============================================
#!/bin/perl
#
# huvudregel:
# a) rader vars sista ord slutar med '-' bryts före avstavat ord
# b) avstavat ord sammanfogas på nästa rad
# c) indrag bibehålles
#
# undantag:
# a) rad som slutar med tankstreck (ensamt '-')
# b) rad som slutar med förled i upprepade sammansatta ord
# c) avstavning i sidans sista rad
#
# vid undantag b) flyttas förledet till följande rad

seek(STDIN, 0, SEEK_SET);
$line= "";
$nextline= "";
$spill = "";

#if (<STDIN>) {
  # läs in första raden
  $line = <STDIN>;
  {
    # avlägsna ord som slutar med bindestreck från
    # slutet av raden, med undantag för ensamma
    # bindestreck, placera avlägsnad text i $spill
    $line =~ s/(\s*)(.*)( +?)(\S+?)-$/\1\2/;
    $spill = $4;
  }
  print $line;

  while (<STDIN>) {

    # testa om nästa rad börjar med "och", "eller"
    # (bör mer naturligt placeras efter nästa sats
    # och använda sig av $nextline)
    if (/^\s*(och|eller).*$/) {
      $spill = $spill . "- ";
    }

    # förbered nästa rad
    $nextline = $_;

    # sätt ihop marginal + spill + nästa_rad
    $nextline =~ s/(\s*)(.+?)$/$1$spill$2/;

    # gör nästa rad till aktuell rad
    $line = $nextline;

    # avlägsna ord som slutar med bindestreck från
    # slutet av raden, med undantag för ensamma
    # bindestreck, placera avlägsnad text i $spill
    $line =~ s/(\s*)(.*)( +?)(\S+?)-$/\1\2/;
    $spill = $4;
    print $line;
  }
#}
print "\n(till nästa sida: " . $spill . ")\n";
#============================================

> -----Ursprungligt meddelande-----
> Från: [email-masked]
> [mailto:[email-masked]]För Bengt J. Olsson
> Skickat: den 27 januari 2004 00:00
> Till: [email-masked]; Hans Persson
> Ämne: [Runeberg] Re: [Runeberg] Vill du hjälpa Projekt Runeberg
> programmera?
>
>
> Har inte något färdigt program men har följande brott-stycke
> av ett sånt program;
>
> <för varje rad>
>
> $line =~ s/(.*) (.+?)-$/$1/;
>
> <matchar om sista tecknet på raden är "-";
>  allt utom det avstavade ordet finns kvar i $1;
>  första delen av det avstavade ordet finns i $2>
>
> <nästa rad om matchningen lyckades>
>
> $line = $2 . $line;
>
> <konkatenerar början av det avstavade ordet med nästa rad>
>
> M v h Bengt
>
> ---
> Bengt J. Olsson
> [email-masked]
> http://blafs.com
>
>

_______________________________________________
Runeberg mailing list
[email-masked]
http://lists.lysator.liu.se/mailman/listinfo/runeberg