Wikipedysta:Jurekj

Jurekj jest mężczyzną.
tło1=lightblue|tło2=yellow|[[Plik:POL Radom COA.svg|40px]|Ten użytkownik pochodzi z Radomia}}
pl Polski jest językiem ojczystym tego użytkownika.
en-2 This user is able to contribute with an intermediate level of English.

Generowanie drzew genealogicznych

Format danych

W dyskusji do hasła umieszczamy dane do wygenerowania drzewa w formacie: id::klucz::wartość

gdzie:

id - nr identyfikacyjny osoby mającej się pojawić w drzewie, od osoby z id=1 rozpoczyna się rysunek drzewa. Kolejne osoby nie muszą mieć kolejnych numerów, dla każdego użytego numeru musi być jednak podany wiersz z kluczem: name. Kolejność wierszy też nie ma znaczenia.

klucz - w tym mamencie dopuszczalne są następujące klucze:

* name - wymagany, wartość definiuje nazwę pod jaką pojawi się osoba w drzewie
* item - opcjonalny, wartość definiuje hasło w Wikipedii pod którym dana osoba występuje
* children - opcjonalny, wartość to lista rozdzielonych przecinkami id potomków danej osoby
* spouses - opcjonalny, wartość to lista rozdzielonych przecinkami id małżonków danej osoby
* text - opcjonalny, wartość dodatkowy opis danej osoby

dla przykładu poniżej takie dane do drzewa genealogicznego Pompejuszy:

1::name::Gnejusz Pompejusz Strabon
1::item::Pompejusze#Gnejusz Pompejusz Strabon
1::children::2
2::item::Pompejusz
2::name::Gnejusz Pompejusz Wielki
2::children::3,4,5
2::spouses::6,7,8,9,10
3::item::Pompejusze#Gnejusz Pompejusz Młodszy
3::name::Gnejusz Pompejusz Młodszy
3::spouses::11
4::item::Pompejusze#Sekstus Pompejusz
4::name::Sekstus Pompejusz
4::spouses::12
5::item::Pompejusze#Pompeja
5::name::Pompeja
5::children::15
5::spouses::13,14
6::name::Antistia
7::name::Emilia c. Marka Emiliusza Skaura
8::name::Mucia Tercja c. Kwintusa Muciusza Scewoli
9::name::Julia c. Cezara
10::name::Cecylia Metella Kornelia
11::name::Klaudia c. Appiusza Klaudiusza Pulchra
12::name::Skrybonia II
12::item::Skryboniusz Libon#Skrybonia II
13::name::Faustus Korneliusz Sulla Feliks
14::name::Lucjusz Korneliusz Cynna
14::item::Korneliusz Cynna#Lucjusz Korneliusz Cynna k.32
15::item::Korneliusz Cynna#Kornelia Pompeja Magna
15::name::Pompeja Kornelia
15::spouses::16
16::name::Skryboniusz III
16::item::Skryboniusz Libon#Lucjusz Skryboniusz Libon III


Dane kopiujemy do pliku "dane.txt" i umieszczmy w tym samym katalogu co skrypt "gen_tab". Skrypt czyta ten plik i na jego podstawie generuje drzewo genealogiczne jako tabelę w kodzie HTML wysyłaną na standardowe wyjście. Tabelę tę można wkleić do hasła w Wikipedii. Aktualna wersję skryptu udostępniam i proszę o uwagi.Jurekj (dyskusja) 17:08, 13 lis 2010 (CET)odpowiedz

skrypt "familytree.pl"

#!c:/strawberry/perl/bin/perl.exe
## powyższa linia musi odpowiadać konkretnej instalacji Perla
## np w Linuxie to najczęściej: #!/usr/bin/perl
##

#
# Dane do wygenerowania drzewa w formacie: id::klucz::wartość umieszczamy w pliku "data.txt" w tym samym katalogu co skrypt "familytree.pl".
# Skrypt czyta ten plik i na jego podstawie generuje drzewo genealogiczne wykorzystując szablon 'familytree" oraz wikikod i kod HTML.
# Wynik wysyłany jest na standardowe wyjście i można go wkleić do hasła w Wikipedii.
#
# format danych: id::klucz::wartość
# gdzie:
# id - nr identyfikacyjny osoby mającej się pojawić w drzewie, od osoby z id=1 rozpoczyna się rysunek drzewa.
# Kolejne osoby nie muszą mieć kolejnych numerów, dla każdego użytego numeru musi być jednak podany wiersz z kluczem: name.
# Kolejność wierszy też nie ma znaczenia.
# klucz - w tym mamencie dopuszczalne są następujące klucze:
#
#* name - wymagany, wartość definiuje nazwę pod jaką pojawi się osoba w drzewie
#* item - opcjonalny, wartość definiuje hasło w Wikipedii pod którym dana osoba występuje
#* children - opcjonalny, wartość to lista rozdzielonych przecinkami id potomków danej osoby
#* spouses - opcjonalny, wartość to lista rozdzielonych przecinkami id małżonków danej osoby
#* text - opcjonalny, wartość to dodatkowy opis danej osoby
my $file = "dane.txt";
my (@person,@item,@tree,@brunch) = ();
my ($dane, $wynik_wiki) =();
my %fam = ();

