﻿#!/usr/bin/perl -w
use strict;
use warnings;
use utf8;
use open qw(:std :utf8);
use integer;


# Filter_4_02_move_floats.pl
# 2010-06-30
# Wolfgang Schmidle


my $filtername = "Filter_4_02_move_floats.pl";

# text input

my @text;
while(<>) { push @text, $_; }


# go through the text

my $notes = "mgl|mgr|fn";

my %position = (
	mgl => "left",
	mgr => "right",
	fn => "foot"
);

my @newText;

my $pb = "";

my $figure = 0;
my $note = 0;
my $position = "";
my $handwritten = 0;

my $nummer;
my $anchor;
my $float;
my @floats = ();

my $inP = 0;
my $inPandNote = 0;
my $noteText = "";
my $inPandFigure = 0;
my $figureText = "";

my $i = 0;

foreach (@text) {

	$i++;

	if (m!<p[ >]!) { $inP = 1; }
	if (m!</p>!) { $inP = 0; }

	if (/<pb [^>]*file="([^"]+)"/) { 
		$pb = $1; 
		$figure = 1;
		$note = 1;
		push @newText, $_;
		next;
	}
	
	# <n> wird noch nicht korrekt verarbeitet. Vorläufig eine Schummellösung:
	s!<n ([^>]+)>!<anchor type="note" xlink:href="" $1>!g;
	
	
	if ($inP) {
	
		if (m!<figure/>!) {
			$nummer = ( $figure < 10 ? "$pb-0$figure" : "$pb-$figure");
			s!<figure/>!<anchor type="figure" xlink:label="fig-${nummer}a" xlink:href="fig-$nummer"/>!;
			$float = '  <figure xlink:label="fig-'.$nummer.'" xlink:href="fig-'.$nummer.'a">'."\n";
			$float .= '    <image file="'.$nummer.'" xlink:href="&URLbase;figures/'.$nummer.'"/>'."\n";
			$float .= '  </figure>'."\n";
			push @floats, $float;
			$figure++;
			push @newText, $_;
			next;
		}	

		if (m!<figure>!) {
			$inPandFigure = 1;
			$nummer = ( $figure < 10 ? "$pb-0$figure" : "$pb-$figure");
			$anchor = "<anchor type=\"figure\" xlink:label=\"fig-${nummer}a\" xlink:href=\"fig-$nummer\"/>\n";
			s!<figure>!<figure xlink:label="fig-$nummer" xlink:href="fig-${nummer}a">!;
			push @newText, $anchor;
			$figureText = $_;

# 			if ($figureText =~ m!</figure>!) {
# 				$inPandFigure = 0;
# 				push @floats, $figureText;
# 			}

			$figure++;
			next;
		}
		if (m!</figure>!) {
			$inPandFigure = 0;
			$figureText .= $_;
			push @floats, $figureText;
			next;
		}	
		if ($inPandFigure) {
			$figureText .= $_;
			next;
		}

		if (m!<($notes)!) {
			$inPandNote = 1;
			$position = $position{$1};
			$nummer = ( $note < 10 ? "$pb-0$note" : "$pb-$note");
			$anchor = "<anchor type=\"note\" xlink:label=\"note-${nummer}a\" xlink:href=\"note-$nummer\"/>\n";
			s!<($notes)([^>]*)>!<note$2 position="$position" xlink:label="note-$nummer" xlink:href="note-${nummer}a" xml:space="preserve">!;
			push @newText, $anchor;
			$noteText = $_;
			if ($noteText =~ s!</($notes)>!</note>!) {
				$inPandNote = 0;
				push @floats, $noteText;
			}
			$note++;
			next;
		}
		if (s!</($notes)>!</note>!) {
			$inPandNote = 0;
			$noteText .= $_;
			push @floats, $noteText;
			next;
		}	
		if ($inPandNote) {
			$noteText .= $_;
			next;
		}

		if (m!<handwritten/>!) {
			$nummer = ( $handwritten < 10 ? "$pb-0$figure" : "$pb-$figure");
			s!<handwritten/>!<anchor type="handwritten" xlink:label="hd-${nummer}a" xlink:href="hd-$nummer"/>!;
			$float = '  <handwritten xlink:label="hd-'.$nummer.'" xlink:href="hd-'.$nummer.'a"/>'."\n";
			push @floats, $float;
			$handwritten++;
			push @newText, $_;
			next;
		}	
	}
	
	if (! $inP) {

		if (m!<figure/>!) {
			$nummer = ( $figure < 10 ? "$pb-0$figure" : "$pb-$figure");
			$_ = '  <figure>'."\n";
			$_ .= '    <image file="'.$nummer.'" xlink:href="&URLbase;figures/'.$nummer.'"/>'."\n";
			$_ .= '  </figure>'."\n";
			$figure++;
			push @newText, $_;
			next;	
		}
		
		if (m!<figure>!)  { 
			push @newText, $_;
			$figure++;
			next;
		}	
		if (m!</figure>!)  { 
			push @newText, $_;
			next;
		}	
	
		if (m!<($notes)!)  { 
			$position = $position{$1};
			s!<($notes)([^>]*)>!<note$2 position="$position" xml:space="preserve">!;
			s!</($notes)>!</note>!;
			push @newText, $_;
			$note++;
			next;
		}	
		if (m!</($notes)>!)  { 
			s!</($notes)>!</note>!;
			push @newText, $_;
			next;
		}	
	
		if (m!<handwritten/>!) {
			push @newText, $_;
			$handwritten++;
			next;
		}	
	}

	if (m!</p>!) {
		push @newText, $_;

		if (/type="float"/) { die "$filtername: Line $i: Es gibt schon ein <div float>!\n"; }
		if ($pb eq "") { die "$filtername: Line $i: <div float> ohne vorhergehendes <pb>!\n"; }
		
		if (@floats) {
			push @newText, '<div type="float" level="0" n="0">'."\n";
			foreach (@floats) { push @newText, $_; }
			push @newText, '</div>'. "\n";
			@floats = ();
		}

		next;
	}
		
	push @newText, $_;
	next;
}

if (@floats) { die "$filtername: Es gibt am Ende noch mindestens ein <anchor> ohne zugehöriges <figure>!\n"; }


print @newText;

# TO DO:
# <figure> und <note>, die nicht nur eine Zeile lang sind
# tables etc.
# anchored marginal notes

# getrennt? prüfe, ob labels doppelt vergeben wurden
# --> braucht man das? Das kann doch nur passieren, wenn labels zum Teil per Hand vergeben wurden?

# Marginalien: wenn sie nach der ersten Zeile des Absatzes kommen, ziehe sie vor den Absatz
# (erst ein Durchlauf, wo das korrigiert wird, bevor das eigentliche Herausziehen der Floats kommt?)

# Fußnoten in Boskovic
# Boskovic 1763, p.0329: <n (a)><!?>, und sie haben recht. Wie vermerke ich das?

# note mit xml:space nur, wenn kein <p> oder <s>. Oder: das <s> Skript nimmt es wieder raus, falls nicht anwendbar?

# Floats stillschweigend herausziehen, wenn nur eine Absatz-Zeile davor oder danach ist.

# sortiere die Elemente in <figure>, nämlich erst <caption>, dann <description>, dann <variables>

# dieses Skript wäre ein Kandidat, um in XSLT geschrieben zu werden!
