Χρήστης:AtouBot/xml-σελίδες-ns0.pl

Από Βικιλεξικό
Μετάβαση στην πλοήγηση Πήδηση στην αναζήτηση

Όνομα εργαλείου: xml-σελίδες-ns0.pl


Περιγραφή:

Αυτό το εργαλείο διαβάζει κείμενο σε μορφή xml και γράφει στην κονσόλα το περιεχόμενο σελίδων που βρίσκονται στο κύριο namespace (ns0). Για να αποθηκευτούν οι σελίδες, πρέπει να κάνετε ανακατεύθυνση με τον κανονικό τρόπο (xml-σελίδες-ns0.pl > όνομα-αρχείου).

Παράμετροι: Δεν υπάρχουν.

Προϋποθέσεις:

  • perl

Σημειώσεις χρήσης:

  • Παράδειγμα χρήσης:

cat elwiktionary-20080309-pages-meta-current.xml |./xml-σελίδες-ns0.pl

→ Πίσω στα Εργαλεία

xml-σελίδες-ns0.pl[επεξεργασία]

#!/usr/bin/perl

# γράφουμε όλες τις σελίδες στο ns0

# παραδείγματα: 
#  cat elwiktionary-20080309-pages-meta-current.xml |./xml-σελίδες-ns0.pl

use utf8;

#!/usr/bin/perl


use constant {
    NONE => 0,
    STATRTPAGE   => 1,
    TITLE   => 2,
    NS0 => 3,
    ENDPAGE => 4,
};

@namespaces = ();
# retrieve a header from somewhere and figure it out
$namespacesxml = `wget -q -O - "http://el.wiktionary.org/w/api.php?action=query&meta=siteinfo&siprop=namespaces&format=xml"`;
# format: <ns id="4" case="case-sensitive" subpages="" canonical="Project" xml:space="preserve">Βικιλεξικό</ns>

#$namespacesxml =~ s/<\/ns>/<\/ns>\n/g ;
@namespaceslines = split(/<\/ns>/,$namespacesxml);

foreach ( @namespaceslines ) {
    if ($_ =~ /<ns.*"preserve">([^>]*)$/) {
	push @namespaces, $1;
    }
}

$state=NONE;
while (<STDIN>) {
    $line=$_;
    if ($line =~ /<page>/) {
	$state = STARTPAGE;
	@text=($line);
    }
    elsif ($state == STARTPAGE) {
	if ($line =~ /<title>/) {

	    if ($line !~ /<title>([^:]*):.*<\/title>/) {
		$state = NS0;
		for my $textline (@text) {
		    print "$textline";
		}
		print $line;
	    }
	    else {
		$ns = $1;
		if ($ns ~~ @namespaces) {
		    $state = TITLE;
		}
		else {
		    $state = NS0;
		    for my $textline (@text) {
			print "$textline";
		    }
		    print $line;
		}
	    }
	    @text=();
	}
	else {
	    @text=(@text,$line);
	}
    }
    elsif ($state == NS0) {
	print $line;
	if($line =~ /<\/page>/) {
	    $sstate = ENDPAGE;
	}
    }
    elsif ($state == TITLE) {
	if($line =~ /<\/page>/) {
	    $sstate = ENDPAGE;
	}
    }
    elsif ($state == ENDPAGE) {
	# do nothing :-P
    }
}

exit(0);