Wikipedysta:Jurekj
| ||
| tło1=lightblue|tło2=yellow|[[Plik:POL Radom COA.svg|40px]|Ten użytkownik pochodzi z Radomia}} | ||
| ||
|
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)
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.
- 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:
- 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.
- 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.
- 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.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.
