﻿#!/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 <reg>-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 = "<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 (/<p[ >]/) { $inTextContainer = 1; }
# 	if (/<head[ >]/) { $inTextContainer = 1; }
# 	if (/<caption[ >]/) { $inTextContainer = 1; }
# 	if (/<description[ >]/) { $inTextContainer = 1; }
# 	if (/<variables[ >]/) { $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 <var> ? 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>"


	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? </s>"

	
	# Teil 2: <var> einfügen
	
	s!<var>!<var>¥!g; # markiere bereits bestehende <var> tags
	s!</var>!¥</var>¥!g; # markiere bereits bestehende <var> 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<var>¥$2</var>$3!g;  
	s!( (?:$lb)?)($vcop$vc$vc$vc$vc$vcae)($nach)!$1<var>¥$2</var>$3!g;  
	
	# Variable mit fünf Buchstaben
	# fünf Buchstaben kommen noch vor
	s!($vor)($vcmp$vc$vc$vc$vcae)($nach)!$1<var>¥$2</var>$3!g;  
	s!( (?:$lb)?)($vcop$vc$vc$vc$vcae)($nach)!$1<var>¥$2</var>$3!g;  

	# Variable mit vier Buchstaben
	s!($vor)($vcmp$vc$vc(?:$lb)?$varChar)([:])!$1<var>¥$2</var>$3!g;  # für mit : getrennte Variablen
	s!( (?:$lb)?)($vcop$vc$vc(?:$lb)?$varChar)([:])!$1<var>¥$2</var>$3!g;  # für mit : getrennte Variablen

	s!($vor)($vcmp$vc$vc$vcae)($nach)!$1<var>¥$2</var>$3!g;  
	s!( (?:$lb)?)($vcop$vc$vc$vcae)($nach)!$1<var>¥$2</var>$3!g;  
	
	# Variable mit drei Buchstaben
	s!($vor)($vcmp$vc(?:$lb)?$varChar)([:])!$1<var>¥$2</var>$3!g;  # für mit : getrennte Variablen
	s!( (?:$lb)?)($vcop$vc(?:$lb)?$varChar)([:])!$1<var>¥$2</var>$3!g;  # für mit : getrennte Variablen

	s!($vor)($vcmp$vc$vcae)($nach)!$1<var>¥$2</var>$3!g;  
	s!( (?:$lb)?)($vcop$vc$vcae)($nach)!$1<var>¥$2</var>$3!g;  
	
	# Variable mit zwei Buchstaben
	s!($vor)($vcmp(?:$lb)?$varChar)([:])!$1<var>¥$2</var>$3!g;  # für mit : getrennte Variablen
	s!( (?:$lb)?)($vcop(?:$lb)?$varChar)([:])!$1<var>¥$2</var>$3!g;  # für mit : getrennte Variablen
	
	s!($vor)($vcmp$vcae)($nach)!$1<var>¥$2</var>$3!g;  
	s!( (?:$lb)?)($vcop$vcae)($nach)!$1<var>¥$2</var>$3!g;  
	# Vorsicht: bei deutschen Texten würde das auch "z.B." oder Initialen zur Variablen erklären!
	# dagegen &amp; 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." --> "<var>.f.d.</var> 660."
	# ex. <lb/>f. c. in --> ex <var>.<lb/>f.c.</var> in
	# ex <lb/>f. c. in --> ex <lb/><var>f.c.</var> in
	# ad .u.i. </s> --> ad <var>.u.i.</var> </s> --> <var>.u.i</var>. </s>
	
	# Variable mit einem Buchstaben
	s!($vor)(\.$vcae)($nach)!$1<var>¥$2</var>$3!g;  
	# s!( (?:$lb)?)($vcop$vc)($nach)!$1<var>¥$2</var>$3!g;  # das ist mir zu riskant!

	
	# Sonderfall Satzende: letztes Satzzeichen soll hinter </var>
	s!([.?])(</var>)( ?(?:$lb)?</s>)!$2$1$3!;
	
	
	s!¥!!g;
	

# 	if (m!</p>!)    { $inTextContainer = 0; }
# 	if (m!</head>!) { $inTextContainer = 0; }
# 	if (m!</caption>!) { $inTextContainer = 0; }
# 	if (m!</description>!) { $inTextContainer = 0; }
# 	if (m!</variables>!) { $inTextContainer = 0; }
# 	if (m!</note>!) { $inTextContainer = 0; }
# 	if (m!</handwritten>!) { $inTextContainer = 0; }
# 	if (m!</xhtml:!) { $inTextContainer = 0; }
}


# geänderten Text ausgeben

print @text;

# TO DO:
# weitere Buchstaben in $vor, wenn es noch kein <reg> gibt
# auch pb erlauben wie Benedetti n=20 ?
# <s>o.c. verò 
#  in d.</s>
# dat. <lb/> <anchor type="figure" xlink:label="fig-0024-01a" xlink:href="fig-0024-01"/><lb/>o. quid 
# beachte für <reg>: Punkt vor oder nach ꝑ wegen Variable davor bzw. danach