my @min = (0,0,0,0,0,0,0);
my ($max_col,$max_line)=(); # rozmiary tablicy
my ($id,$nr_of_chidren,$list_of_children,$name,$id_item) = ();
my %links = ();
my %up_wiki = ();
my %down_wiki = ();
my ($id,$sex,$id_father,$id_mother,$nr_of_chidren,$list_of_children,$name,$id_item) = ();

&graph_def;
&read_persons;
&create_item(1,0,1); 
&parse;
print $wynik_wiki;
exit;
######################
sub read_persons {
    open(IN,"$file" ) or die "I cannot open $file\n";
    while (<IN>) {
        next if /^#/;
		next if /^\s*$/;
        chomp;
        my ($id,$key,$value) = split(/::/);
        if ($key eq 'children') {
            $person[$id]{'list_of_children'} = [ split(/,/,$value) ];
            $person[$id]{'nr_of_children'} = scalar(@{$person[$id]{'list_of_children'}});
        } elsif ($key eq 'spouses') {
            $person[$id]{'list_of_spouses'} = [ split(/,/,$value) ];
            $person[$id]{'nr_of_spouses'} = scalar(@{$person[$id]{'list_of_spouses'}});           
        } elsif ($key eq 'item' or $key eq 'item' or $key eq 'text' or $key eq 'name') {
            $person[$id]{$key} = $value;
        } else  {
            print "error in line $. of file $file \n";
            exit;
        }
    }
    close IN;   
}
########################
sub graph_def {
	$fam{'134'} = "|)|-|-";
	$fam{'123'} = "|-|^|-";
	$fam{'34'} = "| |,|-";
	$fam{'14'} = "| |!| ";
	$fam{'124'} = "|-|-|(";
	$fam{'1234'} = "|-|+|-";
	$fam{'23'} = "|-|-|-";
	$fam{'13'} = "|`|-|-";
	$fam{'234'} = "|-|v|-";
	$fam{'24'} = "|-|.| ";
}
########################
sub parse {
	my $width_col = 80;
	$wynik_wiki.="{{familytree/start}}\n";
	foreach my $id (@item) {
		$ld=scalar(@{$$id{'list_of_children_item'} } ); 
		if ($ld == 0){
		} elsif ($ld == 1) {
    	    $l1 = $$id{'line'};
			$l2 = $item[$$id{'list_of_children_item'}[0]]{'line'};
			if ($l1 == $l2) {
				$branch[$$id{'col'}][$$id{'line'}] = '14';
			} else {
				$wynik.="error l1=$l1 l2=$l2 \n";
				exit;
			}
		} else {
			$l1 = $item[$$id{'list_of_children_item'}[0]]{'line'};
			$l2 = $item[$$id{'list_of_children_item'}[-1]]{'line'};
			$branch[$$id{'col'}][$l1] = '34';
			$branch[$$id{'col'}][$l2] = '24';
			for ($i=$l1+1; $i < $l2; $i++) {
				$branch[$$id{'col'}][$i] = '23';
			}
			for ($i=1; $i < $ld-1; $i++) {
				$l = $item[$$id{'list_of_children_item'}[$i]]{'line'};
				$branch[$$id{'col'}][$l] = '234';
			}	    
		}
		if ($ld == 1 ) {
			$branch[$$id{'col'}][$$id{'line'}] = '14';
		} elsif ($ld > 0 ) {
			if ($branch[$$id{'col'}][$$id{'line'}] eq '234') {
				$branch[$$id{'col'}][$$id{'line'}] = '1234';
			} elsif ($branch[$$id{'col'}][$$id{'line'}] eq '34') {
				$branch[$$id{'col'}][$$id{'line'}] = '134';
			} elsif ($branch[$$id{'col'}][$$id{'line'}] eq '24') {
				$branch[$$id{'col'}][$$id{'line'}] = '124';
			} else {
				$branch[$$id{'col'}][$$id{'line'}] = '123';
			}
		}
		$id_per = $$id{'id'};
		my $per.="";
		if (defined ($person[$id_per]{'item'})) {
			if ($person[$id_per]{'item'} eq $person[$id_per]{'name'}) {
				$per .= "\[\[".$person[$id_per]{'item'}."\]\]";   
			} else {	
				$per .= "\[\[".$person[$id_per]{'item'}."\|".$person[$id_per]{'name'}."\]\]";    
			}	
		} else {
			$per .= "$person[$id_per]{'name'}";        
		}
		$per .= "";
		if (defined ($person[$id_per]{'text'})) {
			$per.="<br /><small>$person[$id_per]{'text'}</small>";    
		}
		if (defined ($person[$id_per]{'nr_of_spouses'})) {
			$per.="<span style=\"text-align:left;\"><i><small>\n";
			foreach my $id_spouse (@{$person[$id_per]{'list_of_spouses'}}) {
				if (defined  $person[$id_spouse]{'item'}) {
					if ($person[$id_spouse]{'item'} eq $person[$id_spouse]{'name'}) {
						$spouse = "\[\[$person[$id_spouse]{'item'}\]\]";    
					} else {
						$spouse = "\[\[$person[$id_spouse]{'item'}\|$person[$id_spouse]{'name'}\]\]";    
					}	
				} else {
					$spouse = "$person[$id_spouse]{'name'}";        
				}
				$per.="*$spouse\n" ;
			}    
			$per.="</span></i></small>";	
		}
		$tree[$$id{'col'}][$$id{'line'}]=$per;
    }
	for (my $i=1;$i<$max_col+1;$i++) {
		$end_ft = "";
		$wynik_wiki.="{{familytree|border=1";
		for (my $j=1;$j<$max_line+1;$j++) {
			if (defined ($tree[$i][$j])) {
	    	    $wynik_wiki.= "|$i\_$j| ";
				$end_ft.="|$i\_$j = $tree[$i][$j]";                                                                  
			} else {
				$wynik_wiki.="| | | | ";                                                         
			}
		}
		$wynik_wiki.="$end_ft}}\n";	
		$wynik_wiki.="{{familytree|border=0";
		for ( $j=1;$j<$max_line+1;$j++) {
			if (defined ($branch[$i][$j])) {
				$wynik_wiki.= $fam{$branch[$i][$j]};
				if (($branch[$i][$j]) ne "24" and ($branch[$i][$j]) ne "14") {
					$wynik_wiki.="|-";
				} else {
					$wynik_wiki.="| ";                                         
				}
			} else {
				$wynik_wiki.="| | | | ";
			}	
		}
		$wynik_wiki.="}}\n";
	}
	$wynik_wiki.="";
	$wynik_wiki.="{{familytree/end}}\n";
}


