#!/usr/bin/perl 

#########################################
##### Author:		Sebastian Enger / B.Sc
##### CopyRight:	Sebastian Enger / B.Sc
##### LastModified	7.01.2007
##### Function:		Dublicated Content Filter für Google
##### Todo:			
########################################


use strict;
use Text::German;
use Text::English;
use Lingua::DE::ASCII;
use Lingua::EN::Inflect;
use Lingua::DE::Num2Word;
use Lingua::DE::Wortschatz;

use Data::Dumper;


# todo:
# statische synonym textdatei nehmen und diese dann abarbeiten, wenn kein treffer gefunden wurde dann benutze das langsame my $result	= Lingua::DE::Wortschatz::use_service('T', $_);
# StringManipulation ist mir noch zu krass, der text wird extrem unleserlich bis jetzt noch
###	amazon content grabbing + adding


# perl -MCPAN -e 'install "Text::German"'
# perl -MCPAN -e 'install "Text::English"'
# perl -MCPAN -e 'install "Lingua::EN:Inflect"'
# perl -MCPAN -e 'install "Lingua::DE::Wortschatz"'
# perl -MCPAN -e 'install "Lingua::DE::Num2Word"'
# perl -MCPAN -e 'install "Lingua::DE::ASCII"'


# englische funktionen:
	### Number2Word(): wandele eine zahl in ein englisches wort um
	### PluralManipulation(): bilde den plural von englischen wörtern
	### StemmmingManipulation(): reduzierung von englischen wörtern auf ihre grundform

# deutsche funktionen:
	### Zahl2Wort(): wandele eine zahl in ein deutsches wort um
	### SynonymManipulation(): zufälliges ersetzen von deutschen wörtern mit einem zufälligem synonym zum ursprünglichen wort
	### GrundformManipulation(): reduzierung von deutschen wörtern auf ihre grundform

# sprachunabhängige funktionen:
	### TextBlowup(): füge satzkombinationen zum array hinzu -> nimm randomized einzelne wörter aus dem vorhandenen Text - sortiere dieses nach alphabetischer reihenfolge - und speichere das ergebnis ans (aktuell:Ende) des zu modifizierenden Textes
	### StringManipulation(): buchstaben, zeichen, wörter spiegeln, vertauschen, löschen, ersetzen ...:
		###
		# Erste Buchstaben groß/klein schreiben
		###
		###
		# Wort groß/klein schreiben
		###
		###
		# zufälliges Zeichen einfügen
		###
		###
		# zufällige Nummer einfügen
		###
		###
		# zufälligen Buchstaben einfügen
		###
		###
		# Wörter zufällig verdoppeln
		###
		###
		# Wörter zufällig verdoppeln und das vedoppelte spiegeln
		###
		###
		# Wörter zufällig spiegeln
		###
		###
		# zeichen aus einem Wort zufällig löschen
		###
		###
		# Deutsche Umlaute zufällig ersetzen
		###
		###
		# Wort zufällig mit unsinnigen zeichen füllen
		###


# aufrufreihenfolge:



# variables
my $text		= "";

my @FullContent = ();
my @array		= ();

my @letters		= (	"a", "b", "c", "d", "e", "f", "g", "h",
					"i", "j", "k", "l", "m", "n", "o", "p",
					"q", "r", "s", "t", "u", "v", "w", "x",
					"y", "z" );

my @numbers		= ( "0", "1", "2", "3", "4", "5", "6", "7",
					"8", "9" );

my @characters	= (	"+", "-", "&", " ", "(", ")", "@", "!",
					"%" );


# random initilisation
srand();


my $SrcFile	= "src.txt";	# quell	
my $ModFile	= "mod.txt";	# .. zielfile


# src file einlesen
open( RH, "<$SrcFile" ) or die "sudden flaming death\n";
	flock(RH, 2);
	$text = do { local( $/ ) ; <RH> } ;
close RH;


@FullContent			= split(' ', $text);
my $FullContentArray	= &Main( \@FullContent );


# mod file schreiben
open( WH, ">$ModFile" ) or die "sudden flaming death\n";
	flock(WH, 2);
	for ( @{$FullContentArray} ) {	# todo: content ordnen: sprich nach 5 sätzen ( eg nach 5 .) ein \n schreiben
		print WH " $_";
	};
close WH;



exit;


########
### Main(): rufe alle wichtige funktionen geordnet auf

