Χρήστης:AtouBot/xml-σελίδες-με-συμβολοσειρά.pl

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


Περιγραφή:

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

Παράμετροι:

  • --not δείχνει τις σελίδες που δεν περιέχουν τη συμβολοσειρά
  • --noredirs παραβλέπει τις ανακατευθύνσεις
  • η συμβολοσειρά

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

  • perl

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

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

cat elwiktionary-20080309-pages-meta-current.xml |./xml-σελίδες-με-συμβολοσειρά.pl '{{-el-}} (βρίσκει ελληνικά λήμματα)


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

xml-σελίδες-με-συμβολοσειρά.pl επεξεργασία

#!/usr/bin/perl

# γράφουμε όλες τις σελίδες που περιέχουν μια ορισμένη έκφραση

# παράμετροι: 
#   --not       γράφουμε τις σελίδες χωρίς την έκφραση
#   --noredirs  αγνοούμε ανακατευθύνσεις 

# παραδείγματα: 
#  cat elwiktionary-20080309-pages-meta-current.xml |./xml-σελίδες-με-έκφραση.pl  --not '{{=el=}}'
#  cat elwiktionary-20080309-pages-meta-current.xml |./xml-σελίδες-με-έκφραση.pl  '{{PAGENAME}}'

#binmode(STDOUT, ":utf8");
#binmode(STDIN, ":utf8");

use utf8;

$noredirs=0;
$not=0;
$expr="";

$body=0;

sub check_expr {
    my($expr,$not,$noredirs,@text)=@_;
    $pagetype="unknown";
    for $tline (@text) {
	if ($tline =~ /<title>/) {
	    if ($tline !~ /<title>.*:.*<\/title>/) {
		$pagetype="main namespace";
	    }
	    else {
		$pagetype="other";
	    }
	}
	if ($pagetype =~ /other/) {
	    return(0);
	}
	elsif (($tline =~ /#REDIRECT/ig) || ($tline =~ /#ΑΝΑΚΑΤΕΥΘΥΝΣΗ/ig)) {
	    if ($noredirs) {
		return(0);
	    }
	}
	if (($tline =~ /<text/) || ($tline =~ /<\/text/)) {
	    $body=1;
	    $tline =~ s/<(\/)?text[^>]*>//g;
	}
	elsif ($tline =~ /<revision/) {
	    $body=1;
	}
	if (($body == 1) && ($tline =~ /\Q$expr\E/)) {
	    if ($not) {
		return(0);
	    }
	    else {
		return(1);
	    }
	}
    }
    if ($not) {
	return(1);
    }
    else {
	return(0);
    }
}

while ($opt = shift(@ARGV)) {
    if ($opt =~ /--not/) {
	$not = 1 ;
    }
    elsif ($opt =~ /--noredirs/) {
	$noredirs = 1 ;
    }
    else {
	$expr = $opt;
#	print "got opt $opt\n";
    }
}

$startpage=0;
while (<STDIN>) {
    $line=$_;
    if ($line =~ /<page>/) {
	$startpage++;
        @text=();
    }
    elsif ($line =~ /<\/page>/) {
	@text=(@text,$line);
    	$startpage=0;
	if (check_expr($expr,$not,$noredirs,@text)) {
	    for my $textline (@text) {
		print "$textline";
	    }
	}
        @text=();
    }
    if ($startpage) {
	@text=(@text,$line);
    }
}

exit(0);