sub create_item {
    my ($id,$item_father,$col) = @_;
    my $item_my = ++$id_item;                 		
    my $max = 0;					
    my $lineinherit = 0;				
    $item[$item_my]{'id'} = $id;			
    $item[$item_my]{'col'} = $col;			
    $item[$item_my]{'list_of_children_item'} = [];	

    if ($item_father>0) {				
	push  @{ $item[$item_father]{'list_of_children_item'}}, $item_my;	
	$lineinherit =  $item[$item_father]{'line'} - &inthalf($person[$item[$item_father]{'id'}]{'nr_of_children'});
    } else {
    	$lineinherit = 1;
    }
    
    if ( $lineinherit > $min[$col]) {		
	$item[$item_my]{'line'} = $lineinherit;
    } else {
	$item[$item_my]{'line'} = $min[$col] +1;
    }
	if (($person[$item[$item_father]{'id'}]{'nr_of_children'} == 2) and
	 	($person[$item[$item_father]{'id'}]{'list_of_children'}[-1] == $id)) {
	    $item[$item_my]{'line'}++;

	    }

    $min[$col] = $item[$item_my]{'line'};

    if ( $person[$id]{'nr_of_children'}  > 0 ) {	
	foreach my $child (@{$person[$id]{'list_of_children'} } ) {
	    create_item ($child,$item_my,$col+1) ;
	}
	my $first_child = $item[$item_my]{'list_of_children_item'}[0];
	my $last_child = $item[$item_my]{'list_of_children_item'}[-1];
	my $newline = linehalf($item[$first_child]{'line'},$item[$last_child]{'line'});	
    	$item[$item_my]{'line'} = $newline if ($newline>$item[$item_my]{'line'});	
	$min[$col] = $item[$item_my]{'line'};	
    }
    $max_line = $item[$item_my]{'line'} if $item[$item_my]{'line'} > $max_line;
    $max_col = $item[$item_my]{'col'} if $item[$item_my]{'col'} > $max_col;
}


sub inthalf {
    my ($left) = @_;
    if ($left > 1) {
        return ($left - ($left % 2 )) / 2;
    } else {
    return 0;
    }
} 
sub linehalf {
    my ($min,$max) = @_;
    return ($min + inthalf($max - $min) );
}


Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.
Kembali kehalaman sebelumnya