#!/usr/bin/perl -w use strict; use warnings; use utf8; use open qw(:std :utf8); # Filter_5_02_insert_var.pl # 2010-03-26 # Wolfgang Schmidle # Text einlesen my @text; while(<>) { push @text, $_; } # Textzeilen bearbeiten # Variablen aus dem -Skript übernommen my $klein = "a-zſæèòäöüßãẽĩõũóꝰę"; my $gross = "A-ZÄÖÜ"; my $vorNonword = " (>;:"; my $nachNonword = " )<.,:;!?&\n"; # Vorsicht bei . und : my $wortanfang = "(?:[$gross$klein][$klein])"; my $wortende = "(?:[$gross$klein][$klein])"; my $lb = ""; my $vor = "(?:$wortende|[$vorNonword])"; my $nach = "(?:$wortanfang|[$nachNonword])"; my $varChar = "[a-zA-Z*ωπλŔæ]"; # * kommt tatsächlich vor: Benedetti p.0342, Ŕ ist mein Ersatzzeichen für ... im Text! # alle griechischen Buchstaben? # teile es auf in allgemein sinnvolle Buchstaben und Benedetti-Spezifische Buchstaben # es muss einen Parameter geben, mit dem man Zeichen zu einer Standard-Zeichenklasse hinzufügen kann. # Und einen Parameter, mit dem man Zeichen entfernen kann! my $vc = "(?:$lb)?$varChar\\."; my $vcop = "$varChar\\."; # $vcop = $vc ohne Punkt davor, und deshalb auch ohne "(?:$lb)?" my $vcmp = "\\.(?:$lb)?$varChar\\."; # $vcmp = $vc mit Punkt davor my $vcae = "(?:$lb)?(?:$varChar)[.?]"; # $vcae = $vc am Ende, wo auch ? statt . erlaubt ist my $inTextContainer = 0; foreach (@text) { # if (/]/) { $inTextContainer = 1; } # if (/]/) { $inTextContainer = 1; } # if (/]/) { $inTextContainer = 1; } # if (/]/) { $inTextContainer = 1; } # if (/]/) { $inTextContainer = 1; } # Variablen markieren in einem Variablen-Container: geht das problemlos? # if (/ xml:space="preserve"/) { $inTextContainer = 1; } # # # muss ich überhaupt verausfinden, ob ich gerade in einem Text-Container bin? # # oder reicht es, alles zu markieren, was wie eine Variable ist? # # schließlich gibt es außerhalb der Text-Container keinen Text, der markiert werden könnte. # # next unless $inTextContainer; # beachte: bereits markierte Variablen nicht ein zweites Mal markieren! # beachte: Punkte können fehlen, wie in "linea a. i." # Vorschlag: erst Punkte umsortieren, erst dann ? Gibt es für die Trennung einen Grund? # beachte: die regexes dürfen keine Punkte dazuerfinden # Teil 1: Punkte verschieben s!($vor)\. ($vc)!$1 .$2!g; s!( à)\. ($vc)!$1 .$2!g; # Sonderfall à s!($vor)\. ((?:$lb)?(?:$varChar)[?:])!$1 .$2!g; # Sonderfall Satzzeichen, zum Beispiel "dabit. a? " s!($vcop) ($vc)!$1$2!g; s!($vcop) ($vc)!$1$2!g; # ja, zweimal! s!($vcop) ((?:$lb)?(?:$varChar)[?:])!$1$2!g; # Sonderfall Satzzeichen, zum Beispiel "dabit. q. c? " # Teil 2: einfügen s!!¥!g; # markiere bereits bestehende tags s!¥!g; # markiere bereits bestehende tags # Variable mit sechs Buchstaben # sechs Buchstaben könnten noch bei einem gnomon vorkommen, danach wird's sowieso ein bisschen gruselig s!($vor)($vcmp$vc$vc$vc$vc$vcae)($nach)!$1¥$2$3!g; s!( (?:$lb)?)($vcop$vc$vc$vc$vc$vcae)($nach)!$1¥$2$3!g; # Variable mit fünf Buchstaben # fünf Buchstaben kommen noch vor s!($vor)($vcmp$vc$vc$vc$vcae)($nach)!$1¥$2$3!g; s!( (?:$lb)?)($vcop$vc$vc$vc$vcae)($nach)!$1¥$2$3!g; # Variable mit vier Buchstaben s!($vor)($vcmp$vc$vc(?:$lb)?$varChar)([:])!$1¥$2$3!g; # für mit : getrennte Variablen s!( (?:$lb)?)($vcop$vc$vc(?:$lb)?$varChar)([:])!$1¥$2$3!g; # für mit : getrennte Variablen s!($vor)($vcmp$vc$vc$vcae)($nach)!$1¥$2$3!g; s!( (?:$lb)?)($vcop$vc$vc$vcae)($nach)!$1¥$2$3!g; # Variable mit drei Buchstaben s!($vor)($vcmp$vc(?:$lb)?$varChar)([:])!$1¥$2$3!g; # für mit : getrennte Variablen s!( (?:$lb)?)($vcop$vc(?:$lb)?$varChar)([:])!$1¥$2$3!g; # für mit : getrennte Variablen s!($vor)($vcmp$vc$vcae)($nach)!$1¥$2$3!g; s!( (?:$lb)?)($vcop$vc$vcae)($nach)!$1¥$2$3!g; # Variable mit zwei Buchstaben s!($vor)($vcmp(?:$lb)?$varChar)([:])!$1¥$2$3!g; # für mit : getrennte Variablen s!( (?:$lb)?)($vcop(?:$lb)?$varChar)([:])!$1¥$2$3!g; # für mit : getrennte Variablen s!($vor)($vcmp$vcae)($nach)!$1¥$2$3!g; s!( (?:$lb)?)($vcop$vcae)($nach)!$1¥$2$3!g; # Vorsicht: bei deutschen Texten würde das auch "z.B." oder Initialen zur Variablen erklären! # dagegen & a. e. sollte relativ geradlinig sein; vielleicht sollte man den Fall extra behandeln, wo wie hier ein Punkt # selbst nach Bendettis Standard nicht nötig ist (weil & sowieso ein Worttrenner ist; genauso ")" wie in "linearum (verbigratia) a.b.") # --> ein Parameter: darf der erste Punkt fehlen # --> und ein Paramter: sind Punkte vor/nach Variablen ! # Entscheidung: ".f.d. 660." --> ".f.d. 660." # ex. f. c. in --> ex .f.c. in # ex f. c. in --> ex f.c. in # ad .u.i. --> ad .u.i. --> .u.i. # Variable mit einem Buchstaben s!($vor)(\.$vcae)($nach)!$1¥$2$3!g; # s!( (?:$lb)?)($vcop$vc)($nach)!$1¥$2$3!g; # das ist mir zu riskant! # Sonderfall Satzende: letztes Satzzeichen soll hinter s!([.?])()( ?(?:$lb)?)!$2$1$3!; s!¥!!g; # if (m!

!) { $inTextContainer = 0; } # if (m!!) { $inTextContainer = 0; } # if (m!!) { $inTextContainer = 0; } # if (m!!) { $inTextContainer = 0; } # if (m!!) { $inTextContainer = 0; } # if (m!!) { $inTextContainer = 0; } # if (m!!) { $inTextContainer = 0; } # if (m! gibt # auch pb erlauben wie Benedetti n=20 ? # o.c. verò # in d. # dat. o. quid # beachte für : Punkt vor oder nach ꝑ wegen Variable davor bzw. danach