sub Main(){

	my $FullContent = shift;

	for ( @{$FullContent} ) {
		$_ = Zahl2Wort( $_ ) if ( $_ =~ /\d/ && rand() >= 0.6 );		# zahl in wort umwandeln, wenn quellzeichen eine zahl ist und rand > 0.6
	};
	
	$FullContent = &SynonymManipulation( $FullContent );				### SynonymManipulation(): zufälliges ersetzen von deutschen wörtern mit einem zufälligem synonym zum ursprünglichen wort	
	$FullContent = &GrundformManipulation( $FullContent );				### GrundformManipulation(): reduzierung von deutschen wörtern auf ihre grundform
	$FullContent = &TextBlowup( $FullContent );							### TextBlowup(): füge satzkombinationen zum array hinzu

#	$FullContent = StringManipulation( $FullContent );					### StringManipulation(): buchstaben, zeichen, wörter spiegeln, vertauschen, löschen, ersetzen ...

	return $FullContent;

}; # Main()






############
### TextBlowup(): füge satzkombinationen zum array hinzu

sub TextBlowup(){
	
	my $FullContentArray = shift;

	for ( @{$FullContentArray} ) {
		
		my $random = rand();
		if ( $random > 0.95 ) {
			my @alpha_sorted = ();									# lege neues array an
			
			for (my $i=0; $i<=int(rand(20)); $i++ ) {				# für 0 bis rand(30) fülle ein das neue array @alpha_sorted mit zufälligen werten aus dem arrays @FullContent
				push(@alpha_sorted, @FullContent[ int(rand($#FullContent)) ] );
			};
		
			@alpha_sorted	= sort { $b cmp $a } (@alpha_sorted);	# führe  sort aus ...
					
			# later: splice the content of @alpha_sorted as a string somewhere in the rand(middle) of @FullContent

			for (@alpha_sorted) {
				push(@{$FullContentArray}, $_);						# ... und schaufele die geordneten daten wieder ans ende von  @FullContent
			};

		}; # if ( $random > 0.95 ) {

	}; # for ( @FullContent ) {

	return $FullContentArray;

}; # sub GrundformManipulation(){




###########
### SynonymManipulation(): zufälliges ersetzen von deutschen wörtern mit einem zufälligem synonym zum ursprünglichen wort

sub SynonymManipulation(){

	my $FullContentArray = shift;

	for ( @{$FullContentArray} ) {
		
		my $random = rand();

		if ( $random > 0.975 ) {
			
			my $old		= $_;
			my $result;
			eval {
				$result	= Lingua::DE::Wortschatz::use_service('T', $_);
			};
			my @lines	= $result->hashrefs();
			my $String	= @lines[ rand(@lines) ] ;
			$_			= $String->{Synonym} if ( length($String->{Synonym}) > 1 );		
			print "Old: $old --- New: $_\n";

		};

	}; # for ( @FullContentArray ) {

	return $FullContentArray;

}; # sub SynonymManipulation(){


############
### GrundformManipulation(): reduzierung von deutschen wörtern auf ihre grundform

sub GrundformManipulation(){
	
	my $FullContentArray = shift;

	for ( @{$FullContentArray} ) {
		
		my $random = rand();

		if ( $random > 0.5 ) {
			$_ = Text::German::reduce($_);			
		};

	}; # for ( @FullContentArray ) {

	return $FullContentArray;

}; # sub GrundformManipulation(){



############
### StringManipulation(): buchstaben, zeichen, wörter spiegeln, vertauschen, löschen, ersetzen ...


sub StringManipulation(){
	
	my $FullContentArray = shift;

	for ( @{$FullContentArray} ) {


		# für jede Anweisung wird eine neue zufällige Zahl erstellt
		

		###
		# Erste Buchstaben groß/klein schreiben
		###

		my $random = rand();
		if ( $random > 0.4 && $random < 0.5 ) {
			$_ = ucfirst();		# zufällig ersten Buchstaben groß schreiben
		} elsif ( $random > 0.5 && $random < 0.6 ) {
			$_ = lcfirst();		# zufällig ersten Buchstaben klein schreiben
		};


		###
		# Wort groß/klein schreiben
		###

		my $random = rand();
		if ( $random >= 0.3 && $random <= 0.4 ) {
			$_ = uc();		# zufällig Wort groß schreiben
		} elsif ( $random >= 0.7 && $random <= 0.8 ) {
			$_ = lc();		# zufällig Wort klein schreiben
		};


		###
		# zufälliges Zeichen einfügen
		###

		my $random			= rand();
		my $replaceString	= @characters[ rand(@characters) ] ;
		
		if ( $random < 0.09 ) {
			substr($_, rand(length), 0 ) = "$replaceString";
		};
		
		
		###
		# zufällige Nummer einfügen
		###

		my $random			= rand();
		my $replaceString	= @numbers[ rand(@numbers) ] ;
		
		if ( $random < 0.09 ) {
			substr($_, rand(length), 0 ) = "$replaceString";
		};


		###
		# zufälligen Buchstaben einfügen
		###

		my $random			= rand();
		my $replaceString	= @letters[ rand(@letters) ] ;
		
		if ( $random < 0.09 ) {
			substr($_, rand(length), 0 ) = "$replaceString";	
		};


		###
		# Wörter zufällig verdoppeln
		###

		my $random = int(rand(30));
			
		if ( $random == 5 ) {
			$_ .= $_;
		};


		###
		# Wörter zufällig verdoppeln und das vedoppelte spiegeln
		###

		my $random = int(rand(30));
			
		if ( $random == 6 ) {
			$_ .= reverse $_;
		};


		###
		# Wörter zufällig spiegeln
		###

		my $random = int(rand(30));
			
		if ( $random == 7 ) {
			$_ = reverse $_;
		};


		###
		# zeichen aus einem Wort zufällig löschen
		###

		my $random	= rand();
		my $length  = length($_);
	
		if ( $length > 0 ) {
		
			if ( $random < 1/$length ) {
				substr($_, rand(length), rand(length) ) = "";
			}; # if ( $random < 1/$length ) {
		
		}; # if ( $length > 0 ) {
		
		###
		# Deutsche Umlaute zufällig ersetzen
		###

		my $random = int(rand(30));
			
		if ( $random == 1 ) {
			eval {
				$_ = to_ascii($_) if ( length($_) > 3 );
			};
		};


		###
		# Wort zufällig mit unsinnigen zeichen füllen
		###

		my $random	= rand();
		my $length  = length($_);
		
		if ( $length > 0 ) {

			if ( $random < 3/length ) {

				my $cp = $_;
				$_  = "";

				for ( length($cp) ) {
					my $random = int(rand(127));
					$_ .= chr($random);
				}; # for
			}; # if ( $random
		}; # if ( $length > 0 ) {
	
	}; # for ( @FullContent ) {

	return $FullContentArray;

}; # sub StringManipulation(){



###########
### Zahl2Wort(): wandele eine zahl in ein deutsches wort um

sub Zahl2Wort(){

	my $zahl = shift;
	my $text = Lingua::DE::Num2Word::num2de_cardinal( $zahl );
	if ( length ($text) >= length ($zahl) ) {
		return $text;
	} else {
		return $zahl;
	};

}; # sub Zahl2Wort(){



###########
### Number2Word(): wandele eine zahl in ein englisches wort um

sub Number2Word(){

	my $zahl = shift;
	my $text = Lingua::EN::Inflect::NUMWORDS($zahl);
	if ( length ($text) >= length ($zahl) ) {
		return $text;
	} else {
		return $zahl;
	};

}; # sub Number2Word(){



############
### PluralManipulation(): bilde den plural von englischen wörtern

sub PluralManipulation(){
	
	my $FullContentArray = shift;

	for ( @{$FullContentArray} ) {
		
		my $random = rand();

		if ( $random > 0.5 ) {
			$_ = Lingua::EN::Inflect::PL($_);
		};

	}; # for ( @FullContentArray ) {

	return $FullContentArray;

}; # sub PluralManipulation(){



############
### StemmmingManipulation(): reduzierung von englischen wörtern auf ihre grundform

sub StemmmingManipulation(){
	
	my $FullContentArray = shift;

	for ( @{$FullContentArray} ) {
		
		my $random = rand();

		if ( $random > 0.3 ) {
			$_ = Text::English::stem($_);			
		};

	}; # for ( @FullContentArray ) {

	return $FullContentArray;

}; # sub StemmmingManipulation(){



#####################################################################################################
#####################################################################################################
#####################################################################################################
#####################################################################################################
#####################################################################################################
#####################################################################################################
#####################################################################################################



########### obsolate:


#	my @A = @{$FullContent};
#	print $#A;
#	exit;



############
### selection_sort(): wörter nach auswahlverfahren vertauschen

# my @array = ( "ich " ,  "liebe " ,  "es ",  "den ",  "sonnenuntergang ",  "zu ", " betrachten " );
# selection_sort( \@array);
# print @array;

sub s1election_sort(){

	my $array = shift;
	
	my $i;
	my $j;

	for ( $i = 0; $i <= $#array ; $i++ ) {
		
		my $m = $i;
		my $x = $array->[ $m ];

		for ( $j = $i + 1 ; $j < @$array ; $j++ ) {

			( $m , $x ) = ( $j, $array->[ $j ] ) if ( $array->[ $j ] lt $x );

		}; # for ( $j = $i + 1 ; $j < @{$array} ; $j++ ) {
		
		@$array[$m, $i] = @$array[$i, $m] unless $m == $i; 

	}; # for ( $i = 0; $i <= $#array ; $i++ ) {

	return $array;

}; # sub selection_sort(){

1;