-----Ursprungligt meddelande----- Från: runeberg-admin@lists.lysator.liu.se [mailto:runeberg-admin@lists.lysator.liu.se]För Bernhard Johanson Skickat: den 28 januari 2004 14:14 Till: runeberg@lists.lysator.liu.se Ämne: [Runeberg] Re: Runeberg digest, Vol 1 #49 - 5 msgs
Till Tommy Riboe m. fl.
Det finnas faktiskt ett undantag till, nämligen om nästa rad börjar med en versal, typ Schleswig-Holstein Sedan är väl frågan om indrag av rad ska avlägsnas, vilket jag
tycker.
I gamla OCR, åtminstone, återfinns tabbar och mångdubbla spaces. Kanske även de bör sållas bort, allt för att underlätta korrekturläsningen.
Vänl. Bernhard Johanson
Här kommer en uppdatering av gårdagens Perlskript.
Bernhard, nedanstående kod klarar att hålla ihop sammansatta ord med inledande versal i båda leden. Jag har även lagt till ett filter för eliminering av upprepade blanksteg.
Roger, de exempel du tar upp, t ex sammansättningar av spärrad text kräver nog fortsatt diskussion om vad som skall omfattas av skriptet. Själv kan jag inte överblicka vilka fördelar resp nackdelar som kan uppstå sett över hela processen (inscanning, korrekturläsning, html-konvertering). Vissa moment behöver nog även i fortsättningen göras manuellt.
Kanske skall flera filter utvecklas för de olika ändamålen: * sammanslagning av avstavade ord * kompaktering av blanksteg * behandling av spärrad text, uppmärkning med <i></i> * uppmärkning styckeinledning indrag/fetstil, ersätts av <b></b> * ev. specialmärkning av uppslagsord * korrekturläsning utan marginalindrag (återinsätts vid html-konvertering?)
En annan fråga är hur man skall länka till följande sida, tre olika filer är en möjlighet dvs infil, utfil och "spill till nästa sida". Ett shellskript kan sedan göra resten av jobbet: preparera filnamn, kombinera filer till nästa infil osv.
mvh Tommy Riboe
#!/bin/perl # #================================== # Programmets funktionalitet: # 1) Sammanslagning av avstavade ord # ---------------------------------- # 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 # d) bindestreck mellan ord som inleds med versal # # vid undantag "b" och "d" flyttas förledet till följande rad # # återstående problem: # sammansatta ord med explicit bindestreck behandlas som avstavade # såvida inte båda leden inleds med versal # # 2) Borttagning av dubblerade blanksteg # -------------------------------------- # # Övrigt # ------ # * Subrutinerna använder globala variabler - iakttag varsamhet # * Vid användning under Windows (Cygwin): kom ihåg att spara text i Unixformat #==================================
# use locale # ev. anpassad teckenuppsättn.
# --------------------------------- # tag bort upprepade blanksteg mellan ord
sub remove_multiple_blanks { $line =~ s/(\w+?)( )*/$1$2/g; }
# --------------------------------- # avlägsna ord som slutar med bindestreck från # slutet av raden, med undantag för ensamma # bindestreck, placera avlägsnad text i $spill
sub split_line_and_print { $line =~ s/^(\s*)(.*)( +?)(\S+?)-$/\1\2/; $spill = $4; remove_multiple_blanks; print $line; }
# --------------------------------- # undantag b), testa om nästa rad börjar med "och", "eller" # om så, behåll bindestreck (men ordet flyttas ned)
sub exception_b { if ($nextline =~ /^\s*(och|eller).*$/) { $spill = $spill . "- "; } }
# --------------------------------- # undantag d), testa om både $spill och nästa ord börjar med versal # om så, behåll bindestreck (men ordet flyttas ned) # (versaltestet behöver göras mer generellt)
sub exception_d { if ($nextline =~ /^\s*[A-ZÅÄÖÜÉ].*$/ && $spill =~ /^[A-ZÅÄÖÜÉ].*$/) { $spill = $spill . "-"; } }
# --------------------------------- # sätt ihop marginal + spill + nästa_rad
sub combine_with_next_line { $nextline =~ s/(\s*)(.+?)$/$1$spill$2/; }
# --------------------------------- # M A I N loop #
$line= ""; $nextline= ""; $spill = "";
#if (<STDIN>) { $line = <STDIN>; # läs in första raden split_line_and_print; # ord med bindestreck vid radslut
while (<STDIN>) { $nextline = $_; # förbered nästa rad exception_b; # undantag b), behåll bindestreck + ' ' exception_d; # undantag d), behåll bindestreck combine_with_next_line; # sätt ihop marginal + spill + nästa_rad $line = $nextline; # gör nästa rad till aktuell rad split_line_and_print; # ord med bindestreck vid radslut } #}
# ev. innehåll i $spill skall flyttas till nästa sida print "\n(till nästa sida: " . $spill . ")\n";
# # E N D of program # ---------------------------------